/*
Московский Государственный Университет Гражданской Авиации

Студент группы ЭВМ-1-2 2010
Виталий Новичков

Программирование на языке Высокого уровня:

Лабораторная работа #6
6 Апреля 2011 15:23
*/

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip.h>
#include <fstream.h>
#include <process.h>
#include <dos.h>
#include "..\#6\prnbrdr.c"

void on_fileerror(int errno) // Вывод ошибки при открытии файла данных
	{
	prnborder("Ошибка при открытии файла данных", 4);
	printf("                                Код ошибки: %i", errno);
	getch();
	exit(1);
	}


//Обьявление структурного типа auto
struct SportSectns
	{
	char section_name[20]; //Название секции
	char Trainer_Fname[14]; //ФИО тренера
	double tr_diration; //Длительность тренировки (МИНУТЫ)
	double price_of_1_tr; //Стоимость одного занятия
	int sportsmen_quantity; //Количество спортсменов
	};

SportSectns B[10];	//Обьявление массива размером 10 структур
/*
Задача - определить общее количество спортсменов

░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╫╪┘┌█▄▌▐▀

*/


//Обьявление массива указателей, инициированный строками щапки таблицы:
char *header[6]=
{
"\n                           Спортивные секции                                \n",
"╔════════════╤═══════════════╤══════════════╤════════════════╤═════════════╗\n",
"║  Название  │      ФИО      │ Длительность │   Стоимость    │  Количество ║\n",
"║   секции   │    Тренера    │  тренировки  │ одного занятия │ спортсменов ║\n",
"╠════════════╪═══════════════╪══════════════╪════════════════╪═════════════╣\n",
"╚════════════╧═══════════════╧══════════════╧════════════════╧═════════════╝\n\n"
};

ifstream fin, found_in;   //Определение входного файлового потока
ofstream fout;  //Определение выходного файлового потока

// Удаление пробелов вначале и в конце строки - параметра
#include "filter.c"

// Вывод строк шапки таблицы
void p_head()
{
for(int i=0; i<5; i++)
fout << header[i];
}

// Определение количества записей в файле данных
#include "..\#6\number.c"

/*
Вывод данных в оперативную память
Заполнение массива структур
*/
void EnTeR(SportSectns B[10], int n, char * filename, int &TheSum)
	{
	/*
	Параметры: B - Заполняемый массив структурб n - количество записей
	в файле данных, LiNk - ссылка для передачи строки с именем файла данных
	*/
	int i;
	char T[80];		//массив буфер;
	fin.open(filename);	//Открытие файла данных
	if (!fin) on_fileerror(1);
	for(i=0; i<n; i++)
	/*
	Заполняются поля элементов массива структур значениями из строк файла данных:
	*/
	   {
	   //Считывается название секции
	   fin.getline(B[i].section_name, 13); filter_(B[i].section_name);
	   //Считывается ФИО тренера
	   fin.getline(B[i].Trainer_Fname, 12); filter_(B[i].Trainer_Fname);
	   //Считывается длительность, цена, количество спортсменов
	   fin >> B[i].tr_diration;
	   fin >> B[i].price_of_1_tr;
	   fin >> B[i].sportsmen_quantity;
	   fin.getline(T, 80);
	   TheSum+=B[i].sportsmen_quantity;
	   }
	fin.close();
}

//Вывод массива структур
void Prn_Data(SportSectns B[10], int n, int sm)
	{
	int i;
	for(i=0; i<n; i++)
	   {
	   fout << '║'
	   << setw(12)
	   << B[i].section_name
	   <<'│'
	   << setw(15)
	   << B[i].Trainer_Fname
	   <<'│'
	   << setw(14)
	   << B[i].tr_diration
	   <<'│'
	   << setw(16)
	   << B[i].price_of_1_tr
	   <<'│'
	   << setw(13)
	   << B[i].sportsmen_quantity
	   << "║\n";
	   }
	fout << header[5];
	fout << "Общее количество спортсменов спорткомплекса: " << sm << "\n";
	}

//Поиск по Названии секции
int do_find(SportSectns p[10], int n, int argc, char * * params)
	/*
	Параметры: Указатель на первый элемент массива структур и
	количество заполненных структур в массиве;
	*/
	{
	char Fname[20];			//Строка для поискового признака;
	found_in.open("finding.dat");	//Открытие файла данных для поиска;
	if (!found_in)
	{
	  if (argc>1) found_in.open(params[2]);
	  if(!found_in){
		cout << "Файл Finding.dat по-умолчанию не найден.\
		\nПоиск выполняться не будет!";
		return 1;
	  }
	}
	fout << "\n\nПоиск по названию секции:\n\n";
	fout <<"╔════════════╤══════════════╤═══════════════╤════════════════╤═════════════╗\n";
	while(!found_in.eof())  //Пока файл не закончится
		{
		found_in.getline(Fname, 20); filter_(Fname); // Считывание поискового признака
		if(!strcmp(Fname, ""))	//Если строка пустая
		  {
		//fout<<"╚════════════╧══════════════╧═══════════════╧════════════════╧═════════════╝\n";
		  fout<<"║            │           [ НЕТ ДАННЫХ ДЛЯ ПОИСКА ]           │             ║\n";
		  continue;
		  }
		for(int z=0; z < n; z++) //Перебор структуры из массива структур
		if(!strcmp(p[z].section_name, Fname))
		/*
		Сравним поисковый признак с полем очередной структуры,
		если есть совпадение? выводим строку элементов структуры и
		переходим к следующей итерации цикла While
		*/
		  {
	   fout << '║'
	   << setw(12)
	   << p[z].section_name
	   <<'│'
	   << setw(14)
	   << p[z].Trainer_Fname
	   <<'│'
	   << setw(15)
	   << p[z].tr_diration
	   <<'│'
	   << setw(16)
	   << p[z].price_of_1_tr
	   <<'│'
	   << setw(13)
	   << p[z].sportsmen_quantity
	   << "║\n";
		goto m;
		   }
		   /*Завершен цикл For
		   если перебрали все структуры массива
		   и совпадений не было*/
		   fout << "║            │       [Секция "<< setw(13) << Fname <<" НЕ НАЙДЕНА]       │             ║\n";
		   m:
		} //Тело цикла While
		//Завершен цикл While
		fout <<"╚════════════╧══════════════╧═══════════════╧════════════════╧═════════════╝\n";
		fin.close();
	return 0;
	}

//Главная функция
void main(int argc, char *params[])
{
char FileLen[80];
int TheSum=0;
clrscr();

	if (argc<=1)
	{
	  cout << "Введите имя файла данных: ";
	  cin.getline(FileLen, 80);      	//Ввод имени файла
	}
	else
	{
	  sprintf(FileLen, params[1]);
	  cout << "Открывается файл: " << FileLen << endl;
	}

	fout.open("results.txt");	//Открытие файла результатов
	if(!fout)
	{
	on_fileerror(3);
	}
	//Вызовы
	int n=number(FileLen); //Количество записей в файле
	EnTeR(B, n, FileLen, TheSum);
	p_head();
	Prn_Data(B, n, TheSum);
	do_find(B, n, argc, params);
	printf("\nОперация успешно завершена!\n");

}