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; Что ж я сразу то не заметил. Madzi похоже нам ахинею подсунул. То то он формулировку своей фантазии придумать не может. |
Автор: | albobin [ Четверг, 05 Декабрь, 2013 07:30 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
ilovb писал(а): Что ж я сразу то не заметил. Madzi похоже нам ахинею подсунул. То то он формулировку своей фантазии придумать не может. Похоже. Но зато хороший пример для показа чем плох выход из середины цикла. В исходном тексте выход по условию 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 похоже нам ахинею подсунул. |
Автор: | 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/ |