На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение
постоянный участник




Сообщение: 29
ссылка на сообщение  Отправлено: 05.04.12 10:54. Заголовок: C4 задача 38


в операторе
 цитата:
if X > Xprev then
L := L + X – Xprev; { изменяем высоту подъема }
if L > LMax then LMax := L;
end
else L := 0;


не хватает begin

 цитата:
while True do begin
readln(X); { читаем число }
if X = 0 then break;
................
end;


такой выход из цикла разве не является "Грязным хаком"?
на мой взгляд плохо продумана логика алгоритма
Вот другой вариант решения

 цитата:

var X, Xtn, Xt, N, LMax: integer;
{X - очередное число, Xtn - предыдущее число, Xt - первое число в подъеме}
begin
N := 0; LMax := 0; Xt := 0; Xtn := 0;
repeat
readln(X);
if Xt = 0 then Xt := X; {выполнится один раз для первого числа,
возможно, оно будет первым в подъеме}
N:= N + 1;
if X < Xtn then {если X < Xtn, то Xtn последнее число в подъеме}
begin
if Xtn - Xt > LMax then LMax := Xtn - Xt;
Xt :=X;
end ;
Xtn:=X;
until x = 0;
writeLn('Получено ', N-1, ' чисел'); { 0 не входит в последовательность}
writeLn('Наибольшая высота подъема ', LMax);
end.




Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 4 [только новые]


Администратор




Сообщение: 243
ссылка на сообщение  Отправлено: 05.04.12 13:05. Заголовок: oval пишет: не хвата..


oval пишет:
 цитата:
не хватает begin

Спасибо, конечно так.
 цитата:
такой выход из цикла разве не является "Грязным хаком"?

:-) Это предмет споров. Обычно "грязный хак" - это использование недокументированных возможностей. Здесь такого нет.
Я обсуждал этот вопрос со многими специалистами, неизменно приходили к таким выводам:
1) да, "высокая теория" не рекомендует так делать рад "чистоты" кода (из цикла должен быть только один выход)
2) в то же время в промышленном программировании такой прием применяется постоянно.

Почему же так происходит? Дело в том, что это цикл, в котором необходимость продолжения действия определяется в середине тела цикла (после того, как отработал оператор read), не в начале, и не в конце. Поэтому, строго говоря, использование while и repeat тут не очень удобно. Можно, конечно, но получается обычно менее прозрачно, чем с break.

Итак, прочитали 0. Нужно сразу закончить цикл, что и делает break. Естественно, можно поставить ветвление if (X>0) ..., но это фактически то же самое, что и break. Если не делать ни того, ни другого, и использовать repeat-until, нужно обязательно проверять, как это нулевое значение "протащится" через оставшуюся часть тела цикла, не будет ли побочных эффектов. А зачем, собственно? Чтобы соблюсти "чистоту"? Можно поставить выход через break, и логика программы станет понятной. Так что, я всегда выберу удобство и понятность вместо слепого следования "правилам".
 цитата:
на мой взгляд плохо продумана логика алгоритма

Пожалуйста, изложите конкретные претензии. Для меня эта логика естественна. За что тут могут снизить балл на ЕГЭ, я не знаю.
 цитата:
Вот другой вариант решения

Тоже вариант. Но я достаточно долго соображал, как будет проходить завершающий 0 через остаток цикла.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 30
ссылка на сообщение  Отправлено: 05.04.12 13:34. Заголовок: Поляков пишет: За ч..


Поляков пишет:

 цитата:
За что тут могут снизить балл на ЕГЭ, я не знаю.


на ЕГЭ балл не снизят, но своим детям я такое решение не зачту
в крайнем случае выход через булевскую переменную

 цитата:
while not(end_posl) do begin
readln(X); { читаем число }
end_posl:=X=0;
................
end;


хотя, действительно, это вопрос только "чистоты" кода

 цитата:
как будет проходить завершающий 0 через остаток цикла


0 конец ввода, и соответственно, конец последнего подъема, проверяем его высоту

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 244
ссылка на сообщение  Отправлено: 05.04.12 14:42. Заголовок: oval пишет: действит..


oval пишет:
 цитата:
действительно, это вопрос только "чистоты" кода

То есть, чисто религиозный. :-) Мне наоборот кажется, что решение с логической переменной "кривое", хотя соответствует формальным признакам "кошерности". Я так никогда не напишу, если в языке есть break.
Тут выбор между следованием "идее" и понятностью кода. "Каждый выбирает для себя..." (Ю. Левитанский) Возможно, это недостаток моей логики и стиля мышления.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 411
ссылка на сообщение  Отправлено: 05.10.12 18:23. Заголовок: Продолжение банкета ..


Продолжение банкета - тут.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1179
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет