Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

15. Записи

Предыдущий раздел:

Следующий раздел:

15.4. Примеры использования записей

Пример 1: Тип запись для хранения результатов экзамена, содержащий название предмета и оценку.

  type
    TExamRes = record
      Subject: string;
      Mark: 2..5;
    end;

Большая буква T в начале имени типа TExamRes добавлена из соображений стиля. Принято добавлять букву T ко всем идентификаторам вводимых вами типов.

Пример 2: Тип запись для хранения результатов сессии, содержащий имя студента и результаты экзаменов.

  TSession = record
    Name: string;
    ExamResults: array [1..5] of TExamRes;
  end;

Здесь одним из полей является целый массив элементов определенного выше типа TExamRes. Соответственно, если есть переменная этого типа:

  var
    s: TSession;

тогда s.Name – имя студентов, s.ExamResults[3].Subject – название 3-го экзамена и т.д.

Пример 3: Тип для хранения результатов сессии студенческой группы.

  TGroupResults = array [1..10] of TSession;

Элементы массива могут иметь любой тип в том числе и тип-запись. Чтобы совместно с результатами хранить номер группы можно использовать не тип массив, а новую запись:

  TRecGroupResults = record
    Number: integer; {Номер группы}
    GroupResults: array [1..10] of TSession;
  end;

Если есть переменная Res: TRecGroupResults, то

    Res.Number – номер группы,
    Res.GroupResults[i] – результаты i-го студента,
    Res.GroupResults[i].Name – имя i-го студента,
    Res.GroupResults[i].ExamResults[k].Mark – оценка i-го студента за k-й экзамен.

Пример 4: В текстовом файле students.txt хранится информация о студентах: ФИО, год рождения и какую школу окончил. Примеры строк из этого файла

    Иванов Иван Иванович 1985 11
    Петров Петр Петрович 1986 102

Требуется описать массив записей с информацией о студентах и прочитать данные из файла в этот массив. Программа также должна уметь по введенному номеру школы выдавать список закончивших ее студентов.

program Students;

type
  {Тип запись с информацией про студента}
  TStudent = record
    F, I, O: string;
    Year: 1900..2100;
    School: 1..200;
  end;

var
  {Массив информации о студентах}
  Students: array [1..1000] of TStudent;
  SNum: integer; {Количество студентов}
  SN: 1..200; {Номер школы}
  i: integer;

procedure ParseString(s: string; var F, I, O:string;
  var Year, School: integer);
{Процедура, которая из строки, считанной из файла, выделяет
 фамилию, имя, отчество, год рождения и номер школы}
var
  n, code: integer;
begin
  {Положение 1-го пробела в строке}
  n:=Pos(' ', S);
  {Выделение фамилии}
  F:=Copy(S, 1, n-1);
 {Берем все, что идет после 1-го пробела}
  S:=Copy(S, n+1, length(S));
  {Положение 1-го пробела в строке без фамилии}
  n:=Pos(' ', S);
  {Выделение имени}
  I:=Copy(S, 1, n-1);
  {Берем все, что идет после 1-го пробела}
  S:=Copy(S, n+1, length(S));
  n:=Pos(' ', S);
  O:=Copy(S, 1, n-1);
  S:=Copy(S, n+1, length(S));
  n:=Pos(' ', S);
  Val(Copy(S, 1, n-1), Year, code);
  //Year:=StrToInt(Copy(S, 1, n-1)); - для PascaABC
  S:=Copy(S, n+1, length(S));
  n:=Pos(' ', S);
  Val(Copy(S, 1, n-1), School, code);
  //Scool:=StrToInt(Copy(S, 1, n-1));
end;

procedure ReadData(FileName: string; 
  var Students: array of TStudent; var Num: integer);
{Процедура, читающая данные из файла и определяющая 
 их общее количество}
var
  F: text;
  S: string;
begin
  AssignFile(F, FileName);
  Reset(F);
  Num:=0;
  while not EOF(F) do
  begin
    Readln(F, S);
    with Students[Num] do
      ParseString(S, F, I, O, Year, School);
    Num:=Num+1;
  end;
  CloseFile(F);
end;

begin
  ReadData('students.txt', Students, SNum);
  Write(‘Input school number’);
  Readln(sn);
  {Поиск студентов из школы sn}
  for i:=1 to SNum do
    with Students[i] do
    begin
      if School = sn then
        writeln(F, ' ', I, ' ', O);
    end;
  readln;
end.

Следующий раздел:

Предыдущий раздел:

9 комментариев

  1. Таня

    Это то же самое что и типизированные файлы?

  2. Taras

    Да, нет. Это совсем другое.

  3. Таня

    Просто в раздатке по практике начало такое же.. А могут чем-то отличаться эти типизированные файлы для турбо и абц? Вроде всё нормально пишу, а вместе 4 чисел в файл записывается » ъ!» и даже в том примере что вместе с заданием что-то подобное

  4. Taras

    А как ты смотришь, что там записано? Это же не текстовый файл, куда пишутся коды символов. В файле находится двоичное представление твоих чисел. Если открываешь файл в каком-нибудь «блокноте», то видишь символы с кодами, выдранными из этого двоичного представления.

  5. Таня

    То есть может быть всё в порядке? А как правильно смотреть?

  6. Taras

    Долго не отвечал — только что вернулся из похода.

    Если нужно просто проверить, правильно ли все записалось, то надо просто написать еще одну программку или процедуру, которая прочитает и выведет содержимое файла. А вообще для просмотра бинарных файлов используют программки типа Hex Editor’а. Там каждый байт представляется двузначным шестнадцатиричным числом. Если ты знаешь, как в памяти представляются записываемые в файл числа, можешь разбить это представление на байты и сопоставить с тем, что видишь. Например, число типа integer нужно просто перевести в шестнадцатиричную систему счисления.

  7. Таня

    Hex Editor есть, думаю справлюсь. Спасибо!

  8. Сергей

    а сделайте пжлст лекцию про типизированные файлы))

  9. Taras

    Сделаю. Может быть, даже на этой неделе.

Добавить комментарий