Форум » Анализ алгоритмов для исполнителей » Задание 14, разбор решения » Ответить

Задание 14, разбор решения

Анна_Л: Здравствуйте! Я не понимаю объяснение примера задания Р-10 (ege14), а именно в пункте 9) «Несмотря на то, что набирается три «5», не происходит замена трех «5» на «2», так как ветвь «Иначе» выполняется только в том случае, если не отработала ветвь «То»». На самом деле ветвь "Иначе" в полном ветвлении "Если" выполняется в случае ложного значения логического выражения, что и должно произойти: При выполнении команды "ПОКА нашлось (222) или нашлось (555)" Редактор найдёт последовательность (555), возвращается логическое значение "истина", заходим в цикл. В команде "ЕСЛИ нашлось (222)" возвращается логическое значение "ложь", переходим на ветвь "ИНАЧЕ", выполняется команда "заменить (555,2)". А в приведённом решении задания Р-10 пункты 9-11 противоречат Вашему же предупреждению "Возможные ловушки и проблемы". Почему во всех темах этого форума, связанных с 14 заданием (с Редактором), в объяснениях решений ветви полного ветвления "Если_то_иначе" неравноценны, т.е. ветвь "иначе" просто игнорируется? Спасибо.

Ответов - 8

Поляков: Анна_Л пишет: ветвь "иначе" просто игнорируется Нет, не игнорируется. Ветвь "иначе" выполняется тогда, когда не выполнено условие после "если" и не отработала ветвь "то". Пусть строка равна '555222'. Сравните работу трёх программ на этой строке:[pre2] ЕСЛИ нашлось (222) ТО заменить (222, 5) ИНАЧЕ заменить (555, 2) КОНЕЦ ЕСЛИ[/pre2][pre2] ЕСЛИ нашлось (555) ТО заменить (555, 2) ИНАЧЕ заменить (222, 5) КОНЕЦ ЕСЛИ[/pre2][pre2] ЕСЛИ нашлось (222) ТО заменить (222, 5) КОНЕЦ ЕСЛИ ЕСЛИ нашлось (555) ИНАЧЕ заменить (555, 2) КОНЕЦ ЕСЛИ[/pre2]Все три результата разные.

Анна_Л: Я по-прежнему не понимаю добавку "и не отработала ветвь ТО": для меня "И" неразрывно связана с конъюнкцией. Разбирая приведённые Вами примеры и ещё раз просматривая ветви форума, я поняла, что основные проблемы и разногласия на самом деле связаны с тем, что в заданиях на Редактора не прописано, как работает команда "нашлось" и новая итерация цикла ПОКА после выполнения команды "заменить": поиск начинается каждый раз с начала строки (аналогично функции POS в Паскале) или с той позиции в строке, после которой произошла замена? Если второй вариант, то почему после того, как Редактор просмотрел всю строку, он опять начинает с начала строки (как это описано в п.11 решения р-10)? Мне показалось, что сами разработчики это понимают по-разному: в пособиях Лещинера подразумевается поиск каждый раз с начала, а в пособиях Крылова - последовательный, с позиции после замены, с прохождением по строке несколько раз. Хотелось бы услышать Вашу точку зрения. Спасибо.

Поляков: Анна_Л пишет: Я по-прежнему не понимаю добавку "и не отработала ветвь ТО": для меня "И" неразрывно связана с конъюнкцией. Если условие верно, то ветвь ТО срабатывает. А чтобы разобраться - наберите программу и пройдите в пошаговом режиме.

Анна_Л: Здравствуйте, Константин Юрьевич! Воспользовалась Вашим советом, написала программу и действительно разобралась, что же я не понимала в объяснениях этого задания. Разрешите предложить свою интерпретацию п. 9) разбора задания р-10. Может, это будет кому-то, как и мне, понятнее: "На четвертой итерации цикла в строке присутствуют и три получившиеся пятерки, и оставшиеся 238 двоек, т.е. в условии ПОКА оба выражения: "нашлось (222)" и "нашлось (555)" истинны. Но поскольку в условном операторе ЕСЛИ в ветке ТО стоит проверка "нашлось (222)", будет проверяться именно это условие, и выполнится замена трёх двоек на пятёрку. Это будет продолжаться до тех пор, пока Редактор будет находить в строке не менее трёх двоек". Может, кому-то пригодится и моя программа на Паскале (для задания р-10), программа Наймушина на моём комьпютере не пошла, разбираться было лень(. program task_14; const s2 = '222'; s5 = '555'; var s: string; s0: char; i, i2, i5, n: integer; begin writeln('введите символ и через пробел количество повторений'); readln(s0, i); for n := 1 to i do s := s + s0; while (pos(s2, s) <> 0) OR (pos(s5, s) <> 0) do if pos(s2, s) <> 0 then begin i2 := pos(s2, s); s[i2] := '5'; delete(s, i2 + 1, 2); writeln('i2=', i2, ' ', s); end else begin i5 := pos(s5, s); s[i5] := '2'; delete(s, i5 + 1, 2); writeln('i5=', i5, ' ', s); end; writeln(s) end. Спасибо за помощь!

Рамзия: Добрый вечер. Прорешали несколько раз задание 170, ответ получаем 565. У Вас 564. Какой там все таки ответ?

Поляков: Рамзия пишет:Прорешали несколько раз задание 170, ответ получаем 565. У Вас 564. Какой там все таки ответ? 1) приводите ваше решение, будем разбираться. 2) можно ведь просто программу написать и проверить.

aln1947: Добрый день, Анна. Я Наймушин Александр Львович, программа которого на Вашем компьютере "не пошла". Там есть инструкция для пользователя, где сказано: на компьютере должно быть установлено ПО Net.Framework 4.0 или выше. И тогда все работает. Если Вы работаете в Питоне 3.4.1, могу предложить простенькую программку для решения таких задач, например, задача 14-172. Набираете в Paint, сохраняете с расширением *.py, затем открываете в IDLE, выводятся все получаемые строки одна за одной до последней. s = '3'+'6' * 115+'3' while '63' in s or '664' in s or '6665' in s: if '63' in s: s = s.replace('63','4',1) print(s) elif '664' in s: s = s.replace('664','65',1) print(s) elif '6665' in s: s = s.replace('6665','63',1) print(s) print(s)

aln1947: Добрый день, Анна. Я Наймушин Александр Львович, программа которого на Вашем компьютере "не пошла". Там есть инструкция для пользователя, где сказано: на компьютере должно быть установлено ПО Net.Framework 4.0 или выше. И тогда все работает. Если Вы работаете в Питоне 3.4.1, могу предложить простенькую программку для решения таких задач, например, задача 14-172. Набираете в Paint, сохраняете с расширением *.py, затем открываете в IDLE, выводятся все получаемые строки одна за одной до последней. s = '3'+'6' * 115+'3' while '63' in s or '664' in s or '6665' in s: if '63' in s: s = s.replace('63','4',1) print(s) elif '664' in s: s = s.replace('664','65',1) print(s) elif '6665' in s: s = s.replace('6665','63',1) print(s) print(s)



полная версия страницы