Перевести Код Из Паскаля В C

  • Автор темы Strongmamba
  • Дата начала
S

Strongmamba

#1
Помогите пожалуйста. Отсортировать по возрастанию элементы стоящие по периметру матрицы,начиная с элемента 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(n);
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.
 
И

Истребитель

#2
Ну это же совсем не трудно

0. uses превращается в include, если не знаешь что инклюдить посмотри на какую процедуру ругается компилятор и на www.cplusplus.com посмотри какой файл нужно заинклюдить, затем добавь #include <имяфайла>

1. Для операций сравнения = превращается в ==, <> превращается в !=, условия для if обязательно должны быть в скобках
2. Все функции/процедуры без параметров должны иметь пустые скобки на конце
3. then отсутствует
4. begin заменяется на { а end заменяется на } и после закрывающей скобки точка с запятой не требуется
5. writeln и readln нет, read = scanf, write = printf, синтаксис похожий (чтобы сделать вывод пустой строки выводишь \r\n)

if a = b then begin writeln; exit; end;
станет
if (a==B) { printf("\r\n"); exit(); }

6. var не нужен, переменные объявляются чуть иначе, первый элемент массива нумеруется 0, а не 1:

var i:integer;
станет
int i;

var a:array[1..nmax,1..nmax] of integer;
станет
int a[nmax,nmax];

7. Присваивание записывается просто = а не :=

8. Процедуры и функции объявляются одинаково, процедура - это функция возвращающая void (пустоту), не требуется отдельный блок var

procedure vvod;
var i:int;
begin
readln;
end;

станет

void vvod()
{
int i;
scanf();
}

9. repeat и until превращаются в do и while
10. вместо a:=a+1 можно писать a++ и аналогично для минуса.
11. смысл слов unti и while противоположный, т.е. в паскале цикл выполняется пока условие ложь, а в с пока истина

repeat
a:=a + 1;
until a = 10;

станет

do{
a++;
} while (a!=10)

12. По case синтаксис похожий, просто почитай синтаксис помошник или посмотри на www.cplusplus.com

13. Тело главной программы находится внутри функции int main()

begin
vvod;
...
end

станет

int main(){
vvod();
..
}

После того как переведешь весь код, просто запускай компилятор и смотри какие ошибки остались, читаешь справку, если какая-то функция встроенная ругается, что такой нет то гуглишь "аналог <имя_функции/процедуры> в C" и смотришь на что заменить.