Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стек. ошибка удаления иногда возникает, ошибка удаления 
:(
    Опции темы
ника18
  Дата 16.12.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.12.2010

Репутация: нет
Всего: нет



Описать класс Lifo, реализовать стек произвольного размера для хранения целых чисел, добавление и извлечение одиночного элемента из стека, реализовать при помощи перегрузки операций >, <. Добавлять последовательность элементов, перегрузив оператор >>. Вывод на экран - <<.

Проблема в реализации, иногда удаление норм работает, а иногда при удаление прога вылетает
Пример когда вылетает

Это реализация
 smile 
сейчас в стеке один элемент, равный 0
Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
1
введите элемент
2


Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
2
сколько еще элементов будет загружено в стек?
4
Введите1элемент
4
Введите2элемент
5
Введите3элемент
6
Введите4элемент
7


Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
4
Весь стек:
7 6 5 4 2 0

Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
3
вводим 3 и прога вылетает, почему так и как это исправить?

Код C++

    
Код


#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std; 
class Lifo
{
 private:
        struct element
        { 
         int value; // ячейка для хранения инфоормации
         element *next; // указатель на следующий элемент стека
        };
  element *last; // указатель на последний элемент стека
 public:
Lifo(void) //  Конструктор без параметра
        {
         last=new element;
         last->value=0;
         last->next=NULL; 
        }; 
Lifo (int x) // Конструктор с параметром
        {
         last=new element;
         last->value=x;
         last->next=NULL;
        };
void operator>(int val) // операция >
        {
         element *pv=new element;
         pv->value=val;
         pv->next=last;
         last=pv; 
        };
void operator>>(int n) // добавление эл-тов в стек 
        {
         int val; 
         for(int i=0;i<n;i++)
                {
         cout<<"Введите"<<i+1<<"элемент"<<endl;
         cin>>val;
         element *pv=new element;
         pv->value=val; 
         pv->next=last;
         last=pv;
                };
        };
void operator< (int a) //операция <
        {
         cout<< "Последне введенное число: "  << last->value <<endl; 
         element *pv=last;
         last=last->next; 
         delete pv; 
        };
void operator<<(int a)//вывод на экран
        {
         cout<<"Весь стек:"<<endl; 
         while(last!=NULL)
                {
                 cout<<last->value<<" " ;
                 element *pv=last;
                 last=last->next; 
             delete pv; 
                };
        }; 
};
 
int  _tmain()
{
        setlocale(LC_ALL,"Russian") ;
 Lifo A(0);
 char znak;
 cout<<"сейчас в стеке один элемент, равный 0"<<endl;
for(int i=0;i<5;i++)
 {
        cout<<"Выберете операцию:\n1-загрузить в стек один элемент;\n2-загрузить в стек несколько элементов;\n3-вывести последний загруженный эл-т и удалить его;\n4-вывести весь стек"<<endl;
    cin>>znak;
        int n;
         switch (znak)
          { 
                case '1':
                                 int q;
                                 cout<<"введите элемент"<<endl;
                                 cin>>q;
                                 A. operator>(q);
                                 break; 
                case '2':
                                 cout<<"сколько еще элементов будет загружено в стек?"<<endl;
                                 cin>>n;
                                 A. operator >>(n);
                                 break; 
                case '3':
                                 A.operator <(0);
                                 break; 
                case '4':
                                 A.operator <<(0);
                                 break;
          }
    cout<<"\n"<<endl; 
} 
_getch();
return 0; 
}

PM MAIL   Вверх
Crafty
Дата 16.12.2010, 22:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Твой класс работает с динамической памятью, а деструктор у тебя отсутствует. Не совсем логично перегружать операторы больше и меньше для заполнения стека, луычше уж создать ф-ции члeны push и pop. И еще поидеи конструктор по умолчанию не должен заполнять стек, а должен только присвоить указателю на стек NULL.
PM MAIL   Вверх
ника18
Дата 16.12.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.12.2010

Репутация: нет
Всего: нет



а меня думаешь спрашивали, как логичнее???? это задание такое выше читай
PM MAIL   Вверх
toxx
Дата 16.12.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата

а меня думаешь спрашивали, как логичнее???? это задание такое выше читай 

будь проще и люди к тебе потянуться

а по теме, ты удаляешь весь стэк, и хочешь чтобы он потом тебе вывел элемент? класно


PM MAIL   Вверх
ника18
Дата 17.12.2010, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.12.2010

Репутация: нет
Всего: нет



честно не совсем поняла я с сети прогу брала, эту часть и сама в ней не могу разобраться
PM MAIL   Вверх
Чoо
Дата 17.12.2010, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



ника18, если мы "эмулируем" работу стека, то при выводе элементов мы их извлекаем из стека, то бишь удаляем. Если бы сохраняли, то это был бы уже не стек, а список.
Проще стек ппредставить как стопку тарелок. Положили тарелку в стопку - добавили элемент в стек. Положили много тарелок. Затем, что бы вытащить первую, нам надо по очереди вытащить все те что сверху - извлечь из стека. 
Ну или другими словами, помещая в стек, мы сохраняем в нем элемент, извлекая из стека - удаляем элемент. При чем, нельзя извлечь элемент из середины.
а программа вылетает, потому что не сделали контроль: если стек пуст, то все-равно программа пытается извлечь элемент. 
вопщем ща гляну чо сделать можно

Добавлено @ 02:51
Код

void operator< (int a) //операция <
        {
            if(last)
            {
                 cout<< "Последне введенное число: "  << last->value <<endl;
                 element *pv=last;
                 last=last->next;
                 delete pv;
             }
            else
                cout << "Стек пуст...\n";
        };
void operator<<(int a)//вывод на экран
        {
         if(last)
         {
             cout<<"Весь стек:"<<endl;
             while(last!=NULL)
                    {
                     cout<<last->value<<" " ;
                     element *pv=last;
                     last=last->next;
                 delete pv;
                    };
         }
         else
            cout << "Стек пуст...\n";
        };
};

вот эти две функции замените.
Хотя реализация мне не нравится. Цикл, в котором работаем со стеком, не бесконечный. 
Ну и меню надо чуть переписать:
Код

        cout<<"Выберете операцию:\n"
                     "1-Отправить в стек один элемент;\n"
                     "2-Отправить в стек несколько элементов;\n"
                     "3-Извлечь эл-т из стека;\n"
                     "4-Извлечь все элементы из стека\n";

Что элемент будет удален писать не надо, и так понятно - стек же.

Это сообщение отредактировал(а) Чoо - 17.12.2010, 14:48


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 17.12.2010, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(ника18 @  17.12.2010,  01:07 Найти цитируемый пост)
честно не совсем поняла я с сети прогу брала, эту часть и сама в ней не могу разобраться 

а надо бы. если не понятно - запускать программу в пошаговом режиме и смотреть что происходит.

Добавлено через 7 минут и 41 секунду
деструктор. Куда-нибудь вставьте smile
Код

~Lifo(void)
{
    while(last!=NULL)
    {
        element *pv=last;
        last=last->next;
        delete pv;
    }
}



--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.