Файл: Упорядочить список студентов по алфавиту и распечатать его. - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Всем привет!!! Прошу помочь с написание программы. Заранее благодарю. На диске имеется файл данных STUDENT.DAT. В нем записана информация о студентах в следующем формате: фамилия (строка до 12 символов), имя (строка до 10 символов), год рождения (целое число), месяц рождения (целое в диапазоне 1..12), день рождения (целое в диапазоне 1..31), четыре оценки за последнюю экзаменационную сессию (целые числа в диапазоне 2..5). Упорядочить список студентов по алфавиту и распечатать его.

Решение задачи: «Файл: Упорядочить список студентов по алфавиту и распечатать его.»

textual
Листинг программы
  1. const
  2.     M = 4;
  3. type
  4.     TStudent = record
  5.         lastName: String[12];
  6.         firstName: String[10];
  7.         year: Integer;
  8.         month: 1..12;
  9.         day: 1..31;
  10.         marks: Array[1..M] Of 2..5;
  11.     end;
  12.     TFileTStudents = File Of TStudent;
  13.     TArrayTSudents = Array Of TStudent;
  14. var
  15.     f: TFileTStudents;
  16. procedure SwapStudents(var x, y: TStudent); //обмен студентов в массиве
  17. var
  18.     z: TStudent;
  19. begin
  20.     z := x;
  21.     x := y;
  22.     y := z;
  23. end;
  24. function CompareName(const s1, s2: String): Boolean; //True - если второе должно быть перед первым
  25. var
  26.     Result, notFound: Boolean;
  27.     i, minLength: Byte;
  28. begin
  29.     notFound := True; //"пока что" разницы не нашли
  30.     i := 1; //сравниваем с первого символа
  31.     //определяем наименьшую длину
  32.     if (Length(s1) < Length(s2))
  33.     then
  34.         minLength := Length(s1)
  35.     else
  36.         minLength := Length(s2);
  37.     //сравниваем посимвольно
  38.     while ((notFound) And (i <= minLength))  do //пока не найдём разницу или не дойдём до конца одной (более короткой) строки
  39.     begin
  40.         notFound := s1[i] = s2[i]; //помечаем разные ли символы
  41.         if (Not notFound) //если символы разные
  42.         then
  43.             Result := s1[i] > s2[i]; //находим какой из них первее (меньше) по алфавиту
  44.         Inc(i); //переходим к следующему символу
  45.     end;
  46.     CompareName := Result Or ((notFound) And (Length(s2) < Length(s1))); //если определили в цикле или (на отрезке minLength не было разницы и вторая фамилия короче первой. например фамилии "Козлова" и "Козлов". "Козлов" должен быть перед "Козлова").
  47. end;
  48. procedure SortStudentsByLastName(var f: TFileTStudents); //сортировка
  49. var
  50.     ar: TArrayTSudents;
  51.     i, j: Byte;
  52. begin
  53.     //читаем из файла в массив
  54.     ReSet(f); SetLength(ar, 0);
  55.     while (Not EoF(f)) do
  56.     begin
  57.         SetLength(ar, Length(ar) + 1);
  58.         Read(f, ar[Length(ar) - 1]);
  59.     end;
  60.     Close(f);
  61.     //сортировка
  62.     for i := Length(ar) - 2 downto 0 do
  63.         for j := 0 to i do
  64.             if (CompareName(ar[j].lastName, ar[j + 1].lastName)) //сравниваем фамилии
  65.             then //если нужно менять
  66.                 SwapStudents(ar[j], ar[j + 1]); //меняем. ваш кэп
  67.     //перезаписываем сортированные данные из массива в файл
  68.     ReWrite(f);
  69.     for i := 0 to Length(ar) - 1 do
  70.         Write(f, ar[i]);
  71.     Close(f);
  72. end;
  73. procedure ReadFormFileAndPrint(var f: TFileTStudents); //чтение из файла и вывод на экран. код элементарный и не требует комментариев
  74. var
  75.     stud: TStudent;
  76. begin
  77.     ReSet(f); WriteLn; WriteLn;
  78.     while (Not EoF(f)) do
  79.     begin
  80.         Read(f, stud);
  81.         with stud do
  82.             WriteLn(lastName, ' ', firstName);
  83.     end;
  84.     Close(f);
  85. end;
  86. procedure AddingStudents(var f: TFileTStudents); //добавление в файл. всё достаточно тривиально и просто
  87. var
  88.     i, j, n: Byte;
  89.     stud: TStudent;
  90. begin
  91.     repeat
  92.         Write('How much to add? ');
  93.         ReadLn(n);
  94.     until (n > 0);
  95.     ReWrite(f);
  96.     for i := 1 to n do
  97.         with stud do
  98.         begin
  99.             WriteLn('Adding ', i, ' student:');
  100.             Write(#9, 'Last name? '); ReadLn(lastName);
  101.             Write(#9, 'First name? '); ReadLn(firstName);
  102.             Write(#9, 'Birth year? '); ReadLn(year);
  103.             repeat
  104.                 Write(#9, 'Birth month? '); ReadLn(month);
  105.             until (month in [1..12]);
  106.             repeat
  107.                 Write(#9, 'Birth day? '); ReadLn(day);
  108.             until (day in [1..31]);
  109.             WriteLn(#9, 'Adding marks:');
  110.             for j := 1 to M do
  111.             begin
  112.                 repeat
  113.                     Write(#9, #9, 'mark[', j, ']='); ReadLn(marks[j]);
  114.                 until (marks[j] in [2..5]);
  115.             end;
  116.             Write(f, stud);
  117.         end;
  118.     Close(f);
  119. end;
  120. begin
  121.     Assign(f, 'student.dat'); AddingStudents(f);
  122.     SortStudentsByLastName(f);
  123.     ReadFormFileAndPrint(f);
  124. end.

Объяснение кода листинга программы

  1. Создается новый файл с названием student.dat или используется существующий файл.
  2. Добавление студентов в файл. По запросу пользователя добавляется определенное количество студентов. Для каждого студента запрашиваются данные: фамилия, имя, год рождения, месяц рождения, день рождения, оценки.
  3. Файл закрывается и открывается заново для сортировки.
  4. Студенты сортируются в алфавитном порядке по фамилии.
  5. Сортировка происходит путем сравнения фамилий студентов. Если фамилия первого студента больше фамилии второго, то они меняются местами.
  6. Файл закрывается и открывается заново для чтения и вывода на экран.
  7. Каждый студент выводится на экран в формате: фамилия, имя.
  8. После чтения и вывода на экран файл закрывается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы