Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
palamarchukn
9 / 9 / 1
Регистрация: 26.11.2009
Сообщений: 78
#1

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

16.04.2012, 21:06. Просмотров 673. Ответов 5
Метки нет (Все метки)

Здравствуйте!
Есть вопрос по реализации некоторых функций.
Написана программа стек в СИ + все возможные действия + доп. стек (корзина).
Необходимо помочь с след. функциями 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();
 
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2012, 21:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Необходимо помочь с след. функциями assert(), malloc(), iterator (C++):

Нужно ли под массив выделять память функциями malloc или new? - C++
собственно вот программа по вводу размера массива, вводу массива, сортировки: #include &lt;iostream&gt; #include &lt;windows.h&gt; using...

std::sort(iterator, iterator, method) подскажите как исправить - C++
Уважаемые Знатоки!!! Вашему вниманию предоставляю код: #include &quot;stdafx.h&quot; #include &lt;vector&gt; #include &lt;algorithm&gt; class...

Необходимо помочь решить - C++
Пользователь вводит с клавиатуры 3 числа. Необходимо найти разность максимального и минимального из них. Впервые пришлось столкнуться с...

Срабатывает assert внутри malloc - C Linux
Обнаружилась странная вещь: Этот код в убунте (32bit) почему-то заставляет сработать assert в malloc, если вводить нечётное число (я...

Выполнить функциями calloc() или malloc() - C (СИ)
Написать пользовательскую функцию, решающую указанную ниже задачу. Массивы А и В динамические, выделение памяти выполнить функциями...

Отличия между функциями malloc, calloc и realloc и способами их использования - C (СИ)
На этом форуме есть множество тем по функциям malloc, calloc и realloc, но я так и не понял чем они друг от друг отличаются и в каких...

5
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
17.04.2012, 05:41 #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?
1
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 531
17.04.2012, 08:04 #3
C
1
STACK *tmp=new STACK;
C
1
struct STACK *tmp=malloc(struct STACK);
Так не работает почему то,самому это надо тоже
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
17.04.2012, 08:05 #4
a.n.o.n.i.m, опечатался, посмотри мое предыдущее сообщение, я его подредактировал
1
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 531
17.04.2012, 08:24 #5
Ок,sizeof в этом и была проблема,хотя он ведь везде у malloc есть

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



C
1
STACK *tmp=(STACK*)malloc(sizeof(STACK));
1
palamarchukn
9 / 9 / 1
Регистрация: 26.11.2009
Сообщений: 78
19.05.2012, 18:12  [ТС] #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, тебе тоже огромное спасибо.
0
19.05.2012, 18:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2012, 18:12
Привет! Вот еще темы с ответами:

Необходимо вычислить след матрицы, по возможности набросать блок-схемы - Pascal ABC
Необходимо вычислить след матрицы, по возможности набросать блок-схемы. \sum_{k=1}^{6}\frac{{(-1)}^{k}}{(2k+1)k}; ...

Найти максимальное из трех чисел x, y, z, где x - след матрицы А, у - след матрицы В, z - след матрицы С - Pascal ABC
Заданы три матрицы А (третьего порядка), В (второго порядка) и С (третьего порядка). Найти максимальное из трех чисел x, y, z, где x - след...

Процедуры: Найти наименьшее из чисел x,y,z, где х – след матрицы А, y – след матрицы В, z – след матрицы С - Turbo Pascal
Всем доброго времени суток!Ребята,прошу помогите пожалуйста! Даны матрицы А(3, 3), В(2, 2), С(5, 5). Найти наименьшее из чисел x,y,z,...

Найти максимальное из трех чисел x,y,z где x - след матрицы А, у - след матрицы В, z - след матрицы С - Turbo Pascal
Заданы три матрицы А(3 порядка), В (2 порядка), С (3 порядка). Найти максимальное из трех чисел x,y,z где x - след матрицы А, у - след...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.