OberonCore
https://forum.oberoncore.ru/

Интересный сайт - обучение школьников С++ и Паскаль
https://forum.oberoncore.ru/viewtopic.php?f=88&t=2008
Страница 8 из 12

Автор:  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: Интересный сайт - обучение школьников С++ и Паскаль

Илья Ермаков писал(а):
Если для понимания куска алгоритма требуется врубать в мозгу "пошаговый отладчик" (т.е. гонять его мысленно, изображая из себя комп) - то в топку такой кусок алгоритма :)

Да я в этом коде вообще логики не вижу :D

Автор:  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;


Что ж я сразу то не заметил. :evil: Madzi похоже нам ахинею подсунул. То то он формулировку своей фантазии придумать не может.

Автор:  albobin [ Четверг, 05 Декабрь, 2013 07:30 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
Что ж я сразу то не заметил. :evil: 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;

Что ж я сразу то не заметил. :evil: Madzi похоже нам ахинею подсунул.
Ещё "RETURN y;" у процедуры (не у функции). Это я сразу заметил, просто промолчал. :)

Автор:  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: Интересный сайт - обучение школьников С++ и Паскаль

Можно подумать, что исходный "цикл" понятен. :D

Автор:  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 из 12 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/