Прежде чем писать программу, попробуем ее формализовать. Мы знаем, что периметр прямоугольника равен Р = 2*(a+b), а площадь равна S=a*б, где a и b - две стороны прямоугольника. Тогда b =S/a, а периметр P =2a +2b или 2a+2S/a. Отсюда a*P = 2a² +2S. Имеем квадратное уравнение: a²-a*P/2+S=0, решая которое относительно а (сторона прямоугольника) при известных коэффициентах P и S, получим значение сторон прямоугольника. В программе я не проверяю, что введены именно положительные периметр и площадь, надеясь на внимательность вводящего данные. Итак: program storona; uses crt; { используем экран} var b,P,S,d,x1,x2: real; {наши переменные} begin clrscr; {чистим экран} write('Wwedite perimetr P: '); readln(P); write('Wwedite ploshad S: '); readln(S); {Вычисляем дискриминант} b:=-P/2; d:= b*b - 4*S; if d > 0 then {Если дискриминант >0 - все хорошо} begin x1:= (-b + sqrt(d))/2; x2:= (-b - sqrt(d))/2; writeln('Storona1 = ',x1:0:2); {ответ с двумя знаками после запятой} writeln('Storona2 = ',x2:0:2); end; {Если дискриминант равен 0, то тоже неплохо: у нас квадрат} if d = 0 then begin x1:= -(b/2); writeln('Storona1 = ',x1:0:2); writeln('Storona2 = ',x1:0:2); end; {Если дискриминант меньше 0, плохо, выводим сообщение} if d < 0 then begin writeln('Ошибка в данных); end; readln; end.
Обратный код от A это A' = 2^8 - 1 - A = Const - A Схема вычитания путем суммы обратных кодов справедлива т.к.: (A - B)' = A' + B'' = (Const - A) + (Const - (Const - B)) = Const - (A - B)
самый левый бит - это бит знака. если там 1 - то число отрицательное. Например, пусть дан обратный код: F' = 0010 1010, инвертируем биты, получаем: F = 1101 0101 - смотрим на левую цифру (старший разряд) он равен 1, значит приписываем минус: F = - (0101 0101) = -85
Мы знаем, что периметр прямоугольника равен Р = 2*(a+b), а площадь равна S=a*б, где a и b - две стороны прямоугольника.
Тогда b =S/a, а периметр P =2a +2b или 2a+2S/a. Отсюда
a*P = 2a² +2S. Имеем квадратное уравнение:
a²-a*P/2+S=0, решая которое относительно а (сторона прямоугольника) при известных коэффициентах P и S, получим значение сторон прямоугольника.
В программе я не проверяю, что введены именно положительные периметр и площадь, надеясь на внимательность вводящего данные.
Итак:
program storona;
uses crt; { используем экран}
var
b,P,S,d,x1,x2: real; {наши переменные}
begin
clrscr; {чистим экран}
write('Wwedite perimetr P: ');
readln(P);
write('Wwedite ploshad S: ');
readln(S);
{Вычисляем дискриминант}
b:=-P/2;
d:= b*b - 4*S;
if d > 0 then {Если дискриминант >0 - все хорошо}
begin
x1:= (-b + sqrt(d))/2;
x2:= (-b - sqrt(d))/2;
writeln('Storona1 = ',x1:0:2); {ответ с двумя знаками после запятой}
writeln('Storona2 = ',x2:0:2);
end;
{Если дискриминант равен 0, то тоже неплохо: у нас квадрат}
if d = 0 then
begin
x1:= -(b/2);
writeln('Storona1 = ',x1:0:2);
writeln('Storona2 = ',x1:0:2);
end;
{Если дискриминант меньше 0, плохо, выводим сообщение}
if d < 0 then
begin
writeln('Ошибка в данных);
end;
readln;
end.
Схема вычитания путем суммы обратных кодов справедлива т.к.:
(A - B)' = A' + B'' = (Const - A) + (Const - (Const - B)) = Const - (A - B)
самый левый бит - это бит знака. если там 1 - то число отрицательное. Например, пусть дан обратный код:
F' = 0010 1010, инвертируем биты, получаем:
F = 1101 0101 - смотрим на левую цифру (старший разряд) он равен 1, значит приписываем минус:
F = - (0101 0101) = -85
а)
19' = (0001 0011)' = 1110 1100
14' = (0000 1110)' = 1111 0001
F' = 19 - 14 = 19' + 14'' = 19' + 14 =
1110 1100 +
0000 1110 =
1111 1010
F = F'' = (1111 1010)' = 0000 0101 = 5
б) F' = 19' + 43''=
1110 1100 +
0010 1011 =
0101 0111 (тут переполнение)
F = 110 1000 = -010 1000 = -24
в) F' = 43 - 25 = 43' + 25'' =
1101 0100 +
0001 1001 =
1110 1101
F = F'' = (1110 1101)' = 0001 0010 = 18