Консультация № 129214
26.03.2008, 20:29
0.00 руб.
0 2 1
Пожалуйста найдите ошибку. Не производится сортировка массива.Нужно только исправить.
Сама задача.
Дан список учеников класса и
отметки каждого из учеников за выполнение двух контрольных работ.
Требуется: подсчитать число учеников, выполнивших первую работу на 5;
подсчитать число учеников, выполнивших обе работы на 5.
Упорядочить список учеников по среднему баллу за обе контрольные работы.

<p><fieldset style=‘background-color:#EFEFEF; width:80%; border:1px solid; padding:10px;‘ class=fieldset><font color=#777777><i>код программы и модуля перенесён в приложение.</i>
-----
</font><font size=1 color=#777777><b>• Отредактировал: <a href=http://rusfaq.ru/info/user/31795 target=_blank>Зенченко Константин Николаевич</a></b> (Профессионал)
<b>• Дата редактирования:</b> 26.03.2008, 20:35</font></fieldset>

Приложение:
Модуль unit sort_mas; interface const n=3; m=10; type mas=array[1..n,1..m] of real; procedure sort(var x:mas); implementation procedure sort; var l,c:real; i,j:integer; begin repeat l:=0; for j:=1 to m-1 do begin if x[3,j]>x[i,j+1] then begin for i:=1 to n do begin c:=x[i,j]; x[i,j]:=x[i,j+1]; x[i,j+1]:=c; end; l:=1; end; end; until l=0; end; end. Программа program jimm0b; uses crt, sort_mas; const n=3; m=10; type mas=array[1..n,1..m] of real; procedure view(x:mas); var i,j:integer; begin for i:=1 to 2 do begin for j:=1 to m do write(x[i,j]:5); writeln; end; end; procedure create_random(var x:mas); var i,j:integer; begin for i:=1 to 2 do for j:=1 to m do x[i,j]:=random(4)+2; end; procedure create (var x:mas); var i,j:integer; begin clrscr; For i:=1 to n do for j:=1 to m do begin write(‘vvedite A[‘,i,‘;‘,j,‘]=‘); readln(x[i,j]); end; end; var A:mas; Ch,i,j,l1,k:integer; l,c:real; begin clrscr; randomize; writeln(‘1-vvod mas‘); writeln(‘2-random‘); writeln; repeat write(‘vvedite #pynkta‘); readln(ch); case ch of 1:Create(a); 2:create_random(a); else writeln(‘povtorite vvod‘); end; until (ch=1) or (ch=2); clrscr; view(a); writeln(‘ishodny mas‘); For j:=1 to m do begin if a[1,j]=5 then inc(k); end; for j:=1 to m do begin if (a[1,j]=5) and (a[2,j]=5) then inc(l1); end; writeln; writeln(k:5,l1:3); for j:=1 to m do begin a[3,j]:=((a[1,j]+a[2,j])/2); write(a[3,j]:3);end; sort(a); write(a[3,j]:3); readkey; end.

Обсуждение

Неизвестный
26.03.2008, 23:58
общий
Просто уберите из самой программы переобъявление типа mas - он и так объявлен в интерфейсной части модуля, а так компилятор о несоответствии типов и сообщает, он же не может определить, что эти типы идентичны.
давно
Профессор
401888
1232
27.03.2008, 10:00
общий
это ответ
Здравствуйте, Муратов Дмитрий Анатольевич!
При ответе на вопрос №128005 я посоветовал вам применить иассив записей, в котором очень удлбно объединять различные типы, и кроме оценок можно вводить фамилии учеников, их класс, школу и т.д. В этом отношении двумерные массивы позволяют вводить данные только одного типа. Но раз уж массивы, значит массивы. Уважаю за упорство, сам такой.
Я переделал вашу процедуру сортировки и подремонтировал сам модуль, а также программу. В программе создание процедур, которые используются только один раз я считаю нецелесообразно, иначе их тоже надо вынести в модуль. Но это все на ваше усмотрение.Принцип сортировки: определяем среднее от суммы оценок в строке 2 и строке 3 и сортируем массив по возрастанию методом обмена(или пузырька). Результат деления вроде бы Real, но т.к. мы его не определяем, а только сравниваем, на типе это никак не сказывается.
Массив я сделал размерностью [1..3,1..n]. В первую строчку я ввел номера учеников, чтобы результаты сортировки были нагляднее. Во второй и третьей строчках-оценки. Взял от 3 до 5, двоешникам у нас не место, они только количество пятерок уменьшают и результат при небольших n может некрасиво выглядеть(с нолями).
В приложении привожу модуль(как его оформлять вы видимо знаете, если что, то я описал его в ответе на вопрос 128005), саму программу, а также программу без модуля на всякий случай, вдруг что-то не заработает, так можно ошибку найти.
Если что-то не пойдет, не ругайте меня на форуме, у меня временно нет туда доступа, лучше напишите личное сообшение, все проблемы решим. Пожалуй все. Удачи!


Приложение:
1.Модуль.unit Sort_mas;interfacetype mas=array[1..3,1..30]of byte; procedure Sort(n:integer;var a:mas);implementation procedure Sort(n:integer;var a:mas); var i,j,k,x:integer; begin for j:=1 to n-1 do for k:=1 to n-1 do if ((a[2,k]+a[3,k])/2)>((a[2,k+1]+a[3,k+1])/2) then begin for i:=1 to 3 do begin x:=a[i,k]; a[i,k]:=a[i,k+1]; a[i,k+1]:=x; end; end; end;end.2.Программаuses crt,Sort_mas;var a:mas; n,i,j,kol1,kol2:integer;beginclrscr;randomize;Write(‘Kolchestvo uchenikov=‘);readln(n);for i:=1 to 3 do begin for j:=1 to n do begin a[i,j]:=random(3)+3; a[1,j]:=j; write(a[i,j]:3); end; writeln; end;readln;Sort(n,a);writeln(‘Uporiadochenny massiv:‘);for i:=1 to 3 do begin for j:=1 to n do begin write(a[i,j]:3); end; writeln; end;readln;kol1:=0;for j:=1 to n doif a[2,j]=5 then begin kol1:=kol1+1; end;writeln(‘Pervaia rabota na 5 = ‘,kol1,‘ uchenikov‘);kol2:=0;for j:=1 to n doif (a[2,j]=5)and(a[3,j]=5) then begin kol2:=kol2+1; end;writeln(‘Obe raboty na 5 = ‘,kol2,‘ uchenikov‘);readlnend.3. Программа без модуля.uses crt;var a:array[1..3,1..30]of byte; n,i,j,k,x,kol1,kol2:integer;beginclrscr;randomize;Write(‘Kolchestvo uchenikov=‘);readln(n);for i:=1 to 3 do begin for j:=1 to n do begin a[i,j]:=random(3)+3; a[1,j]:=j; write(a[i,j]:3); end; writeln; end;readln;for j:=1 to n-1 dofor k:=1 to n-1 doif ((a[2,k]+a[3,k])/2)>((a[2,k+1]+a[3,k+1])/2) then begin for i:=1 to 3 do begin x:=a[i,k]; a[i,k]:=a[i,k+1]; a[i,k+1]:=x; end; end;writeln(‘Uporiadochenny massiv:‘);for i:=1 to 3 do begin for j:=1 to n do begin write(a[i,j]:3); end; writeln; end;readln;kol1:=0;for j:=1 to n doif a[2,j]=5 then begin kol1:=kol1+1; end;writeln(‘Pervaia rabota na 5 = ‘,kol1,‘ uchenikov‘);kol2:=0;for j:=1 to n doif (a[2,j]=5)and(a[3,j]=5) then begin kol2:=kol2+1; end;writeln(‘Obe raboty na 5 = ‘,kol2,‘ uchenikov‘);readlnend.
Форма ответа