Pascal, программа. . - Компьютерные вопросы

Вопрос Pascal, программа. .

Регистрация
8 Ноя 2013
Сообщения
85
Репутация
0
Спасибо
0
Монет
0
Перепишите программу, не прибегая к процедуре Break. В чем,

по-вашему, слабость этого второго варианта? Можно ли обойтись в программе без булевой переменной R и строковой S? Напишите такой вариант

программы. var A, B, C : integer;

R: Boolean;

S: string;

begin

repeat

Write(’Первый сомножитель A = ’); Readln(A);

Write(’Второй сомножитель B = ’); Readln(B);

Write(’Произведение A*B = ’); Readln(C);

if C=0 then break;

R:= A*B=C;

if R

then S:= ’Правильно!’

else S:= ’Ошибка!’;

Writeln(S);

until false;

end.

 
Регистрация
21 Июл 2013
Сообщения
93
Репутация
10
Спасибо
0
Монет
0
То, что внутри цикла не будет break - это не слабость, а достоинство кода.
В структурном программировании, направленном на написание надёжного кода, каждая конструкция должна иметь единственную точку входа и единственную точку выхода. И в нормальном Pascal никаких break и continue не существует: такое есть только в PascalABC.NET, который не имеет никакого отношения к Pascal и представляет собой C#, загримированный под Pascal.

Если же код выглядит "нелогично", как утверждает нейросеть в соседнем ответе, то он просто разбивается на несколько подпрограмм, каждая из которых занимается своей частью работы.
 
Регистрация
19 Май 2013
Сообщения
70
Репутация
13
Спасибо
0
Монет
0
>В чем, по-вашему, слабость этого второго варианта?
Ни в чем. Какая тут может быть "слабость"? Собссно, смотри код ниже - красивый, стройный, чистый код, никаких заморочек и "слабостей".

>Можно ли обойтись в программе без булевой переменной R и строковой S?
Можно запросто.

>Напишите такой вариант
Да пожалуйста (классический паскаль без наворотов):

function GetInt(_Prompt: string): Integer;
var
r: Integer;
begin
Write(_Prompt+': ');
ReadLn(r);
GetInt := r;
end;

function ResultOK(a,b,c: Integer): string;
begin
if (a*b=c) then
ResultOK := 'Right'
else
ResultOK := 'Wrong';
if (c=0) then
ResultOK := '';
end;

var
a,b,c: Integer;
begin
repeat
a := GetInt('Enter first multiplier');
b := GetInt('Enter second multiplier');
c := GetInt('Enter multiplication');
WriteLn(ResultOK(a,b,c));
until c=0;
end.
 
Регистрация
21 Авг 2013
Сообщения
76
Репутация
0
Спасибо
0
Монет
0
1. Вариант без Break: var A, B, C : integer;
R: Boolean;
S: string;
begin
repeat
Write('Первый сомножитель A = '); Readln(A);
Write('Второй сомножитель B = '); Readln(B);
Write('Произведение A*B = '); Readln(C);
if C<>0 then begin
R:= A*B=C;
if R
then S:= 'Правильно!'
else S:= 'Ошибка!';
Writeln(S);
end;
until C=0;
end.


2. Оптимизированный вариант без R и S:
var A, B, C : integer;
begin
repeat
Write('Первый сомножитель A = '); Readln(A);
Write('Второй сомножитель B = '); Readln(B);
Write('Произведение A*B = '); Readln(C);
if C<>0 then
if A*B=C
then Writeln('Правильно!')
else Writeln('Ошибка!');
until C=0;
end.


Слабость первого варианта (без Break) в том, что условие выхода (C=0) проверяется только в конце цикла, после выполнения всех действий внутри него. Это менее логично с точки зрения структуры программы, так как проверка на выход должна происходить сразу после ввода данных. Поэтому приходится использовать дополнительную проверку if C<>0 внутри цикла, чтобы не выводить сообщение при завершающем значении.
 
Регистрация
28 Июл 2013
Сообщения
87
Репутация
0
Спасибо
0
Монет
0
a = int(input())
b = int(input())
c = int(input())

if c != (a+b):
print("ошибка")
else:
print("верно")
 
Сверху Снизу