Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2009, 16:44   #1
ge4r
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 18
По умолчанию Сруктура и класс

Помогите найти косяк в коде.
Задание

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

Код:
#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);
};
Вложения
Тип файла: txt Fail.txt (5.3 Кб, 148 просмотров)
ge4r вне форума Ответить с цитированием
Старый 12.11.2009, 16:46   #2
ge4r
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 18
По умолчанию

Код:
void Help()
{
	
	printf("addt - adding to tail\n");
	printf("addh - adding to head\n");
	printf("getc - number of students\n");
	printf("addat - adding to custom place\n");
	printf("remove - delete student\n");
	printf("getstd - info about student\n");
}

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

{
	int Count;
	int nIndex=0;
	string cmd;
	CStudent Stud;
	CStudentList List;
	printf("Print help to get list of commands .\n");
	do 
	{
		printf ("Input command: ");
		cin >> cmd;
		if (cmd == string("help"))
			Help();
		
          
		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("addat"))
		{
			printf("Input position number:");
			cin >>nIndex;
			List.InsertAt (nIndex,Stud);
			Insert(Stud);
			View (Stud);
		}
		if (cmd == string("getc"))
		{
		Count = List.GetCount();
		printf ("%d. \n",Count);
		}
		if (cmd == string("getstd"))
		{
			printf("Input position number:");
			cin >>nIndex;
			Stud = List.GetAt (nIndex-1);
			View (Stud);
		}
		if (cmd == string("remove"))
		{
			printf("Input postion number to delete:");
			//scanf("%d. \n",nIndex);
			cin >> nIndex;
			List.Remove (nIndex-1);
		}
	}
	while  (cmd != string("exit"));

}
мой код компилится,но вот когда пытаюсь добавить 2 раза в голову,то при запросе 1го элемента все рано получаю тот что добавлял 1ым,а второй вообще теряется...аналогично видимо и с добавлением в хвост...ну и если несложно,погоняйте программку(хелпина есть),может еще какие баги найдете - пишите...программа прилагается в тхт ибо в срр нельзя выкладывать
ge4r вне форума Ответить с цитированием
Старый 12.11.2009, 17:34   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
List.AddHead (Stud); // Добавляем копию Stud в список
Insert (Stud); // вводим значения в Stud
View (Stud); // Выводим Stud
// Если тут выводить голову списка, а не Stud, то сразу будет
// видно несоответствие введенных и хранимых в списке данных
Можно попробовать банально переставить местами строки:
Код:
Insert (Stud);
List.AddHead (Stud);
View (Stud);
pu4koff вне форума Ответить с цитированием
Старый 12.11.2009, 18:29   #4
ge4r
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 18
По умолчанию

блин...чертовски верное замечание....поправил,все заработало...хотя пока первые тесты,сейчас буду все подробно проверять...спасибо)
ge4r вне форума Ответить с цитированием
Старый 13.11.2009, 13:29   #5
ge4r
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 18
По умолчанию

и все же косяк найден...не удаляется ни в какую 1ый элемент,то есть глава списка...в процедуре ремув ошибки не вижу,вроде бы все логично
ge4r вне форума Ответить с цитированием
Старый 13.11.2009, 13:44   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
int CStudentList::Remove (int nIndex)
{
	int i=0;
	CStudent *CStdList_Temp = CStdList_Head;
	CStudent *CStdList_Temp2;
	// Если в списке 1 элемент, то его удалить не получится
	if (CStdList_Temp->src_Link == NULL) return -1;
		else
		{
	// При удалении "головы", этот цикл не выполняется
	// => CStdList_Temp2 не инициализируется и указывает на "мусор"
	while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
	{
		i++;
		CStdList_Temp2 = CStdList_Temp;
		CStdList_Temp = CStdList_Temp->src_Link;
	}
		}
	if (i == nIndex)
	{
		// При nIndex == 0, CStdList_Temp2 == "мусор"
		CStdList_Temp2->src_Link = CStdList_Temp->src_Link;
		delete (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;
	if (!nIndex) // Удаление "головы"
	{
		CStdList_Head = CStdList_Head->src_Link;
		delete (CStdList_Temp);
		return 0;
	}
		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;
	
	}
};
pu4koff вне форума Ответить с цитированием
Старый 13.11.2009, 14:27   #7
ge4r
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 18
По умолчанию

спасибо,помогло.
ge4r вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ . Класс Ануар56 Помощь студентам 8 23.04.2009 19:41
олимпиада 10 класс Marsik Фриланс 2 13.10.2008 01:12
Класс Юлёк Фриланс 6 15.06.2008 15:00
Класс по имени Sibedir Общие вопросы Delphi 2 04.12.2007 08:24