Перевести код с Pascal - C (СИ) (76842)
Формулировка задачи:
var N:integer;
a:array[0..1000] of integer;
function Min(m1,m2:integer):integer;
begin
if(m1>m2) then Min:=m2
else Min:=m1;
end;
procedure output(count:integer);
var i:integer;
begin
write(a[1]);
for i:=2 to count do
write('+',a[i]);
writeln;
end;
procedure p(k,summ:integer);
var i:integer;
begin
if(summ=N) and (k>2) then output(k-1);
if summ<N then
begin
for i:=1 to Min(N-summ,a[k-1]) do
begin
a[k]:=i;
p(k+1,summ+i);
end;
end;
end;
begin
a[0]:=MaxInt;
readln(N);
p(1,0);
readln;
end.Решение задачи: «Перевести код с Pascal»
textual
Листинг программы
#include <stdio.h>
// библиотека ввода/вывода (scanf/printf)
#include <conio.h>
// включает функцию getch();
#define Min( a, b ) ( ((a) < (b)) ? (a) : (b) )
// задает функцию Min(a,b) - если А меньше Б, возвращает А, иначе возвращает Б
#define MaxInt 32767;
// в паскале есть эта константа, тут пришлось задавать так
int N,a[1000]; /* n:integer; a:array[0..1000] of integer; */
void output(int count); /* задание прототипа процедуры output(count:integer); */
void p(int k,int summ); /* задание прототипа процедуры p(k,summ:integer); */
int main(int argc, char* argv[]) /* основная программа */
{ /* begin */
a[0]=MaxInt; /* a[0]:=MaxInt; */
scanf("%i",&N); /* readln(N); */
p(1,0);
getch(); /* ждёт нажатие любой клавиши перед закрытием программы */
return 0;
}
void output(int count) /* procedure output(count:integer); */
{
int i; /* i:integer; */
printf("%i",a[1]); /* write(a[1]); */
for(i=2;i<=count;i++) /* for i=2 to count do*/
printf("+%i",a[i]); /* write(a[i]); */
printf("\n"); /* writeln(); */
}
void p(int k,int summ) /* procedure p(k,summ:integer) */
{
int i;
if ((summ==N)&&(k>2)) output(k-1); /* if (summ=N) and (k>2) then output(k-1); */
if (summ<N){
for(i=1;i<=Min(N-summ,a[k-1]);i++){ /* for i=1 to Min(N-summ,a[k-1]) do begin */
a[k]=i;
p(k+1,summ+i);
}
}
}
Объяснение кода листинга программы
- Включаются необходимые библиотеки для ввода/вывода и функции Min и MaxInt.
- Объявляются переменные N и массив a размером 1000.
- Определяются прототипы функций output и p.
- В функции main инициализируется первый элемент массива a значением MaxInt и считывается значение N с помощью scanf.
- Вызывается функция p(1,0) для начального заполнения массива.
- В функции output выводится значение первого элемента массива a и последовательно добавляются значения остальных элементов до указанного счётчика.
- В функции p проверяется условие: если сумма текущих элементов равна N и индекс больше 2, то вызывается функция output для предыдущего элемента.
- Если сумма текущих элементов меньше N, то в цикле добавляются значения от 1 до минимального значения (N-summ) и вызывается функция p для следующего элемента.
- В конце программы вызывается функция getch для ожидания нажатия клавиши перед закрытием программы.
- Возвращаемое значение функции main равно 0, что означает успешное завершение программы.