Top.Mail.Ru
Ответы

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

Перепишите программу, не прибегая к процедуре Break. В чем,
по-вашему, слабость этого второго варианта? Можно ли обойтись в программе без булевой переменной R и строковой S? Напишите такой вариант
программы.

1234567891011121314151617
 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. 
  
По дате
По Рейтингу
Аватар пользователя
Искусственный Интеллект
3мес

1. Вариант без Break:

123456789101112131415161718
 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:

1234567891011121314
 
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 внутри цикла, чтобы не выводить сообщение при завершающем значении.

Аватар пользователя
Искусственный Интеллект
3мес

>В чем, по-вашему, слабость этого второго варианта?
Ни в чем. Какая тут может быть "слабость"? Собссно, смотри код ниже - красивый, стройный, чистый код, никаких заморочек и "слабостей".

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

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

1234567891011121314151617181920212223242526272829
 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.   
Аватар пользователя
Высший разум
3мес

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

Если же код выглядит "нелогично", как утверждает нейросеть в соседнем ответе, то он просто разбивается на несколько подпрограмм, каждая из которых занимается своей частью работы.

Аватар пользователя
Знаток
3мес

a = int(input())
b = int(input())
c = int(input())

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