Преобразовать файл, сохранив в каждой последовательности члены, предшествующие первому минимальному значению - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

В файле целых чисел хранятся последовательности натуральных чисел. Ноль — разделитель последовательностей. Преобразовать файл, сохранив в каждой последовательности члены, предшествующие первому минимальному значению. Помогите, пожалуйста.

Решение задачи: «Преобразовать файл, сохранив в каждой последовательности члены, предшествующие первому минимальному значению»

textual
Листинг программы
  1. type tfile=file of integer;
  2. procedure create_file(var f:tfile);
  3. var n,i,j,k,a:integer;
  4. begin
  5. assign(f,'1111');
  6. rewrite(f);
  7. write('Сколько последовательностей записать в файл n=');
  8. readln(n);
  9. for i:=1 to n do
  10.  begin
  11.   k:=5+random(6);//длина последовательности от 5 до 10
  12.   for j:=1 to k do
  13.    begin
  14.     a:=random(20)+1;
  15.     write(f,a);
  16.    end;
  17.   if i<>n then
  18.    begin
  19.     a:=0;
  20.     write(f,a);
  21.    end;
  22.  end;
  23. close(f);
  24. end;
  25. procedure read_file(var f:tfile;s:string);
  26. var a:integer;
  27. begin
  28. writeln(s);
  29. reset(f);
  30. while not eof(f) do
  31.  begin
  32.   read(f,a);
  33.   write(a:4);
  34.   if a=0 then writeln;
  35.  end;
  36. close(f);
  37. writeln;
  38. end;
  39. procedure udal(var f:tfile);
  40. var i,a,pp,ip,i1,j,mn,imn,k,q:integer;
  41. begin
  42. reset(f);
  43. //добавим 0 в начало файла для удобства
  44. for i:=filesize(f)downto 1 do
  45.  begin
  46.   seek(f,i-1);
  47.   read(f,a);
  48.   seek(f,i);
  49.   write(f,a);
  50.  end;
  51. a:=0;
  52. seek(f,0);
  53. write(f,a);
  54. //найдем конец первой последовательност
  55. //для определения окончания цикла удалений}
  56. i:=1;
  57. pp:=0;
  58. while(i<filesize(f))and(pp=0) do
  59.  begin
  60.   seek(f,i);
  61.   read(f,a);
  62.   if a=0 then pp:=i-1
  63.   else i:=i+1;
  64.  end;
  65. ip:=filesize(f)-1;//конец последней последовательности
  66. //начнем с конца файла, чтобы не сбивались индексы после удаления
  67. while ip>=pp do//пока не перешагнули через конец первой последовательности
  68.  begin
  69.   i1:=-1;//начало последовательности, пока не знаем, будем искать
  70.   j:=ip;
  71.   while(j>=0)and(i1=-1) do
  72.    begin
  73.     seek(f,j);
  74.     read(f,a);
  75.     if a=0 then i1:=j+1//если нашли 0, то за ним начало
  76.     else j:=j-1;
  77.    end;
  78.   seek(f,i1);
  79.   read(f,mn);
  80.   imn:=i1; //будем искать позицию первого мин. в этой последовательности
  81.   for j:=i1 to ip do
  82.    begin
  83.     seek(f,j);
  84.     read(f,a);
  85.     if a<mn then
  86.      begin
  87.       mn:=a;
  88.       imn:=j;
  89.      end;
  90.    end;
  91.   k:=ip-imn+1;//количество удалений
  92.   for j:=1 to k do
  93.    begin
  94.     for q:=imn to filesize(f)-2 do//сдвигаем на 1 вверх нижние элементы
  95.      begin
  96.       seek(f,q+1);
  97.       read(f,a);
  98.       seek(f,q);
  99.       write(f,a);
  100.      end;
  101.     seek(f,filesize(f)-1);//удаляем последний
  102.     truncate(f);
  103.    end;
  104.   ip:=i1-2;//конец новой последовательности на 2 выше начала предыдущей
  105.  end;
  106. //удалим первый 0
  107. for i:=0 to filesize(f)-2 do
  108.  begin
  109.   seek(f,i+1);
  110.   read(f,a);
  111.   seek(f,i);
  112.   write(f,a);
  113.  end;
  114. seek(f,filesize(f)-1);
  115. truncate(f);
  116. end;
  117. var f:tfile;
  118. begin
  119. randomize;
  120. create_file(f);
  121. read_file(f,'Исходный файл');
  122. udal(f);
  123. read_file(f,'Сохранение до минимальных в сериях');
  124. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы