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