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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2015, 14:05   #1
djrenko
 
Регистрация: 28.03.2015
Сообщений: 3
Печаль Реализовать на базе списка СТЕК и ОЧЕРЕДЬ

Можете помочь с программой?
Создать базовый класс - СПИСОК. Реализовать на базе списка СТЕК и ОЧЕРЕДЬ с виртуальными функциями включения и исключения элементов. Для проверки позднего связывания определить массив указателей на базовый класс, которым присваиваются адреса объектов созданных классов. использовать указатели для вызова виртуальных функций.
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include "Structs.h"

using namespace std;

void init()
{
	setlocale(LC_ALL, "UKR");
}
void run()
{
	List **L;
	char c;
	List* Item;
	double saved;
	Queue QueOb;
	Stack StOb;
	char symbol;
	do{
		cout << "\n---------------МЕНЮ---------------\n1-Создать динамическую структуру.\n2-Показать динамическую структуру.\n3-Загрузить из файла\n----------------------------------\n";
		c = _getch();
		switch (c)
		{
		case '1':
					cout << "\nКуда поместить значение?"
						<< " в очередь или стек? (О/С) : ";
					symbol = _getch();
					cout << symbol << endl;
					symbol = tolower(symbol);
					if (symbol == 'o')
					{
						Item = &QueOb;
						L = &Item;
						cout << "\n\nВведите данные в очередь. По окончанию ввода введите 0:\n";
						for (;;){
							cin >> saved;
							if (saved == 0) break;
							Item->Put(saved);
						}
					}
					else if (symbol == 'c')
					{
						Item = &StOb;
						L = &Item;
						cout << "\n\nВведите данные в стек. По окончанию ввода введите 0:\n";
						for (;;){
							cin >> saved;
							if (saved == 0) break;
							Item->Put(saved);
						}
					}
					break;
		case '2':
					cout << "Откуда извлечь значение?(О/С)\n"
						<< "Нажмите 0, чтобы выйти в меню.";
					symbol = _getch();
					symbol = tolower(symbol);
					if (symbol == '0')
						break;
					if (symbol == 'o') { cout << "\n\nОчередь:"; Item = &QueOb; }
					else if (symbol = 'c') { cout << "\n\nСтек:"; Item = &StOb; }
					else break;
					while (Item->Tail != NULL)
					{
						if (Item->Get(saved))
							cout << saved << "<<";
						else
						{
							cout << "|\n\n----------------------------------\n\n";
							break;
						}
					}
					break;
		case '3':
			/*if (Item == &QueOb || Item == &StOb)
			{
				/*	FILE *stream;
					if ((stream = fopen("Text.txt","at")) == NULL)
					cout << "Error " << endl;
					else
					fwrite((char*)&Item, sizeof(Item), 1, stream);
					fclose(stream);
					break;*/
				/*ofstream output_file;
				output_file.open("C:\\Zona Downloads\\Temp.txt");
				while (&Item->Next != NULL)
				{
					output_file << &Item->Tail;
				}
				output_file.close();
			}
		break; */
			ofstream File;
			File.open("123.bin");
			{
				File.write((char*)Item,sizeof(Item));
				File.close();
			}
		}
	} while (c != '4');
}
/*
istream& operator>>(istream& is, List& L)
{
	double temp=0;
	cin >> temp;
	if (temp)
	L.Put(temp);
	return is;
}
*/
void main()
{
	init();
	run();
}
Выдает ошибку "потенциально неинициализированная локальная переменная-указатель Item вот здесь
Код:
ofstream File;
			File.open("123.bin");
			{
				File.write((char*)Item,sizeof(Item));
				File.close();
			}
Мучаюсь уже неделю
djrenko вне форума Ответить с цитированием
Старый 28.03.2015, 14:05   #2
djrenko
 
Регистрация: 28.03.2015
Сообщений: 3
По умолчанию

Определения классов:
Код:
#include <iostream> 
#include <stdlib.h> 
#include <ctype.h> 
//Абстрактный класс для списков 
class List
{
public:
	List(){ Head = Tail = Next = 0; }
	virtual void Put(double n) = 0;
	virtual bool Get(double& n) = 0;
	void SetValue(double n){ Num = n; }
	double GetValue(){ return Num; }
	//Указатель ка начало списка 
	List* Head;
	List* Tail;//Указатель иа конец списка 
	List* Next;//Указатель ка следующий 
	//элемент списка 
private:
	double Num;
};
	//Список типа "очередь" 
	class Queue : public List
	{
	public:
		Queue():List(){ Head = Tail = Next = NULL; }
		void
			Queue::Put(double n)
		{
				List* Item;
				//Создаем новый элемент очереди 
				Item = new Queue;
				//Устанавливаем хранимое значение 
				Item->SetValue(n);
				//Добавляем в конец очереди 
				if (Tail) Tail->Next = Item;
				Tail = Item;
				Item->Next = NULL;
				if (!Head) Head = Tail;
			}
				bool
					Queue::Get(double& n)
				{
						List* Item;
						if (!Head)
						{
							n = 0;
							return false;
						}
						//Восстанавливаем значение 
						//первого элемента очереди 
						n = Head->GetValue();
						//Устанавливаем начало очереди 
						//на следующий злемент 
						Item = Head;
						Head = Head->Next;
						//Удаляем первый элемент очереди 
						delete Item;
						return true;
					}
			};
						//Список типа "стек" 
						class Stack : public List
						{
						public:
							Stack(): List(){ Head = Tail = Next = NULL; }
							void
								Stack::Put(double n)
							{
									List* Item;
									//Создаем новый элемент стека 
									Item = new Stack;
									//Устанавливаем хранимое значение 
									Item->SetValue(n);
									//Добавляем новый элемент в начало стека 
									if (Head) Item->Next = Head;
									Head = Item;
									if (!Tail) Tail = Head;
								}
										bool
											Stack::Get(double& n)
										{
												List* Item;
												if (!Head)
												{
													n = 0;
													return false;
												}
												//Восстанавливаем Значение 
												//первого элемента стека 
												n = Head->GetValue();
												//Устанавливаем начало стека 
												//на следующий элемент 
												Item = Head;
												Head = Head->Next;
												//Удаляем первый элемент стека 
												delete Item;
												return true;
											}
						};
djrenko вне форума Ответить с цитированием
Старый 28.03.2015, 14:08   #3
djrenko
 
Регистрация: 28.03.2015
Сообщений: 3
По умолчанию

Определения классов:
Код:
#include <iostream> 
#include <stdlib.h> 
#include <ctype.h> 
//Абстрактный класс для списков 
class List
{
public:
	List(){ Head = Tail = Next = 0; }
	virtual void Put(double n) = 0;
	virtual bool Get(double& n) = 0;
	void SetValue(double n){ Num = n; }
	double GetValue(){ return Num; }
	//Указатель ка начало списка 
	List* Head;
	List* Tail;//Указатель иа конец списка 
	List* Next;//Указатель ка следующий 
	//элемент списка 
private:
	double Num;
};
	//Список типа "очередь" 
	class Queue : public List
	{
	public:
		Queue():List(){ Head = Tail = Next = NULL; }
		void
			Queue::Put(double n)
		{
				List* Item;
				//Создаем новый элемент очереди 
				Item = new Queue;
				//Устанавливаем хранимое значение 
				Item->SetValue(n);
				//Добавляем в конец очереди 
				if (Tail) Tail->Next = Item;
				Tail = Item;
				Item->Next = NULL;
				if (!Head) Head = Tail;
			}
				bool
					Queue::Get(double& n)
				{
						List* Item;
						if (!Head)
						{
							n = 0;
							return false;
						}
						//Восстанавливаем значение 
						//первого элемента очереди 
						n = Head->GetValue();
						//Устанавливаем начало очереди 
						//на следующий злемент 
						Item = Head;
						Head = Head->Next;
						//Удаляем первый элемент очереди 
						delete Item;
						return true;
					}
			};
						//Список типа "стек" 
						class Stack : public List
						{
						public:
							Stack(): List(){ Head = Tail = Next = NULL; }
							void
								Stack::Put(double n)
							{
									List* Item;
									//Создаем новый элемент стека 
									Item = new Stack;
									//Устанавливаем хранимое значение 
									Item->SetValue(n);
									//Добавляем новый элемент в начало стека 
									if (Head) Item->Next = Head;
									Head = Item;
									if (!Tail) Tail = Head;
								}
										bool
											Stack::Get(double& n)
										{
												List* Item;
												if (!Head)
												{
													n = 0;
													return false;
												}
												//Восстанавливаем Значение 
												//первого элемента стека 
												n = Head->GetValue();
												//Устанавливаем начало стека 
												//на следующий элемент 
												Item = Head;
												Head = Head->Next;
												//Удаляем первый элемент стека 
												delete Item;
												return true;
											}
						};
djrenko вне форума Ответить с цитированием
Старый 28.03.2015, 16:10   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

И как вы думаете, чему оно там будет равно? Вы объявляете указатель... что в нем? а фих его знаете. Потом в кейсе заходите в 3 и ... ?

П.С. Да и вообще писать в файл лист, приводя его к чаровскому указателю, это бред... (могли б хоть попытаться и реализовать в классах приведение типов для начала)

Последний раз редактировалось p51x; 28.03.2015 в 16:13.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стек и очередь Кротяка Общие вопросы C/C++ 1 12.08.2014 18:51
С++. Создать базовый класс список. Реализовать на базе списка стек и очередь... Объяснить программу (написать комментарии) the_faceless Помощь студентам 0 17.02.2014 01:54
Стек и очередь SsAn Паскаль, Turbo Pascal, PascalABC.NET 1 05.01.2014 13:24
заменить стек на очередь Карина1470 C# (си шарп) 1 14.09.2013 16:49
Чем отличается Очередь на базе списка от Очереди на базе массива? TwiX Общие вопросы C/C++ 7 16.02.2011 12:17