Товарищи, по книге Потопахина разбираюсь с КП, решал задачки, но не уверен что все решил правильно. Если кому не сложно, ткните носом в мои ошибки. Задачки:
1)
Код:
Определить, является ли число N совершенным. Совершенные числа, это числа, равные сумме своих делителей. Например 6=1+2+3; или 28=1+2+4+7+14.
MODULE Math;
IMPORT In, StdLog;
PROCEDURE Calc*;
VAR
k, n, sum, N:INTEGER;
flag:BOOLEAN;
BEGIN
In.Open;
In.Int(N);
sum:=0;
n:=N DIV 2;
flag:=TRUE;
WHILE (k<=n) & flag DO
IF N MOD k=0 THEN
sum:=sum+k;
END;
k:=k+1;
IF sum=N THEN
flag:=FALSE;
StdLog.String('Число N совершенное')
END;
ELSE
StdLog.String('Число N не является совершенным')
END;
END Calc;
END Math.
2)
Код:
Дано три целых числа. Проверить, являются ли они членами геометрической прогрессии
MODULE Math;
IMPORT In, StdLog;
PROCEDURE Calc*;
VAR
a, b, c, k:INTEGER;
flag:BOOLEAN;
BEGIN
In.Open;
In.Int(a); In.Int(b); In.Int(c);
flag;=FALSE;
k:=2;
REPEAT
IF (a*k=b) & (b*k=c) & (k<c) THEN
flag:=TRUE;
END;
k:=k+1;
UNTIL flag=TRUE;
END;
IF flag=TRUE THEN
StdLog.String('Это члены геометрической прогрессии');
ELSE
StdLog.String('Это не члены геометрической прогрессии');
END Calc;
END Math.
3) Тут вообще никак не придумаю путь решения
Код:
Вычислить сумму всех четных чисел из входного потока данных
MODULE Math;
IMPORT In, StdLog;
PROCEDURE Calc*;
VAR
sum, k, N:INTEGER;
In.Open;
In.Done;
In.Int(N);
BEGIN
sum:=0;
FOR k: a1 TO a[N] DO
IF (k MOD 2=0) & In.Done THEN
sum:=sum+k;
END;
END;
StdLog.String(sum);
END Calc;
END Math.
4)
Код:
Вычислить сумму всех положительных чисел из входного потока данных
MODULE Math;
IMPORT In, StdLog;
PROCEDURE Calc*;
VAR
N, k, sum, a INTEGER;
BEGIN
In.Open;
In.Int(N);
In.Done;
sum:=0;
WHILE (a[N]>0) & (In.Done) THEN
sum:=sum+a[N];
IF (a[k]>0) THEN
sum:=sum+N;
END;
END;
StdLog.Int(sum);
END Calculation;
END Math.
5)
Код:
Дано число N. Определить, является ли оно степенью двойки
MODULE Math;
PROCEDURE Calc*;
IMPORT In, StdLog;
VAR
k, N:INTEGER;
In.Open;
In.Int(N);
BEGIN
k:=N;
WHILE k>2 DO
k:=k DIV 2;
IF k=2 THEN
StdLog.String('N является степенью двойки');
ELSE
StdLog.String('N не является степенью двойки');
END;
6)
Код:
Дано три числа. Выяснить, являются ли они сторонами прямоугольного треугольника
MODULE Math;
IMPORT In, StdLog;
PROCEDURE Calc*;
VAR
a, b, c INTEGER;
BEGIN
In.Open;
In.Int(a); In.Int(b); In.Int(c);
IF (a+b>c) & (a+c>b) & (b+c>a) THEN
IF (a*a+b*b>c*c) OR (a*a+c*c>b*b) OR (b*b+c*c>a*a) THEN
StdLog.String('Это прямоугольный треугольник');
ELSE
StdLog.String('Эти числа не являются сторонами прямоугольного треугольника');
END;
END Calc;
END Math.
7)
Код:
Дано три целых числа. Проверить, являются ли они членами арифметической прогрессии
MODULE Math;
IMPORT in, StdLog;
PROCEDURE Calc*;
VAR
a, b, c, k:INTEGER;
flag:BOOLEAN;
In.Open;
In.Int(a); In.Int(b); In.Int(c);
BEGIN
k:=1;
REPEAT
k:=k+1;
IF (a+k=b) & (b+k=c) & (k<=c) THEN flag:=true;
UNTIL flag;
END;
END;
IF flag THEN
StdLog.String('Это члены арифметической прогрессии');
ELSE
StdLog.String('Это не члены арифметической прогрессии');
END Calc;
END Math;