Помощь - Поиск - Пользователи - Календарь
Полная версия: Процедура сортировки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Orevin
Нужно написать процедуру, которая упорядочивает по возрастанию (обменом) 1 строку в массиве 10х10. В самой программе с помощью этой процедуры упорядочить все строки.
По всякому пытался делать, но правильно работать никак не хочет. Помогите, пожалуйста, исправить ошибки.
Айра
PROGRAM prog2;
TYPE
arr1=array[1..10,1..10] of integer;
VAR
i,j,k :integer;
A,a1 :arr1;
Fin, Fout :text;
PROCEDURE poryadok(k: integer; var a1: arr1);
var T,j,i:integer;
begin
for i:=2 to 10 do {значение k у тебя передается из программы}
{так что здесь изменять его не следует, воспользуйся лучше переменной i}
for j:=10 downto i do
if a1[k,j-1] > a1[k,j] then {сортировка у меня выглядит чуть-чуть по-другому}
begin
T:=a1[k,j-1];
a1[k,j-1]:=a1[k,j];
a1[k,j]:=T;
end;
end;

BEGIN
assign(Fout,'res2.txt');
rewrite(Fout);
assign(Fin,'dat2.txt');
reset(Fin);
for i:=1 to 10 do
for j:=1 to 10 do
begin
read(Fin,A[i,j]);
end;
close(Fin);
for k:=1 to 10 do
begin
poryadok(k, A);
end;
for i:=1 to 10 do
begin
for j:=1 to 10 do
begin
write(Fout,A[i,j]);
end;
writeln(Fout);
end;
close(Fout);
END.



Вроде все работает правильно..
volvo
Оля, смотри:
Цитата
{значение k у тебя передается из программы, так что здесь изменять его не следует, воспользуйся лучше переменной i}
Во-первых, даже если ты его и изменишь, ничего страшного не будет - изменения не передаются в вызывающую программу, а вообще если ты не хочешь чтобы пользователь что-то менял -

PROCEDURE poryadok(CONST k: integer; var a1: arr1); { <--- Пускай попробует теперь изменить }
smile.gif

Но и это не главное... Главное - то, что процедура может быть проще:

TYPE
vector = array[1 .. 10] of integer;
arr1 = array[1 .. 10] of vector;
...
PROCEDURE poryadok(var a1: vector);
var T, j, i: integer;
begin
for i:=2 to 10 do
for j:=10 downto i do
if a1[j-1] > a1[j] then begin {сортировка у меня выглядит чуть-чуть по-другому}
T:=a1[j-1]; a1[j-1]:=a1[j]; a1[j]:=T;
end;
end;

{ и вызов: }
...
for k:=1 to 10 do
poryadok(A[k]);
...
Айра
Цитата
Во-первых, даже если ты его и изменишь, ничего страшного не будет - изменения не передаются в вызывающую программу

А вот сама сортировка всех строк, пока я не заменила k на i, происходила неправильно, она была только в одной строке... Ведь k, как я поняла, содержит номер упорядочиваемой строки, а если мы его меняем в процедуре, то второй проход будет уже не в той же строке, а значит сортировка полностью не пройдет. Если я не права, то поправь smile.gif

TYPE
vector = array[1 .. 10] of integer;
arr1 = array[1 .. 10] of vector;

arr1 - это массив состоящий из массивов? Тогда получается, что каждая строка и будет vector'ом, а дальше, в вызове, работаем по-строчно. Я правильно поняла?..


p.s. [оффтоп] я рада, что ты вернул рыжее чудо на аватар smile.gif [/оффтоп]
volvo
Цитата
... а дальше, в вызове, работаем по-строчно. Я правильно поняла?
Правильно... Что, в принципе и требовалось в задании:
Цитата
написать процедуру, которая упорядочивает по возрастанию (обменом) 1 строку в массиве 10х10
, а если надо упорядочить только одну строку - зачем передавать всю матрицу?
Orevin
Спасибо, с вашей помощью разобрался smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.