Здавалка
Главная | Обратная связь

While NOT(EOF(baza)) Do



Begin

ReadLn(baza, nomer, fam, name, ocenka, sr_ball); читаем из файла очередную строку с данными

WriteLn(nomer:10, fam:15, name:15, ocenka:3, sr_ball:6:2 ); выводим ее на экран

End;

Close(baza); закрываем файл

ReadLn;

End.

На экране появится:

ИС-09 Иванов Иван 4 4.12

ПО-09 Петров Петр 5 4.27

ЗИ-09 Сидоров Сидор 3 3.42

Конечно, правильное чтение данных из текстового файла возможно только тогда, когда мы точно знаем структуру этого файла.

 

Записи

На начальных этапах развития программирования, при решении математических, экономических или инженерных задач программисты, как правило, обходились десятком переменных, которые обрабатывались разными алгоритмами. С течением времени объемы обрабатываемых данных стали расти. Приходилось обрабатывать не один-два десятка чисел, а целые таблицы. К тому же таблицы стали содержать не только числовую, но и текстовую информацию. И тут на помощь пришли новые типы данных – массивы, строки, множества. С их помощью можно объединить несколько объектов под одним именем, а затем обращаться к ним поэлементно. Основное требование при создании таких структур – однотипность объединяемых объектов. Однако сложность многих реальных ситуаций требует для своего отражения более гибких средств программирования.

Практика показала, что для обработки больших совокупностей однотипных данных такая структура, как массив, очень полезна. Но массив полезен тогда, когда обрабатывается однотипная информация. Реальные задачи в большинстве своем имеют дело с обработкой данных различных типов: информация по кадрам, статистические данные, бухгалтерский учет, экономические задачи. В этих задачах существенно то, что совместно обрабатывается числовая и текстовая информация, причем, как правило, размерность обрабатываемых данных даже одного типа весьма различна. Например, для хранения данных об одном студенте (номер учебной группы, фамилия, имя, оценка по информатике, средний балл сдачи сессии) нельзя использовать один массив, так как эти данные разнотипны: номер группы, фамилия, имя – строки, оценка – целое, средний балл – вещественное. Конечно, можно использовать несколько массивов: один - для хранения номеров групп, второй – для хранения фамилий и имен, третий – для хранения оценок, четвертый – для хранения средних баллов и так далее. Связь между этими массивами можно установить с помощью индексов. При этом необходимо будет решать сложную задачу целостности информации. Например, если произвести сортировку фамилий во втором массиве по алфавиту, то соответствующим образом необходимо переставить элементы остальных массивов, чтобы фамилии соответствовали остальным данным. Это достаточно сложная задача.

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

Для работы с данными различных типов, но объединенных в одну структуру под одним именем, в Паскале введен новый тип данных – запись.

Записи могут состоять из компонентов различных типов, называемых полями. Каждое поле можно рассматривать как отдельную переменную, имеющую свое имя.

В отличие от ранее рассмотренных типов данных, тип записи описывается в разделе определения типов:

Type TStudent = Record

nomer, fam, name : String[15];

ocenka : 2..5;

sr_ball : Real;

End;

Внимание! Описание записи заканчивается словом End, для которого нет слова Begin.

Описан тип записи с именем TStudent, имеющий поля:

nomer, fam, name - номер группы, фамилия и имя – строки длиной 15 символов,

ocenka - оценка по информатике – интервал от 2 до 5,

sr_ball - средний балл сдачи сессии – вещественное.

Таким образом, при описании полей указываются их имена и через двоеточие – типы. Описание заканчивается словом End.

После определения типа записи можно описать разные базовые структуры этого нового типа в разделе описания переменных:

Var stud_1 : TStudent;

gruppa : Array [1..15] Of TStudent;

baza_gruppa : File Of TStudent;

Описанная переменная stud_1 имеет те же поля, что и запись типа TStudent. Чтобы обратиться к любому поля, необходимо написать имя переменной и через точку – имя поля. Поле записи определенного типа может являться операндом в любых выражениях того же типа, то есть к нему могут применяться операции, допустимые для переменных данного типа:

stud_1.nomer := ‘ИС-09’;

stud_1.fam := ‘Иванов’;

stud_1.name := ‘Ваня’;

stud_1.ocenka := 4;

stud_1.sr_ball := 4.12;

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

.nomer := ‘ИС-09’; это неправильно!

.fam := ‘Иванов’; это неправильно!

Для упрощения работы с записями в Паскале введен специальный оператор, позволяющий сократить написание имен записей – оператор присоединения:

With x Do

оператор;

где With - служебное слово c,

x - имя переменной-записи,

Внутри этого оператора поля переменной-записи обозначаются без имени самой записи:

With stud_1 Do

Begin

nomer := ‘ИС-09’;

fam := ‘Иванов’;

name := ‘Ваня’;

ocenka := 4;

sr_ball := 4.12;

End;

Внимание! Запись может быть введена с клавиатуры и выведена на экран только по полям, а не целиком, то есть в операторах ввода и вывода ReadLn и WriteLn нельзя указывать имя записи без имени поля:

ReadLn(stud_1); это неправильно!

WriteLn(stud_1); это неправильно!

ReadLn(stud_1.ocenka); это правильно!

WriteLn(stud_1.ocenka); это правильно!

Записи могут являться элементами массивов, то есть разрешены массивызаписей, например, описанный выше массив gruppa. Каждый элемент этого массива – отдельная запись со всеми полями, определенными при ее описании. При обращении к элементу такого массива указывается имя массива, индекс элемента и через точку – имя поля:

gruppa[5].nomer := ‘ИС-09’;

gruppa[5].fam := ‘Иванов’;

gruppa[5].name := ‘Ваня’;

gruppa[5].ocenka := 4;

gruppa[5].sr_ball := 4.12;

В этом случае тоже можно использовать оператор присоединения:

With gruppa[5] Do

Begin

nomer := ‘ИС-09’;

fam := ‘Иванов’;

name := ‘Ваня’;

ocenka := 4;

sr_ball := 4.12;

End;

При работе с файлами записей (базами данных) необходимо учитывать то, что для ввода и вывода элементов такого файла – отдельных записей – необходимо использовать рабочую переменную-запись, имеющую такие же поля, что и элементы файла. Для ввода очередного элемента в данный файл сначала необходимо заполнить все поля рабочей переменной, например, операторами ввода:

 

ReadLn(stud_1.nomer);

ReadLn(stud_1.fam);

ReadLn(stud_1.name);

ReadLn(stud_1.ocenka);

ReadLn(stud_1.sr_ball);

а затем записать эту переменную в файл целиком:

Write(baza_gruppa, stud_1);

Очередная запись читается из файла тоже целиком:

Read(baza_gruppa, stud_1);

после этого ее можно, например, вывести на экран по полям:

With stud_1 Do

WriteLn(nomer:10, fam:15, name:15, ocenka:3, sr_ball:6:2);

В данном случае запись выведена в одну строку форматным способом.

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

Пример: создать базу данных (файл записей), в которой можно было бы хранить следующие данные о студентах:

учебная группа,

личные данные:

фамилия,

имя,

отчество,

дату рождения:

год,

месяц,

день,

адрес:

город,

улица,

дом,

корпус,

квартира,

телефон.

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

Интерфейс:

Группа: ИС-09

Фамилия: Иванов

Имя: Иван

Отчество: Иванович

Год рождения: 1993

Месяц рождения: 2

День рождения: 23

Город: Иркутск

Улица: Трилиссера

Дом: 123

Корпус: 2

Квартира: 45

Телефон: 235347

Группа:

 

На экран будет выведено:

ИС-09 Иванов Иван Иванович

 

Программа:

Program Baza_student;

Uses WinCrt;

Type TKadr = Record основная запись

gruppa : String[10];

fio : Record запись в записи

fam, name : String[10];

otch : String[15];

End;

adres: Record запись в записи

gorod, ulica : String[20];

korp, dom, kv: String[5];

telefon : String[10];

End;

data : Record запись в записи

den : 1..31;

mes : 1..12;

god : 1900..2000;

End;

End;

Var student : TKadr;

baza : File Of TKadr;

Begin

ClrScr;

Assign(baza, 'D:\User\baza_student.dat');

ReWrite(baza); открываем файл для записи

Repeat начало цикла ввода

With student Do оператор присоединения

Begin

Write('Группа: ');

ReadLn(gruppa);

If (Length(gruppa)=0) если номер группы не введен,

Then Break; то выходим из цикла ввода

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

ReadLn(fio.fam);

Write('Имя: ');

ReadLn(fio.name);

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

ReadLn(fio.otch);

Write('Год рождения: ');

ReadLn(data.den);

Write('Месяц рождения: ');

ReadLn(data.mes);

Write('День рождения: ');

ReadLn(data.den);

Write('Город: ');

ReadLn(adres.gorod);

Write('Улица: ');

ReadLn(adres.ulica);

Write('Дом: ');

ReadLn(adres.dom);

Write('Корпус: ');

ReadLn(adres.korp);

Write('Квартира: ');

ReadLn(adres.kv);

Write('Телефон: ');

ReadLn(adres.telefon);

End; конец оператора присоединения

Write(baza, student); запись в базу данных

Until (False); конец цикла ввода

ReSet(baza); открываем файл для чтения

While Not(EOF(baza)) Do пока не конец файла

Begin

Read(baza, student); читаем данные из файла

With student Do и выводим на экран форматным способом

WriteLn(gruppa:10, fio.fam:10, fio.name:10, fio.otch:15);

End;

Close(baza); закрываем файл

ReadLn;

End.

На практике часто бывает удобно сделать некоторые поля записи изменяемыми (вариантными).

Например, если имеются две записи с одинаковыми полями, различающихся только одним полем, то эти две записи можно представить одной, а различающиеся поля сделать вариантными. Тип и структура вариантного поля изменяются в зависимости от значения особого поля записи, называемого селектором (переключателем). В качестве селектора можно использовать поле любого упорядоченного типа: целого, символьного, интервального или перечисляемого. Конкретные значения, принимаемые селектором, называются ключами вариантов.

Записи с вариантными полями называются записями с вариантами. Вариантные поля в них описываются после неизменяемых. Наличие вариантного поля указывается конструкцией:







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.