Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
Killing Friend
1 / 1 / 0
Регистрация: 26.07.2009
Сообщений: 15
#1

Связные списки - C++

16.08.2009, 18:48. Просмотров 3282. Ответов 7
Метки нет (Все метки)

Я практически полный нуб в С++. Вот такая задача: В столовой предлагаются N комплексных обедов, состоящих из Q блюд. Известна стоимость и калорийность каждого блюда. Сколько стоит самый деше¬вый и самый дорогой обед? Сколько калорий включает в себя самое калорийное блюдо? Есть вот такая реализация с помощью структур и векторов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;
struct blud
{
    int kal, c;
    string naz;
};
vector <blud> zapic(vector <blud> m, int n)
{
    blud temp;
    for (int i=0;i<n;i++)
    {
        cout<<"Введите название"<<endl;
        cin>>temp.naz;
        cout<<"Введите калорийность"<<endl;
        cin>>temp.kal;
        cout<<"Введите цену"<<endl;
        cin>>temp.c;
        m.push_back(temp);
    }
    return m;
}
void display (vector <blud> m, int n)
{
    for (int i=0;i<n;i++)
    {
        cout<<m[i].naz<<" ";
        cout<<m[i].kal<<" ";
        cout<<m[i].c<<" ";
        cout<<endl;
    }
}
vector <blud> desh (vector <blud> m,vector <blud> min, int n)
{
    blud temp1;
    int v=0;
    temp1=m[0];
    for (int i=1; i<n; i++)
    {
        if (m[i].c<m[v].c)
        {
            temp1=m[i];
            v=i;
        }
        else
        {
        v++;
        }
    }
    min.push_back(temp1);
    return min;
}
vector <blud> dor (vector <blud> m, vector <blud> max, int n)
{
    blud temp;
    int p=0;
    temp=m[0];
    for (int i=1; i<n; i++)
    {
        if (m[i].c>m[p].c)
        {
            temp=m[i];
        }
        p++;
    }
    max.push_back(temp);
    return max;
}
vector <blud> z3 (vector <blud> m, vector <blud> k, int n)
{
    blud temp3;
    int p=0;
    temp3=m[0];
    for (int i=1; i<n; i++)
    {
        if (m[i].kal>m[p].kal)
        {
            temp3=m[i];
        }
        p++;
    }
    k.push_back(temp3);
    return k;
}
int main()
{
    setlocale (LC_ALL, "Russian");
    vector <blud> m, min, max, k;
    int n;
    cout<<"Введите количество блюд"<<endl;
    cin>>n;
    cout<<endl;
    m = zapic(m, n);
    cout<<endl;
    display(m, n);
    min=desh (m, min, n);
    cout<<"Самое дешёвое блюдо"<<endl;
    for (int i=0;i<1;i++)
    {
        cout<<min[i].naz<<" ";
        cout<<min[i].kal<<" ";
        cout<<min[i].c<<" ";
        cout<<endl;
    }
    cout<<"Самое дорогое блюдо"<<endl;
    max=dor (m, max, n);
    for (int i=0;i<1;i++)
    {
        cout<<max[i].naz<<" ";
        cout<<max[i].kal<<" ";
        cout<<max[i].c<<" ";
        cout<<endl;
    }
    k = z3 (m, k, n);
    for (int i=0; i<1; i++)
    {
    cout<<"Самое калорийное блюдо "<<k[i].naz<<" содержит в себе "<<k[i].kal<<" калорий"<<endl;
    }
    system ("pause");
    return 0;
}
Надо переделать в виде связный списков. А как не знаю - не показывали. Помогите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2009, 18:48     Связные списки
Посмотрите здесь:

C++ Связные списки
C++ Связные списки
Связные списки C++
C++ Связные списки.
Стэк и связные списки C++
Связные списки C++
C++ Связные списки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.08.2009, 19:06     Связные списки #2
Цитата Сообщение от Killing Friend Посмотреть сообщение
Помогите пожалуйста!
http://lmgtfy.com/?q=%D1%81%D0%B2%D1...81%D0%BE%D0%BA
Killing Friend
1 / 1 / 0
Регистрация: 26.07.2009
Сообщений: 15
16.08.2009, 19:13  [ТС]     Связные списки #3
Уже искал. Так и не вкурил как реализовать мою задачу в виде списков.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.08.2009, 19:33     Связные списки #4
C++
1
vector <blud>
замени на std::list<blud>
list - это двусвязный список.
Killing Friend
1 / 1 / 0
Регистрация: 26.07.2009
Сообщений: 15
16.08.2009, 19:52  [ТС]     Связные списки #5
Тогда компилятор игнорирует тело функции (4 синтаксические ошибки при построении).
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.08.2009, 20:00     Связные списки #6
Цитата Сообщение от Killing Friend Посмотреть сообщение
Тогда компилятор игнорирует тело функции (4 синтаксические ошибки при построении).
C++
1
2
list <blud> m,
cout<<m[i].naz<<" ";
у std::list не определён оператор взятия индекса. обращаться к элементам можно через итераторы.
C++
1
std::list::iterator
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
17.08.2009, 01:16     Связные списки #7
Killing Friend, я
вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////
struct dish
{
    double price;
    double caloric;
    dish* next;
};
//////////////////////////////////////////////////////////////////////////
class set_meal
{
private:
    dish* first_dish;
    int amount_dishes;
public:
    set_meal():amount_dishes(0),first_dish(NULL)
    {}
    set_meal(int n_d):amount_dishes(n_d),first_dish(NULL)
    {}
    set_meal(set_meal& s1)
    {
        amount_dishes = s1.amount_dishes;
    }
    void get_dish();
    double total_cost();
    double total_calories();
};
//------------------------------------------------------------------------
void set_meal::get_dish()
{
    for(int i = 0;i < amount_dishes;i++)
    {
        dish* new_dish = new dish;
        cout << "\nВведите калорийность блюда №"
             << i+1
             << ": ";
        cin >> new_dish->caloric;
        cout << "\nВведите цену блюда №"
             << i+1
             << ": $";
        cin >> new_dish->price;
        new_dish->next = first_dish;
        first_dish = new_dish;
    }
    _flushall();
}
//------------------------------------------------------------------------
double set_meal::total_cost()
{
    double t_price = 0;
    dish* current = first_dish;
    while(current)
    {
        t_price += current->price;
        current = current->next;
    }
    return t_price;
}
//------------------------------------------------------------------------
double set_meal::total_calories()
{
    double t_calories = 0;
    dish* current = first_dish;
    while(current)
    {
        t_calories += current->caloric;
        current = current->next;
    }
    return t_calories;
}
//////////////////////////////////////////////////////////////////////////
class cashbox
{
private:
    int amount_set_meals;
    int amount_dishes;
    double* t_cost_meal;
    double* t_calories_meal;
    set_meal* meal;
    void price_meal();
    void calorie_meal();
    void most();
public:
    cashbox():amount_set_meals(0),amount_dishes(0)
    {}
    ~cashbox()
    {
        delete[] meal;
        delete[] t_cost_meal;
    }
    void run();
};
//------------------------------------------------------------------------
void cashbox::run()
{
    cout << "Введите количество комплексных обедов: ";
    cin >> amount_set_meals;
    cout << "\nВведите количество блюд в обеде: ";
    cin >> amount_dishes;
    _flushall();
    meal = new set_meal[amount_set_meals];
    t_cost_meal = new double[amount_set_meals];
    t_calories_meal = new double[amount_set_meals];
    for(int i = 0; i < amount_set_meals;i++)
    {
        meal[i] = set_meal(amount_dishes);
        cout << "\nОбед №" << i+1;
        meal[i].get_dish();
    }
    most();
}
//------------------------------------------------------------------------
void cashbox::price_meal()
{
    for (int i = 0;i < amount_set_meals;i++)
    {
        t_cost_meal[i] = meal[i].total_cost();
    }
}
//------------------------------------------------------------------------
void cashbox::calorie_meal()
{
    for(int i = 0; i < amount_set_meals;i++)
    {
        t_calories_meal[i] = meal[i].total_calories();
    }
}
//------------------------------------------------------------------------
void cashbox::most()
{
    //double low_price = 0;
    int num_cheap = 0;
    int num_m_exp = 0;
    int num_h_calories = 0;
    price_meal();
    calorie_meal();
    for(int i = 0; i < amount_set_meals;i++)
    {
        if(t_cost_meal[i] < t_cost_meal[num_cheap])
            num_cheap = i;
        if(t_cost_meal[i] > t_cost_meal[num_m_exp])
            num_m_exp = i;
        if(t_calories_meal[i] > t_calories_meal[num_h_calories])
            num_h_calories = i;
    }
    cout << "\nСамое дешовый обед - обед №" 
         << num_cheap+1 
         << "($" 
         << t_cost_meal[num_cheap]
         << ").";
    cout << "\nСамое дорогой обед - обед №"
         << num_m_exp+1
         << "($"
         << t_cost_meal[num_m_exp]
         << ").";
    cout << "\nСамое калорийный обед - обед №"
         << num_h_calories+1
         << "("
         << t_calories_meal[num_h_calories]
         << " Кал.).";
}
//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    setlocale(0,"");
    cashbox cash;
    cash.run();
    getchar();
    return 0;
}
попробовал решить твою задачку..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2009, 09:44     Связные списки
Еще ссылки по теме:

C++ однонаправленные связные списки
C++ массивы и связные списки
C++ связные списки
C++ Связные списки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 09:44     Связные списки #8
Цитата Сообщение от Killing Friend Посмотреть сообщение
Уже искал. Так и не вкурил как реализовать мою задачу в виде списков.
Если учите динамические структуры, то программу нужно писать заново.
А если подойдёт библиотечный std::list, то переделайте только операторы типа for на использование итераторов (как сказал zim22)
for (Spisok::const_iterator i=f.begin(); i!=f.end(); ++i)
в таком цикле к элементам обращаетесь по *i или i->
Yandex
Объявления
17.08.2009, 09:44     Связные списки
Ответ Создать тему
Опции темы

Текущее время: 17:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru