Advertisement
Alex_Fomin

БД спортиков ;)

Dec 27th, 2015
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 18.66 KB | None | 0 0
  1. uses
  2.   crt, sysutils;
  3.  
  4. const
  5.   DB_NAME = 'Ulyana.dat';// Имя файла БД
  6.  
  7. type
  8.   content = record
  9.     surname: string[16];// Фамилия
  10.     name: string[16];//Имя
  11.     patronymic: string[16];//Отчество
  12.     year: string[4];//Год рождения
  13.     month: string[2];//Месяц рождения
  14.     day: string[2];//День рождения
  15.   end;
  16.  
  17.   TData = array of content;// Опишем тип содержимого
  18.   TFile = file of content;// Опишем тип файла
  19.  
  20. var
  21.   data: TData;
  22.   id: integer;
  23.   key: char;
  24.  
  25. procedure PrintLine;// Просто линия ;)
  26. begin
  27.   TextColor(White);
  28.   Write('--------------------------------------------------------------------------------');
  29. end;
  30.  
  31. procedure PrintHeader(st_1: string; st_2: string);// Процедура вывода загловка
  32. begin
  33.   PrintLine;
  34.   TextColor(Yellow);GotoXY((80 - Length(st_1)) div 2, WhereY);WriteLn(st_1);
  35.   TextColor(Green);GotoXY((80 - Length(st_2)) div 2, WhereY);WriteLn(st_2);
  36.   PrintLine;
  37. end;
  38.  
  39. procedure MainMenu;// Процедура вывода основного меню программы
  40. const
  41.   menu: array [0..8] of string = ('Добавить запись', 'Удалить запись', 'Изменить запись',
  42.                                   'Просмотр информации базы данных',
  43.                                   'Сохранить информацию в файл ' + DB_NAME,
  44.                                   'Загрузить информацию из файла ' + DB_NAME,
  45.                                   'Поиск информации', 'Об авторе', 'Выход');
  46.  
  47. var
  48.   i: byte;
  49.  
  50. begin
  51.   clrscr;
  52.   PrintHeader('ОСНОВНОЕ МЕНЮ ПРОГРАММЫ', 'Управление: для выбора нужного действия используйте клавиши (0-8)');
  53.   for i := Low(menu) to High(menu) - 1 do
  54.   begin
  55.     TextColor(Yellow);Write(' { ', Succ(i), ' } ');TextColor(Cyan);Writeln(menu[i]);PrintLine;
  56.   end;
  57.   TextColor(Yellow);Write(' { 0 } ');TextColor(Cyan);Writeln(menu[High(menu)]);PrintLine;
  58. end;
  59.  
  60. procedure Return;// Функция возврата к основному меню
  61. var
  62.   key: char;
  63.  
  64. begin
  65.   PrintLine;
  66.   GotoXY(15, WhereY);TextColor(Yellow);Writeln('Для возврата в главное меню нажмите клавишу "Enter"');
  67.   PrintLine;
  68.   repeat
  69.     key := ReadKey;
  70.   until (key = #13);
  71.   MainMenu; // Основное меню программы
  72. end;
  73.  
  74. procedure SeachMenu;// Процедура вывода меню поиска
  75. const
  76.   menu: array [0..6] of string = ('Поиск по фамилии', 'Поиск по имени', 'Поиск по отчеству',
  77.                                   'Поиск по первой букве фамилии', 'Поиск по первой букве имени',
  78.                                   'Поиск по первой букве отчества', 'Вернуться в главное меню');
  79. var
  80.   i: byte;
  81. begin
  82.   clrscr;
  83.   PrintHeader('МЕНЮ ПОИСКА', 'Управление: для выбора нужного действия используйте клавиши (0-6)');
  84.   for i := Low(menu) to High(menu) - 1 do
  85.   begin
  86.     TextColor(Yellow);Write(' { ', Succ(i), ' } ');TextColor(Cyan);Writeln(menu[i]);PrintLine;
  87.   end;
  88.   TextColor(Yellow);Write(' { 0 } ');TextColor(Cyan);Writeln(menu[High(menu)]);PrintLine;
  89. end;
  90.  
  91. procedure PrintInfoAuthor;// Информация об авторе программы
  92. begin
  93.   clrscr;
  94.   PrintHeader('ОБ АВТОРЕ', 'Подробная информация об авторе программы');
  95.   TextColor(Cyan);Write(' Университет: ');
  96.   TextColor(Yellow);Writeln('Помогите Тупому Устроиться (ПТУ)');
  97.   TextColor(Cyan);Write(' Факультет:   ');TextColor(Yellow);Writeln('Упс...непомню...');
  98.   TextColor(Cyan);Write(' Кафедра:     ');TextColor(Yellow);Writeln('Автосервис');
  99.   TextColor(Cyan);Write(' Группа:      ');TextColor(Yellow);Writeln('34');
  100.   TextColor(Cyan);Write(' Студентка:   ');TextColor(Yellow);Writeln('Фомин Александр Сергеевич');
  101.   Return;
  102. end;
  103.  
  104. function InPutString(st: string): string;// Прверка корректности ввода строки
  105. var
  106.   temp, msg: string;
  107. begin
  108.   repeat
  109.     TextColor(Cyan);Write(' ' + st + ': ');
  110.     TextColor(Yellow);GotoXY(20, WhereY);ReadLn(temp);
  111.     if Length(temp) = 0 then
  112.     begin
  113.       msg := 'ОШИБКА: Введена пустая строка... Повторите ввод через 3 сек.';
  114.       TextColor(Red);GotoXY((80 - Length(msg)) div 2, WhereY);Write(msg);
  115.       Delay(3000);GotoXY(1, WhereY);ClrEol;GotoXY(1, WhereY - 1);ClrEol;
  116.     end;
  117.   until Length(temp) <> 0;
  118.   InPutString := UpCase(temp[1]) + Copy(temp, 2, Length(temp))
  119. end;
  120.  
  121. function InPutDate(st: string; low: integer; high: integer): string;// Прверка корректности ввода даты
  122. var
  123.   temp: integer;
  124.   msg: string;
  125. begin
  126.   repeat
  127.     TextColor(Cyan);Write(' ' + st + ' (', low, '..', high, '): ');
  128.     TextColor(Yellow);GotoXY(20, WhereY);ReadLn(temp);
  129.     if not (low > temp) and (temp > high) then
  130.     begin
  131.       msg := 'ОШИБКА: Неверный диапазон... Повторите ввод через 3 сек.';
  132.       TextColor(Red);GotoXY((80 - Length(msg)) div 2, WhereY);Write(msg);
  133.       Delay(3000);GotoXY(1, WhereY);ClrEol;GotoXY(1, WhereY - 1);ClrEol;
  134.     end;
  135.   until (low <= temp) and (temp <= high);
  136.  
  137.   if temp < 10 then InPutDate := '0' + IntToStr(temp) else InPutDate := IntToStr(temp);
  138. end;
  139.  
  140. procedure ChangeDataBase(var data: content);// Процедура ввода данных в БД
  141. var
  142.   temp: integer;
  143. begin
  144.   clrscr;
  145.   PrintHeader('ВВОД ДАННЫХ', 'Управление: для ввода данных используйте клавиатуру');
  146.   with data do
  147.   begin
  148.     surname := InPutString('Фамилия');
  149.     name := InPutString('Имя');
  150.     patronymic := InPutString('Отчество');
  151.     year := InPutDate('Год', 1901, 2100);
  152.     month := InPutDate('Месяц', 1, 12);
  153.     case StrToInt(month) of // Определим кол-во дней в выбранном месяце
  154.       4, 6, 9, 11: temp := 30;
  155.       1, 3, 5, 7, 8, 10, 12: temp := 31;
  156.       2: if ((StrToInt(year) mod 4 = 0) and (StrToInt(year) mod 100 <> 0)) or (StrToInt(year) mod 400 = 0) then temp := 29 else temp := 28;
  157.     end;
  158.     day := InPutDate('День', 1, temp);
  159.   end;
  160.  
  161.   Return; // Возврат в основное меню
  162. end;
  163.  
  164. procedure SaveDataBase(data: TData);// Процедура сохранения данных в файл DB_NAME
  165. var
  166.   id: integer;
  167.   fdata: TFile;
  168.   msg: string;
  169. begin
  170.   clrscr;
  171.   PrintHeader('СОХРАНЕНИЕ ДАННЫХ', 'Сохранение данных в файл ' + DB_NAME);
  172.   Assign(FData, DB_NAME); // Подключаем файл "DB_NAME"
  173.   Rewrite(FData); // Создаем файл "DB_NAME" и открываем для записи
  174.   for id := Low(data) to High(data) do Write(FData, data[id]); // Записываем информацию в файл "DB_NAME"
  175.   Close(FData); // Закрываем файл "DB_NAME"
  176.   msg := 'ВНИМАНИЕ: База данных успешно сохранена в файл "' + DB_NAME + '"';
  177.   TextColor(LightGreen);GotoXY((80 - Length(msg)) div 2, WhereY);WriteLn(msg);
  178.   Return; // Возврат в основное меню
  179. end;
  180.  
  181. procedure LoadingDataBase(var data: TData; var id: integer);// Загрузка информации из файла "DB_NAME"
  182. var
  183.   fdata: TFile;
  184.   msg: string;
  185. begin
  186.   clrscr;
  187.   PrintHeader('ЗАГРУЗКА ДАННЫХ', 'Загрузка данных из файла ' + DB_NAME);
  188.   Assign(FData, DB_NAME); // Подключаем файл "DB_NAME"
  189.   Reset(FData); // Открываем файл "DB_NAME" для чтения}
  190.   while not Eof(FData) do
  191.   begin
  192.     Inc(id);
  193.     SetLength(data, id);
  194.     Read(FData, Data[Pred(id)]);
  195.   end;
  196.   Close(FData); // Закрываем файл "DB_NAME"
  197.   msg := 'ВНИМАНИЕ: База данных успешно загружена из файла "' + DB_NAME + '"';
  198.   TextColor(LightGreen);GotoXY((80 - Length(msg)) div 2, WhereY);WriteLn(msg);
  199.   Return; // Возврат в основное меню
  200. end;
  201.  
  202. procedure ShortStory(data: TData; var id: integer);// Строка вывода информации из БД на экран
  203. var
  204.   count: integer;
  205. begin
  206.   clrscr;
  207.   PrintHeader('ПРОСМОТР ДАННЫХ', 'Управление: клавиши "' + #24 + '", "' + #25 + '", "Esc" - выход в основное меню');
  208.   Write('| ID |      Фамилия      |        Имя       |     Отчество     | Дата рождения |');
  209.   PrintLine;
  210.   count := 0;
  211.   repeat
  212.     Inc(id);
  213.     Inc(Count);
  214.     with Data[id] do // Печатаем "таблицу"
  215.     begin
  216.       GotoXY(1, WhereY);Write('|', id:3);
  217.       GotoXY(6, WhereY);Write('| ', surname);
  218.       GotoXY(26, WhereY);Write('| ', name);
  219.       GotoXY(45, WhereY);Write('| ', patronymic);
  220.       GotoXY(64, WhereY);Write('|   ', day + '.' + month + '.' + year, '  |');
  221.     end;
  222.   until (count = 15) or (id = High(data));
  223.   PrintLine;
  224. end;
  225.  
  226. procedure PrintShortStory(data: TData);// Процедура просмотра информации
  227. var
  228.   id: integer;
  229.   key: char;
  230.   msg: string;
  231.  
  232. begin
  233.   clrscr;
  234.   id := -1;
  235.   if (High(data) < 0) then
  236.   begin
  237.     PrintHeader('ПРОСМОТР ДАННЫХ', 'Управление: клавиши "' + #24 + '", "' + #25 + '", "' + #26 + '", "' + #27 + '", ' + 'Esc - выход в основное меню');
  238.     msg := 'ОШИБКА: Файл базы данных не загружен или отсутствует информация';
  239.     TextColor(LightRed);GotoXY((80 - Length(msg)) div 2, WhereY);WriteLn(msg);
  240.     Return; // Возврат в главное меню
  241.   end
  242.             else
  243.   begin
  244.     ShortStory(Data, id);
  245.     // ----- Управление Start ----- //
  246.     repeat
  247.       key := Readkey; // Считываем ASCII-код клавиши
  248.       case key of
  249.         #80: // Стрелка вниз
  250.           begin// Если элемент был последним, то возвращаемся к первому
  251.             if (id >= High(data)) then id := -1; // Первый элемент массива}
  252.             ShortStory(Data, id)
  253.           end; // Case key #80
  254.         #72:// Стрелка вверх
  255.           begin
  256.             if (High(data) > 14) then // Хер его знает как объяснить, но без этого работать небыдет (иными словами - КОСТЫЛЬ)
  257.             begin
  258.               if (id < High(data)) and (id > 14) then Dec(id, 30)
  259.                                          else
  260.               begin
  261.                 if (id >= High(data)) then
  262.                 begin
  263.                   id := High(data) - (High(data) mod 15);
  264.                   Dec(id, 16);
  265.                 end
  266.                 else if (id <= 14) and (High(data) > 14) then id := High(data) - (High(data) mod 15) else Dec(id, 15);
  267.               end;
  268.               ShortStory(Data, id)
  269.             end;
  270.           end;// Case key #72
  271.       end; // Case key
  272.     until key = #27; // Клавиша "Esc"
  273.     // ----- Управление End ----- //
  274.   end;
  275.   MainMenu; // Возврат в основное меню
  276. end;
  277.  
  278. function SelectionID(id: integer): integer;// Функция выбора ID записи
  279. var
  280.   temp: integer;
  281.   msg: string;
  282.   key: char;
  283. begin
  284.   clrscr;
  285.   repeat
  286.     PrintHeader('ВЫБОР ЗАПИСИ', 'Выберите номер записи от 0 до ' + IntToStr(id));
  287.     TextColor(Cyan);Write(' Введите номер: ');TextColor(Yellow);Readln(temp);
  288.     if ((temp < 0) or (id < temp)) then
  289.     begin
  290.       PrintLine;
  291.       msg := 'ОШИБКА: Неверный диапазон... Повторите ввод через 3 сек.';
  292.       TextColor(LightGreen);GotoXY((80 - Length(msg)) div 2, WhereY);WriteLn(msg);
  293.       PrintLine;
  294.       Delay(3000); // Задержка 3 сек
  295.       clrscr;
  296.     end;
  297.   until ((0 <= temp) and (temp <= id));
  298.   SelectionID := temp;
  299.   PrintLine;
  300.   TextColor(Yellow);GotoXY(19, WhereY);Writeln('Для продолжения нажмите клавишу "Enter"');
  301.   PrintLine;
  302.   repeat
  303.     key := Readkey;
  304.   until key = #13;
  305.   clrscr;
  306. end;
  307.  
  308. procedure DeleteDataBase(var data: TData; var id: integer; n: integer);// Процедура удаления записи из базы данных
  309. var
  310.   i: integer;
  311.   msg: string;
  312. begin
  313.   PrintHeader('УДАЛЕНИЕ ЗАПИСИ', 'Удаление записи с выбранным ID (' + IntToStr(n) + ') из базы данных');
  314.   if (0 <= n) and (n <= id) then
  315.   begin
  316.     for i := n to Pred(id) - 1 do Data[i] := Data[Succ(i)];
  317.     Dec(id);
  318.     SetLength(data, id);
  319.   end;
  320.   msg := 'ИНФОРМАЦИЯ: Выбранная запись успешно удалена';
  321.   TextColor(LightGreen);GotoXY((80 - Length(msg)) div 2, WhereY);WriteLn(msg);
  322.   Return; // Возврат в основное меню
  323. end;
  324.  
  325. procedure Seach(data: TData; field: char);// Процедура поиска информации
  326. var
  327.   id, count: integer;
  328.   sdata: TData;
  329.   msg, temp: string;
  330.   key:char;
  331. begin
  332.   clrscr;
  333.   PrintHeader('ПОИСК ДАННЫХ', 'Управление: ввод с клавиатуры, Enter - подтвердить');
  334.   count := 0;
  335.   case Field of
  336.     #49:
  337.       begin// По фамилии
  338.         temp := InPutString('Фамилия');
  339.         PrintLine;
  340.         for id := Low(data) to High(data) do
  341.           if data[id].surname = temp then
  342.           begin
  343.             Inc(count);
  344.             SetLength(sdata, count); // Выделяем память
  345.             sdata[Pred(count)] := data[id];
  346.           end;
  347.       end;
  348.     #50:
  349.       begin// По имени
  350.         temp := InPutString('Имя');
  351.         PrintLine;
  352.         for id := Low(data) to High(data) do
  353.           if data[id].name = temp then
  354.           begin
  355.             Inc(count);
  356.             SetLength(sdata, count); // Выделяем память
  357.             sdata[Pred(count)] := data[id];
  358.           end;
  359.       end;
  360.     #51:
  361.       begin// По отчеству
  362.         temp := InPutString('Отчество');
  363.         PrintLine;
  364.         for id := Low(data) to High(data) do
  365.           if data[id].patronymic = temp then
  366.           begin
  367.             Inc(count);
  368.             SetLength(sdata, count); // Выделяем память
  369.             sdata[Pred(count)] := data[id];
  370.           end;
  371.       end;
  372.     #52:
  373.       begin// По первой букве фамилии
  374.         temp := InPutString('Фамилия');
  375.         PrintLine;
  376.         for id := Low(data) to High(data) do
  377.           if data[id].surname[1] = UpCase(temp[1]) then
  378.           begin
  379.             Inc(count);
  380.             SetLength(sdata, count); // Выделяем память
  381.             sdata[Pred(count)] := data[id];
  382.           end;
  383.       end;
  384.     #53:
  385.       begin// По первой букве имени
  386.         temp := InPutString('Имя');
  387.         PrintLine;
  388.         for id := Low(data) to High(data) do
  389.           if data[id].name[1] = UpCase(temp[1]) then
  390.           begin
  391.             Inc(count);
  392.             SetLength(sdata, count); // Выделяем память
  393.             sdata[Pred(count)] := data[id];
  394.           end;
  395.       end;
  396.     #54:
  397.       begin// По первой букве отчества
  398.         temp := InPutString('Отчество');
  399.         PrintLine;
  400.         for id := Low(data) to High(data) do
  401.           if data[id].patronymic[1] = UpCase(temp[1]) then
  402.           begin
  403.             Inc(count);
  404.             SetLength(sdata, count); // Выделяем память
  405.             sdata[Pred(count)] := data[id];
  406.           end;
  407.       end;
  408.   end; // case field
  409.   if (count = 0) then
  410.   begin
  411.     msg := 'Результаты поиска: по данному критерию найдено ' + IntToStr(count) + ' из ' + IntToStr(Succ(High(data))) + ' записей';
  412.     TextColor(Red);GotoXY((80 - Length(msg)) div 2, WhereY);WriteLn(msg);
  413.     Delay(3000); // Задержка 3 секунды
  414.     Return; // Возврат в главное меню
  415.   end
  416.   else
  417.   begin
  418.     msg := 'Результаты поиска: по данному критерию найдено ' + IntToStr(count) + ' из ' + IntToStr(Succ(High(data))) + ' записей';
  419.     TextColor(LightGreen);GotoXY((80 - Length(msg)) div 2, WhereY);WriteLn(msg);
  420.     Delay(3000); // Задержка 3 секунды
  421.     PrintLine;
  422.     TextColor(Yellow);GotoXY(19, WhereY);Writeln('Для продолжения нажмите клавишу "Enter"');
  423.     PrintLine;
  424.     repeat
  425.         key := Readkey;
  426.     until key = #13;
  427.     PrintShortStory(sdata);
  428.   end;
  429. end;
  430.  
  431. begin// Основная программа
  432.   id := 0;
  433.   MainMenu; // Выводим основное меню программы
  434.   repeat
  435.     key := ReadKey;
  436.     case key of
  437.       #49:
  438.         begin
  439.           Inc(id);
  440.           SetLength(data, id); // Выделяем память
  441.           ChangeDataBase(data[Pred(id)]); // Добавление записи
  442.         end;
  443.       #50: DeleteDataBase(Data, id, SelectionID(Pred(id))); // Удаление записи
  444.       #51: ChangeDataBase(Data[SelectionID(Pred(id))]); // Изменение записи
  445.       #52: PrintShortStory(Data); // Вывод информации на экран
  446.       #53: SaveDataBase(Data); // Сохранение информации в файл "DB_NAME"
  447.       #54: LoadingDataBase(Data, id); // Загрузка информации из файла "DB_NAME"
  448.       #55:
  449.         begin
  450.           clrscr;
  451.           SeachMenu; // Выводим меню поиска
  452.           repeat
  453.             key := ReadKey;
  454.             case key of
  455.               #49: Seach(data, #49); // Поиск по фамилии
  456.               #50: Seach(data, #50); // Поиск по имени
  457.               #51: Seach(data, #51); // Поиск по отчеству
  458.               #52: Seach(data, #52); // Поиск по первой букве фамилии
  459.               #53: Seach(data, #53); // Поиск по первой букве имени
  460.               #54: Seach(data, #54); // Поиск по первой букве отчества
  461.               #48: MainMenu;
  462.             end; // case key
  463.           until key in [#48..#54];
  464.         end;
  465.       #56: PrintInfoAuthor; // Вывод информации об авторе
  466.       #48: Exit;
  467.     end; // End case
  468.   until key = #48;
  469. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement