Автор Тема: Классы и структуры С++  (Прочитано 5281 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Данила

  • Глобальный модератор
  • *****
  • Сообщений: 1657
  • Математик-экстрасенс
    • Просмотр профиля
Классы и структуры С++
« : 09 Ноября 2009, 14:06:52 »
Помогите найти косяк в коде.
Задание

Определить структуру CStudent c полями имя,средний балл,номер группы.Определить класс CStudentList,работающий со списками студентов и реализовать в нем следующие функции : добавление элемента в начало списка,в конец списка,подсчет кол-ва элементов, добавление элемента в произвольную позицию списка, удаление элемента по позиции элемента,получение элемента заданной позиции.Отдельно реализовать функцию ввода одного элемента с клавиатуры и функцию вывода на экран одного элемента.

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

// KT_Lab_2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

struct CStudent
{
   char src_Name[30];
   int src_AvBall, src_NumGroup;
   CStudent *src_Link;
   CStudent ();
};

class CStudentList
{
   private:
      CStudent *CStdList_Head;
      CStudent CStdList_NULL;
   public:
      CStudentList ();
      ~CStudentList ();
      void AddTail (const CStudent &src);
      void AddHead (const CStudent &src);
      int GetCount () const;
      int InsertAt (int nIndex, const CStudent &src);
      int Remove (int nIndex);
      CStudent GetAt (int nIndex);
};

CStudent::CStudent ()
{
   src_Link = NULL;
}

CStudentList::CStudentList ()
{
   CStdList_Head = NULL;
   memcpy(CStdList_NULL.src_Name, "empty", 6);
   CStdList_NULL.src_AvBall = -1;
   CStdList_NULL.src_NumGroup = -1;
   CStdList_NULL.src_Link = NULL;
};

CStudentList::~CStudentList ()
{
   CStudent *CStdList_Temp = CStdList_Head;
   while (CStdList_Head != NULL)
      {
         CStdList_Head = CStdList_Head->src_Link;
         delete CStdList_Temp;
         CStdList_Temp = CStdList_Head;
      }
};

void CStudentList::AddTail (const CStudent &src)
{
   CStudent *CStdList_Temp = CStdList_Head;
   if (! CStdList_Temp)
   {
      CStudent *CStdList_Head = new CStudent;
      *CStdList_Head = src;
   } else
   {
   while (CStdList_Temp->src_Link != NULL)
      CStdList_Temp = CStdList_Temp->src_Link;
   CStudent *CStdList_New = new (CStudent);
   *CStdList_New = src;
   CStdList_Temp->src_Link = CStdList_New;
   }
};

void CStudentList::AddHead (const CStudent &src)
{
   CStudent *CStdList_Temp = CStdList_Head;
   CStudent *CStdList_New = new (CStudent);
   *CStdList_New = src;
   CStdList_New->src_Link = CStdList_Temp;
   CStdList_Head = CStdList_New;
};

int CStudentList::GetCount() const
{
   int CStdList_Count = 0;
   CStudent *CStdList_Temp = CStdList_Head;
   while (CStdList_Temp != NULL)
   {
      CStdList_Temp = CStdList_Temp->src_Link;
      CStdList_Count++;
   };
   return (CStdList_Count);
};

int CStudentList::InsertAt (int nIndex, const CStudent &src)
{
   int i=0;
   
   
      CStudent *CStdList_Temp = CStdList_Head;
      CStudent *CStdList_Temp2;
      if (CStdList_Temp->src_Link == NULL) return -1;
      else
      {
      
      while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
   
   {
      i++;
      CStdList_Temp2 = CStdList_Temp;
      CStdList_Temp = CStdList_Temp->src_Link;
   }
      }
   if (i == nIndex)
   {
      CStudent *CStdList_New = new (CStudent);
      *CStdList_New = src;
      CStdList_Temp2->src_Link = CStdList_New;
      CStdList_New->src_Link = CStdList_Temp;
      return 0;
   }
   else
   {
   return -1;
   }
};

int CStudentList::Remove (int nIndex)
{
   int i=0;
   CStudent *CStdList_Temp = CStdList_Head;
   CStudent *CStdList_Temp2;
   if (CStdList_Temp->src_Link == NULL) return -1;
      else
      {
   while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
   {
      i++;
      CStdList_Temp2 = CStdList_Temp;
      CStdList_Temp = CStdList_Temp->src_Link;
   }
      }
   if (i == nIndex)
   {
      CStdList_Temp2->src_Link = CStdList_Temp->src_Link;
      delete (CStdList_Temp);
      return 0;
   }
   else
   {
   return -1;
   
   }
};


CStudent CStudentList::GetAt (int nIndex)
{
   int i=0;
   CStudent *CStdList_Temp = CStdList_Head;
   while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
   {
      i++;
      CStdList_Temp = CStdList_Temp->src_Link;
   }
   if (i == nIndex)
   {
      return *CStdList_Temp;
   }
   else
   {
   return CStdList_NULL;
   }
};

void Insert (CStudent &src)
{
   printf ("Creating new record.\n");
   printf ("Insert a name: ");
   scanf ("%s", src.src_Name);
   printf ("Insert an average ball: ");
   scanf ("%d", &src.src_AvBall);
   printf ("Insert a number of group: ");
   scanf ("%d", &src.src_NumGroup);
   printf ("Creating completed.\n");
};

void View (const CStudent &src)
{
   printf ("Student %s.\n",src.src_Name );
   printf ("Average ball: %d.\n",src.src_AvBall);
   printf ("Number of group: %d.\n",src.src_NumGroup);
};

void Help()
{
   
   printf("addt — добавление к конец списка\n");
   printf("addh — добавление в начало списка\n");
   printf("getc — получить число студентов в списке\n");
   printf("insertat — добавление в указанное место списка\n");
   printf("insert — добавление в список\n");
   printf("remove — удаление одного студента из списка\n");
   printf("getstd — получить информацию о студенте\n");
}

int _tmain (int argc, _TCHAR* argv[])

{
   int Count;
   int nIndex=0;
   string cmd;
   CStudent Stud;
   CStudentList List;
   printf("Чтобы увидеть список команд введите Help .\n");
   do
   {
      printf ("Input command: ");
      cin >> cmd;
      if (cmd == string("help"))
         Help();
      if (cmd == string("insert"))
         Insert (Stud);
      View (Stud);
      if (cmd == string("addh"))
      {
         List.AddHead (Stud);
         Insert (Stud);
         View (Stud);
      }
      
      if (cmd == string("addt"))
      {
         List.AddTail (Stud);
         Insert (Stud);
         View (Stud);
      }
 
      if (cmd == string("insertat"))
      {
         printf("Введите номер позиции:");
         scanf ("%d. \n",nIndex);
         List.InsertAt (nIndex,Stud);
         Insert(Stud);
      }
      if (cmd == string("getc"))
      {
      Count = List.GetCount();
      printf ("%d. \n",Count);
      }
      if (cmd == string("getstd"))
      {
         
         Stud = List.GetAt (2);
         View (Stud);
      }
      if (cmd == string("remove"))
      {
         printf("Введите номер студента для удаления:");
         scanf("%d. \n",nIndex)
         List.Remove (nIndex);
      }
   }
   while  (cmd == string("exit"));
      /*Count = List.GetCount();
      printf ("%d",Count,"\n");
      scanf ("%d", &Count);*/
}

« Последнее редактирование: 09 Ноября 2009, 14:13:09 от Данила »
Просьба не кидать мне в ЛС Ваши задания...создаем тему,пишем свое задание,наработки\идеи...полностью и нахаляву ничего не решаю

Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #1 : 09 Ноября 2009, 20:37:08 »
Я связный списои такие к делал на Паскале и такие баги чаще всего возникали когда указатель, говоря на C++, обращался в NULL.Она выкидывает такие вещи когда пытаешься удалять пустоту. Вообщем проверь указатели на NULL   
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #2 : 09 Ноября 2009, 20:57:08 »
Вот только у тебя странный фрагмент кода:
   while  (cmd == string("exit"));
      /*Count = List.GetCount();
      printf ("%d",Count,"\n");
      scanf ("%d", &Count);*/
}
Может все-таки !=., а то как-то странно у тебя это все будет работать, ведь "exit" ты определил для выхода или как? И вообще зачем этот кусок кода
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Данила

  • Глобальный модератор
  • *****
  • Сообщений: 1657
  • Математик-экстрасенс
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #3 : 10 Ноября 2009, 12:41:01 »
да,там неравно..не заметил,ибо код еще до того момента падает...указатели на нульность проверял,все равно падает...
Просьба не кидать мне в ЛС Ваши задания...создаем тему,пишем свое задание,наработки\идеи...полностью и нахаляву ничего не решаю

Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #4 : 11 Ноября 2009, 18:50:53 »
Насчет проверки указателей я имел ввиду при помощи дебагера во время выполнения. Потом есть же репризатории исходников, где есть примеры прог, использующих связные списки и двусвязные. Возьми какой-нибуд из них и заточи под свою задачу
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Данила

  • Глобальный модератор
  • *****
  • Сообщений: 1657
  • Математик-экстрасенс
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #5 : 11 Ноября 2009, 22:38:38 »
как раз через дебаг и смотрел...есть стандартный list ,но препод сказал что нех его пока юзать,пишите ручками...в листе есть и добавление в хвост и в начало ,и удаление...эх
Просьба не кидать мне в ЛС Ваши задания...создаем тему,пишем свое задание,наработки\идеи...полностью и нахаляву ничего не решаю

Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн samar

  • Пользователь
  • **
  • Сообщений: 41
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #6 : 12 Ноября 2009, 19:33:33 »

int CStudentList::Remove (int nIndex)
{
   int i=0;
   CStudent *CStdList_Temp = CStdList_Head;
   CStudent *CStdList_Temp2;
   if (CStdList_Temp->src_Link == NULL) return -1;
      else
      {
   while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
   {
      i++;
      CStdList_Temp2 = CStdList_Temp;
      CStdList_Temp = CStdList_Temp->src_Link;
   }
      }
   if (i == nIndex)
   {
      CStdList_Temp2->src_Link = CStdList_Temp->src_Link;
      delete (CStdList_Temp);
      return 0;
   }
   else
   {
   return -1;
   
   }
};




Во-первых в этой строчке
 if (CStdList_Temp->src_Link == NULL) return -1;
может быть потенциальная ошибка(т.е. вы пытаетесь разыименовать указатель, не проверив его валидность). Правильно будет
  if(CStdList_Temp==NULL || (CStdList_Temp != NULL && CStdList_Temp->src_Link == NULL)) return -1;

Строка
delete (CStdList_Temp);
лучше всего исользовать delete так
delete CStdList_Temp;

В данном алгоритме удаления не учитывается ситуация, когда удаляется элемент с индексом 0, а также если в списке один элемент.

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #7 : 12 Ноября 2009, 20:38:23 »
Кстати найди книжку:
 Арт Фридман Ларс Кландер Марк Михаэлис Херб Шильдт
С\С++ Алгоритмы и приемы программирования. Там как раз очень подробно рассматривают списки и реализуют класс С++, который работает со связанным списком. И там просто хорошие объяснения многих алгоритмов. Может пригодится))   
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Данила

  • Глобальный модератор
  • *****
  • Сообщений: 1657
  • Математик-экстрасенс
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #8 : 12 Ноября 2009, 21:42:01 »
спасибо,уже пофиксил и сдал...)
Просьба не кидать мне в ЛС Ваши задания...создаем тему,пишем свое задание,наработки\идеи...полностью и нахаляву ничего не решаю

Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #9 : 12 Ноября 2009, 21:55:20 »
Слушай а отфиксенный вариант не выложишь?))
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Данила

  • Глобальный модератор
  • *****
  • Сообщений: 1657
  • Математик-экстрасенс
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #10 : 12 Ноября 2009, 22:42:28 »
прошу...единственное,там не учтено удаление 1го элемента...мне стало лень дорабатывать )
Просьба не кидать мне в ЛС Ваши задания...создаем тему,пишем свое задание,наработки\идеи...полностью и нахаляву ничего не решаю

Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Данила

  • Глобальный модератор
  • *****
  • Сообщений: 1657
  • Математик-экстрасенс
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #11 : 13 Ноября 2009, 13:50:10 »
блин...удаление 1го элемента так и не получается сделать...вроде с индексацией все в порядке,а не хочет
Просьба не кидать мне в ЛС Ваши задания...создаем тему,пишем свое задание,наработки\идеи...полностью и нахаляву ничего не решаю

Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн samar

  • Пользователь
  • **
  • Сообщений: 41
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #12 : 13 Ноября 2009, 15:31:57 »
я бы посоветовал посмотреть следующие книги:
- Вирт "Структуры данных" (точно не помню название)
- Джон Хопкрофт, Джеффри Ульман, Альфред Ахо "Структуры данных и алгоритмы"

в них очень подробно разобранно (на Паскале) построение и работа со структурами данных. Классические труды.

Оффлайн Данила

  • Глобальный модератор
  • *****
  • Сообщений: 1657
  • Математик-экстрасенс
    • Просмотр профиля
Re: Классы и структуры С++
« Ответ #13 : 13 Ноября 2009, 15:35:32 »
ан нет...поправил сей косяк....вот готовая лаба,со всеми фиксами
Просьба не кидать мне в ЛС Ваши задания...создаем тему,пишем свое задание,наработки\идеи...полностью и нахаляву ничего не решаю

Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

 

СИ структуры, вывести в порядке убывания количества

Автор neiromagick

Ответов: 2
Просмотров: 4164
Последний ответ 09 Января 2011, 23:39:11
от Данила
Структуры и алгоритмы обработки данных

Автор was9

Ответов: 1
Просмотров: 2952
Последний ответ 13 Апреля 2011, 00:03:47
от XTen
С++. Структуры и массивы структур.

Автор Beauty44

Ответов: 0
Просмотров: 2991
Последний ответ 22 Сентября 2013, 17:55:56
от Beauty44
Виртуальные методы и классы

Автор БАЛАШИК

Ответов: 3
Просмотров: 2862
Последний ответ 28 Октября 2010, 15:47:36
от testtest
Две на тему: "Структуры и динамические структуры данных"

Автор Dima3Mastertwo

Ответов: 6
Просмотров: 3453
Последний ответ 23 Февраля 2010, 18:40:04
от Dima3Mastertwo