Программа


USES CRT;  { Подключение модуля CRT }
CONST FileName='SCHOOL';   { Имя файла с данными }
      QuantityMarks=5;     { Количество оценок }
      MaxQuantityPupil=20; { Максимальное количество учеников }
TYPE PupilType=record { Тип "Ученик" }
                 FamilyName:string[10];
                 Name:String[10];
                 Form:record
                        Year:byte;
                        Letter:char;
                      end;
                 Marks:array [1..QuantityMarks] of byte
               end;
    SchoolType=array [1..MaxQuantityPupil] of PupilType; { Тип "Школа" }
VAR MeterPupil,MeterChar:integer; { Счетчики учеников и символов }
    F:file of PupilType; { Файл учеников }
    School:SchoolType;   { Массив учеников }
    Pupil:PupilType;     { Ученик }
PROCEDURE SortArray(var School:SchoolType;MaxNumber:integer);
                                              { Процедура сортировки массива }
  Var MeterInside:integer; { Внутренний счетчик }
  Procedure Change(var A,B:PupilType); { Процедура обмена }
    var Buf:PupilType;       { Буфер для переноса элементов }
    begin Buf:=A; A:=B; B:=Buf end;
  Function GetNumberMinElement(StartElement,EndElement:integer;
                               School:SchoolType):integer;
                               { Функция поиска наименьшего элемента }
    var Meter:integer; { Счетчик }
        NumberMinElement:integer; { Номер минимального элемента }
    function SecondElementIsMin(First,Second:PupilType):boolean;
                                 { Функция определения минимального элемента }
      begin
        if Second.Form.Year<First.Form.Year
        then SecondElementIsMin:=TRUE
        else if Second.Form.Year>First.Form.Year
             then SecondElementIsMin:=FALSE
             else if Second.Form.Letter<First.Form.Letter
                  then SecondElementIsMin:=TRUE
                  else if Second.Form.Letter>First.Form.Letter
                       then SecondElementIsMin:=FALSE
                       else if Second.FamilyName<First.FamilyName
                            then SecondElementIsMin:=TRUE
                            else if Second.FamilyName>First.FamilyName
                                 then SecondElementIsMin:=FALSE
                                 else if Second.Name<First.Name
                                      then SecondElementIsMin:=TRUE
                                      else SecondElementIsMin:=FALSE
      end;
    begin
      NumberMinElement:=StartElement;
                        { Начальное определение номера минимального элемента }
      for Meter:=StartElement+1 to EndElement do { Цикл просмотра
            неотсортированной части массива и выявление наименьшего элемента }
        if SecondElementIsMin(School[NumberMinElement],School[Meter])
          then NumberMinElement:=Meter;
                               { Переопределение номера наименьшего элемента }
      GetNumberMinElement:=NumberMinElement { Определение значения функции }
    end;
  Begin
    for MeterInside:=1 to MaxNumber do { Цикл сортировки }
      Change(School[MeterInside], 
             School[GetNumberMinElement(MeterInside,MaxNumber,School)])
                { Перестановка текущего элемента и наименьшего из поледующих }
  End;
PROCEDURE OutArray(School:SchoolType;MaxNumber:integer);
                                                  { Процедура вывода массива }
  Var MeterInside:integer; { Внутренний счетчик }
      MeterMarks:integer;  { Счетчик оценок }
      MediumMark:real;     { Средний балл }
  Begin
    ClrScr; { Очистка экрана }
    { Вывод шапки таблицы }
    WriteLn('╔═══════════════════════╦═════╦════════╦═══════╗');
    WriteLn('║  Фамилия    Имя       ║Класс║ Оценки ║Ср.балл║');
    WriteLn('╠═══════════════════════╬═════╬════════╬═══════╣');
    for MeterInside:=1 to MaxNumber do { Цикл вывода учеников }
      with School[MeterInside] do
        begin { Вывод ученика: }
          Write('║ ',FamilyName,' ',Name,' ║ ',Form.Year:2,Form.Letter,' ║ ');
          { Подсчет среднего балла: }
          MediumMark:=0; { Сброс значения среднего балла }
          for MeterMarks:=1 to QuantityMarks do { Набор суммарной оценки }
            MediumMark:=MediumMark+Marks[MeterMarks];
          MediumMark:=MediumMark/QuantityMarks; { Пересчет среднего балла }
          for MeterMarks:=1 to QuantityMarks do { Цикл вывода оценок }
            if Marks[MeterMarks]>0 then Write(Marks[MeterMarks])
                                   else Write('.');
         WriteLn('  ║ ',MediumMark:4:1,'  ║') { Вывод среднего балла }
        end;
    { Закрытие таблицы: }
    WriteLn('╚═══════════════════════╩═════╩════════╩═══════╝');
  End;
BEGIN
  Assign(F,FileName); { Связывание файловой переменной с именем файла }
  Reset(F);           { Открытие файла под чтение }
  MeterPupil:=0;      { Начальное определение счетчика }
  while not EOF(F) and (MeterPupil<=MaxQuantityPupil) do { Цикл чтения файла }
    Begin
      Inc(MeterPupil);  { Подсчет числа записей }
      Read(F,School[MeterPupil]); { Чтение записи из файла }
      { Выравнивание пробелами длин фамилии и имени: }
      with School[MeterPupil] do
        begin
          for MeterChar:=Length(FamilyName)+1 to 10 do
            FamilyName:=FamilyName+' ';
          for MeterChar:=Length(Name)+1 to 10 do Name:=Name+' '
        end
    End;
  SortArray(School,MeterPupil); { Сортировка массива }
  OutArray(School,MeterPupil);  { Вывод массива }
  Close(F) { Закрытие файла }
END.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию