Файл. Текстовый файл. Запись в файл. Чтение из файла. Типизированные файлы, страница 5

Writeln (‘Второе no величине вещественное число в ‘,file_name, '=', L2:8:5);

Write ('Для завершения работы нажмите <Ehter>: ');

ReadLn;

end.


Усложним задачу и найдем n-е по величине число. В этом случае уже нельзя использовать алгоритм, подобный только что рассмотренному. Оптимальный способ решения данной задачи состоит в том, чтобы расположить элементы массива по возрастанию. Тогда нетрудно найти любой по порядку элемент,

Для упорядочения элементов массива по какому-либо признаку используются алгоритмы сортировки. Один из наиболее известных (но не очень эффективный) называется методом «пузырька» или методом «подстановки». Метод состоит в последовательном переборе элементов массива; и сравнении, значений соседних элементов. Если значения этих элементов расположены не в порядке возрастания, производится их перестановка. После выполнения первого перебора всех элементов массива наибольший из них окажется на последнем месте, а все остальные могут быть расположены не по возрастанию. Следовательно, перебор придется повторить для всех элементов массива, кроме последнего. После повторного перебора на предпоследнем месте окажется второй по величине элемент и т. д. Замечу еще, что для решения нашей задачи не требуется выполнения полной сортировки, достаточно лишь, чтобы n-й элемент оказался на «своем» месте. Это позволяет сократить количество операций, а следовательно, и время, необходимое для решения задачи.

Программапоискаn-гоповеличинезначениявтекстовомфайле

program nth_largest;

type

vector = array[0..100] of Real;

var

t : real;

file_name : String[9];

in_file : text;

values : vector;

j, k, max, n_th :Word;

Begin

Writeln('Введите имя файла:');

Readln(file_name);

WriteLn(‘Какое по счету наибольшее число следует найти?');

ReadLn(n_th);

Assign (in_fi1е, filename);

reset (in_file);

k := 0;

while not eof (in_file) do

begin

Read (in_fi1e, t);

values[k] := t;

Inc(k);

end;

close (in_file);

max := k – 1;

for j := 0   to n_th do

begin

for k := 1  to max - j  do

begin

if values[k] < values[k-1] then

begin

t:=values[k];

values[k] := values[k – 1];

values[k - l]:=t;

end;

end;

end;

WriteLn(n_th, '-e no величине вещественное число в ',

fi1e_name. '=', values[max - n_th + 1]:8:5);

write ('Для завершения работы нажмите <Enter>:');

ReadLn;

end.

Ограничения на чтение и запись

Файловый тип в языке Паскаль является абстракцией магнитной ленты. Операции resetи rewriteсоответствуют перемотке ленты и подготовке ее соответственно к чтению или записи. Heпосредственно за операцией записи операция чтения следовать не может, так же как за чтением не может следовать запись. Следовательно, если файл нужно использовать как для ввода, так и для вывода, его нужно «перемотать», заполнить информацией, снова «перемотать», а затем уже читать из него. Физическая природа фактически подключенного файла может накладывать на эту схему еще большие ограничения. Колоду перфокарт можно только читать, вывод на пульт машины также невозможен, напротив, печатающее устройство или экран дисплея может лишь принимать информацию. В связи с этим в языке Паскаль принято решение запретить как запись в файл input, так и ввод информации из файла output.

Пример: Дублирование перфокарт

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

programкопироватьколоду (вхфайл, выхфайл, output);

const

числоколонок = 80;

пробел = ‘ ‘;

type

номерколонки = 1 .. числоколонок;

Card = array [номерколонки] of char;

файлкарт = file of Card;

var

вхфайл, выхфайл : файлкарт;

text, пустаяCard : Card;

колонка : номерколонки;

begin

for колонка : = 1 to числоколонок do

пустаяCard[колонка] : = пробел;

reset (вхфайл);

rewrite (выхфайл);

while not eof (вхфайл) do

begin

read (вхфайл, text);

if text ¹пустаяCard

then write (выхфайл, text)

end {while}

end. {копироватьколоду}