Файл: Упорядочить список студентов по алфавиту и распечатать его. - 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
или используется существующий файл. - Добавление студентов в файл. По запросу пользователя добавляется определенное количество студентов. Для каждого студента запрашиваются данные: фамилия, имя, год рождения, месяц рождения, день рождения, оценки.
- Файл закрывается и открывается заново для сортировки.
- Студенты сортируются в алфавитном порядке по фамилии.
- Сортировка происходит путем сравнения фамилий студентов. Если фамилия первого студента больше фамилии второго, то они меняются местами.
- Файл закрывается и открывается заново для чтения и вывода на экран.
- Каждый студент выводится на экран в формате: фамилия, имя.
- После чтения и вывода на экран файл закрывается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д