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

Объяснение кода листинга программы

  1. Объявление типов данных:
    • tfile: файл, содержащий целочисленные значения;
    • procedure: функция, которая выполняет некоторую задачу;
    • var: указатель на переменную, которая будет использоваться в функции;
    • n, i, j, k, a: целочисленные переменные, используемые в коде.
  2. Создание файла:
    • 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): закрытие файла.
  3. Чтение файла:
    • 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): закрытие файла.
  4. Удаление элементов:
    • udal(f): функция, которая удаляет элементы из файла;
    • reset(f): возвращение указателя на начало файла;
    • добавление 0 в начало файла для удобства;
    • поиск конца первой последовательности;
    • поиск позиции первого минимального значения в последовательности;
    • удаление элементов, начиная с позиции i1 и до конца последней последовательности;
    • сдвиг элементов на 1 вверх, начиная с позиции imn и до конца файла;
    • удаление последнего элемента;
    • удаление первого 0 в начале файла;
    • закрытие файла.
  5. Основной блок программы:
    • randomize: инициализация генератора случайных чисел;
    • create_file(f): создание файла;
    • read_file(f,'Исходный файл'): чтение файла и вывод его содержимого;
    • udal(f): удаление элементов из файла;
    • read_file(f,'Сохранение до минимальных в сериях'): чтение файла и вывод его содержимого.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы