Форум программистов, компьютерный форум CyberForum.ru

база данных универа - C++

Восстановить пароль Регистрация
 
ronny137
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 61
07.06.2011, 23:21     база данных универа #1
как в этой проге взаимодействует дерево и список. нарисуйте плиз схемку)

Код
// Base University.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <conio.h>
#include <string.h>
#include <windows.h>


struct derevo
{
	char name[20];
	int type; // 1 - вуз, 2 - факультет, 3 - кафедра
	derevo *down, *up;
	derevo *next;
};

struct spisok
{
	derevo *el;
	spisok *next;
};

void menu(); // рисование меню
derevo *readfile(char *name); // чтение линейного списка из файла
derevo *build(derevo *begin); // построение дерева на основе линейного списка
spisok *poisk(derevo *begin, char *name); // строит линейный список из найденных элементов
int sravn(char *a, char *b); // ищет совпадение в 2х именах
void write(derevo *begin, char *name); // запись дерева в файл
void ramka(int x1, int y1, int x2, int y2); // построение квадратной рамки 
void cursor(int X, int Y); // постановка курсора в консоли
void watch(derevo *tmp); // просмотр всей базы
int search(derevo *begin); // запрос параметров поиска + сам поиск и вывод

COORD coord;								
HANDLE hStdOut;	
char *func[]={"Watch","Find","Exit",NULL}; // меню


int _tmain(int argc, _TCHAR* argv[])
{
	hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
	derevo *begin;
	begin=readfile("spisok.txt");
	begin=build(begin);
	while(1) 
	{
		char k,*s;
		menu();
		k=getch();
		cursor(2,6);
		s=new char;
		int g=k-48;
		printf("%s",func[g-1]);
		switch(g)
		{
		case 1: watch(begin); break;
		case 2: if(!search(begin)) {cursor(2,9); printf("Not found");} break;
		case 3: return 0;
		}
		getch();
	}
	write(begin,"spisok.txt");
	return 0;
}

int search(derevo *begin) // принимает указатель на первый верхний элемент, выводит все найденное
{
	spisok *fnd;
	char name[20];
	cursor(2,8);
	printf("Enter the word: ");
	scanf("%s",name);
	fnd=poisk(begin,name); 
	if(!fnd->el) return 0;
	cursor(30,9);
	printf("%s",fnd->el->name);
	while(1)
	{
		switch(fnd->el->type)
		{
		case 1: printf("\nUniversity - %s",fnd->el->name); break;
		case 2: printf("\nFaculty - %s",fnd->el->name); break;
		case 3: printf("\nChair - %s",fnd->el->name); break;
		}
		fnd=fnd->next;
		if(!fnd->el) break;
	}
	return 1;
}

void watch(derevo *tmp) // выводит на экран все содержимое
{
	cursor(30,8);
	int i=1;
	while(1)
	{
		switch(tmp->type)
		{
		case 1: printf("\n%d. University - %s",i++,tmp->name); break;
		case 2: printf("\n  %s :",tmp->name); break;
		case 3: printf(" %s",tmp->name); break;
		}
		if(tmp->down) tmp=tmp->down;
		else
		{
			if(!tmp->next&&!tmp->up) break;
			if(tmp->next) tmp=tmp->next;
			else
			{
				while(!tmp->up->next) {tmp=tmp->up; if(!tmp->up) return;}
				tmp=tmp->up->next;
			}
		}
	}
}


void menu() // рисует меню
{
	int i=1;
	char **pch;
	system("cls");
	ramka(1,1,20,5);
	ramka(1,1,20,7);
	pch=func;
	while(*pch)
	{
		cursor(2,i+1);
		printf("%d - %s \n",i++,*pch++);
	}
	for(i=2;i<19;i++){cursor(i,6); putch(' ');
	}
	cursor(2,6);
}

derevo *readfile(char *name) // считываем из файла по словам
{
	FILE *f;
	f=NULL;
	f=fopen(name,"r");
	if(!f) {printf("#File not found#"); getch(); exit(0);}
	char temp[20],*s;
	derevo *begin, *tmp, *a;
	begin=new derevo;
	memset(begin,0,sizeof(derevo));
	tmp=begin;
	while(!feof(f)) // Пока не конец файла, считываем по строчке
	{
		s=temp;
		fscanf(f,"%s",s); 
		strcpy(tmp->name,++s);
		switch(*(s-1))
		{
		case '#' : tmp->type=1; break; // вуз 
		case '%' : tmp->type=2; break; // факультет
		case ':' : tmp->type=3; break; // кафедра
		}
		tmp->next=new derevo;
		a=tmp;
		tmp=tmp->next;
		memset(tmp,0,sizeof(derevo));
	}
	a->next=NULL;
	fclose(f);
	return begin;
}

derevo *build(derevo *begin) // принимает линейный список и строит по нему дерево
{
	derevo *first, *univer, *fac, *tmp, *a;
	first=begin;
	tmp=begin;
	univer=NULL;
	fac=NULL;
	while(tmp!=0)
	{
		a=tmp->next;
		switch(tmp->type)
		{
		case 1:
			tmp->down=tmp->next;
			if(univer) univer->next=tmp;
			univer=tmp; 
			univer->next=NULL;
			fac=NULL; break;
		case 2:
			tmp->up=univer;
			tmp->down=tmp->next;
			if(fac) fac->next=tmp;
			fac=tmp;
			fac->next=NULL; break;
		case 3:
			if(tmp->next) if(tmp->next->type!=3) tmp->next=NULL;
			tmp->up=fac; break;
		}
		tmp=a;
	}
	
	return begin;
}

spisok *poisk(derevo *begin, char *name) // принимает указатель на первый верхний элемент, ищет по имени полным перебором
{
	derevo *tmp;
	spisok *find, *ftmp;
	tmp=begin;
	find=new spisok;
	memset(find,0,sizeof(spisok));
	ftmp=find;
	while(1)
	{
		if(sravn(tmp->name,name))
		{
			ftmp->el=tmp;
			ftmp->next=new spisok;
			ftmp=ftmp->next;
			memset(ftmp,0,sizeof(spisok));
		}
		if(tmp->down) tmp=tmp->down;
		else
		{
			if(!tmp->next&&!tmp->up) break;
			if(tmp->next) tmp=tmp->next;
			else
			{
				while(!tmp->up->next) {tmp=tmp->up; if(!tmp->up) return find;}
				tmp=tmp->up->next;
			}
		}
	}
	return find;
}



int sravn(char *a, char *b) // принимет 2е строки, если в первой находит вторую возвращает 1, иначе 0
{
	if(!a||!b) return 0;
	char *tmp;
	tmp=b;
	while(*a!=0)
	{
		if(*a==*tmp)
		{
			if(*(tmp+1)==0) return 1;
			tmp++;
		}
		else tmp=b;
		a++;
	}
	return 0;
}

void write(derevo *begin, char *name) // принимает указатель на первый верхний элемент дерева и по нему записывает дерево в файл
{
	FILE *f;
	f=fopen(name,"w");
	derevo *tmp;
	tmp=begin;
	while(1)
	{
		switch(tmp->type)
		{
		case 1: fprintf(f,"\n#%s",tmp->name); break;
		case 2: fprintf(f,"\n%%%s ",tmp->name); break;
		case 3: fprintf(f,":%s ",tmp->name); break;
		}
		if(tmp->down) tmp=tmp->down;
		else
		{
			if(!tmp->next&&!tmp->up) break;
			if(tmp->next) tmp=tmp->next;
			else
			{
				while(!tmp->up->next) {tmp=tmp->up; if(!tmp->up) return;}
				tmp=tmp->up->next;
			}
		}
	}
	fclose(f);
}

void ramka(int x1, int y1, int x2, int y2)
{
	for(int i=(y1+1);i<y2;i++)
	{
		cursor(x1,i);
		printf("%c",179);
		cursor(x2,i);
		printf("%c",179);
	}
	for(int i=x1+1;i<x2;i++)
	{
		cursor(i,y1);
		printf("%c",196);
		cursor(i,y2);
		printf("%c",196);
	}
	cursor(x1,y1);
	printf("%c",218);
	cursor(x1,y2);
	printf("%c",192);
	cursor(x2,y1);
	printf("%c",191);
	cursor(x2,y2);
	printf("%c",217);
}
void cursor(int X, int Y)
{
	coord.X=X;
	coord.Y=Y;
	SetConsoleCursorPosition(hStdOut,coord);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2011, 23:21     база данных универа
Посмотрите здесь:

База данных в С++. C++
база данных C++
база данных C++
Кто может помочь в написании программок на C для универа C++
C++ База данных
C++ Помогите написать программу на C++ для Универа ($ЗАПЛАЧУ!$)
база данных C++
База данных C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 21:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru