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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2010, 07:40   #1
amfisat
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 13
Вопрос Исправить программу

Здравствуйте!
У меня такое затруднение возникло:к данной задаче написана прога. Надо исправить ее так, чтобы fstream не использовалась( ee не проходили).

Задача:

Написать прогу, содержащую динам. инфу налоговой инспекции (у 1 лица могут быть записи о неск. налогах). Сведения о каждом лице:
1)имя
2)список неуплаченных налогов
3)для каждого налога - размер
4)признак, является ли лицо юр. или физ.

Программа обеспечивает:
1)формирование базы данных в виде бин. дерева
2) при уплате всех налогов (сумма и имя вводятся с консоли) лицо удаляется
3) по запросу выводятся сведения о физ. и юрид. лицах отдельно.

Код:

Код:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <cstring>
using namespace std;

char* filename="dbase";
enum Action {INSERT, DEL, INFO};
enum Dir {LEFT, RIGHT};
enum Print {FIZ, IUR, ALL};
const int l_time=20, l_type=40, l_fio=31;

struct Tax {    //штраф (элемент списка)
	char type[l_type]; //вид
	float price; //размер штрафа
	Tax* next;
};
struct Node {
	char fio[l_fio];
	bool face; //true - fiz
	Tax* beg;
	Node* left;
	Node* right;
};

struct Data {
	char fio[l_fio];
	char type[l_type];
	float price;
	bool face; //true - fiz
};

Node* descent(Node* p);
Node* first(Data data);
Data input(Action ation);
int menu();
void print_node(const Node& node, Print flag);
void print_dbase(Node* p, Print flag);
Node* read_dbase(char* filename);
int read_fine (ifstream &f, Data& data);
int remove_fine(Node* p, const Data& data);
//int remove_fines(Node* p);
//void remove_fines (Node* p);
Node* remove_node(Node* root, Node* p, Node* parent, Dir dir);
Node* remove_tree(Node* p);
Node* search_insert(Node* root, const Data& data, Action action, Dir& dir, Node*& parent);
void write_dbase (ofstream &f, const Node* root);
void write_node (ofstream &f, const Node& node);
using namespace std;


int main(){

	Node* p, *parent;
	Node* root=read_dbase(filename);
	ofstream fout;

	Dir dir; 
	Data data;

	while(true)
	{
		switch (menu())
		{
		case 1:    //ввод сведений о нарушении
			if (!root) root=first(input(INSERT));
			else search_insert(root, input(INSERT), INSERT, dir, parent);
			break;
		case 2:  //ввод сведений об оплате штрафа
			if (!root)
			{
				cout<<"Basa pusta!!!"<<endl;
				break;
			}

			data=input(DEL);
			if (!(p=search_insert(root, data, DEL, dir, parent)))
				cout<<"Svedenij net!!!"<<endl;
			else
				if (remove_fine(p, data)==2)  //удалены все нарушения
					root=remove_node(root, p, parent, dir);
			break;
		case 3:  //справка
			if (!root)
			{
				cout<<"Basa pusta!!!"<<endl;
				break;
			}
			print_dbase(root, FIZ);
			break;
		case 4:  //справка
			if (!root)
			{
				cout<<"Basa pusta!!!"<<endl;
				break;
			}
			print_dbase(root, IUR);
			break;
		case 5:  //справка
			if (!root)
			{
				cout<<"Basa pusta!!!"<<endl;
				break;
			}
			if (!(p=search_insert(root, input(INFO), INFO, dir, parent)))
				cout<<"Svedenij net!!!"<<endl;
			else print_node(*p, ALL);
			break;
		case 6:  //выход
			fout.open (filename);
			if (!fout.is_open())
			{
				cout<<"Oshibka otkrytiya file!"<<filename<<endl;
				return 1;
			}
			write_dbase (fout, root);
			return 0;

		case 7:  //отладка
			print_dbase(root, ALL);
			break;
		default:
				cout<<"Ne to chislo vveli!!!"<<endl;
				break;
		}
	}
	return 0;
}

Последний раз редактировалось amfisat; 02.06.2010 в 07:44. Причина: Улучшение чтения
amfisat вне форума Ответить с цитированием
Старый 02.06.2010, 07:42   #2
amfisat
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 13
По умолчанию

Код:
Node* descent(Node* p)            //spusk
{Node* prev, *y=p->right;
	if (!y->left) y->left=p->left;
	else
	{do{
			prev=y;
			y=y->left;
		}
		while (y->left);
		y->left=p->left;
		prev->left=y->right;
		y->right=p->right;
	}
	return y;
}

Node* first(Data data)   // koren
{
	Tax* beg=new Tax;
	beg->price=data.price;
	strcpy (beg->type, data.type);
	beg->next=0;

	Node* root=new Node;
	strncpy (root->fio, data.fio, l_fio);
	root->face = data.face;
	root->beg=beg;
	root->left=root->right=0;
	return root;
}

Data input(Action action)  //ввод нарушения
{
	Data data;
	char buf[10], temp1[3], temp2[3];
	cout<<"FIO: "<<endl;
	cin.getline(data.fio, l_fio);
	cout << "Fizicheskoe ili iuridicheskoe (f/u):" << endl;
	char face;
	//cin.getline (&face, 1);
	cin >> face;
	if (face=='f') data.face = true;
	else data.face = false;
	if (action==INFO)
		return data;


	cin.clear();
	cin.get();

	cout<<"Tip naloga: "<<endl;
	//cin.getline(data.type, l_type);
	cin.getline(data.type, l_type);
	if (action==DEL)
		return data;

	//do
	//{
		cout<<"Razmer naloga: "<<endl;
		cin>>data.price;//buf;
	//}
	//while (!(data.price=(float)atof(buf)));
	cin.get();


	return data;
}

int menu()
{
	//char buf;
	int option;
	//do
	//{
		cout<<"================================================="<<endl;
		cout<<"1 - svedeniya o naloge"<<endl;
		cout<<"2 - svedeniya ob oplate naloga"<<endl;
		cout<<"3 - spravka o dolgah fizlic"<<endl;
		cout<<"4 - spravka o dolgah iurlic"<<endl;
		cout<<"5 - spravka o dolgah po fio"<<endl;
		cout<<"6 - exit"<<endl;
		cout<<"================================================="<<endl;

		cin>>option;//buf;
	//	option=atoi(buf);
	//}
	//while (!option);
	cin.get();
	return option;
}

void print_node (const Node& node, Print flag)
{
	if (flag==FIZ && !node.face) return;
	if (flag==IUR && node.face) return;
	cout<<"FIO: "<<node.fio<<endl;
	Tax* pf=node.beg;
	float summa=0;
	while (pf)
	{
		cout<<"Vid naloga: "<<pf->type<<endl;
		cout<<"Summa: "<<pf->price<<endl;
		summa+=pf->price;
		pf = pf->next;
	}
	cout<<"Itogo: "<<summa<<endl;
}

void print_dbase(Node* p, Print flag)
{
	if (p)
	{
		print_node(*p, flag);
		print_dbase (p->left, flag);
		print_dbase (p->right, flag);
	}
}

Node* read_dbase (char* filename)
{
	Node *parent;
	Dir dir;
	Data data;
	ifstream f(filename, ios::in);
	if (!f)
	{
		cout<<"Net file "<<filename<<endl;
		return 0;
	}
	
	f.getline(data.fio, l_fio);
	f >> data.face;
	if (f.eof())
	{
		cout<<"Pustoj file!"<<endl;
		return 0;
	}
	read_fine (f, data);
	Node* root=first(data);
	while (!read_fine(f, data))
		search_insert (root, data, INSERT, dir, parent);

	while (f.getline(data.fio, l_fio))
	{
		f >> data.face;
		read_fine (f, data);
		search_insert (root, data, INSERT, dir, parent);
		while (!read_fine (f, data))
			search_insert (root, data, INSERT, dir, parent);
	}
	return root;
}

int read_fine (ifstream &f, Data& data)
{
	f.getline(data.type, l_type);
	if (strlen (data.type)==0) f.getline(data.type, l_type);
	if (data.type[0]== '=')
		return 1;
	f>>data.price;
	f.get();
	return 0;
}



int remove_fine (Node* p, const Data& data)
{
	Tax* prev, *pf=p->beg;
	bool found=false;
	while (pf && !found)
	{
		if (!strcmp(pf->type, data.type))
			found=true;
		else
		{
			prev=pf;
			pf=pf->next;
		}
	}
	if (!found)
	{
		cout<<"Svedenij net!"<<endl;
		return 1;
	}
	if (pf==p->beg)
		p->beg=pf->next;
	else
		prev->next=pf->next;
	delete pf;
	pf = NULL;
	if (!p->beg)
		return 2;
	return 0;
}

Node* remove_node (Node* root, Node* p, Node* parent, Dir dir)
{
	Node *y;
	if (!p->left)
		y=p->right;
	else
		if (!p->right)
			y=p->left;
		else
			if (p==root)
				root=y;
			else
			{
				if (dir==LEFT)
					parent->left=y;
				else 
					parent->right=y;
			}
			if (p==root) root = NULL;
			delete p;
			p = NULL;
			return root;
}
amfisat вне форума Ответить с цитированием
Старый 02.06.2010, 07:43   #3
amfisat
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 13
По умолчанию

Код:
Node* search_insert (Node* root, const Data& data, Action action, Dir& dir, Node*& parent)
{
	Node* p=root;
	bool found=false;
	int cmp;
	parent=0;
	while (p && !found)
	{
		cmp=strcmp (data.fio, p->fio);
		if (!cmp && data.face == p->face)
			found=true;
		else
		{
			parent=p;
			if (cmp>0)
			{
				p=p->left;
				dir=LEFT;
			}
			else 
			{
				p=p->right;
				dir=RIGHT;
			}
		}
	}

	if (action!=INSERT)
		return p;

	Tax* pf=new Tax;
	pf->price=data.price;
	strcpy (pf->type, data.type);
	pf->next=0;

	if (!found)
	{
		p=new Node;
		strncpy (p->fio, data.fio, l_fio);
		p->face = data.face;
		p->beg=pf;
		p->left=p->right=0;
		if (dir==LEFT)
			parent->left=p;
		else
			parent->right=p;
	}
	else
	{
		Tax* temp=p->beg;
		while (temp->next)
			temp=temp->next;
		temp->next=pf;
	}
	return p;
}

void write_dbase (ofstream &f, const Node* p)
{
	if (p)
	{
		write_node (f, *p);
		write_dbase (f, p->left);
		write_dbase (f, p->right);
	}
}
void write_node (ofstream &f, const Node& node)
{
	f<<node.fio<<endl;
	f<<node.face<<endl;
	Tax* pf=node.beg;
	while (pf)
	{
		f<<pf->type<<endl<<pf->price<<endl;
		pf=pf->next;
	}
	f<<"="<<endl;
}
amfisat вне форума Ответить с цитированием
Старый 02.06.2010, 08:22   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не понял...
Во-первых: как базу набивать то?
во-вторых:
Цитата:
cout<<"6 - exit"<<endl;
А потом:
Цитата:
case 6: //выход
fout.open (filename);
if (!fout.is_open())
{
cout<<"Oshibka otkrytiya file!"<<filename<<endl;
return 1;
}
write_dbase (fout, root);
return 0;
Это что за... или это меня вчерашнее не отпускает до сих пор?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы(исправить программу) ilyas22 Паскаль, Turbo Pascal, PascalABC.NET 3 26.05.2010 22:35
исправить программу вычисления полинома. vitaly38 Помощь студентам 11 21.03.2010 16:11
Помогите исправить программу... Lifefine Общие вопросы C/C++ 1 29.10.2009 11:32
Помоги исправить программу. Lifefine Общие вопросы C/C++ 3 19.10.2009 20:27
Помогите исправить программу kill301 Помощь студентам 1 01.06.2009 16:17