#include <iostream>
#include <limits.h> //для INT_MAX
#include <iomanip> //для setw()
#include <fstream> //для файлового ввода/вывода
using namespace std;
//Структура Маршрута
struct MARSH
{
char NameStart [16]; //Начальный пункт маршрута
char NameEnd [16]; //Конечный пункт маршрута
int Number; // Номер маршрута
};
int Count = 0; //Введеное кол-во маршрутов
const int MaxEl = 8; //Размерность массива
MARSH El[MaxEl]; // Массив элементов
//Функция вывода меню
char ShowMenu (void)
{
cout<<
"-----------------------"<<endl<<
" MENU "<<endl<<
"-----------------------"<<endl<<
"<1> - Input Marshrut"<<endl<<
"<2> - Print All Marshrut"<<endl<<
"<3> - Print Marshrut of Number"<<endl<<
"<4> - Quit"<<endl<<endl<<
"<5> - Save To File"<<endl<<
"<6> - Load From File"<<endl;
cout<<": ";
return getchar(); //Ожидаем ввода
};
//Функция Добавление элемента
bool Add()
{
MARSH Temp; //Временная переменная структуры
cin.sync(); //Синхронизируем входной поток (В нем скорее всего необработаная эскейп-последовательность
//или код ентера
cout<<endl<< //Рисуем шапка
"----------------------------------------"<<endl<<
" Input new Marshrut"<<endl<<
"----------------------------------------"<<endl;
cout<<"Enter Start Marshrut: "; //Вводим начало маршрута
cin.getline(Temp.NameStart,16);
cout<<"Enter End Marshrut: "; //Водим конец маршрута
cin.getline(Temp.NameEnd,16);
cout<<"Enter Number (#) Marshrut: "; //Вводи номер маршрута
cin>>Temp.Number;
cout<<endl;
if (Count < MaxEl) //Проверяем что бы массив был не переполнен (Условие задачи [8])
{
El[Count] = Temp; //Помещяем элемент в массив
Count ++; //Интерементируем кол-во элементов
} else { //Если переполнение
cout<<endl<<"False :Massive is FULL"<<endl;
cin.sync();
return false;
}
cin.sync();
return true;
}
//Функция сортивовки Массива элементов
void Sort (void)
{
for (int i = 0; i< Count; i++)
{
int Min = INT_MAX; //Максимальное значение Int
int minPos = -1; //Позиция с минимальным элементом
for (int j=i; j<Count;j++) //Перебираем
{
if (El[j].Number<Min)//Ищим наименьший элемент
{
Min = El[j].Number;
minPos = j;
}
MARSH Temp; //Меняем местами по-возрастанию Ном. маршрута элементы
Temp = El[i];
El[i] = El[minPos];
El[minPos] = Temp;
}
}
}
//Функция вывода Элементов Массива (Всех
void Print(void)
{
//Рисуем шапку setw(int) длина поля для вывода
cout<<setw(3)<<" "<<setw(6)<<"# "<<setw(17)<<"Start Marshrut "<<setw(17)<<"End Marshrut "<<endl<<
"------------------------------------------"<<endl;
cout.setf(ios::left);
//Обходим массив элементов и печатаем все
for (int i=0; i < Count; i++)
{
cout<<setw(3)<<i+1<<setw(6)<<El[i].Number<<setw(17)<<El[i].NameStart<<setw(17)<<El[i].NameEnd<<endl;
}
cout.unsetf(ios::left);
cout<<"------------------------------------------"<<endl<<endl;
cin.sync(); //синхронизация потока и задержка
cin.get();
}
//Функции проверки маршрута по его номеру и вывод его на экран
void PrintOfNumMars(void)
{
int NumMarsh; // Номер маршрута
cin.sync();
cout<<endl<<"Input No Marshruta : ";
cin>>NumMarsh; //Получаем номер маршрута
cout<<endl;
//Обходим весь цикл элементов
for (int i=0; i < Count; i++)
{
//Пытаемся найти требуемый номер маршрута
//если нашли отрисовываем шапку выводим элемент и выходи return ом из функции
if (El[i].Number == NumMarsh)
{
cout<<setw(3)<<" "<<setw(6)<<"# "<<setw(17)<<"Start Marshrut "<<setw(17)<<"End Marshrut "<<endl<<
"------------------------------------------"<<endl;
cout<<setw(3)<<i+1<<setw(6)<<El[i].Number<<setw(17)<<El[i].NameStart<<setw(17)<<El[i].NameEnd<<endl;
cin.sync(); //синхронизация потока и задержка
cin.get();
return;
}
}
//Если не нашли элемента с треб. номером пишим что ничего не вышло :-)
cout<<"Marshrut "<<NumMarsh<<" NOT FOUND"<<endl;
cin.sync(); //синхронизация потока и задержка
cin.get();
}
//Функция сохранения массива элементов в файл
void SaveToFile(void)
{
char filename[256]; //Имя файла
cout<<endl<<"Input Filename to Save Date : ";
cin.sync();
cin.get(filename,256); //Вводим имя файла
ofstream OutFile(filename,ios::binary); //Определяем выходной поток и делаем его бинарным
for (int i=0; i < Count; i++)
{
OutFile.write(reinterpret_cast<char*>(&El[i]),sizeof(El[i])); //Пишим элементы в файл
}
OutFile.close(); //Закрываем файл
}
//Функция загрузки массива из файла
void LoadFromFile(void)
{
char filename[256]; //Имя файла
cout<<endl<<"Input Filename to Load Date : ";
cin.sync();
cin.get(filename,256); //Получение имени файла
ifstream InFile(filename,ios::binary); //Определение входного потока как бинарного
Count = 0;
InFile.read(reinterpret_cast<char*>(&El[Count]),sizeof(El[Count])); //Читаем первый элемент из файла
while (!InFile.eof()) // Пока не конец файла читаем остальные элементы
{
InFile.read(reinterpret_cast<char*>(&El[Count]),sizeof(El[Count]));
Count++;
}
InFile.close(); //Закрываем файл
}
//Входная функция программы
int main (void)
{
char ch=0;
while (ch !='4') //Пока не введено '4' - ВЫХОД, то повторять меню
{
cin.sync();
ch = ShowMenu();
switch (ch)
{
case '1': Add();Sort();break;
case '2': Print();break;
case '3': PrintOfNumMars();break;
case '5': SaveToFile();break;
case '6': LoadFromFile();break;
}
}
return 0;
}