Файл: Упорядочить список студентов по алфавиту и распечатать его. - Free Pascal
Формулировка задачи:
Всем привет!!! Прошу помочь с написание программы. Заранее благодарю.
На диске имеется файл данных STUDENT.DAT. В нем записана информация о студентах в следующем формате: фамилия (строка до 12 символов), имя (строка до 10 символов), год рождения (целое число), месяц рождения (целое в диапазоне 1..12), день рождения (целое в диапазоне 1..31), четыре оценки за последнюю экзаменационную сессию (целые числа в диапазоне 2..5). Упорядочить список студентов по алфавиту и распечатать его.
Решение задачи: «Файл: Упорядочить список студентов по алфавиту и распечатать его.»
textual
Листинг программы
- const
- M = 4;
- type
- TStudent = record
- lastName: String[12];
- firstName: String[10];
- year: Integer;
- month: 1..12;
- day: 1..31;
- marks: Array[1..M] Of 2..5;
- end;
- TFileTStudents = File Of TStudent;
- TArrayTSudents = Array Of TStudent;
- var
- f: TFileTStudents;
- procedure SwapStudents(var x, y: TStudent); //обмен студентов в массиве
- var
- z: TStudent;
- begin
- z := x;
- x := y;
- y := z;
- end;
- function CompareName(const s1, s2: String): Boolean; //True - если второе должно быть перед первым
- var
- Result, notFound: Boolean;
- i, minLength: Byte;
- begin
- notFound := True; //"пока что" разницы не нашли
- i := 1; //сравниваем с первого символа
- //определяем наименьшую длину
- if (Length(s1) < Length(s2))
- then
- minLength := Length(s1)
- else
- minLength := Length(s2);
- //сравниваем посимвольно
- while ((notFound) And (i <= minLength)) do //пока не найдём разницу или не дойдём до конца одной (более короткой) строки
- begin
- notFound := s1[i] = s2[i]; //помечаем разные ли символы
- if (Not notFound) //если символы разные
- then
- Result := s1[i] > s2[i]; //находим какой из них первее (меньше) по алфавиту
- Inc(i); //переходим к следующему символу
- end;
- CompareName := Result Or ((notFound) And (Length(s2) < Length(s1))); //если определили в цикле или (на отрезке minLength не было разницы и вторая фамилия короче первой. например фамилии "Козлова" и "Козлов". "Козлов" должен быть перед "Козлова").
- end;
- procedure SortStudentsByLastName(var f: TFileTStudents); //сортировка
- var
- ar: TArrayTSudents;
- i, j: Byte;
- begin
- //читаем из файла в массив
- ReSet(f); SetLength(ar, 0);
- while (Not EoF(f)) do
- begin
- SetLength(ar, Length(ar) + 1);
- Read(f, ar[Length(ar) - 1]);
- end;
- Close(f);
- //сортировка
- for i := Length(ar) - 2 downto 0 do
- for j := 0 to i do
- if (CompareName(ar[j].lastName, ar[j + 1].lastName)) //сравниваем фамилии
- then //если нужно менять
- SwapStudents(ar[j], ar[j + 1]); //меняем. ваш кэп
- //перезаписываем сортированные данные из массива в файл
- ReWrite(f);
- for i := 0 to Length(ar) - 1 do
- Write(f, ar[i]);
- Close(f);
- end;
- procedure ReadFormFileAndPrint(var f: TFileTStudents); //чтение из файла и вывод на экран. код элементарный и не требует комментариев
- var
- stud: TStudent;
- begin
- ReSet(f); WriteLn; WriteLn;
- while (Not EoF(f)) do
- begin
- Read(f, stud);
- with stud do
- WriteLn(lastName, ' ', firstName);
- end;
- Close(f);
- end;
- procedure AddingStudents(var f: TFileTStudents); //добавление в файл. всё достаточно тривиально и просто
- var
- i, j, n: Byte;
- stud: TStudent;
- begin
- repeat
- Write('How much to add? ');
- ReadLn(n);
- until (n > 0);
- ReWrite(f);
- for i := 1 to n do
- with stud do
- begin
- WriteLn('Adding ', i, ' student:');
- Write(#9, 'Last name? '); ReadLn(lastName);
- Write(#9, 'First name? '); ReadLn(firstName);
- Write(#9, 'Birth year? '); ReadLn(year);
- repeat
- Write(#9, 'Birth month? '); ReadLn(month);
- until (month in [1..12]);
- repeat
- Write(#9, 'Birth day? '); ReadLn(day);
- until (day in [1..31]);
- WriteLn(#9, 'Adding marks:');
- for j := 1 to M do
- begin
- repeat
- Write(#9, #9, 'mark[', j, ']='); ReadLn(marks[j]);
- until (marks[j] in [2..5]);
- end;
- Write(f, stud);
- end;
- Close(f);
- end;
- begin
- Assign(f, 'student.dat'); AddingStudents(f);
- SortStudentsByLastName(f);
- ReadFormFileAndPrint(f);
- end.
Объяснение кода листинга программы
- Создается новый файл с названием
student.dat
или используется существующий файл. - Добавление студентов в файл. По запросу пользователя добавляется определенное количество студентов. Для каждого студента запрашиваются данные: фамилия, имя, год рождения, месяц рождения, день рождения, оценки.
- Файл закрывается и открывается заново для сортировки.
- Студенты сортируются в алфавитном порядке по фамилии.
- Сортировка происходит путем сравнения фамилий студентов. Если фамилия первого студента больше фамилии второго, то они меняются местами.
- Файл закрывается и открывается заново для чтения и вывода на экран.
- Каждый студент выводится на экран в формате: фамилия, имя.
- После чтения и вывода на экран файл закрывается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д