Преобразовать файл, сохранив в каждой последовательности члены, предшествующие первому минимальному значению - PascalABC.NET
Формулировка задачи:
В файле целых чисел хранятся последовательности натуральных чисел. Ноль — разделитель последовательностей. Преобразовать файл, сохранив в каждой последовательности члены, предшествующие первому минимальному значению.
Помогите, пожалуйста.
Решение задачи: «Преобразовать файл, сохранив в каждой последовательности члены, предшествующие первому минимальному значению»
textual
Листинг программы
type tfile=file of integer;
procedure create_file(var f:tfile);
var n,i,j,k,a:integer;
begin
assign(f,'1111');
rewrite(f);
write('Сколько последовательностей записать в файл n=');
readln(n);
for i:=1 to n do
begin
k:=5+random(6);//длина последовательности от 5 до 10
for j:=1 to k do
begin
a:=random(20)+1;
write(f,a);
end;
if i<>n then
begin
a:=0;
write(f,a);
end;
end;
close(f);
end;
procedure read_file(var f:tfile;s:string);
var a:integer;
begin
writeln(s);
reset(f);
while not eof(f) do
begin
read(f,a);
write(a:4);
if a=0 then writeln;
end;
close(f);
writeln;
end;
procedure udal(var f:tfile);
var i,a,pp,ip,i1,j,mn,imn,k,q:integer;
begin
reset(f);
//добавим 0 в начало файла для удобства
for i:=filesize(f)downto 1 do
begin
seek(f,i-1);
read(f,a);
seek(f,i);
write(f,a);
end;
a:=0;
seek(f,0);
write(f,a);
//найдем конец первой последовательност
//для определения окончания цикла удалений}
i:=1;
pp:=0;
while(i<filesize(f))and(pp=0) do
begin
seek(f,i);
read(f,a);
if a=0 then pp:=i-1
else i:=i+1;
end;
ip:=filesize(f)-1;//конец последней последовательности
//начнем с конца файла, чтобы не сбивались индексы после удаления
while ip>=pp do//пока не перешагнули через конец первой последовательности
begin
i1:=-1;//начало последовательности, пока не знаем, будем искать
j:=ip;
while(j>=0)and(i1=-1) do
begin
seek(f,j);
read(f,a);
if a=0 then i1:=j+1//если нашли 0, то за ним начало
else j:=j-1;
end;
seek(f,i1);
read(f,mn);
imn:=i1; //будем искать позицию первого мин. в этой последовательности
for j:=i1 to ip do
begin
seek(f,j);
read(f,a);
if a<mn then
begin
mn:=a;
imn:=j;
end;
end;
k:=ip-imn+1;//количество удалений
for j:=1 to k do
begin
for q:=imn to filesize(f)-2 do//сдвигаем на 1 вверх нижние элементы
begin
seek(f,q+1);
read(f,a);
seek(f,q);
write(f,a);
end;
seek(f,filesize(f)-1);//удаляем последний
truncate(f);
end;
ip:=i1-2;//конец новой последовательности на 2 выше начала предыдущей
end;
//удалим первый 0
for i:=0 to filesize(f)-2 do
begin
seek(f,i+1);
read(f,a);
seek(f,i);
write(f,a);
end;
seek(f,filesize(f)-1);
truncate(f);
end;
var f:tfile;
begin
randomize;
create_file(f);
read_file(f,'Исходный файл');
udal(f);
read_file(f,'Сохранение до минимальных в сериях');
end.
Объяснение кода листинга программы
- Объявление типов данных:
- tfile: файл, содержащий целочисленные значения;
- procedure: функция, которая выполняет некоторую задачу;
- var: указатель на переменную, которая будет использоваться в функции;
- n, i, j, k, a: целочисленные переменные, используемые в коде.
- Создание файла:
- assign(f,'1111'): присваиваем имя файлу;
- rewrite(f): очищаем файл;
- write('Сколько последовательностей записать в файл n='): вывод на экран запроса на ввод количества последовательностей;
- readln(n): считывание количества последовательностей с экрана;
- for i:=1 to n do: начало цикла, который выполняется n раз;
- k:=5+random(6): генерация случайной длины последовательности от 5 до 10;
- for j:=1 to k do: начало внутреннего цикла, который выполняется k раз;
- a:=random(20)+1: генерация случайного числа от 1 до 20;
- write(f,a): запись числа в файл;
- if i<>n then: условие для записи числа 0 после последней последовательности;
- a:=0: инициализация переменной a значением 0;
- write(f,a): запись числа 0 в файл;
- close(f): закрытие файла.
- Чтение файла:
- read_file(f,s): функция, которая считывает файл и выводит его содержимое;
- writeln(s): вывод на экран строки s;
- reset(f): возвращение указателя на начало файла;
- while not eof(f) do: цикл, который выполняется до достижения конца файла;
- read(f,a): считывание числа из файла и сохранение его в переменной a;
- write(a:4): вывод числа a, записанного в 4-х знаках;
- if a=0 then writeln: вывод на экран символа новой строки, если число равно 0;
- close(f): закрытие файла.
- Удаление элементов:
- udal(f): функция, которая удаляет элементы из файла;
- reset(f): возвращение указателя на начало файла;
- добавление 0 в начало файла для удобства;
- поиск конца первой последовательности;
- поиск позиции первого минимального значения в последовательности;
- удаление элементов, начиная с позиции i1 и до конца последней последовательности;
- сдвиг элементов на 1 вверх, начиная с позиции imn и до конца файла;
- удаление последнего элемента;
- удаление первого 0 в начале файла;
- закрытие файла.
- Основной блок программы:
- randomize: инициализация генератора случайных чисел;
- create_file(f): создание файла;
- read_file(f,'Исходный файл'): чтение файла и вывод его содержимого;
- udal(f): удаление элементов из файла;
- read_file(f,'Сохранение до минимальных в сериях'): чтение файла и вывод его содержимого.