Программа вывода последовательности цифр в порядке увеличения частоты их встречаемости - Pascal
Формулировка задачи:
Болел два месяца — не знаю, что делать.
На самом деле тут работы надве минуты
: скопипастил всё что нужно, осталось доработать (согласовать куски кода скопированные из разных источников).ЗАДАНИЕ
В исходном текстовом файле записаны строки, содержащие цифры в произвольном порядке, возможно разделенные другими символами. Требуется написать программу, которая для каждой строки исходного файла будет выводить в результирующий файл последовательность цифр ('0','1'..'9') из входной последовательности в порядке увеличения частоты их встречаемости. Каждая цифра при этом должна быть распечатана один раз. Если какие-то цифры встречаются одинаковое число раз, то они выводятся по возрастанию. Например, пусть в одной из строк исходного файла содержатся следующие символы: 12324#32 в результирующем файле должно быть: 1432program Lab3; uses crt; const FILE1 = 'C:\Users\user\Desktop\Lab3\fname1.txt'; FILE2 = 'C:\Users\user\Desktop\Lab3\fname2.txt'; type mas = array[1..10] of integer; matr = array[1..10] of mas; procedure About; begin writeln('Л***'); writeln('В***'); writeln; writeln('Г***'); writeln('К***'); writeln; writeln('Задание.'); writeln('Требуется написать программу, которая для каждой строки исходного файла'); writeln('будет выводить в результирующий файл последовательность цифр из входной'); writeln('последовательности в порядке увеличения частоты их встречаемости.'); writeln('Примечание.'); writeln('* Каждая цифра при этом должна быть распечатана один раз.'); writeln('* Если какие-то цифры встречаются одинаковое число раз,'); writeln('то они выводятся по возрастанию.'); writeln('Например.'); writeln('Пусть в одной из строк исходного файла содержатся следующие символы:'); writeln('123**24#32'); writeln('В результирующем файле должно быть:'); writeln('1432'); end; //---- procedure Alg; var s :string; d, p :array[0 .. 1000] of longint; i, c, j :longint; begin read(s); for i := 1 to length(s) do inc(d[ord(s[i]) - 48]); for i := 0 to 9 do p[i] := i; for i := 1 to 100 do for j := 0 to 8 do if (d[p[j]] > d[p[j + 1]]) then begin c := p[j]; p[j] := p[j + 1]; p[j + 1] := c; end; for i := 0 to 9 do if (d[p[i]] <> 0) then write(p[i]); end; //--- нашёл в интернете procedure FileToFile(var f1, f2: text); var s, t: string; begin reset(f1); rewrite(f2); // открываем файл 1, перезаписываем файл 2 while not eof(f1) do // подсчитываем количество символов begin readln(f1, s); if (s <> '') then Alg(s, t) else (t := ''); writeln(f2, t); end; close(f1); close(f2); end; procedure FileNew(var fname1, fname2: string; f1, f2: text); begin writeln('Введите имя исходного файла:'); // запрашиваем C:\Users\user\Desktop\Lab3\fname1.txt readln(fname1); fname1 := FILE1; if FileExists(fname1) then begin writeln('Введите имя результирующего файла'); // запрашиваем C:\Users\user\Desktop\Lab3\fname2.txt readln(fname2); fname2 := FILE2; assign(f1, fname1); assign(f2, fname2); FileToFile(f1, f2); end else writeln('Файл с таким именем не существует.'); close(f1); close(f2); // закрываем файл readln; end; var fname1, fname2: string; f1, f2: text; begin About; FileNew(fname1, fname2, f1, f2); end.
Решение задачи: «Программа вывода последовательности цифр в порядке увеличения частоты их встречаемости»
textual
Листинг программы
var s: String; b, c: array [0..9] of Integer; i, p, q, t: Integer; begin while not EoF do begin ReadLn(s); for i:=0 to 9 do b[i]:=i; for i:=0 to 9 do c[i]:=0; for i:=1 to Length(s) do if s[i] in ['0'..'9'] then Inc(c[Ord(s[i])-Ord('0')]); q:=High(b); repeat p:=q; q:=0; for i:=0 to p-1 do if (c[i+1]<c[i]) or (c[i+1]=c[i]) and (b[i+1]<b[i]) then begin q:=i; t:=b[i]; b[i]:=b[i+1]; b[i+1]:=t; t:=c[i]; c[i]:=c[i+1]; c[i+1]:=t; end; until q=0; for i:=0 to 9 do if c[i]<>0 then Write(b[i]); WriteLn; end; end.
Объяснение кода листинга программы
- Объявляются переменные:
s
- строковая переменнаяb
- массив целых чисел от 0 до 9c
- массив целых чисел от 0 до 9i
,p
,q
,t
- целочисленные переменные
- Запускается цикл
while not EoF do
, который выполняется до тех пор, пока не достигнут конец файла. - Считывается строка из файла и сохраняется в переменную
s
с помощьюReadLn(s)
. - Инициализируется массив
b
значениями от 0 до 9. - Инициализируется массив
c
значениями 0 для каждого индекса от 0 до 9. - Выполняется цикл для перебора символов в строке
s
и подсчета частоты встречаемости цифр от 0 до 9. Если символ является цифрой, то увеличивается соответствующий элемент массиваc
. - Устанавливаются значения переменных
p
иq
равные максимальному индексу массиваb
. - Запускается цикл
repeat...until
, в котором проводится сортировка массивовb
иc
в порядке увеличения частоты встречаемости цифр. - Для каждой пары соседних элементов массива производится проверка частоты встречаемости (элемент
c
) и их значений (элементb
) и, если необходимо, происходит их обмен местами. - После сортировки выводятся отсортированные цифры, для которых частота встречаемости больше 0, в порядке увеличения частоты методом
Write(b[i]);
, а затем переход на новую строку методомWriteLn
. - Повторять шаги с 3 по 10 до тех пор, пока файл не закончится.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д