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