OberonCore https://forum.oberoncore.ru/ |
|
Интересный сайт - обучение школьников С++ и Паскаль https://forum.oberoncore.ru/viewtopic.php?f=88&t=2008 |
Страница 8 из 13 |
Автор: | Madzi [ Среда, 04 Декабрь, 2013 19:08 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Валерий Лаптев писал(а): По коду у меня сразу возникает вопросы. А если передаваемые в качестве параметров x, y, epsilon сразу удовлетворяют условиям выхода? Это же никак не проверяется перед циклом. Или если x постоянно (при входе) < epsilon, то х и у в цикле вычисляются 100 раз? Если передаваемые параметры x, y, и epsion сразу удовлетворяют условиям выхода, то вызова Proc1 не произойдёт. Значение функций Fn1 и Fn2 может лежать в пределах [0..1], соответственно x > x * Fn1 Аргумент функции не обязательно должен быть целым. Здесь он целый для упрощения примера, в реальности есть приращение delta, которое является шагом по функции. Y, как правило > 1, а epsion лежит в приделах от [0.001 до 100] (в зависимости от требуемой точности). |
Автор: | ilovb [ Среда, 04 Декабрь, 2013 19:20 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
что значит "IF (x > epsilon) THEN"? Почему "x := Fn2(y);" находится внутри этого IF? Что значит "y := y - epsion / 2;" Почему оно тоже находится внутри IF? "(y = Fn1(x)) === (z = Fn1(x))" У вас в коде Fn1 не берется от x... В чем задача то заключается? Можете простыми словами сформулировать? |
Автор: | Madzi [ Среда, 04 Декабрь, 2013 19:50 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
ilovb писал(а): что значит "IF (x > epsilon) THEN"? Почему "x := Fn2(y);" находится внутри этого IF? Что значит "y := y - epsion / 2;" Почему оно тоже находится внутри IF? "(y = Fn1(x)) === (z = Fn1(x))" У вас в коде Fn1 не берется от x... В чем задача то заключается? Можете простыми словами сформулировать? Задача в нахождении оптимальных управляющих параметров для поддержания объекта в заданном состоянии (в реальном времени), но к делу это не относится, поскольку в контексте данного обсуждения задача стоит представить данный "неструктурный" цикл структурно. Для этого вовсе не обязательно погружаться в предметную область. |
Автор: | ilovb [ Среда, 04 Декабрь, 2013 19:54 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Madzi: Вы утомили. Без комментариев... |
Автор: | Илья Ермаков [ Среда, 04 Декабрь, 2013 21:52 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Если для понимания куска алгоритма требуется врубать в мозгу "пошаговый отладчик" (т.е. гонять его мысленно, изображая из себя комп) - то в топку такой кусок алгоритма ![]() |
Автор: | albobin [ Среда, 04 Декабрь, 2013 21:53 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Простыми тупыми перестановками веток. Если не налажал, то : Код: PROCEDURE Proc1(x, y, epsion : REAL);
VAR x : REAL; i : INTEGER; BEGIN i := 0; WHILE (i < 100) & ~(x > y) DO x := x * Fn1(i) * y; IF (x <= epsilon) THEN y := (y + x - i) / epsion; INC(i); ELSE x := Fn2(y); IF ~(x > y) THEN y := y - epsion / 2; y := (y + x - i) / epsion; INC(i); END; END; END; RETURN y; END Proc1; |
Автор: | ilovb [ Среда, 04 Декабрь, 2013 21:54 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Код: PROCEDURE Proc1(x, y, epsion : REAL);
VAR x : REAL; i : INTEGER; PROCEDURE Calc; (* что сие вычисляет не знаю *) BEGIN x := x * Fn1(i) * y; IF (x > epsilon) THEN x := Fn2(y); IF (x <= y) THEN y := y - epsion / 2; END; END; END; BEGIN i := 0; Calc; (* получить первый *) WHILE (i < 100) & (x <= y) DO y := (y + x - i) / epsion; INC(i); Calc; (* получить следующий *) END; RETURN y; END Proc1; |
Автор: | ilovb [ Среда, 04 Декабрь, 2013 21:56 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Илья Ермаков писал(а): Если для понимания куска алгоритма требуется врубать в мозгу "пошаговый отладчик" (т.е. гонять его мысленно, изображая из себя комп) - то в топку такой кусок алгоритма ![]() Да я в этом коде вообще логики не вижу ![]() |
Автор: | Madzi [ Среда, 04 Декабрь, 2013 22:05 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
ilovb писал(а): Код: PROCEDURE Proc1(x, y, epsion : REAL); VAR x : REAL; i : INTEGER; PROCEDURE Calc; (* что сие вычисляет не знаю *) BEGIN x := x * Fn1(i) * y; IF (x > epsilon) THEN x := Fn2(y); IF (x <= y) THEN y := y - epsion / 2; END; END; END; BEGIN i := 0; Calc; (* получить первый *) WHILE (i < 100) & (x <= y) DO y := (y + x - i) / epsion; INC(i); Calc; (* получить следующий *) END; RETURN y; END Proc1; Как минимум следует добавить проверку Код: PROCEDURE Proc1(x, y, epsion : REAL); VAR x : REAL; i : INTEGER; PROCEDURE Calc; (* что сие вычисляет не знаю *) BEGIN x := x * Fn1(i) * y; IF (x > epsilon) THEN x := Fn2(y); IF (x <= y) THEN y := y - epsion / 2; END; END; END; BEGIN i := 0; Calc; (* получить первый *) WHILE (i < 100) & (x <= y) DO y := (y + x - i) / epsion; INC(i); IF i < 100 THEN Calc; END; (* получить следующий *) END; RETURN y; END Proc1; И полученный цикл как минимум не проще исходного. |
Автор: | ilovb [ Среда, 04 Декабрь, 2013 22:08 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Да ладно? Вы знаете что-то проще линейного поиска? Кроме того это лишь тупое преобразование. Смысл содержимого Calc от меня ускользает. Когда вы озвучите задачу может внезапно оказаться что это проще совсем иначе делать. ps Что-то долго вы описание рожаете... Как вы смогли закодить то, что словами выразить не можете? |
Автор: | ilovb [ Среда, 04 Декабрь, 2013 22:49 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Цитата: PROCEDURE Proc1(x, y, epsion : REAL); VAR x : REAL; i : INTEGER; Что ж я сразу то не заметил. ![]() |
Автор: | albobin [ Четверг, 05 Декабрь, 2013 07:30 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
ilovb писал(а): Что ж я сразу то не заметил. ![]() Похоже. ![]() Но зато хороший пример для показа чем плох выход из середины цикла. В исходном тексте выход по условию x>y только в одной точке цикла, а есть ещё два пути, в которых 'y' меняется, а проверки нет (на один из которых указывал В.Лаптев). То ли это просчёт, то ли неявно учитывается как могут изменятся значения и , следовательно, будет гарантировано, что x<=y. PS Вот переделка как бы сохраняющая поведение оригинала ![]() Код: BEGIN
i := 0; check := FALSE; WHILE (i < 100) & (~(x > y) OR ~check) DO IF ~check THEN x := x * Fn1(i) * y; IF (x <= epsilon) THEN y := (y + x - i) / epsion; INC(i); ELSE x := Fn2(y); check := TRUE END; ELSE check := FALSE; y := y - epsion / 2; y := (y + x - i) / epsion; INC(i); END; END; END; |
Автор: | igor [ Четверг, 05 Декабрь, 2013 08:22 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
ilovb писал(а): Цитата: PROCEDURE Proc1(x, y, epsion : REAL); VAR x : REAL; i : INTEGER; Что ж я сразу то не заметил. ![]() ![]() |
Автор: | Madzi [ Четверг, 05 Декабрь, 2013 09:22 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Это упрощение реального примера, который я перенабрал, а не скопипастил, отсюда и ошибки. ![]() Но по существу, предложенные циклы не стали понятнее (нагляднее). |
Автор: | ilovb [ Четверг, 05 Декабрь, 2013 09:25 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Так запостите реальный код полностью на исходном языке. Возможно хоть что-то станет яснее. |
Автор: | albobin [ Четверг, 05 Декабрь, 2013 09:34 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Madzi писал(а): Но по существу, предложенные циклы не стали понятнее (нагляднее). Вы - заинтересованное лицо, а больше никто и не высказывался ![]() |
Автор: | ilovb [ Четверг, 05 Декабрь, 2013 09:44 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Можно подумать, что исходный "цикл" понятен. ![]() |
Автор: | igor [ Четверг, 05 Декабрь, 2013 11:29 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Madzi писал(а): Предвосхищая вопросы по поводу операторных скобок - оформляйте требуемый код процедурами. Следование Вашему совету в некоторых случаях может быть полезным, но вряд ли его следует возводить в ранг правила. Оформление кода процедурами, кроме прочего (хорошего или плохого), может разрывать текущий контекст обработки данных, что не способствует повышению наглядности кода. Может поэтому Ваши процедуры Fn1() и Fn2() и не дают покоя ilovb. ![]() |
Автор: | Madzi [ Четверг, 05 Декабрь, 2013 13:01 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
igor писал(а): Madzi писал(а): Предвосхищая вопросы по поводу операторных скобок - оформляйте требуемый код процедурами. Следование Вашему совету в некоторых случаях может быть полезным, но вряд ли его следует возводить в ранг правила. Оформление кода процедурами, кроме прочего (хорошего или плохого), может разрывать текущий контекст обработки данных, что не способствует повышению наглядности кода. Может поэтому Ваши процедуры Fn1() и Fn2() и не дают покоя ilovb. ![]() Возможно ![]() Оформление кода процедурами/функциями, на мой взгляд, следующий шаг к повышению структурности программы. При этом можно дать компилятору возможность самому решать будет процедура/функция "inline" (код подставлен вместо вызова) или будет вызов. Хотелось бы обсудить как раз этот момент, но, наверное, в отдельной ветке. |
Автор: | albobin [ Четверг, 05 Декабрь, 2013 14:26 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Madzi писал(а): Оформление кода процедурами/функциями, на мой взгляд, следующий шаг к повышению структурности программы. Кто ж спорить будет с такой формулировкой. ![]() Вы же имели ввиду под "следующим шагом" - отказ от последовательностей операторов в управляющих конструкциях (IF, WHILE, ...). Не так ли? |
Страница 8 из 13 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |