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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ronny137
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 61
#1

обьясните решение - C++

02.06.2011, 00:59. Просмотров 311. Ответов 2
Метки нет (Все метки)

обьясните решение, что как работает и каким способом итд


Код
// 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);
}
Добавлено через 1 час 12 минут
обьясните пожалуйста хотя бы вкратце, а то даж не знаю примерно что отвечать преподу
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2011, 00:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос обьясните решение (C++):

Обьясните. - C++
Прошу помощи. Расскажите пожалуйста по пунктам где и что делает программа, что за функция.Заранее благодарен. #include &lt;stdio.h&gt; int...

Обьясните код - C++
Ребят помогите с обьяснением этой проги !!! #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; using namespace std; ...

Обьясните задание - C++
Задание 7 Не стал переписывать задание т. к. там пример

Обьясните запись - C++
while( ! fscanf (f, &quot;%*%*c&quot; )) c ++ ; Что она может означать?

Обьясните программу - C++
Обьясните пожалуста как и что делает эта программа и почему она это делает. // Листинг 9.10. // Передача указателей на объекты ...

Обьясните функцию - C++
Обьяните пожалуйста кто сможет строчку где g = rand() / (float) RAND_MAX * groups; int g = peerGroup; while (g == peerGroup) g...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.06.2011, 01:07 #2
в комментариях же все написано
0
ronny137
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 61
02.06.2011, 02:04  [ТС] #3
комментов мало.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2011, 02:04
Привет! Вот еще темы с ответами:

Обьясните пожалуйста - C++
/*Эта программа преобразует галлоноы в литрыс помощью чисел с плавающей точкой.*/ #include &lt;iostream&gt; using namespace std; int ...

Обьясните пожалуйста - C++
struct Test { void test(); }; int main() { Test *ptr = NULL; ptr-&gt;test(); }

Обьясните проограмму - C++
Объясните , пожалуйста, подробно каждую строчку. Спасибо. Сама задачка звучит так. Определить разность между наиб. и наим числом...

Деревья(обьясните) - C++
помогите разобраться с деревьями (с построением и работой над ними) ПЛЗ гарю!!!!!!


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru