Сам себя гружу...

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Vladimir89
Сообщения: 76
Зарегистрирован: 21 май 2007, 02:25

Занятия в универе по Си++ закончились. Пришло время отправляться в свободное пдавание. Решил по собственной инициативе сделать программу которая бы составляла расписание для школы.
Пока что у меня написан только класс учитель (и то он не доделан).
Но дело в другом. тут мне понадобиться учителей засунуть в Динамическую структуру. Я уже решил что это будет Стек. Так вот, и решил я не стандартным стеком пользоваться а своим собственным написаным И возникла у меня проблема:

Код: Выделить всё

#include "stdafx.h"
#include "iostream"
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
class teacher
{
	char name[20];
	char fam[20];
	char otch[20];
    char spec[20];
    

public:
	
	teacher* next;
	int pos;
	char* getName()
	{return name;}
	char* getFam()
	{return fam;}
	char* getOtch()
	{return otch;}
    char* getSpec()
	{return spec;}
		teacher()
	{
		cout<<endl<<"Input name: ";
		cin>>name;
		cout<<endl<<"Input familiyu: ";
		cin>>fam;
		cout<<endl<<"Input otchestvo: ";
		cin>>otch;
		cout<<endl<<"Input specialnost: ";
		cin>>spec;
	pos=0;
		}
~teacher()
{
cout<<"Teacher "<<fam<<" "<<name<<" "<<otch<<" was deleted.";
}

teacher(const teacher& U)
{
	char name1[20];
	char fam1[20];
	char otch1[20];
    char spec1[20];
strcpy(name1,name);
strcpy(fam1,fam);
strcpy(otch1,otch);
strcpy(spec1,spec);
}
friend ostream& operator << (ostream& p , teacher& U);

};

ostream& operator << (ostream& p , teacher& U)
{
	return p<<endl<<"Familiya: "<<U.fam<<", Name: "<<U.name<<",Otchestvo: "<<U.otch<<",Specialnost: "<<U.spec<<endl;
}
class suck
{
	teacher* Top;
public:
	void push(teacher&);
	//void pop(char* f, char* n, char* o);
	void total(void);

};
void suck::total(void)
{
cout<<*Top;
for(;Top->pos!=1 ;)
{
		
	cout<<*Top->next;
	Top=Top->next;
}

}

void suck: :p ush(teacher& U)
{

	if(Top==0)
	{Top=&U	;
	Top->pos=1;}
	else
{
teacher* p;
p=Top;
Top=&U;
U.next=p;
}

}

/*class day
{
	char[10] name;*/



void main(void)
{
	suck S;
	teacher A;
	teacher B;
	cout<<A<<B;
	S.push(A);
	S.push(B);
	S.total();
	_getch();
}
Из всей этой бодяги интересует меня ни что иное как функция TOTAL. Дело в том что при прогоне по шагам дело доходит до нее и случается вылет. Потому что она обращается к несозданной переменной (или что то такое). Вопрос: как сделать так чтобы эта ТОТАЛ выводила весь стек нормально?
Си ++
Здоровье --
Vanush
Сообщения: 56
Зарегистрирован: 10 янв 2008, 22:18

Тебе надо еще много читать,и особенно pointer.
Аватара пользователя
Vladimir89
Сообщения: 76
Зарегистрирован: 21 май 2007, 02:25

А что не так у меня с указателями?
Си ++
Здоровье --
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Первое: почему бы не воспользоваться стеком из STL? Читайте рекомендации Стауструпа. Второе: данный код компилируется? Вы уверены, что при вызове конструктора класса suck указателю Top будет присвоено значение 0?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Чтобы сделать на С++ некое пользовательское приложение, имеющее хоть какую-то реальную пользу, нужно сначала на бумаге нарисовать схему проекта. Иначе говоря, начертить диаграмму классов и функций, стрелками или какими-то другими условными линиями обозначить взаимодействие между ними. Если программа предполагает каким-то образом хранить вводимые данные, то нужно продумать способ чтения и записи этих данных. А уже потом по данной схеме писать реализацию в виде программного кода. Существует понятие "трёхуровневая архитектура". Это значит, что программный код условно разделён на реализацию хранения данных, на бизнес-логику и на интерфейсную часть. Есть ещё такое понятие как паттерны - это некие типовые решения по построению диаграмм классов и их реализации. К сожалению, в большинстве книг по С++ очень мало говорится о проектировании приложений и об архитектуре проекта.
Аватара пользователя
Vladimir89
Сообщения: 76
Зарегистрирован: 21 май 2007, 02:25

Albor писал(а):Первое: почему бы не воспользоваться стеком из STL? Читайте рекомендации Стауструпа. Второе: данный код компилируется? Вы уверены, что при вызове конструктора класса suck указателю Top будет присвоено значение 0?
Потому что на данный момент я только начинаю изучать STL сам по книжке. А в университете я кое как понял как самому писать ДСД (динамические структуры данных). Возможно скоро я смогу переписать код под STL... но это потом. На данном этапе у меня есть проблема и я хочу знать как её решить.
Данный код компилируется. Выдается ошибка при попытке вывести все (функция ТОТАЛ). Причем она выводит все ДСД но потом обращается к несуществующей ДСД и выдается ошибка. Тоесть мне нужен верный способ выхода из цикла.
Си ++
Здоровье --
Аватара пользователя
Vladimir89
Сообщения: 76
Зарегистрирован: 21 май 2007, 02:25

WinMain писал(а):Чтобы сделать на С++ некое пользовательское приложение, имеющее хоть какую-то реальную пользу, нужно сначала на бумаге нарисовать схему проекта. Иначе говоря, начертить диаграмму классов и функций, стрелками или какими-то другими условными линиями обозначить взаимодействие между ними. Если программа предполагает каким-то образом хранить вводимые данные, то нужно продумать способ чтения и записи этих данных. А уже потом по данной схеме писать реализацию в виде программного кода. Существует понятие "трёхуровневая архитектура". Это значит, что программный код условно разделён на реализацию хранения данных, на бизнес-логику и на интерфейсную часть. Есть ещё такое понятие как паттерны - это некие типовые решения по построению диаграмм классов и их реализации. К сожалению, в большинстве книг по С++ очень мало говорится о проектировании приложений и об архитектуре проекта.
На данном этапе мне важно получить не готовый продукт (который по сути никому не нужен), а поднять свой уровень знания языка.
Но за подсказку спасибо :)
Си ++
Здоровье --
Аватара пользователя
Vladimir89
Сообщения: 76
Зарегистрирован: 21 май 2007, 02:25

Albor писал(а): Вы уверены, что при вызове конструктора класса suck указателю Top будет присвоено значение 0?
Ой только сейчас понял что Вы имели ввиду. Не написал конструктор... буду фиксить.
Еще вопрос: нужно ли писать деструктор для класса suck - если да то зачем: ведь мы не используем динамическую память!
Си ++
Здоровье --
Аватара пользователя
Vladimir89
Сообщения: 76
Зарегистрирован: 21 май 2007, 02:25

Код: Выделить всё

#include "stdafx.h"
#include "iostream"
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
class teacher
{
	char name[20];
	char fam[20];
	char otch[20];
    char spec[20];
    

public:
	
	teacher* next;
	int pos;
	char* getName()
	{return name;}
	char* getFam()
	{return fam;}
	char* getOtch()
	{return otch;}
    char* getSpec()
	{return spec;}
		teacher()
	{
		cout<<endl<<"Input name: ";
		cin>>name;
		cout<<endl<<"Input familiyu: ";
		cin>>fam;
		cout<<endl<<"Input otchestvo: ";
		cin>>otch;
		cout<<endl<<"Input specialnost: ";
		cin>>spec;
	pos=0;
		}
~teacher()
{
cout<<"Teacher "<<fam<<" "<<name<<" "<<otch<<" was deleted.";
}

teacher(const teacher& U)
{
	char name1[20];
	char fam1[20];
	char otch1[20];
    char spec1[20];
strcpy(name1,name);
strcpy(fam1,fam);
strcpy(otch1,otch);
strcpy(spec1,spec);
}
friend ostream& operator << (ostream& p , teacher& U);

};

ostream& operator << (ostream& p , teacher& U)
{
	return p<<endl<<"Familiya: "<<U.fam<<", Name: "<<U.name<<",Otchestvo: "<<U.otch<<",Specialnost: "<<U.spec<<endl;
}
class suck
{
	teacher* Top;
public:
	void push(teacher&);
	//void pop(char* f, char* n, char* o);
	void total(void);
    suck()
	{Top=0;}
};
void suck::total(void)
{
cout<<*Top;
do
{

	
	cout<<*Top->next;
	Top=Top->next;

}
while(Top->pos != 1);
}

void suck: :p ush(teacher& U)
{

	if(Top==0)
	{Top=&U	;
	Top->pos=1;}
	else
{
teacher* p;
p=Top;
Top=&U;
U.next=p;
}

}

/*class day
{
	char[10] name;*/



void main(void)
{
	suck S;
	teacher A;
	teacher B;
	cout<<A<<B;
	S.push(A);
	S.push(B);
	system("cls");
	S.total();
	_getch();
}
Вот переделал. Теперь общий вывод работает. расскажу как добился: когда толкьо стек создается его первому элементу в специальную переменную pos присваивается значение 1, дальше все время будут идти элементы у которых pos = 0 . На мой взгляд довольно корявое решение... но пока ничего лушче не придумал.
Си ++
Здоровье --
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Деструктор можно и не писать. Нет ведь динамического выделения памяти. Программа заработала после присвоения 0 указателю Top? Там не в цикле было дело, а в этом указателе, поскольку он был не нулевой.
Ответить