Не могу понять, почему программа работает неправильно( Знаю, что где-то ошибки, но не могу найти - Pascal

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

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

{Ввести последовательность натуральных чисел Aj j=1...n (n<=1000). Упорядочить последовательность по неубыванию наименььшей цифры числа, числа с одинаковыми наименььшими цифрами дополнительно упорядочить по неубыванию суммы цифр числа, числа с одинаковыми наименььшими цифрами и одинаковыми суммами цифр дополнительно упорядочить по неубыванию самого числа.}
program Sortirovka;
uses crt;
const nmax=1000;
var A:array[1..100] of integer;
    i,j,n,nn,m,k,r,l:integer;
    s,s2:string;
    pr1,pr2,c,cod:integer;
    b:boolean;
procedure Perestanovka(var a,b:integer);
var c:integer;
begin
c:=a; a:=b; b:=c;
end;
begin
write('N= '); 
readln (n);
writeln ('Vvedite elementy massiva A: ');
for j:=1 to n do 
   read (A[j]); 
    nn:=n;
    repeat
    b:=false;
    for j:=1 to nn-1 do
        begin
        l:=j mod 10;
        if j>10 then begin 
           l:=j mod 10;
        if m > max then 
           max:=c;  
           j:=j div 10;
        end;   
           str(A[j],s);
           str(A[j+1],s2);
        end;
    dec(nn);
    until not b;
writeln;writeln;
writeln ('po neubivaniu naimenshei tsifri');
for j:=1 to n do 
   write (A[j],' ');
   nn:=n;
   repeat
   b:=false;
    for j:=1 to nn-1 do
        begin
          str(A[j],s);
          str(A[j+1],s2);
          if s[1]<>s2[1] then
          pr1:=1;pr2:=1;
          for i:=1 to length(s) do  
            begin val(s[i],c,cod); 
               pr1:=pr1+c; 
            end;
            for i:=1 to length(s2) do 
              begin  
                 val(s2[i],c,cod);
                 pr2:=pr2+c; 
              end;
            if pr1<pr2 then 
              begin        
                k:=A[j];
                A[j]:=A[j+1];
                A[j+1]:=k;
                b:=true; 
              end;
        end;
    dec(nn);
    until not b;
writeln;writeln;    
writeln ('po neubivaniu summi tsifr');
for j:=1 to n do write (A[j]:4,' ');
    nn:=n;
    repeat
    b:=false;
    for j:=1 to nn-1 do
        begin
          str(A[j],s);
          str(A[j+1],s2);
          pr1:=1;pr2:=1;
          for i:=1 to length(s) do  
             begin 
               val(s[i],c,cod);
               pr1:=pr1+c; 
             end;
             for i:=1 to length(s2) do 
                 begin 
                   val(s2[i],c,cod);
                   pr2:=pr2+c; 
                 end;
                 if (s[1]<>s2[1]) and (pr1<>pr2) then        
                 if A[j]>A[j+1] then  
                      begin
                        r:=A[j];
                        A[j]:=A[j+1];
                        A[j+1]:=r;
                        b:=true; 
                      end;
        end;
    dec(nn);
    until not b;
writeln;writeln;   
writeln ('Massiv A po neubivaniyu samogo chisla: ');
for j:=1 to n do 
  write (A[j]:4,' ');
readln;
end.

Решение задачи: «Не могу понять, почему программа работает неправильно( Знаю, что где-то ошибки, но не могу найти»

textual
Листинг программы
program Sortirovka;
 
uses crt;
 
function min_cif(n:integer):byte;
var m:integer;
    mn:byte;
begin
m:=abs(n);
mn:=9;
while m>0 do
 begin
  if m mod 10<mn then mn:=m mod 10;
  m:=m div 10;
 end;
min_cif:=mn
end;
 
function sum_cif(n:integer):byte;
var m:integer;
    sum:byte;
begin
m:=abs(n);
sum:=0;
while m>0 do
 begin
  sum:=sum+m mod 10;
  m:=m div 10;
 end;
sum_cif:=sum
end;
const nmax=1000;
 
procedure swap(var a,b:integer);
var c:integer;
begin
c:=a; a:=b; b:=c;
end;
var a:array[1..100] of integer;
    i,j,n,k:integer;
begin
clrscr;
randomize;
repeat
write('Введите размер последовательности от 2 до ',nmax,' n=');
readln (n);
until (n>1)and(n<=nmax);
writeln('Исходный массив');
for i:=1 to n do
 begin
  a[i]:=random(1000);
  write(a[i]:4);
 end;
writeln;
for i:=1 to n-1 do
for j:=i+1 to n do
if(min_cif(a[i])>min_cif(a[j]))
or((min_cif(a[i])=min_cif(a[j]))and(sum_cif(a[i])>sum_cif(a[j])))
or((min_cif(a[i])=min_cif(a[j]))and(sum_cif(a[i])=sum_cif(a[j]))and(a[i]>a[j]))
then swap(a[i],a[j]);
writeln ('Отсортированный массив');
for j:=1 to n do
write (A[j]:4);
readln;
end.

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

  1. Программа начинается с определения нескольких функций и константы:
    • min_cif(n:integer):byte; - функция, которая возвращает минимальную цифру числа n.
    • sum_cif(n:integer):byte; - функция, которая возвращает сумму цифр числа n.
    • nmax=1000; - константа, которая определяет максимальное значение размера последовательности.
  2. Затем определена процедура swap(var a,b:integer), которая меняет местами значения переменных a и b.
  3. Далее определены переменные:
    • a:array[1..100] of integer; - массив для хранения чисел.
    • i,j,n,k:integer; - переменные для выполнения операций сравнения и сортировки.
  4. После этого происходит инициализация: экран очищается, генератор случайных чисел инициализируется, и пользователю предлагается ввести размер последовательности.
  5. Пользователь вводит размер последовательности, и на экран выводится исходный массив.
  6. Затем происходит сортировка массива. Два вложенных цикла сравнивают пары соседних элементов и, если необходимо, меняют их местами с помощью процедуры swap. Критерии сортировки:
    • min_cif(a[i])>min_cif(a[j]) - если минимальная цифра элемента a[i] больше минимальной цифры элемента a[j].
    • min_cif(a[i])=min_cif(a[j])) - если минимальные цифры одинаковые, то:
      • sum_cif(a[i])>sum_cif(a[j]) - если сумма цифр элемента a[i] больше суммы цифр элемента a[j].
      • a[i]>a[j] - если числа a[i] и a[j] одинаковы по сумме цифр и минимальной цифре, то сортировка происходит по возрастанию чисел.
  7. После сортировки на экран выводится отсортированный массив.
  8. Программа завершается чтением символа от пользователя.

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

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