Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль.doc
Скачиваний:
58
Добавлен:
07.06.2015
Размер:
1.21 Mб
Скачать

21.2. Типизированные файлы

Характерные особенности типизированных файлов:

1) файл может состоять из записей любого типа;

2) данные передаются из него или в него целыми записями (а не символами или строками)

3) при создании файла записи в нем автоматически нумеруются, причем номер первой из них равен 0.

В разделе Var файл описывается так:

Var

Имя : File Of Тип_Записей;

где Тип_Записей – скалярный (число, символ) или сложный (массив, тип Record и др.).

Пример. Type

Anketa = Record

Fam,Im,Ot : String[10];

Numz : Integer;

O : Array[1..5] Of Integer;

End;

Var

FilAnk : file of Anketa;

Dan : File Of Real;

Fl : File Of Char;

Rank : Anketa;

X : Real;

Операции чтения и записи для типизированных файлов записываются в следующем виде:

Read(Файл, Список_ввода);

Write(Файл, Список_вывода);

Пример. Write(FilAnk,Rank);

21.2.1. Последовательная обработка типизированных файлов

Пример 1. Программа обработки файла, содержащего данные простого типа. При исследовании некоторого технического объекта замерены его параметры Xi и записаны в набор данных StatDan в виде вещественных чисел. Вычислить их среднее значение Mx и стандартное отклонение  по формулам:

Алгоритм для этой задачи будет следующий.

  1. Открыть файл

  2. Подсчитать среднее значение Mx и стандартное отклонение .

  3. Закончить.

Уточняем алгоритм.

1.1. Связать файл из программы с набором StatDan.

1.2. Открыть файл для чтения.

2.1. Mx := 0.

2.2.  := 0.

2.3. N := 0.

2.4. Пока не конец файла выполнить

2.4.1. Считать из файла число.

2.4.2. Mx := Mx + число.

2.4.3.  :=  + х2

2.4.4. N := N + 1.

2.5. Вычислить Mx и .

2.6. Вывести Mx и .

2.7. Закрыть файл.

3. Закончить.

Программа, реализующая этот алгоритм, может быть такой:

Program Stat;

Var

F : File Of Real;

X,M,S : Real;

N : Integer;

Begin

Assign(F,’StatDan’);{ Здесь имя набора задано в виде}

Reset(F); { строковой константы StatDan}

S := 0;

M := 0;

N := 0;

While not Eof(F) do

Begin

Read(F,X);

N := N+1;

M := M+x;

S := S+Sqr(X);

end;

M := M/N;

S := Sqrt(S-Sqr(M))/ N;

Writeln(’Количество измерений - ’,N);

Writeln(’Среднее: ’,M:8:3,’ Отклонение: ’,S:8:3);

end.

Пример 2. Последовательное создание типизированного файла, содержащего данные сложного типа

Как отмечалось выше, к таким данным можно отнести массивы и записи Паскаля. Наиболее типичными являются файлы, содержащие данные типа Record.

Задача. Сформировать и вывести на экран файл, представляющий собой ведомость успеваемости студентов 1 курса ФАИТ. Данные об одном студенте имеют структуру вида:

Фамилия, Имя, Отчество, номер зачетки, оценки по 5 предметам.

Количество студентов (n) и сведения о них вводятся с клавиатуры. Программа для решения поставленной задачи может быть такой.

Program Sozd_Fil;

Const

M=5; { Количество оценок }

Type

Stud=Record

Fam, Im, Ot : String[10];

NumZ : LongInt;

Otm : Array[1..M] Of Integer;

End;

Var

Vedom : File Of Stud;

A : Stud;

FilName : String; { имя набора данных }

j,i,n : Integer;

Begin

Writeln(’Введите имя набора данных’);

Readln(FilName);

Assign(Vedom,FilName);

Rewrite(Vedom); {Открытие файла для записи}

Writeln(’Введите количество студентов’);

Readln(n);

Writeln (’Вводите сведения о каждом студенте’);

For i:=1 to n do

Begin

With A do

Begin

Write(’Фамилия: ’);

ReadLn(Fam);

Write(’Имя: ’);

ReadLn(Im);

Write(’Отчество: ’);

ReadLn(Ot);

Write(’Номер зачетки: ’);

ReadLn(Numz);

WriteLn(’Введите оценки по одной:’);

For J := 1 to 5 do

Begin

WriteLn(’Введите ’,J,’ -ю оценку’);

ReadLn(Otm[j]);

End;

End;

Write(Vedom,A); {Запись в файл переписывается целиком}

End;

Close(Vedom);

Writeln (’Конец работы. Нажмите клавишу ENTER’);

ReadLn;

End.

Пример 3. Последовательная обработка файла Vedom

Задача. Вывести на экран сведения о неуспевающих студентах из файла Vedom предыдущего примера. Соответствующая программа будет иметь следующий вид.

Program Count_2;

Const

M=5;

Dl=10;

Type

Stud = Record

Fam, Im, Ot : String[Dl];

Numz : LongInt;

Otm : Array[1..M] Of Integer;

End;

Var

Vedom : File Of Stud;

FilName : String;{имя набора данных}

A : Stud;

i,j,kdv,K2 : Integer;

Begin

Writeln(’Введите имя набора данных’);

Readln(FilName);

Assign(Vedom,FilName);

Reset (Vedom); {открытие файла, 1-я запись - в буфере}

kdv := 0;

I := 0;

Writeln(’Список фамилий и номеров зачеток неуспевающих студентов’);

While Not Eof(Vedom) Do

Begin

K2 := 0;

Read(Vedom,A);

I := i+1;

With A Do

Begin

For j := 1 To M Do

If Otm[j] < 3 Then

K2 := K2+1;

If K2 > 0 Then

Begin

kdv := kdv+1;

Writeln(Fam:15,Numz:8);

End;

End;{Whith}

End;{While}

Writeln(’Проверено ’,i,’ студентов.’);

Writeln(’Из них неуспевающих ’,kdv,’ человек’);

WriteLn(’Нажмите Enter’);

Readln;

End.