Консультация № 178555
21.05.2010, 21:32
42.84 руб.
0 57 1
Написать программу на С++:
Тема - динамическое управление памятью.
Задача:
Сформировать два стека (можно из цифр, из символов (как угодно). Вывести данные.
Из этих двух стеков создать очередь. Вывести на экран.

Мы C++ проходим, как в учебниках (то есть классический) - без объектов, классов и т.д.

Обсуждение

Неизвестный
23.05.2010, 03:21
общий
Цитата: 256539
Это даже не смешно.


А вам показалось что я шучу?
Неизвестный
23.05.2010, 03:21
общий
Valeraja:
Цитата: 243211
Если возможно выводите без них.
Без проблем. Можете посмотреть в моих ответах.
Цитата: 243211
А вам показалось что я шучу?
Когда человек совершает грубую ошибку и ерепенится при этом это выглядит забавно, по крайней мере.
Неизвестный
23.05.2010, 03:23
общий
Цитата: 256539
Без проблем. Можете посмотреть в моих ответах.


Смотреть я ничего не буду.Я стандарт этого языка знаю лучше чем тут многие.Можете не сомневатся в этом.
Неизвестный
23.05.2010, 03:26
общий
Цитата: 243211
Когда человек совершает грубую ошибку и ерепенится при этом это выглядит забавно, по крайней мере.


Где я сделал грубую ошибку?Тыкните мне пальцем.
Неизвестный
23.05.2010, 03:27
общий
Valeraja:
Ну тогда ответьте какой объем памяти выделит этот оператор?
int* mass=new int;

И куда укажет после этого mass[9]?
Неизвестный
23.05.2010, 03:32
общий
Выделет размер указателя.А в дальнейшем размер будет увеличеватся с количеством присвоеных елементов.Это значит что mass[9] на девятую переменую.Если не верите проверте.Оперируем мы по сути указателями на все эти переменные.Больше тут нечего сказать.
Неизвестный
23.05.2010, 03:40
общий
Valeraja:
Цитата: 243211
Выделет размер указателя.А в дальнейшем размер будет увеличеватся с количеством присвоеных елементов.Это значит что mass[9] на девятую переменую.Если не верите проверте.Оперируем мы по сути указателями на все эти переменные.Больше тут нечего сказать.
Это в каком же стандарте такое прописано? Не верю! Давайте Вы сами проверите и выложите тут образец кода на котором проверяли, а я тут уже давно все проверил.

Неизвестный
23.05.2010, 03:42
общий
Цитата: 256539
Это в каком же стандарте такое прописано? Не верю! Давайте Вы сами проверите и выложите тут образец кода на котором проверяли, а я тут уже давно все проверил.


Хорошо.Давайте свой вариант.Обсудим.
Неизвестный
23.05.2010, 03:48
общий
Valeraja:
По меньшей мере.
int *mass=new int[10]; // Или сколько у Вас там элементов в index
Неизвестный
23.05.2010, 03:51
общий
Цитата: 256539
По меньшей мере.
int *mass=new int[10]; // Или сколько у Вас там элементов в index


Это когда он будет проинициализирован.Вы ведь спрашивали сколько будет выделено в самом начале.
Неизвестный
23.05.2010, 03:55
общий
Valeraja:
Я Вам писал конкретные строки из Вашей же программы в которых инициализация указателя проведена не верно. Поэтому о каком начале Вы говорите не ясно. Тем более, что для этих переменных это и есть начало т.к. они и декларированы в этой строке. Индекс будет находиться вне массива и чего он там будет менять никому не известно.
Неизвестный
23.05.2010, 04:02
общий
Цитата: 256539
Я Вам писал конкретные строки из Вашей же программы в которых инициализация указателя проведена не верно. Поэтому о каком начале Вы говорите не ясно. Тем более, что для этих переменных это и есть начало т.к. они и декларированы в этой строке. Индекс будет находиться вне массива и чего он там будет менять никому не известно.


Да?Вы уверены в том что вы там что нибудь проверяли?
Неизвестный
23.05.2010, 04:04
общий
Valeraja:
Я да, а Вы?
Неизвестный
23.05.2010, 04:05
общий
И?Не работает?
Неизвестный
23.05.2010, 04:16
общий
Valeraja:
А Вы сами попробуйте нагрузить программу данными чуть побольше. 100 или 1000, например.

Ваша же программа:
Код:
#include <cstdlib>
#include <iostream>
#include <stack>
#include <queue>
using namespace std;

int main(int argc, char *argv[])
{
stack <int> s;
stack <int> ss;
int* mass=new int;
int* mass1=new int;
int index=1000; //razmer stekov
int a;
while(s.size() != index){s.push(a++);}
while(ss.size() != index){ss.push(a++);}
queue <int> o;

for(int i=0;i<index;i++){
mass[i]=s.top(); //при выводе из стека первый елемент всегда стерается.Поетому предварительно елемент заносится в массив и выводится
o.push(s.top());s.pop();
mass1[i]=ss.top(); //тоже самое со вторым стеком
o.push(ss.top());ss.pop();}
cout<<"Soderzimoje pervovo steka "<<endl;
for(int i=0;i<index;i++){
cout<<mass[i]<<" ";}
cout<<"\nSoderzimoje vtorovo steka "<<endl;
for(int i=0;i<index;i++){
cout<<mass1[i]<<" ";}

cout<<"\n\n";

for(int i=0;i<index*2;i++){
cout<<o.front();o.pop(); //выводим содержимое очередь на консоль
cout<<" ";} //в програме мы заранее знаем сколько елементов будет в стеках и в очереди
system("PAUSE"); //естественно что все эти константные числа мы можем сделать переменными.(это мы понимаем)
return EXIT_SUCCESS;
}


И посмотрите на результат работы(если она еще будет работать).

Самому проверить не трудно ведь. Ума большого не надо. Гордость и упрямство могут только мешать.
Неизвестный
23.05.2010, 04:50
общий
Да использовать динамические массивы была ошибка.Довольны?

Иправляю.Грузите теперь сколько хотите.


#include <cstdlib>
#include <iostream>
#include <stack>
#include <queue>
using namespace std;

int main(int argc, char *argv[])
{
int index=10,a;
stack <int> s;
stack <int> ss;
int mass[index];
int mass1[index];

while(s.size() != index){cin>>a;s.push(a);}
while(ss.size() != index){cin>>a;ss.push(a);}
queue <int> o;

for(int i=0;i<index;i++){
mass[i]=s.top();
o.push(s.top());s.pop();
mass1[i]=ss.top();
o.push(ss.top());ss.pop();}
cout<<"Soderzimoje pervovo steka ";
for(int i=0;i<index;i++){
cout<<mass[i]<<" ";}
cout<<"\nSoderzimoje vtorovo steka ";
for(int i=0;i<index;i++){
cout<<mass1[i]<<" ";}

cout<<"\n";

for(int i=0;i<index*2;i++){
cout<<o.front();o.pop();
cout<<" ";}
system("PAUSE");
return EXIT_SUCCESS;
}
Неизвестный
23.05.2010, 04:57
общий
Дело не в динамических массивах, а в недостаточном выделении памяти. Если выделить с запасом(new int[10]) то все нормально и освободить после этого надо будет.
Неизвестный
23.05.2010, 04:59
общий
Цитата: 256539
Дело не в динамических массивах, а в недостаточном выделении памяти. Если выделить с запасом(new int[10]) то все нормально и освободить после этого надо будет.


Понятно.Спасибо за замечание.
Неизвестный
23.05.2010, 09:40
общий
Valeraja & Micren
Господа, в пылу выяснения истинны, сдается, потеряли суть вопроса.. :)
Где тут реализация работы стека? Посмотрите на пример лабораторной работы... (кстати, понятие стека и очереди есть разное, это к примеру лабы). Ну да ладно, если автор вопроса по незнанию согласен, то ей видней :)
Но согласитесь, делать константным размер массива в случае со стеком, и даже не дать пользователю определить этот размер — весьма странно. Да и наверно можно обойтись без массива...В случае с массивом (если уж так хочется), думается, можно вполне задать его размер после заполнения стека посредством size() стека.

Например: int count = (s1.siz() > s2.size())? s2.size():s1:size();
это для количества элементов, дабы не выйти за границы массива — выбираем наименьший размер (если в последствии использовать цикл for, в данном случае, count это index).
Ну и, собственно массивы:
int *m1 = new int[s1.size()];
int *m2 = new int[s2.size()];
как то так.. Кстати, всякому оператору new должен соответствовать оператор delete..
Неизвестный
23.05.2010, 09:49
общий
Хватит уже.Я сделал то что меня попросили и не додумывал ничего.Эту истину я вынес и прошлых ответов.С динамическими массивами я ошибся мне пальцем тыкнули и я признал это.Вопрос изчерпан.

Цитата: 19206
Но согласитесь, делать константным размер массива в случае со стеком,


Я же написал.Мнипулируя значением этой переменой.Константа тут просто условно написана.Как будто мы уже получили команду выделить какойто размер.Если переменую индекс вставить как параметр функции и вызывать эту функцию из главной функции то где вы тогда видете константный стек?
Неизвестный
23.05.2010, 16:01
общий
Подскажите, пожалуйста, я так и не поняла, где правильная программа?
Неизвестный
23.05.2010, 16:26
общий
sveta11115:
В ответе сейчас исправленный вариант.
Неизвестный
23.05.2010, 18:22
общий
Спасибо
Неизвестный
24.05.2010, 08:21
общий
Теперь у меня не идет программа. А раньше (неисправленный вариант) работала.
Неизвестный
24.05.2010, 08:25
общий
В чём вы компилируете?
Неизвестный
24.05.2010, 08:30
общий
Microsoft Visual C++ 2008 Express Edition
Неизвестный
24.05.2010, 08:39
общий
В принцмпе странно.Странно потому что новый вариант ни чем не отличается.Я не пользуюсь вижуал си++А какая ошибка?
Неизвестный
24.05.2010, 08:55
общий
sveta11115:
А не компилируется он у Вас, скорее всего, потому, что количество элементов массива должно быть константой. Попробуйте строку
int index=10,a;
заменить на
const int index=10;
int a;
Неизвестный
24.05.2010, 09:10
общий
Ошибка какая?Или разобрались уже?
Неизвестный
24.05.2010, 09:31
общий
Да, спасибо, исправила, что Вы сказали, и все нормально стало.
Форма ответа