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

Необходимо помочь с след. функциями assert(), malloc(), iterator - C++

Восстановить пароль Регистрация
 
palamarchukn
 Аватар для palamarchukn
9 / 9 / 1
Регистрация: 26.11.2009
Сообщений: 78
16.04.2012, 21:06     Необходимо помочь с след. функциями assert(), malloc(), iterator #1
Здравствуйте!
Есть вопрос по реализации некоторых функций.
Написана программа стек в СИ + все возможные действия + доп. стек (корзина).
Необходимо помочь с след. функциями assert(), malloc(), iterator. Нужно переписать программу используя эти функции. Если можно, то хотя бы некоторые куски кода, чтобы понять смысл реализации. Спасибо. Жду ответа.
Сама программа:
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
//#include <memory.h>
#include <stdio.h>
#include <conio.h>
//#include <stdlib.h>
#include <iostream>
#include <windows.h>
//#include <time.h>
 using namespace std;
// Объявление типа STACK
 struct STACK {
 
     int info;
     STACK *next;
 
 };
 //Вспомогательный стек Empty - корзина 
 int Empty(STACK *pstack)
 {
     if (pstack==NULL)
     return 0;
     else
     return 1;
 }
 
 void Add(STACK **pstack)
 {
     STACK *tmp=new STACK;
     tmp->info=rand()%100;
     tmp->next=*pstack;
     *pstack=tmp;
 
 }
 
 void Move(STACK **pdopstack, STACK **pstack)
 {
 
     STACK *tmp=*pdopstack;
     *pdopstack=(*pdopstack)->next;
     tmp->next=*pstack;
     *pstack=tmp;
 
 }
 
 void Del(STACK **pstack)
 {
 
     STACK *tmp=*pstack;
     *pstack=(*pstack)->next;
     delete tmp;
 
 }
 
 void Show(STACK *pstack)
 {
 
     STACK *tmp=pstack;
     while(tmp!=NULL)
     {
     cout << tmp->info << " ";
     tmp=tmp->next;
     }
 
 }
 
 void ClearAll(STACK **pstack)
 {
 
     STACK *tmp;
     while(*pstack!=NULL)
     {
     tmp=*pstack;
     *pstack=(*pstack)->next;
     delete tmp;
     }
 
 }
 
 int main()
 {
 
     setlocale(LC_ALL,"Russian");
     STACK *stack=NULL, *dopstack=NULL;
     int num;
     char otv, otv2;
     do
     {
 
         cout << "1. Добавление элементов в вершину стека" << endl     // сразу же присваиваем переменную otv
         << "2. Удаление элемента с вершины стека" << endl             // сразу же присваиваем переменную otv2
         << "3. Вывод элементов основного стека" << endl
         << "4. Вывод элементов вспомогательного стека" << endl
         << "0. Выход" << endl;
         cout << " = ";
         cin >> otv;
         switch(otv)
         {
 
         case '1':
 
             cout << endl << "1. Добавить новый элемент" << endl
             << "2. Добавить из вспомогательного стека" << endl;
             cout << " = ";
             cin >> otv2;
             switch(otv2)
             {
             case '1':
 
                 cout << endl << "Сколько элементов нужно добавить = " << endl;
                 cin >> num;
                 for (int i=0;i<num;i++)
                 Add(&stack);                     // & адрес, по которому берутся значения
                 cout << endl << "Элементы добавлены" << endl;
                 break;
 
             case '2':
 
                 if (Empty(dopstack)==0)
                 cout << endl << "Вспомогательный стек пуст" << endl;
                 else
                 {
                 Move(&dopstack,&stack);
                 cout << endl << "Элемент добавлен из вспомогательного стека в основной" << endl;
                 }
                 break;
 
             default:
 
                 cout << endl << "Ошибка" << endl;         // это элементарный вывод <<  а, >> Это ввод значений, endl перевод строки
                 break;
 
             }
             break;
 
         case '2':
 
             cout << endl << "1. Удалить элемент" << endl
             << "2. Добавить в вспомогательный стек" << endl << " = ";
             cin >> otv2;
             switch(otv2)
             {
             case '1':
 
                 if (Empty(stack)==0)
                 cout << endl << "Стек пуст" << endl;
                 else
                 {
                 Del(&stack);
                 cout << endl << "Элемент удален" << endl;
                 }
                 break;
 
             case '2':
 
                 if (Empty(stack)==0)
                 cout << endl << "Стек пуст" << endl;
                 else
                 {
                 Move(&stack,&dopstack);
                 cout << endl << "Элемент добавлен в вспомогательный стек" << endl;
                 }
                 break;
 
             default:
 
                 cout << endl << "Ошибка" << endl;
                 break;
 
             }
             break;
 
         case '3':
 
             if (Empty(stack)==0)
             cout << endl << "Стек пуст" << endl;
             else
             {
             cout << endl << "Элементы стека:" << endl;
             Show(stack);
             cout << endl;
             }
             break;
 
         case '4':
 
             if (Empty(dopstack)==0)
             cout << endl << "Вспомогательный стек пуст" << endl;
             else
             {
             cout << endl << "Элементы вспомогательного стека:" << endl;
             Show(dopstack);
             cout << endl;
             }
             break;
 
         case '0':
 
             ClearAll(&stack);
             ClearAll(&dopstack);
             break;
 
         default:
 
             cout << endl << "Ошибка" << endl;
             break;
 
         }
 
     }while(otv!='0');
     cin.get();
 
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2012, 21:06     Необходимо помочь с след. функциями assert(), malloc(), iterator
Посмотрите здесь:

Необходимо помочь решить C++
assert.h C++
std::sort(iterator, iterator, method) подскажите как исправить C++
Assert C++
iterator to count C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.04.2012, 05:41     Необходимо помочь с след. функциями assert(), malloc(), iterator #2
Цитата Сообщение от palamarchukn Посмотреть сообщение
Написана программа стек в СИ
это не С, это C++.

что нужно сделать/поменять:
  • вместо выделения/освобождения памяти с помощью операторов C++ использовать сишные функции.
    Например, вместо
    C++
    1
    
    STACK *tmp=new STACK;
    нужно писать
    C
    1
    
    struct STACK *tmp=malloc(sizeof(struct STACK));
    Также, вместо
    C++
    1
    
    delete tmp;
    нужно писать
    C
    1
    
    free(tmp);
  • Вместо ввода/вывода C++ использовать сишные функции (printf/puts + fgets/scanf)
  • Заменить везде "STACK" на "struct STACK"
  • Проверять везде корректность данных с помощью макроса assert, использовать его следующим образом:
    C
    1
    
    assert(expr);
    где expr — это выражение языка С, которое должно вычисляться в истину
  • почитать уже какую-нибудь книжку по С, от себя рекомендую K&R

И да, что такое iterator?
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
17.04.2012, 08:04     Необходимо помочь с след. функциями assert(), malloc(), iterator #3
C
1
STACK *tmp=new STACK;
C
1
struct STACK *tmp=malloc(struct STACK);
Так не работает почему то,самому это надо тоже
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.04.2012, 08:05     Необходимо помочь с след. функциями assert(), malloc(), iterator #4
a.n.o.n.i.m, опечатался, посмотри мое предыдущее сообщение, я его подредактировал
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
17.04.2012, 08:24     Необходимо помочь с след. функциями assert(), malloc(), iterator #5
Ок,sizeof в этом и была проблема,хотя он ведь везде у malloc есть

ток я вот так сделал



C
1
STACK *tmp=(STACK*)malloc(sizeof(STACK));
palamarchukn
 Аватар для palamarchukn
9 / 9 / 1
Регистрация: 26.11.2009
Сообщений: 78
19.05.2012, 18:12  [ТС]     Необходимо помочь с след. функциями assert(), malloc(), iterator #6
Доброго времени суток! Всем спабо за помощь!
Может быть кому пригодится:
Цель Л.Р.: Реализовать стек на языке Си (LIFO). Так же при создании, была реализована корзина для стека. (вспомогательный стек)
Пояснения к работе программы:
-Реализация задачи проведена на языке Microsoft Visual C++ 2008 Express Edition (используя функции языка Си)
-Алгоритмы были использованы из курса лекций и дополнительных учебных материалов.
-Запуск программы производится при запуске stack.exe файла.
-При запуске программы мы видим, консольное приложение, где нам предложены действия над стеком.
-На свое усмотрение я создал вспомогательный стек, который действует по такому же принципу как и стек LIFO,
только предназначенный в качестве корзины.
-Мы можем добавлять, удалять элементы из основного стека, а так же вместо удаления мы можем убирать элементы в корзину.
-И обратно, можем добавлять элементы в основной стек из корзины.
-Заголовочный файл создался автоматически при создании нового проекта, но использован не был.(из за ненадобности)
-Спасибо за внимание!

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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
// stack.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"   //заголовочный файл здесь не используется. Он автоматически создается при создании проекта. 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <windows.h>
using namespace std;  // для русского алфавита
// Объявление типа STACK
 struct STACK {
     int info;
     struct STACK *next;
  };
 //Вспомогательный стек Empty - корзина 
 int Empty(struct STACK *pstack)   //выделение памяти
 {
     if (pstack==NULL)            //условие для возвращения значения
     return 0;
     else
     return 1;
 }
 
 void Add(struct STACK **pstack)  //выделение памяти
 {
     // C++   STACK *tmp=new STACK;              Таким образом происходит выделения памяти в языке C++
     STACK *tmp=(STACK*)malloc(sizeof(STACK)); //Выделение памяти в языке C
     tmp->info=rand()%100;                     //генерация случайных  значений в стеке
     tmp->next=*pstack;
     *pstack=tmp;
 }
 
 void Move(struct STACK **pdopstack, struct STACK **pstack) // движение по стеку с выделением памяти
 {
     struct STACK *tmp=*pdopstack;
     *pdopstack=(*pdopstack)->next;
     tmp->next=*pstack;
     *pstack=tmp;
 }
 
 void Del(struct STACK **pstack)  //удаление элемента со стека
 {
     struct STACK *tmp=*pstack;
     *pstack=(*pstack)->next;
     //delete tmp;                //освобождение памяти в языке c++
     free(tmp);                   //освбождение памяти в языке c
 }
 
 void Show(struct STACK *pstack) //просмотр стека
 {
     struct STACK *tmp=pstack;
     while(tmp!=NULL)
     {
     cout << tmp->info << " ";
     tmp=tmp->next;
     }
 }
 
 void ClearAll(struct STACK **pstack)  //Очистка, удаление элемантов стека
 {
     struct STACK *tmp;
     while(*pstack!=NULL)
     {
     tmp=*pstack;
     *pstack=(*pstack)->next;
     //delete tmp;                      //освобождение памяти в языке c++
     free(tmp);                         //освбождение памяти в языке c
     }
 }
  int main()                           //реализация меню в консоли используя основную функцию case
 {
 
     setlocale(LC_ALL,"Russian");      // для русского алфавита
     STACK *stack=NULL, *dopstack=NULL;
     int num;
     char otv, otv2;
     do
     {
         cout << "1. Добавление элементов в вершину стека" << endl     // сразу же присваиваем переменную otv
         << "2. Удаление элемента с вершины стека" << endl             // сразу же присваиваем переменную otv2
         << "3. Вывод элементов основного стека" << endl
         << "4. Вывод элементов вспомогательного стека" << endl
         << "0. Выход" << endl;
         cout << " = ";
         cin >> otv;
         switch(otv)
         {
 
         case '1':
 
             cout << endl << "1. Добавить новый элемент" << endl
             << "2. Добавить из вспомогательного стека" << endl;
             cout << " = ";
             cin >> otv2;
             switch(otv2)
             {
             case '1':
 
                 cout << endl << "Сколько элементов нужно добавить = " << endl;
                 cin >> num;
                 for (int i=0;i<num;i++)
                 Add(&stack);                     // & адрес, по которому берутся значения
                 cout << endl << "Элементы добавлены" << endl;
                 break;
 
             case '2':
 
                 if (Empty(dopstack)==0)
                 cout << endl << "Вспомогательный стек пуст" << endl;
                 else
                 {
                 Move(&dopstack,&stack);
                 cout << endl << "Элемент добавлен из вспомогательного стека в основной" << endl;
                 }
                 break;
 
             default:
 
                 cout << endl << "Ошибка" << endl;         // это элементарный вывод <<  а, >> Это ввод значений, endl перевод строки
                 break;
 
             }
             break;
 
         case '2':
 
             cout << endl << "1. Удалить элемент" << endl
             << "2. Добавить в вспомогательный стек" << endl << " = ";
             cin >> otv2;
             switch(otv2)
             {
             case '1':
 
                 if (Empty(stack)==0)
                 cout << endl << "Стек пуст" << endl;
                 else
                 {
                 Del(&stack);
                 cout << endl << "Элемент удален" << endl;
                 }
                 break;
 
             case '2':
 
                 if (Empty(stack)==0)
                 cout << endl << "Стек пуст" << endl;
                 else
                 {
                 Move(&stack,&dopstack);
                 cout << endl << "Элемент добавлен в вспомогательный стек" << endl;
                 }
                 break;
 
             default:
 
                 cout << endl << "Ошибка" << endl;
                 break;
 
             }
             break;
 
         case '3':
 
             if (Empty(stack)==0)
             cout << endl << "Стек пуст" << endl;
             else
             {
             cout << endl << "Элементы стека:" << endl;
             Show(stack);
             cout << endl;
             }
             break;
 
         case '4':
 
             if (Empty(dopstack)==0)
             cout << endl << "Вспомогательный стек пуст" << endl;
             else
             {
             cout << endl << "Элементы вспомогательного стека:" << endl;
             Show(dopstack);
             cout << endl;
             }
             break;
 
         case '0':
 
             ClearAll(&stack);
             ClearAll(&dopstack);
             break;
 
         default:
 
             cout << endl << "Ошибка" << endl;
             break;
 
         }
 
     }while(otv!='0');
     cin.get();
 
 }
Добавлено через 7 часов 53 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
И да, что такое iterator?
И да, Nameless One, ответ на Ваш вопрос:
Итератор - объект, позволяющий программисту перебирать все элементы коллекции без учёта особенностей её реализации. Напр.rint(next(A)). Для проверки в общем. Спасибо за помощь.
Можно считать тему закрытой.
a.n.o.n.i.m, тебе тоже огромное спасибо.
Yandex
Объявления
19.05.2012, 18:12     Необходимо помочь с след. функциями assert(), malloc(), iterator
Ответ Создать тему
Опции темы

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