Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
36
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

Копирование данных в обратном порядке

Задача:

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

Алгоритм решения задачи:

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

Сначала данные считываются из исходного файла и заносятся в массив.

Количество элементов в массиве равно значению переменной k.

Из массива символы «читаются» в обратном порядке и последовательно записываются во второй файл.

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

Программа на языке Паскаль:

var

f1, f2: file of char;

c: char;

arr: array [1..100] of char;

k, i: integer;

begin

assign (f1, 'c:\file1.txt');

reset (f1);

k := 1;

while not eof (f1) do begin

read (f1, c);

arr[k] := c;

write (c:2);

k := k + 1

end;

assign (f2, 'c:\file2.txt');

rewrite (f2);

for i := k-1 downto 1 do begin

write (f2, arr[i])

end;

close (f1);

close (f2);

reset (f2);

writeln;

while not eof (f2) do begin

read (f2, c);

write (c:2)

end;

readln

end.

Поиск самой длинной заданной последовательности в массиве

Задача:

Код на Паскале ниже создает массив из двадцати элементов. Затем находит самую длинную последовательность из нулей и выводит на экран ее длину и номер ее начала в массиве.

Алгоритм решения задачи:

Рассмотрим код программы.

Очевидно, нам требуются переменные для хранения размера самой длинной последовательности нулей массива (len_max) и номера первого элемента этой последовательности (start).

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

Всем трем переменным сначала присваивается 0. Что означает, что никаких искомых последовательностей в массиве нет.

Далее массив просматривается поэлементно (в цикле for).

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

Также нужно обнулить значение len_ser, независимо от того произошла перезапись len_max или нет. Ведь предыдущая последовательность все равно закончилась.

Во внешнюю ветку if вложена еще одна инструкция if (в которую вложена еще одна ветка if).

if i = n then

if len_ser > len_max then begin

len_max := len_ser;

start := i - len_ser

end

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

Программа на языке Паскаль:

const n = 20;

var

arr: array[1..n] of 0..1;

i, len_max, len_ser, start: byte;

begin

writeln('Массив: ');

randomize;

for i := 1 to n do begin

arr[i] := random(2);

write(arr[i]:2);

end;

writeln;

len_max := 0;

len_ser := 0;

start := 0;

for i := 1 to n do

if arr[i] = 0 then begin

len_ser := len_ser + 1;

if i = n then

if len_ser > len_max then begin

len_max := len_ser;

start := i - len_ser

end

end

else begin

if len_ser > len_max then begin

len_max := len_ser;

start := i - len_ser

end;

len_ser := 0

end;

writeln('Длина максимальной серии: ',len_max);

writeln('Начинается с ', start, '-й позиции');

readln

end.