Глава 14 Г

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Глава 14 Г

Сообщение Eskin » 26.02.2017 13:58:34

Я посмотрел в ответы, я немного понимаю код к этой главе, но не совсем понимаю, выбранный автором математический алгоритм, не могли бы вы мне его объяснить?
А так же почему здесь применяется оператор begin :oops:
Код: Выделить всё
if (X>=Y) and (X>=Z)
then { X – длина кирпича }
if Y<Z
then begin Hk:=Y; Sk:=Z end
else begin Hk:=Z; Sk:=Y end


Добавлено спустя 7 минут 48 секунд:
Код из "Ответы на а слабо!"

Код: Выделить всё
Г) В стене прорублено сквозное прямоугольное отверстие со сторонами A и B.
Пусть ваша программа определит, пройдет ли в него кирпич с ребрами X, Y, Z.
Соотношение между сторонами неизвестно, и программе самой следует выяснить высоту
и ширину, как отверстия, так и кирпича.
var A, B : integer; { стороны отверстия }
X, Y, Z : integer; { стороны кирпича }
H, S : integer; { высота и ширина отверстия, H <= S }
Hk, Sk : integer; { высота и ширина кирпича, Hk <= Sk}
begin
Write('Введит две стороны отверстия: '); Readln(A, B);
Write('Введите три стороны кирпича: '); Readln(X, Y, Z);
{ Формируем высоту (H) и ширину (S) отверстия }
if A<B
then begin H:=A; S:=B end
else begin H:=B; S:=A end;
{ Формируем высоту (Hk) и ширину (Sk) кирпича }
if (X>=Y) and (X>=Z)
then { X – длина кирпича }
if Y<Z
then begin Hk:=Y; Sk:=Z end
else begin Hk:=Z; Sk:=Y end
else if (Y>=X) and (Y>=Z)
then { Y – длина кирпича }
if X<Z
then begin Hk:=X; Sk:=Z end
else begin Hk:=Z; Sk:=X end
else { Z – длина кирпича }
if X<Y
then begin Hk:=X; Sk:=Y end
else begin Hk:=Y; Sk:=X end;
{ формируем решение }
if (H>=Hk) and (S>=Sk)
then Writeln ('Проходит')
else Writeln ('Не проходит');
Readln;
end.


Не проще было бы просто воспользоваться операцией сравнения сравнив параметры окна и самого кирпича?
Аватара пользователя
Eskin
незнакомец
 
Сообщения: 8
Зарегистрирован: 05.12.2016 22:43:34

Re: Глава 14 Г

Сообщение bormant » 26.02.2017 16:26:47

Eskin писал(а):математический алгоритм

Определяем меньшую и большую стороны отверстия, определяем пару меньших измерений кирпича, проверяем, что два меньших размера кирпича поэлементно меньше или равны размерам отверстия.

begin ... end -- составной оператор -- нужен, когда на месте одного оператора нужно записать несколько.

Добавлено спустя 5 минут 15 секунд:
Другой вариант ровно о том же:
Код: Выделить всё
procedure swp(var a, b: Integer);
var t: Integer;
begin
  t:=a; a:=b; b:=t;
end;
var a, b, x, y, z: Integer;
begin
  Write('A B X Y Z: '); ReadLn(a,b,x,y,z);
  if a>b then swp(a,b);
  if x>y then swp(x,y);
  if y>z then swp(y,z);
  if x>y then swp(x,y);
  WriteLn((a>=x) and (b>=y));
end.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Глава 14 Г

Сообщение Oleg_D » 28.02.2017 12:58:56

Eskin писал(а):Не проще было бы просто воспользоваться операцией сравнения сравнив параметры окна и самого кирпича?

Так именно это мы и делаем: сравниваем высоту кирпича и отверстия (два мЕньших числа) и их ширину (два бОльших числа). Но сначала выясняем эти бОльшие и мЕньшие числа.
Решение от bormant мне нравится :) , но надо заметить, что на этапе 14-й главы читатель ещё не знаком с процедурами :(
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Глава 14 Г

Сообщение vitaly_l » 28.02.2017 15:10:16

Oleg_D писал(а):надо заметить, что на этапе 14-й главы читатель ещё не знаком с процедурами :(

Ага.. раз он не знает о процедурах, значит он не знает и о "запрете" на использование goto! Соответственно наивного читателя можно совсем запутать и предложить ему вот такое "очень вредное" решение :mrgreen:, т.к. оно позволяет лучше понять begin end:
Код: Выделить всё
var a, b, x, y, z, t, count, max, min: Integer;
label myRepeat;
begin
  Write('A B X Y Z: '); ReadLn(a,b,x,y,z);
  count := 1;  max := a;  min := b;
  myRepeat:
  if max < min then begin t:=max; max:=min; min:=t; end;
  inc(count);
  case count of
    2:begin a := max; b := min; max := x; min := y; end;
    3:begin x := min; y := max; max := z; min := y; end;
    4:begin y := min; z := max; max := x; min := y; end;
  end;
  if count < 5 then goto myRepeat;
  x := max; y := min;
  WriteLn((a>=x) and (b>=y));
end.
Последний раз редактировалось vitaly_l 28.02.2017 16:57:23, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Глава 14 Г

Сообщение Лекс Айрин » 28.02.2017 16:14:25

vitaly_l писал(а):Ага.. раз он не знает о процедурах, значит он не знает и о "запрете" на использование goto!

1. Не запрет, а рекоментацию не использовать.
2. Не факт. что это действительно так. Я бы его озвучивал одновременно с разговором о собственно goto/
3. Не смешно. Создается впечатление о тебе как о человеке программирующем исключительно в машинных кодах. И не знающем даже о команде Loop.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Глава 14 Г

Сообщение vitaly_l » 28.02.2017 17:01:30

Лекс Айрин писал(а):3. Не смешно.

Да ты прав, с циклами - выглядит смешнее:
Код: Выделить всё
var a, b, x, y, z, t, count, max, min: Integer;
begin
  Write('A B X Y Z: '); ReadLn(a,b,x,y,z);
  max := a; min := b;
  for count := 2 to 4 do begin
      if max < min then begin t:=max; max:=min; min:=t; end;
      case count of
        2:begin a := max; b := min; max := x; min := y; end;
        3:begin x := min; y := max; max := z; min := y; end;
        4:begin y := min; z := max; max := x; min := y; end;
      end;
  end;
  x := max; y := min; WriteLn((a>=x) and (b>=y));
end. 
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41


Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru