Преобразовать файл, сохранив в каждой последовательности члены, предшествующие первому минимальному значению - 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,'Сохранение до минимальных в сериях'): чтение файла и вывод его содержимого.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д