OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Ноябрь, 2019 01:06

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 257 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10, 11 ... 13  След.
Автор Сообщение
СообщениеДобавлено: Среда, 04 Декабрь, 2013 19:08 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 573
Откуда: Россия, Санкт-Петербург
Валерий Лаптев писал(а):
По коду у меня сразу возникает вопросы.
А если передаваемые в качестве параметров x, y, epsilon сразу удовлетворяют условиям выхода?
Это же никак не проверяется перед циклом.

Или если x постоянно (при входе) < epsilon, то х и у в цикле вычисляются 100 раз?

Если передаваемые параметры x, y, и epsion сразу удовлетворяют условиям выхода, то вызова Proc1 не произойдёт.

Значение функций Fn1 и Fn2 может лежать в пределах [0..1], соответственно x > x * Fn1
Аргумент функции не обязательно должен быть целым. Здесь он целый для упрощения примера, в реальности есть приращение delta, которое является шагом по функции.
Y, как правило > 1, а epsion лежит в приделах от [0.001 до 100] (в зависимости от требуемой точности).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 19:20 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
что значит "IF (x > epsilon) THEN"?
Почему "x := Fn2(y);" находится внутри этого IF?
Что значит "y := y - epsion / 2;"
Почему оно тоже находится внутри IF?

"(y = Fn1(x)) === (z = Fn1(x))"

У вас в коде Fn1 не берется от x...

В чем задача то заключается? Можете простыми словами сформулировать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 19:50 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 573
Откуда: Россия, Санкт-Петербург
ilovb писал(а):
что значит "IF (x > epsilon) THEN"?
Почему "x := Fn2(y);" находится внутри этого IF?
Что значит "y := y - epsion / 2;"
Почему оно тоже находится внутри IF?

"(y = Fn1(x)) === (z = Fn1(x))"

У вас в коде Fn1 не берется от x...

В чем задача то заключается? Можете простыми словами сформулировать?

Задача в нахождении оптимальных управляющих параметров для поддержания объекта в заданном состоянии (в реальном времени), но к делу это не относится, поскольку в контексте данного обсуждения задача стоит представить данный "неструктурный" цикл структурно. Для этого вовсе не обязательно погружаться в предметную область.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 19:54 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Madzi: Вы утомили. Без комментариев...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 21:52 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9157
Откуда: Россия, Орёл
Если для понимания куска алгоритма требуется врубать в мозгу "пошаговый отладчик" (т.е. гонять его мысленно, изображая из себя комп) - то в топку такой кусок алгоритма :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 21:53 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 700
Откуда: Псков
Простыми тупыми перестановками веток.
Если не налажал, то :
Код:
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;


Последний раз редактировалось albobin Среда, 04 Декабрь, 2013 22:00, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 21:54 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Код:
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;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 21:56 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Илья Ермаков писал(а):
Если для понимания куска алгоритма требуется врубать в мозгу "пошаговый отладчик" (т.е. гонять его мысленно, изображая из себя комп) - то в топку такой кусок алгоритма :)

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 22:05 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 573
Откуда: Россия, Санкт-Петербург
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;


И полученный цикл как минимум не проще исходного.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 22:08 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Да ладно? Вы знаете что-то проще линейного поиска?

Кроме того это лишь тупое преобразование. Смысл содержимого Calc от меня ускользает. Когда вы озвучите задачу может внезапно оказаться что это проще совсем иначе делать.

ps Что-то долго вы описание рожаете... Как вы смогли закодить то, что словами выразить не можете?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Декабрь, 2013 22:49 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Цитата:
PROCEDURE Proc1(x, y, epsion : REAL);
VAR
x : REAL;
i : INTEGER;


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 07:30 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 700
Откуда: Псков
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;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 08:22 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
ilovb писал(а):
Цитата:
PROCEDURE Proc1(x, y, epsion : REAL);
VAR
x : REAL;
i : INTEGER;

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 09:22 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 573
Откуда: Россия, Санкт-Петербург
Это упрощение реального примера, который я перенабрал, а не скопипастил, отсюда и ошибки. :(
Но по существу, предложенные циклы не стали понятнее (нагляднее).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 09:25 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Так запостите реальный код полностью на исходном языке. Возможно хоть что-то станет яснее.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 09:34 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 700
Откуда: Псков
Madzi писал(а):
Но по существу, предложенные циклы не стали понятнее (нагляднее).

Вы - заинтересованное лицо, а больше никто и не высказывался :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 09:44 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Можно подумать, что исходный "цикл" понятен. :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 11:29 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Madzi писал(а):
Предвосхищая вопросы по поводу операторных скобок - оформляйте требуемый код процедурами.
Следование Вашему совету в некоторых случаях может быть полезным, но вряд ли его следует возводить в ранг правила. Оформление кода процедурами, кроме прочего (хорошего или плохого), может разрывать текущий контекст обработки данных, что не способствует повышению наглядности кода. Может поэтому Ваши процедуры Fn1() и Fn2() и не дают покоя ilovb. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 13:01 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 573
Откуда: Россия, Санкт-Петербург
igor писал(а):
Madzi писал(а):
Предвосхищая вопросы по поводу операторных скобок - оформляйте требуемый код процедурами.
Следование Вашему совету в некоторых случаях может быть полезным, но вряд ли его следует возводить в ранг правила. Оформление кода процедурами, кроме прочего (хорошего или плохого), может разрывать текущий контекст обработки данных, что не способствует повышению наглядности кода. Может поэтому Ваши процедуры Fn1() и Fn2() и не дают покоя ilovb. :)

Возможно :).

Оформление кода процедурами/функциями, на мой взгляд, следующий шаг к повышению структурности программы.
При этом можно дать компилятору возможность самому решать будет процедура/функция "inline" (код подставлен вместо вызова) или будет вызов.
Хотелось бы обсудить как раз этот момент, но, наверное, в отдельной ветке.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Декабрь, 2013 14:26 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 700
Откуда: Псков
Madzi писал(а):
Оформление кода процедурами/функциями, на мой взгляд, следующий шаг к повышению структурности программы.

Кто ж спорить будет с такой формулировкой. :)
Вы же имели ввиду под "следующим шагом" - отказ от последовательностей операторов в управляющих конструкциях (IF, WHILE, ...).
Не так ли?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 257 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10, 11 ... 13  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB