Программа вывода последовательности цифр в порядке увеличения частоты их встречаемости - Pascal

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

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

Болел два месяца — не знаю, что делать.

На самом деле тут работы на

две минуты

: скопипастил всё что нужно, осталось доработать (согласовать куски кода скопированные из разных источников).

ЗАДАНИЕ

В исходном текстовом файле записаны строки, содержащие цифры в произвольном порядке, возможно разделенные другими символами. Требуется написать программу, которая для каждой строки исходного файла будет выводить в результирующий файл последовательность цифр ('0','1'..'9') из входной последовательности в порядке увеличения частоты их встречаемости. Каждая цифра при этом должна быть распечатана один раз. Если какие-то цифры встречаются одинаковое число раз, то они выводятся по возрастанию. Например, пусть в одной из строк исходного файла содержатся следующие символы: 12324#32 в результирующем файле должно быть: 1432
Листинг программы
  1. program Lab3;
  2. uses
  3. crt;
  4. const
  5. FILE1 = 'C:\Users\user\Desktop\Lab3\fname1.txt';
  6. FILE2 = 'C:\Users\user\Desktop\Lab3\fname2.txt';
  7. type
  8. mas = array[1..10] of integer;
  9. matr = array[1..10] of mas;
  10. procedure About;
  11. begin
  12. writeln('Л***');
  13. writeln('В***');
  14. writeln;
  15. writeln('Г***');
  16. writeln('К***');
  17. writeln;
  18. writeln('Задание.');
  19. writeln('Требуется написать программу, которая для каждой строки исходного файла');
  20. writeln('будет выводить в результирующий файл последовательность цифр из входной');
  21. writeln('последовательности в порядке увеличения частоты их встречаемости.');
  22. writeln('Примечание.');
  23. writeln('* Каждая цифра при этом должна быть распечатана один раз.');
  24. writeln('* Если какие-то цифры встречаются одинаковое число раз,');
  25. writeln('то они выводятся по возрастанию.');
  26. writeln('Например.');
  27. writeln('Пусть в одной из строк исходного файла содержатся следующие символы:');
  28. writeln('123**24#32');
  29. writeln('В результирующем файле должно быть:');
  30. writeln('1432');
  31. end;
  32. //----
  33. procedure Alg;
  34. var
  35. s :string;
  36. d, p :array[0 .. 1000] of longint;
  37. i, c, j :longint;
  38. begin
  39. read(s);
  40. for i := 1 to length(s) do
  41. inc(d[ord(s[i]) - 48]);
  42. for i := 0 to 9 do
  43. p[i] := i;
  44. for i := 1 to 100 do
  45. for j := 0 to 8 do
  46. if (d[p[j]] > d[p[j + 1]]) then begin
  47. c := p[j];
  48. p[j] := p[j + 1];
  49. p[j + 1] := c;
  50. end;
  51. for i := 0 to 9 do
  52. if (d[p[i]] <> 0) then
  53. write(p[i]);
  54. end;
  55. //--- нашёл в интернете
  56. procedure FileToFile(var f1, f2: text);
  57. var
  58. s, t: string;
  59. begin
  60. reset(f1); rewrite(f2); // открываем файл 1, перезаписываем файл 2
  61. while not eof(f1) do // подсчитываем количество символов
  62. begin
  63. readln(f1, s);
  64. if (s <> '') then Alg(s, t)
  65. else (t := '');
  66. writeln(f2, t);
  67. end;
  68. close(f1); close(f2);
  69. end;
  70. procedure FileNew(var fname1, fname2: string; f1, f2: text);
  71. begin
  72. writeln('Введите имя исходного файла:'); // запрашиваем C:\Users\user\Desktop\Lab3\fname1.txt
  73. readln(fname1);
  74. fname1 := FILE1;
  75. if FileExists(fname1) then
  76. begin
  77. writeln('Введите имя результирующего файла'); // запрашиваем C:\Users\user\Desktop\Lab3\fname2.txt
  78. readln(fname2);
  79. fname2 := FILE2;
  80. assign(f1, fname1); assign(f2, fname2);
  81. FileToFile(f1, f2);
  82. end
  83. else writeln('Файл с таким именем не существует.');
  84. close(f1); close(f2); // закрываем файл
  85. readln;
  86. end;
  87. var
  88. fname1, fname2: string; f1, f2: text;
  89. begin
  90. About;
  91. FileNew(fname1, fname2, f1, f2);
  92. end.

Решение задачи: «Программа вывода последовательности цифр в порядке увеличения частоты их встречаемости»

textual
Листинг программы
  1. var
  2.   s: String;
  3.   b, c: array [0..9] of Integer;
  4.   i, p, q, t: Integer;
  5. begin
  6.   while not EoF do begin
  7.     ReadLn(s);
  8.     for i:=0 to 9 do b[i]:=i;
  9.     for i:=0 to 9 do c[i]:=0;
  10.     for i:=1 to Length(s) do
  11.       if s[i] in ['0'..'9'] then Inc(c[Ord(s[i])-Ord('0')]);
  12.     q:=High(b);
  13.     repeat
  14.       p:=q; q:=0;
  15.       for i:=0 to p-1 do
  16.         if (c[i+1]<c[i]) or (c[i+1]=c[i]) and (b[i+1]<b[i]) then begin
  17.           q:=i;
  18.           t:=b[i]; b[i]:=b[i+1]; b[i+1]:=t;
  19.           t:=c[i]; c[i]:=c[i+1]; c[i+1]:=t;
  20.         end;
  21.     until q=0;
  22.     for i:=0 to 9 do if c[i]<>0 then Write(b[i]); WriteLn;
  23.   end;
  24. end.

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

  1. Объявляются переменные:
    • s - строковая переменная
    • b - массив целых чисел от 0 до 9
    • c - массив целых чисел от 0 до 9
    • i, p, q, t - целочисленные переменные
  2. Запускается цикл while not EoF do, который выполняется до тех пор, пока не достигнут конец файла.
  3. Считывается строка из файла и сохраняется в переменную s с помощью ReadLn(s).
  4. Инициализируется массив b значениями от 0 до 9.
  5. Инициализируется массив c значениями 0 для каждого индекса от 0 до 9.
  6. Выполняется цикл для перебора символов в строке s и подсчета частоты встречаемости цифр от 0 до 9. Если символ является цифрой, то увеличивается соответствующий элемент массива c.
  7. Устанавливаются значения переменных p и q равные максимальному индексу массива b.
  8. Запускается цикл repeat...until, в котором проводится сортировка массивов b и c в порядке увеличения частоты встречаемости цифр.
  9. Для каждой пары соседних элементов массива производится проверка частоты встречаемости (элемент c) и их значений (элемент b) и, если необходимо, происходит их обмен местами.
  10. После сортировки выводятся отсортированные цифры, для которых частота встречаемости больше 0, в порядке увеличения частоты методом Write(b[i]);, а затем переход на новую строку методом WriteLn.
  11. Повторять шаги с 3 по 10 до тех пор, пока файл не закончится.

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


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

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

7   голосов , оценка 3.857 из 5

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

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

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