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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2013, 23:56   #1
absurd_logik
Новичок
Джуниор
 
Регистрация: 12.01.2013
Сообщений: 1
По умолчанию Операторы >>, <<

Сама задача. Реализовать класс «бинарное дерево» рекурсивно реализовав в нем метод добавления элемента, а также (нерекурсивно) метод поиска элемента в дереве. Наследовавшись от класса добавить рекурсивные методы обхода дерева «левый сын–вершина–правый сын» и подсчета вершин дерева. Добавить операторы ввода/вывода, методы ввода/вывода в определенный файл.

Собственно необходимо реализовать только операторы. Остальное работает. Код ниже.

Класс:
Код:
#include <iostream>
#include <conio.h>

using namespace std;

struct uzel 
{
	int chislo;
	uzel *left, *right;
};

class tree
{
public:
	uzel *top;
	tree ()
	{
		top=NULL;
	}
	tree (int a)
	{
		top->chislo=a;
		top->left=top->right=NULL;
	}
	virtual int add (int a)
	{
		if ((add1 (&top, a))==1)
		{
			return 1;
		}
	}

	virtual void search (int a)
	{
		uzel *vrem;
		vrem = top;
		int flag=0;
		while (flag!=1)
		{
			if (vrem==NULL)
			{
				cout << "Takogo chisla net." << endl;
				flag=1;
			}
			else
			{
				if (vrem->chislo==a)
				{
					cout << "Takoe chislo est." << endl;
					flag=1;
				}
				else
				{
					if (a<(vrem->chislo))
					{
						vrem=(vrem->left);
					}
					else
					{
						if (a>(vrem->chislo))
						{
							vrem=(vrem->right);
						}
					}
				}
			}
		}
	}

	friend int add1 (uzel **vrem, int a);

};


int add1 (uzel **vrem, int a)
{
	if (*vrem==NULL)
	{
		uzel *vrem1 = new uzel;
		vrem1->chislo = a;
		vrem1->left=vrem1->right=NULL;
		*vrem = vrem1;
		return 0;
	}
	else 
	{
		if((*vrem)->chislo > a)
		{
			add1(&((*vrem)->left), a);
		}
		else
		{
			if((*vrem)->chislo < a)
			{
				add1(&((*vrem)->right), a);
			}
			else 
			{
				cout << "Chislo " << a << " uze est" << endl;
				return 1;
			}
		}
	}
}
Наследник:
Код:
#include "tree1.h"
#include <fstream>

class newtree: public tree
{
	int versh1(uzel *start)
	{
		if (start==NULL)
		{
			return 0;
		}
		else 
		{
			return (versh1(start->left)+versh1(start->right)+1);
		}
	}




	void txt1 (ofstream* out, uzel *verh)
	{
		if (verh==NULL)
		{
			return;
		}
		else 
		{
			txt1(out, verh->left);
			*out << verh->chislo << " ";
			txt1(out, verh->right);
		}
	}

	void vivod1(uzel *verh)
	{
		if (verh==NULL)
		{
			return;
		}
		else 
		{
			vivod1(verh->left);
			cout << verh->chislo << " ";
			vivod1(verh->right);
		}
	}


public:
	newtree ()
	{
		top=NULL;
	}
	newtree (int a):tree(a){}

	int versh()
	{
		return versh1(top);
	}
	
	void vivod()
	{
		vivod1(top);
	}

	void itxt()
	{
		ifstream in;
		in.open("input.txt");
		while ( !in.eof() )
		{
			int a;
			in >> a;
			add(a);
		}
		in.close();
	}

	void otxt()
	{
		ofstream out;
		out.open ("output.txt");
		txt1(&out, top);
		out.close();
	}

	ofstream otxt1()
	{
		ofstream out;
		out.open ("output1.txt");
		txt1(&out, top);
		out.close();
		return out;
	}


	friend ostream &operator<<(ostream &, tree &);
	friend istream &operator>>(istream &, tree &);

};


ostream &operator<<(ostream &out, newtree &c)
{
	//out << c.otxt1();
	return out;
}

istream &operator>>(istream &in, newtree &c)
{
	//int a;
	//in >> a;
	//c.add(a);
	return in;
}
В библиотеке fstream у меня выбивает ошибку. Возможно такая проблема только у меня. Все кроме << и >> работает нормально. Необходимо, чтобы >> добавляло новый элемент в дереве как add, а << выводила все дерево как vivod.


main:
Код:
#include "tree2.h"
int main()
{
	tree tree1;
	int col, ch;
	cout << "Vvedite colichestvo elementov" << endl;
	cin >> col;
	for (int i=0; i<col; i++)
	{
		int a;
		cin >> a;
		if (tree1.add(a) == 1)
		{
			i--;
		}
	}
	for (int i=0; i<3; i++)
	{
		cout << "Kakoe chislo ischem?" << endl;
		cin >> ch;
		tree1.search(ch);
	}
	newtree tree2;
	cout << "Vvedite colichestvo elementov" << endl;
	cin >> col;
	for (int i=0; i<col; i++)
	{
		int a;
		cin >> a;
		if (tree2.add(a) == 1)
		{
			i--;
		}
	}
	cout << "Kakoe chislo ischem?" << endl;
	cin >> ch;
	tree2.search(ch);
	cout << "Kolichestvo vershin - " << tree2.versh() << endl;
	tree2.vivod();
	tree2.itxt();
	tree2.otxt();
	tree2.vivod();
	getch();

	cout << tree2;
}
Буду рад любой помощи.

Последний раз редактировалось Stilet; 13.01.2013 в 00:14.
absurd_logik вне форума Ответить с цитированием
Старый 14.01.2013, 18:26   #2
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Если не ошибаюсь операторы в/в в чистом виде хранятся в библиотеке iostream, а fstream наследует перегруженные >> и << из классов ostream, istream.
Вообщем, попробуйте iostream подключить.

Последний раз редактировалось Blind Guard; 14.01.2013 в 22:14.
Blind Guard вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
операторы do...while С++ technomaster Помощь студентам 4 04.04.2012 12:21
С++ (операторы) Мари_Ланвейн Помощь студентам 1 23.12.2010 20:35
Операторы ( с ++) violettta Фриланс 13 10.12.2010 14:01
Операторы Viconte Помощь студентам 5 01.11.2010 16:34