Файл: 2. Лекции Паскаль (Часть 2).doc

Добавлен: 19.10.2018

Просмотров: 4356

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Оглавление

9. Файловые типы данных

9.1. Инициализация файла

9.2. Файлы и работа с ними

Лабораторная работа №11.

Работа с внешними файлами

Лабораторная работа №11, вариант № 5.

Работа с внешними файлами

Варианты заданий.

9.3. Сортировка файлов.

9.3.1. Слияние упорядоченных последовательностей.

9.3.2. Сортировка сбалансированным слиянием

9.3.3. Сортировка простым слиянием

9.3.4. Сортировка естественным слиянием.

9.3.5. Сортировка многофазным слиянием.

Лабораторная работа №12.

Сортировка файлов.

Лабораторная работа №12.

Сортировка файлов.

10. Динамическая память.

10.1. Указатели.

10.2. Списки.

Лабораторная работа № 13.

Исключение элементов списка.

Образец выполнения работы.

Лабораторная работа № 13.

Исключение элементов списка.

Варианты задания.

Лабораторная работа № 14.

Работа со списками.

Образец выполнения работы.

Лабораторная работа № 14.

Работа со списками.

Варианты задания.

Лабораторная работа № 15.

Выполнение операций над списковыми структурами.

Образец выполнения работы.

Лабораторная работа № 15.

Выполнение операций над списковыми структурами.

Варианты заданий.

10.3. Деревья.

10.4. Стеки, очереди.

Образец выполнения работы.

Лабораторная работа № 16.

Работа со стеками и очередями.

Лабораторная работа № 16.

Работа со стеками и очередями.

11. Организация меню с использованием средств среды Turbo Pascal

Лабораторная работа №17.

Составления меню.

Образец выполнения работы.

Лабораторная работа № 17.

Составления меню.



окно




Оператор READ(F, X) читает из файла в переменную X (из той позиции, на которую указывает окно) очередную компоненту, после чего окно сдвигается на следующую позицию. Естественно тип переменной X должен совпадать с типом компонента файла F. Результат выполнения выглядит следующим образом:


F

f1

f1

f2

…………



Окно

X=f1;




F

f1

f2

f3



окно

X=f2;

и так далее.

Чтение из файла с помощью процедуры READ(F, X) можно производить только после выполнения процедуры RESET(F).

При чтении из файла нужно определять, указывает ли окно на какую-то компоненту файла или указывает на маркер конца файла. Для определения этого факта в паскале введена в употребление стандартная логическая функция с именем EOF (от end of file), обращение к которой имеет вид eof(F).

Значение этой функции равно TRUE, если окно указывает на маркер конца файла с именем F, и значению FALSE в противном случае.

Недопустимо использовать процедуру READ(F, X) если eof(F)=TRUE.


Например:

Var: data:file of integer ; {задаём файловую переменную data содержащую целые}

x:integer ; {числа типа integer }

begin

assign(data, ’ c:\tp\user.me ’); {связываем файловую переменную с существующим }

reset(data); {файлом или с файлом который будет создан }

while not eof(data) {если не уверены что файл содержит данные сначала проверяем}

begin {а потом читаем }

read(data,x); {читаем все данные из файла до конца }

…………..

…………..

end;

close(data);

end.

или

Например:

Var: data:file of integer ; {задаём файловую переменную data содержащую целые}

x:integer ; {числа типа integer }

begin

assign(data, ’ c:\tp\user.me ’); {связываем файловую переменную с существующим }

reset(data); {файлом или с файлом который будет создан }

repeat

read(data,x); {читаем все данные из файла до конца }

…………..

…………..

until eof(data); {если уверены что файл содержит хоть одну компоненту, можно}

close(data); {сначала прочитать её в переменную X а потом проверить }

end.


Стандартная процедура чтения компоненты из файла READ(F, X) выполняет два действия: первое-это копирования компоненты файла в переменную X, а второе-это передвижение окна на следующую компонента. В некоторых задачах удобно иметь возможность производить эти два действия отдельно. Для таких случаев удобно использовать буферные переменные файлов.

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


В режиме чтения значение переменной F^ всегда является та компонента файла на которую указывает окно. При выполнении процедуры RESET(F) происходит не только установка окна на начало файла, но и присваивание значения первой компоненты файла буферной переменной:

F

f1

f2

f3



окно

F^ = f1;

Для передвижения окна на следующую компоненту непустого файла предусмотрена процедура GET(F), параметром которой является имя файловой переменной. Результат этой процедуры состоит в передвижении окна на следующую позицию файла и присваиванием значения этой следующей компоненты буферной переменной.


В режиме записи буферная переменная выполняет роль поставщика значений компонент файла. Процедура PUT(F) производит запись в файл F в качестве очередной компоненты значение буферной переменной F^ и сдвигает окно на следующую позицию:

F

f1

до выполнения процедуры GET(F)



окно

F^:=f2; {присваиваем значение буферной переменной}

Get(F);


F

f1

f2

после выполнения процедуры GET(F)



окно


Лабораторная работа №11.

Работа с внешними файлами

Цель задания.

  1. Ознакомление с возможностями организации файлов на внешних носителях в ЭВМ.

  2. Получение навыков работы с внешними файлами.

Постановка задачи.

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

  1. ФИО.

  2. Год рождения.

  3. Год окончания школы.

  4. Оценки в аттестате.

  5. Признак - нуждается ли в общежитии.

  6. Оценки вступительных экзаменов.

Разработать программу записи подготовленных данных во внешний файл и программу обработки созданного внешнего файла.


Удалить из внешнего файла все записи, удовлетворяющие условию, заданному в варианте, и распечатать записи , оставшиеся в файле.


Добавить N записей в начало(конец) внешнего файла и распечатать записи полученного файла согласно конкретному варианту.


Содержание отчета.

  1. Постановка задачи.

  2. Анкетные данные абитуриентов.

  3. Тексты программ.

  4. Распечатка результатов выполнения программы.


Методические указания.

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

Образец выполнения задания.

Лабораторная работа №11, вариант № 5.

Работа с внешними файлами

Постановка задачи.

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

  1. ФИО.

  2. Год рождения.

  3. Год окончания школы.

  4. Оценки в аттестате.

  5. Признак - нуждается ли в общежитии.

  6. Оценки вступительных экзаменов.

Разработать программу записи подготовленных данных во внешний файл и программу обработки созданного внешнего файла.



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


Добавить 4 записи в начало(конец) внешнего файла и распечатать список студентов не нуждающихся в общежитии.




Анкетные данные на абитуриентов в конце методического пособия.

Тексты программ №1.

Программа записи подготовленных данных во внешний файл.


program lab11{вариант № 5};

uses crt;

type data=record

fio:string[30];

godr,godo:integer;

ates:record

mat,fiz,rus:integer;

end;

haus:boolean;

ekz:record

mat,fiz,rus:integer;

end;

end;

var stu:data;

files:file of data;

keys:char;

begin

assign(files,'c:\tp\data.dat');

rewrite(files);

repeat;

clrscr;

writeln(' Вводим данные об абитуриентt');

write('Фамилия Имя Отчество..');readln(stu.fio);

write('Год рождения..........');readln(stu.godr);

write('Год окончания школы...');readln(stu.godo);

writeln(' Оценки в атестате');

write('Метематика.....');readln(stu.ates.mat);

write('Физика.........');readln(stu.ates.fiz);

write('Русский язык...');readln(stu.ates.rus);

writeln('Нуждается ли в общежитии (1-да/2-нет)');

keys:=readkey;if keys='1' then stu.haus:=true

else stu.haus:=false;

writeln(' Оценки на вступительных экзаменах');

write('Метематика.....');readln(stu.ekz.mat);

write('Физика.........');readln(stu.ekz.fiz);

write('Русский язык...');readln(stu.ekz.rus);

write(files,stu);

clrscr;

writeln(' Данные об абитуриенте введены');

writeln('1-Добавить данные');

writeln('2-Выход');

writeln(' (нажмите 1 или 2)');

keys:=readkey;

until keys='2';

close(files);

end.

Тексты программ №2.

Программа обработки созданного внешнего файла.

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


program lab11{вариант № 5};

uses crt;

type data=record

fio:string[30];

godr,godo:integer;

ates:record

mat,fiz,rus:integer;

end;

haus:boolean;

ekz:record

mat,fiz,rus:integer;

end;

end;

var stu:data;

files,filee:file of data;

keys:char;

begin

assign(files,'c:\tp\data.dat');

assign(filee,'c:\datae.dat');

reset(files);rewrite(filee);

while not eof(files)do

begin

read(files,stu);write(filee,stu);

end;

reset(filee);rewrite(files);

while not eof(filee) do

begin

read(filee,stu);

if (stu.godr>=1983)or not(stu.haus) then write(files,stu);

end;

close(files);close(filee);erase(filee);

end.


Тексты программ №3.

Программа обработки созданного внешнего файла.

Добавить 4 записи в начало(конец) внешнего файла и распечатать список студентов не нуждающихся в общежитии.


program lab11{вариант № 5};

uses crt;

type data=record

fio:string[30];

godr,godo:integer;

ates:record

mat,fiz,rus:integer;

end;

haus:boolean;

ekz:record

mat,fiz,rus:integer;

end;

end;

var stu:data;

files,filee:file of data;

keys:char;

procedure add(n:integer);

begin

assign(files,'c:\tp\data.dat');assign(filee,'c:\date.dat');

reset(files);rewrite(filee);

while not eof(files) do begin read(files,stu);write(filee,stu);end;

reset(filee);rewrite(files);

while not eof(filee) do begin read(filee,stu);write(files,stu);end;

for n:=1 to n do

begin

clrscr;

writeln(' Вводим данные об абитуриентt');

write('Фамилия Имя Отчество..');readln(stu.fio);

write('Год рождения..........');readln(stu.godr);

write('Год окончания школы...');readln(stu.godo);

writeln(' Оценки в атестате');

write('Метематика.....');readln(stu.ates.mat);

write('Физика.........');readln(stu.ates.fiz);

write('Русский язык...');readln(stu.ates.rus);

writeln('Нуждается ли в общежитии (1-да/2-нет)');

keys:=readkey;if keys='1' then stu.haus:=true

else stu.haus:=false;


writeln(' Оценки на вступительных экзаменах');

write('Метематика.....');readln(stu.ekz.mat);

write('Физика.........');readln(stu.ekz.fiz);

write('Русский язык...');readln(stu.ekz.rus);

write(files,stu);

end;

close(files);close(filee);erase(filee);

end;

procedure print;

var n:byte;

begin

writeln(' ',stu.fio);

writeln('Год рождения..........',stu.godr);

writeln('Год окончания школы...',stu.godo);

writeln(' Оценки в атестате');

writeln('Метематика............',stu.ates.mat);

writeln('Физика................',stu.ates.fiz);

writeln('Русский язык..........',stu.ates.rus);

writeln(' Оценки на вступительных экзаменах');

writeln('Метематика............',stu.ekz.mat);

writeln('Физика................',stu.ekz.fiz);

writeln('Русский язык..........',stu.ekz.rus);

if stu.haus then writeln('Нуждается в общежитии')

else writeln('Не нуждается в общежитии');

for n:=1 to 79 do write('*');

writeln('Для продолжения нажмите Enter !');

readln;

end;

begin

add(4);

clrscr;

reset(files);

while not eof(files) do

begin

read(files,stu);

if not stu.haus then print;

end;

close(files);

end.


Варианты заданий.

Из внешнего файла, содержащего исходные данные, удалить записи, соответствующие:

1) абитуриентам, получившим хотя бы одну оценку 2.

2) иногородним абитуриентам, получившим все оценки 3.

3) абитуриентам, имеющим средний балл меньше 4 и хотя бы оценку 3 в аттестате.

4) абитуриентам, имеющим средний балл в аттестате меньше 4.

5) абитуриентам, имеющим средний балл больше 4,5 и нуждающимся в общежитии.

6) иногородним абитуриентам, не получившим ни одной оценки 5.

7) абитуриентам, имеющим отличный аттестат и получившим все оценки 3.

8) абитуриентам, нуждающимся в общежитии и получившим хотя бы одну оценку 3.

9) абитуриентам, которые старше 18 лет и имеющим отличный аттестат.

10) абитуриентам, имеющим средний балл в аттестате меньше 4,5.

11) абитуриентам, имеющим средний балл за экзамены меньше 4,5.

12) абитуриентам, имеющим отличный аттестат и получившим за экзамены одну оценку 3.

13) абитуриентам, не имеющим в аттестате оценок 5.

14) абитуриентам, имеющим средний балл в аттестате 4,5 и получившим хотя бы одну оценку 3.

15) абитуриентам, имеющим отличный аттестат и нуждающимся в общежитии.

16) абитуриентам, у которых больше одной оценки 3 в аттестате.

17) абитуриентам, у которых больше одной оценки 3 за экзамены.

18) список абитуриентов, сдавших вступительные экзамены на оценки 4 и 5 и возраст менее 20 лет.

19) список абитуриентов, у которых две оценки 3 за экзамены и отличный аттестат.

20) список абитуриентов, у которых все экзамены сданы на 4 и нуждающимся в общежитии.

21) список абитуриентов, у которых не более двух оценок 5 в аттестате.

22) список абитуриентов, у которых менее двух оценок 5 за экзамены.

23) список абитуриентов, у которых менее одной оценки 5 за экзамены.

24)список абитуриентов, у которых менее одной оценки 5 за экзамены и нуждающимся в общежитии.


Используя внешний файл, содержащий исходные данные, добавить N записей и распечатать:

1) список абитуриентов, имеющих в аттестате только оценки 5 (N=2).

2) список абитуриентов, имеющих в аттестате одну оценку 4, а остальные 5 (N=3).

3) список абитуриентов, имеющих средний балл больше 4,5 (N=4).