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

Поиск:

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


Новичок



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

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



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

Код

#ifndef class_stek
#define class_stek

struct element
    {  int key;
       char data;
       element *next;
       element *prev;
    };

class stek
{
private:
    element *beg;
public:
    stek(); 
    ~stek(); 
    void add(char x, int key);
    void remove_beg();
    void remove_end();
    void show();
};
#endif


Код

#include <stdio.h>
#include <cstdlib>
#include <conio.h>
#include "tips.h"
stek::stek()
{beg=0;
};

void stek::add(char data, int key )
{   element *y;
    printf("put data");
    putch(data);
    printf("put key");
    putch(key);
    element *link = new element;
    link->data = data;
    link->key=key;
    if (beg == 0)
    {
     link->next=0;
     link->prev=0;
     beg = link;
     }
    else 
    {if (beg->key<link->key)
     {
      link->next = beg;
      link->prev=0;
      beg=link;
     } else 
       {if (beg->key==link->key)
       {link->key=link->key+1;
        link->next=beg;//vstavka v nachalo pri sovpadenii kluchei
        beg->prev=link;
        link->prev=0;
        beg=link;
       } else
       { y=beg;
         while(y->next->key>link->key || y->next==0) 
          {if (y->next==0)
           {y->next=link;//dobavlenie v konec
           link->prev=y;
           link->next=0;
           } else
           y=y->next;
           };
          y->next->prev=link; //vstavka elementa
          link->next=y->next;
          link->prev=y;
          y->next=link;
         };
       };     
    };
 };


void stek::remove_beg()//udalenie elementa s naibolshim kluchem
{   element *x;
     if (beg==0)
    {printf("spisok pust\n");
     } else
     {if (beg->next==0) 
       {x=beg;
        delete x;
        beg=0;
       } else
      {x=beg;
       beg=x->next;
       beg->prev=0;
       delete x;
      }
     }
};

void stek::remove_end()//udalenie elementa s naimenshim kluchem
{ element *x, *y;
  if (beg==0)
    {printf("spisok pust\n");
     } else
     {if (beg->next==0) 
       {x=beg;
        delete x;
        beg=0;
       } else
       {x=beg;
         while (x->next) 
         {y=x;
          x=x->next;
          };
         y->next=0;
         delete x;
         };
       };
};
  

stek::~stek()
{element *x = beg;
    if (beg==0)
    {printf("spisok pust\n");
     }
      else
    if (beg->next!=0)
    {while (beg->next)
     {x=beg;
      beg=x->next;
      beg->prev=0;
      delete x;
      };
     } else
    {x=beg;
     delete x;
    };
    beg=0;
};

void stek::show()
{
 while (beg->next)
 {printf("beg->data\n");
  beg->next=beg;
  };
}


Код

#include <stdio.h>
#include <conio.h>
#include "tips.h"
using namespace std;


main()
{
  stek u;
  element v;
  int k, choise,key;
  char  data;
  k=1;
  while(k)  
  {
  printf("viberite deistvie\n");
  printf("1- create list\n");
  printf("2- add new element\n");
  printf("3- delete element from beginning\n");
  printf("4 - delete element from end\n");
  printf("5- show list\n");
  printf("6- delete all\n");
  printf("exit - press any key\n");  
  putch(choise);
  switch (choise)
    {case '1': stek(); break;
     case '2': u.add(data,key);break;              
     case '3': u.remove_beg(); break;
     case '4': u.remove_end(); break;
     case '5': u.show();break;
     case '6': u.~stek();break;
     default: k=0;
     };
    
   } ;
getch();
}


PM MAIL ICQ   Вверх
Tipok
Дата 3.11.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



lemuriaIATE, окно у тебя закрывается потому, что в switch..case надо убрать апострофы у цифр. 

Ну а в остальном...
PM MAIL   Вверх
lemuriaIATE
Дата 3.11.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



работает (точнее не работает) одинаково что с апострофами, что без них(
PM MAIL ICQ   Вверх
Tipok
Дата 3.11.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



lemuriaIATE, без апострофов по крайней мере методы вызываются. Тока вот работают они не правильно
PM MAIL   Вверх
lemuriaIATE
Дата 3.11.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а что нужно исправить? или там вообще все неправильно?? сижу уже над этим не знаю сколько...
PM MAIL ICQ   Вверх
Tipok
Дата 3.11.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(lemuriaIATE @ 3.11.2007,  13:23)
работает (точнее не работает) одинаково что с апострофами, что без них(

Там еще putch() замени на cin >> choise. Но методы от этого не заработают
PM MAIL   Вверх
lemuriaIATE
Дата 3.11.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



так а что надо исправить, чтобы они заработали??
для того, чтобы использовать cin нужно подключить iostream.h, в моем компиляторе это нельзя сделать, приходится использовать putch. чем плоха эта функция?
PM MAIL ICQ   Вверх
Fokspro
Дата 3.11.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.11.2007
Где: г. Шахты

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



1. Зачем ты пишешь  using namespace std; если ты им не пользуешься!

2. Функция putch(choise) - печатает на экран переменную choise, нужно использовать: choise=getch(); а затем для ее вывода putch(choise);  Либо уж пользуйся библиотекой std:  std::cin>>k;  Тогда и сама цифра отобразится и переменная примет значение.  Но тогда в кейзах нужно не символы '1', '2' и т.д. писать а именно цифры 1, 2, 3, 4, 5, 6.

3. Переменная choise - лишняя достаточно сделать так:

k=0;
while(k)
{
    ...
    k = getch();
    switch(k)
   {
       case '1': ... break;
       case '2': ... break;
       ...
       default:
           k = 0;
           break;
   }
}

4. Нельзя вызывать методы класса без самого объекта!!! (по поводу case '1': Stek(); ...)  более это конструтор (да и деструтор тоже). Конструтор уже вызвался, потому как программа запущена у тебя и объявлен экземпляр класса Stek u. А вот когда прога отработает, то и деструтор вызовется автоматически при удалении экзепляра класса (u). Здесь два варианта:

    (1) Объявлять Stek * u;   а в кейзах делать u = new Stek;   и   delete u;   вот это более правильно.

    (2) Засунуть инициализацию не в контрутор, а скажем, в метод void Stek::Init()  и его вызвать при нажатии единицы, т.е. case '1': u.Init();  Тоже самое с деструтором.


Это по общей организации программы. Дальше напишу другие косяки.
PM MAIL ICQ   Вверх
lemuriaIATE
Дата 3.11.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Fokspro @  3.11.2007,  15:10 Найти цитируемый пост)
1. Зачем ты пишешь  using namespace std; если ты им не пользуешься!

на самом деле, я даже не знаю, что это такое.. сказали, что нужно написать, я написала.


Цитата(Fokspro @  3.11.2007,  15:10 Найти цитируемый пост)
(2) Засунуть инициализацию не в контрутор, а скажем, в метод void Stek::Init()  и его вызвать при нажатии единицы, т.е. case '1': u.Init();  Тоже самое с деструтором.

ага, поняла, исправлю. 

спасибо! буду ждать дальнейших пояснений. 
вы уж меня сильно не ругайте, первый раз самостоятельно пишу smile
PM MAIL ICQ   Вверх
bsa
Дата 3.11.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(lemuriaIATE @ 3.11.2007,  15:04)
для того, чтобы использовать cin нужно подключить iostream.h, в моем компиляторе это нельзя сделать

iostream.h - это устарело. Вместо него надо подключать iostream:
Код
#include <iostream>
...
using namespace std; - это вообще вещь необязательная. Можно писать и так (считается более предпочтительным):
Код
...
std::cin >> ...;
std::cout << ... << std::endl;

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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