Товарищи, по книге Потопахина разбираюсь с КП, решал задачки, но не уверен что все решил правильно. Если кому не сложно, ткните носом в мои ошибки. Задачки:

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;
```
