S
Strongmamba
Помогите пожалуйста. Отсортировать по возрастанию элементы стоящие по периметру матрицы,начиная с элемента A(n,1) по часовой стрелке.Среди элементов. надо перевести этот чудо-код в С.
uses crt;
const nmax=20;
var a:array[1..nmax,1..nmax] of integer;
n,m,i,j:byte;
kol,num:integer;
procedure vvod;
var i,j:byte;
begin
repeat
write('Количество строк до ',nmax,' n=');
readln;
until n in [1..nmax];
repeat
write('Количество столбцов до ',nmax,' m=');
readln(m);
until m in [1..nmax];
writeln('Исходная матрица:');
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(50)+1;
write(a[i,j]:4);
end;
writeln;
end;
writeln;
end;
{поиск номеров элементов для сравнения и обмена}
procedure n_elem(var x,y:byte;num:integer);
var i,np,xp,xl,yv,yn:byte;
j:integer;
procedure next_elem;{маршрут поиска}
begin
if (j=kol) then exit;{прошли все}
case np of{направления 1-вверх, 2-вправо, 3-вниз, 4-влево}
1: begin y:=y-1; if y=yv then np:=2; end;
2: begin x:=x+1; if x=xp then np:=3; end;
3: begin y:=y+1; if y=yn then np:=4; end;
4: begin x:=x-1; if x=xl then np:=5; end;
end;
j:=j+1;{считаем шаги}
if np=5 then exit;{вернулись в левый нижний угол}
end;
begin
x:=1;y:=n+1;{начало пути ниже матрицы в первом столбце}
np:=1;{первое направление}
xl:=1;xp:=m;yv:=1;yn:=n;{обозначим края}
j:=0;{обнулим счетчик}
for i:=1 to num do next_elem;{начинаем поиск}
end;
{чтение элемента}
procedure out_el(num:integer;var out_el:integer);
var x,y:byte;
begin
n_elem(x,y,num);
out_el:=a[y,x];
end;
{вставка элемента}
procedure in_el(num:integer;k:integer);
var x,y:byte;
begin
n_elem(x,y,num);
a[y,x]:=k;
end;
{Собственно сортировка линейным обменом}
procedure sort;
var i,j:byte;
k,u:integer;
begin
for i:=1 to kol-1 do{идем по маршруту}
for j:=i+1 to kol do{смотрим впереди}
begin
out_el(i,k);{читаем первый}
out_el(j,u);{второй}
if k>u then{если первый больше}
begin
in_el(i,u);{второй на место первого}
in_el(j,k);{первый на место второго}
end;
end;
end;
procedure vyvod;
begin
for i:=1 to n do
begin
for j:=1 to m do
begin
write(a[i,j]:4);
end;
writeln;
end;
end;
{Это поиск макс и мин внутри}
procedure max_min;
var i,j,imn,jmn,imx,jmx:byte;
mn,mx:integer;
begin
mn:=a[2,2];imn:=2;jmn:=2;
mx:=a[2,2];imx:=2;jmx:=2;
for i:=2 to n-1 do
for j:=2 to m-1 do
if a[i,j]<mn then
begin
mn:=a[i,j];
imn:=i;
jmn:=j;
end
else if a[i,j]>mx then
begin
mx:=a[i,j];
imx:=i;
jmx:=j;
end;
writeln('Минимальный элемент внутри периметра a[',imn,',',jmn,']=',mn);
writeln('Максимальный элемент внутри периметра a[',imx,',',jmx,']=',mx);
end;
begin
clrscr;
randomize;
vvod;
kol:=2*(n+m-2);{длина маршрута по периметру}
writeln('Сортировка: ');
sort;
vyvod;
max_min;
readln;
end.
uses crt;
const nmax=20;
var a:array[1..nmax,1..nmax] of integer;
n,m,i,j:byte;
kol,num:integer;
procedure vvod;
var i,j:byte;
begin
repeat
write('Количество строк до ',nmax,' n=');
readln;
until n in [1..nmax];
repeat
write('Количество столбцов до ',nmax,' m=');
readln(m);
until m in [1..nmax];
writeln('Исходная матрица:');
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(50)+1;
write(a[i,j]:4);
end;
writeln;
end;
writeln;
end;
{поиск номеров элементов для сравнения и обмена}
procedure n_elem(var x,y:byte;num:integer);
var i,np,xp,xl,yv,yn:byte;
j:integer;
procedure next_elem;{маршрут поиска}
begin
if (j=kol) then exit;{прошли все}
case np of{направления 1-вверх, 2-вправо, 3-вниз, 4-влево}
1: begin y:=y-1; if y=yv then np:=2; end;
2: begin x:=x+1; if x=xp then np:=3; end;
3: begin y:=y+1; if y=yn then np:=4; end;
4: begin x:=x-1; if x=xl then np:=5; end;
end;
j:=j+1;{считаем шаги}
if np=5 then exit;{вернулись в левый нижний угол}
end;
begin
x:=1;y:=n+1;{начало пути ниже матрицы в первом столбце}
np:=1;{первое направление}
xl:=1;xp:=m;yv:=1;yn:=n;{обозначим края}
j:=0;{обнулим счетчик}
for i:=1 to num do next_elem;{начинаем поиск}
end;
{чтение элемента}
procedure out_el(num:integer;var out_el:integer);
var x,y:byte;
begin
n_elem(x,y,num);
out_el:=a[y,x];
end;
{вставка элемента}
procedure in_el(num:integer;k:integer);
var x,y:byte;
begin
n_elem(x,y,num);
a[y,x]:=k;
end;
{Собственно сортировка линейным обменом}
procedure sort;
var i,j:byte;
k,u:integer;
begin
for i:=1 to kol-1 do{идем по маршруту}
for j:=i+1 to kol do{смотрим впереди}
begin
out_el(i,k);{читаем первый}
out_el(j,u);{второй}
if k>u then{если первый больше}
begin
in_el(i,u);{второй на место первого}
in_el(j,k);{первый на место второго}
end;
end;
end;
procedure vyvod;
begin
for i:=1 to n do
begin
for j:=1 to m do
begin
write(a[i,j]:4);
end;
writeln;
end;
end;
{Это поиск макс и мин внутри}
procedure max_min;
var i,j,imn,jmn,imx,jmx:byte;
mn,mx:integer;
begin
mn:=a[2,2];imn:=2;jmn:=2;
mx:=a[2,2];imx:=2;jmx:=2;
for i:=2 to n-1 do
for j:=2 to m-1 do
if a[i,j]<mn then
begin
mn:=a[i,j];
imn:=i;
jmn:=j;
end
else if a[i,j]>mx then
begin
mx:=a[i,j];
imx:=i;
jmx:=j;
end;
writeln('Минимальный элемент внутри периметра a[',imn,',',jmn,']=',mn);
writeln('Максимальный элемент внутри периметра a[',imx,',',jmx,']=',mx);
end;
begin
clrscr;
randomize;
vvod;
kol:=2*(n+m-2);{длина маршрута по периметру}
writeln('Сортировка: ');
sort;
vyvod;
max_min;
readln;
end.