Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмизация и программирование ч.2.doc
Скачиваний:
6
Добавлен:
24.09.2019
Размер:
7.68 Mб
Скачать

3.3. Работа с текстовыми файлами

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

Результат работы программы тоже бывает полезно выводить не на экран, а в текстовый файл для последующего неспешного анализа. Ниже приведена версия предыдущей программы, использующая файлы:

program num_positive_2;

const n = 10;

var

f_in, f_out : text; { 1 }

a : array [1 .. n] of integer;

i, imax, imin, ibeg, iend, count : integer;

begin

assign(f_in, 'E:\input.txt'); { 2 }

reset(f_in); { 3 }

assign(f_out, 'E:\output.txt'); { 4 }

rewrite(f_out); { 5 }

for i :=1 to n do read(f_in, a[i]); { 6 }

imax := 1; imin := 1;

for i:=1 to n do begin

if a[i] > a[imax] then imax := i;

if a[i] < a[imin] then imin := i;

end;

if imax < imin then ibeg := imax else ibeg := imin;

if imax < imin then iend := imin else iend := imax;

count := 0;

for i := ibeg + 1 to iend - 1 do

if a[i] > 0 then inc(count);

writeln(f_out, ' Количество положительных:', count); { 7 }

close(f_out); { 8 }

end.

Для того чтобы использовать в программе файлы, необходимо сделать следующее:

  1. Объявить файловую переменную (оператор 1).

  2. Связать ее с файлом на диске (операторы 2 и 4).

  3. Открыть файл для чтения (оператор 3) или записи (оператор 5).

  4. Выполнить операции ввода-вывода (операторы 6 и 7).

  5. Закрыть файл (оператор 8).

В этой программе объявляются две переменные f_in и f_out стандартного типа «текстовый файл». Процедура assign связывает эти переменные с файлами на диске, путь к которым задается с помощью строк символов. Если полный путь не указан, предполагается, что файл находится в текущем каталоге. Процедура reset открывает файл для чтения, a rewrite — для записи. Если файл, который требуется открыть для записи, существует, он стирается и создается заново.

Входной файл input.txt можно создать в любом текстовом редакторе. Он, естественно, должен существовать до первого запуска программы. Если файл, открытый для чтения, не существует, выдается сообщение об ошибке.

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

3.4. Сжатие массива

Пример. 3.2. Написать программу, которая «сжимает» целочисленный массив из 10 элементов, удаляя из него элементы, меньшие заданной величины. Освободившиеся в конце массива элементы заполнить нулями.

Исходный массив:

6 -8 15 9 -1 3 5 -10 12 2

Допустим, требуется удалить из него все элементы, значение которых меньше 5. Результат должен иметь вид

6 15 9 5 12 0 0 0 0 0

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

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

Рис. 3.2. Сжатие с использованием дополнительного массива

program compress_l;

const n = 10;

type mas = array [1 .. n] of integer;

var

a, b : mas;

i : integer; { номер текущего элемента в массиве а }

j : integer; { номер текущего элемента в массиве b }

x : integer; { заданное число}

begin

writeln('Введите число');

readln(x);

writeln('Введите элементы массива');

for i := 1 to n do read(a[i]);

j :=0;

for i:=1 to n do

if a[i] >= x then begin

inc(j); b[j] := a[i];

end;

a := b;

writeln('Преобразованный массив:');

for i := 1 to n do write(a[i]:4);

end.

Обнуление «хвоста» массива происходит естественным образом, поскольку в Паскале глобальные переменные обнуляются.

Однако для массивов большой размерности выделение двойного объема памяти может оказаться слишком расточительным. Поэтому далее приводится вариант программы, в которой преобразование массива выполняется «на месте».

Алгоритм работы этой программы выглядит следующим образом:

  1. Просматривая массив, определить номер самого первого из удаляемых элементов.

  2. Если таковой есть, сдвигать каждый последующий элемент массива на первое «свободное» место, обнуляя оставшуюся часть массива.

Иллюстрация алгоритма приведена на рис. 3.3.

Рис. 3.3. Сжатие массива «на месте»

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

program compress_2;

const n = 10;

type mas = array [1 .. n] of integer;

var

a : mas;

i : integer; { номер текущего элемента }

j : integer; { номер элемента, в который помещается текущий }

x : integer; { заданное число }

begin

writeln('Введите число');

readln(x);

writeln('Введите элементы массива');

for i := 1 to n do read(a[i]);

j := 0;

for i := 1 to n do { поиск номера первого удаляемого элемента }

if a[i] < x then begin j := i; break end;

if j <> 0 then begin { если есть, что удалять, }

for i := j + 1 to n do { просмотреть оставшуюся часть массива }

if a[i] >=x then begin { такие элементы надо оставить в массиве }

a[j] := a[i]; inc(j); end;

for i := j to n do a[i] := 0; { обнуление "хвоста" массива }

end;

writeln('Преобразованный массив:');

for i := 1 to n do write(a[i]:4);

end.

Для тестирования этой программы попробуйте использовать несколько значений переменной х – таких, чтобы из массива:

  • не был удален ни один элемент;

  • были удалены все элементы;

  • была удалена часть элементов.