OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 172 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 21:09 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Быстрая вроде и не подходит как пример, да.

Ну, вот показывал студентам простейшие сортировки, пошагово с уточнением выросло вот так:

Код:
   PROCEDURE SortBySelect (VAR a: ARRAY OF REAL; len: INTEGER);
   (* Сортировка прямым выбором *)
      VAR i, iMin: INTEGER;
            min: REAL;
      
      PROCEDURE FindMin;
         VAR j: INTEGER;
      BEGIN
         iMin := i; min := a[iMin];
         FOR j := i TO len-1 DO
            IF a[j] < min THEN
               iMin := j; min := a[iMin]
            END      
         END
      END FindMin;
      
   BEGIN
      i := 0;
      (* INV ( A m, k : (m < i) & (k >= i) : a[m] <= a[k] )
         & ( A m, k : (m < i) & (k < i) & (m < k) : a[m] <= a[k] )
      *)
      WHILE i < len DO
         FindMin;
         a[iMin] := a[i];
         a[i] := min;
         (* Post: ( A k : k >=  i : a[i] <= a[k] )
            & (A m : m < i : a[m] <= a[i],
            то есть, инвариант теперь будет выполняться и при i := i + 1 *)
         INC(i)
      END
   END SortBySelect;
   
   PROCEDURE SortByInsert (VAR a: ARRAY OF REAL; len: INTEGER);
      VAR i, place: INTEGER;
            elem: REAL;
      
      PROCEDURE FindPlace;
         VAR j: INTEGER;
      BEGIN
         place := 0;
         WHILE ~(elem <= a[place]) DO
            INC(place)
         END;
      END FindPlace;
      
      PROCEDURE Move;
         VAR j: INTEGER;
      BEGIN
         FOR j := i TO place+1 BY -1 DO
            a[j] := a[j-1]
         END
      END Move;
   
   BEGIN
      (* INV A m, k : (m < i) & (k < i) & (m < k) : a[m] <= a[k]
      *)
      i := 0;
      WHILE i < len DO
         elem := a[i];
         FindPlace;
         (* Post: (a[place-1] <= a[i]) & (a[place] >= a[i]) *)
         Move;
         a[place] := elem;
         INC(i)
      END
   END SortByInsert;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 21:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Думается, что так лучше, чем единой простынёй со вложенными циклами (и студенты уже приучены - "давайте процедурки, а ещё вот тут не надо ль порубить?").
Можно, конечно, изолировать процедуры эти, наладить взаимодействие через интерфейсы - но... Уже будет это противоестественно. Тут мы один алгоритм над общей группой переменных пишем - и просто по ходу его проектирования выделяем отдельные поддействия. А то придётся вместо одного несколько оформлять, с отвлечением на оформление - и никакой самоценности выделенных полноценных процедур.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 22:02 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Добавлю, что очень часто эти процедуры должны выполнять действия в определённом контексте. Что, этот локальный (и временный к тому же) контекст через параметры тащить? Или через глобальные переменные?
Хочу заявить, что это крайне неправильная постановка будет!

btw, в Форте количество процедур, как я понимаю, теоретически доводится до максимума ;)
Ориентироваться в таком массиве процедур решительно невозможно, навигация становится сложнее, чем всё остальное проектирование...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 22:07 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
... Уже будет это противоестественно. ... и никакой самоценности выделенных полноценных процедур.
Строго говоря, это вкусовщина.

А вот мне нравится герметичная изоляция процедурок.

Процедуры вполне четко группируются в модуле, проблема с навигацией здесь надуманная.

"Тащить контекст" -- тут может скрываться просто плохое проектирование.
Согласен, что изредка бывают случаи, когда без локальных процедур получится громоздко. Но изредка. И всего лишь громоздко. А плохой контроль за побочными эффектами -- это не всего лишь, а "агония отладки".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 22:14 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Не знай, не знай, контекст зачастую бывает весьма велик... И причём именно локальный, временный... Там могут гулять кучи динамических массивов, списков и т.п...
Изоляция - это хорошо, но как передавать такой контекст?
Или отказываться от использования процедур и пользовать копипаст? Дык уж, спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 22:39 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Если не использовать параметры, то вариантов хранения такого контекста может быть три:
1. локальные переменные основной процедуры (процедурное программирование);
2. закрытые глобальные переменные модуля (модульное программирование);
3. закрытые поля объекта (ООП).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 22:53 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Илья Ермаков писал(а):
Ну, вот показывал студентам простейшие сортировки, пошагово с уточнением выросло вот так:

Обычных комментариев не достаточно? А то уж слишком размазанно получается...
Код:
def SortByInsert(a):
    for i in range(len(a)):
       elem = a[i]
       # Find place
       place = 0
       while elem > a[place]:
           place += 1
       # Move larger elements
       for j in range(i, place, -1):
           a[j] = a[j-1]
       # Move current element
       a[place] = elem


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 23:17 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 14 Декабрь, 2008 23:42 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Илья Ермаков писал(а):
Программист придумывает не программу, а процесс построения (обоснованного постепенного составления) программы... Таким образом, нельзя жертвовать качеством процесса ради неких метрик программы.
Как сейчас модно выражаться, +1e37 :D

P.S. гм... а вот как к этому прийти на практике? ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 00:36 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Alexey_Donskoy писал(а):
Регистр BP передавался, и от него отсчитывались смещения локальных переменных, которые лежат в стеке. Всё просто было.
А глобальная процедура (как параметр) тоже с BP передавалась?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 00:52 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Alexey_Donskoy писал(а):
Я только не понял, почему убрали потом...
Могу предположить, что это связано с введением процедурных переменных.
Допустим, мы передали вложенную процедуру как параметр, а там её сохранили в глобальной процедурной переменной (вместе с BP или без него - одинаково плохо). А потом, значительно позднее, использовали процедурную переменную в самый неподходящий момент, когда процедура, в которую была вложена переданная в качестве параметра, уже завершила свою работу.
Например:
Код:
var p: procedure;

procedure use_proc(q: procedure);
begin
    p := q
end;

procedure global;
    var n: integer;
    procedure local;
    begin
        n := n + 1
    end;
begin
    use_proc(@local)
end;

procedure big_process;
begin
    global;
    ...
    p { ой... }
end;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 08:20 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Axcel писал(а):
Вот тут http://www.ict.edu.ru/ft/002383/prolang.pdf написано про проблемы с вложенными процедурами в Паскале.
С грамотой у авторов местами нелады, но особенно порадовал язык "Huskill" : ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 09:32 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Info21 писал(а):
Да ну... беру любой... Quicksort подойдет? Где там они?

Код:
 PROCEDURE QuickSort(VAR a: ARRAY OF INTEGER);
  PROCEDURE QSort (l, r: INTEGER);
    VAR i, j, x, t: INTEGER;
  BEGIN
    i := l; j := r; x := a[(l + r) DIV 2];
    REPEAT
      WHILE a[i] < x DO INC(i) END;
      WHILE a[j] > x DO DEC(j) END;
      IF i <= j THEN
        t := a[i];
        a[i] := a[j]; a[j] := t;
        INC(i); DEC(j)
      END
    UNTIL i > j;
    IF l < j THEN QSort(l, j) END;
    IF i < r THEN QSort(i, r) END
  END QSort;
BEGIN
  QSort(0, LEN(a) - 1);
END QuickSort;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 09:43 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Alexey_Donskoy писал(а):
Как сейчас модно выражаться, +1e37
Это очередной вариант "leet"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 10:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Trurl писал(а):
Info21 писал(а):
Да ну... беру любой... Quicksort подойдет? Где там они?

Код:
 PROCEDURE QuickSort(VAR a: ARRAY OF INTEGER);
  PROCEDURE QSort (l, r: INTEGER);
.....
BEGIN
  QSort(0, LEN(a) - 1);
END QuickSort;


Речь же не о том, можно ли записать с локальной процедурой, а действительно ли это необходимо:

Код:
  PROCEDURE QSort (VAR a: ARRAY OF INTEGER; l, r: INTEGER);
    VAR i, j, x, t: INTEGER;
  BEGIN
    i := l; j := r; x := a[(l + r) DIV 2];
    REPEAT
      WHILE a[i] < x DO INC(i) END;
      WHILE a[j] > x DO DEC(j) END;
      IF i <= j THEN
        t := a[i];
        a[i] := a[j]; a[j] := t;
        INC(i); DEC(j)
      END
    UNTIL i > j;
    IF l < j THEN QSort(l, j) END;
    IF i < r THEN QSort(i, r) END
  END QSort;

PROCEDURE QuickSort*(VAR a: ARRAY OF INTEGER);
BEGIN
  QSort(a, 0, LEN(a) - 1);
END QuickSort;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 10:44 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Александр Ильин писал(а):
(+1e37) - Это очередной вариант "leet"?
Нет, просто вижу, как все пишут +1 или даже +5 - вроде как присоединяются к высказанному мнению, отдают свои голоса (бонусы, "ку") за процитированное высказывание, ну и т.п... Так как для real*4 +1e37 (копейки округляем) - максимально возможное значение, то хотел сказать, что согласен в самой что ни на есть превосходной степени ;)

AVC писал(а):
Могу предположить, что это связано с введением процедурных переменных.
Допустим, мы передали вложенную процедуру как параметр, а там её сохранили в глобальной процедурной переменной (вместе с BP или без него - одинаково плохо). А потом, значительно позднее, использовали процедурную переменную в самый неподходящий момент, когда процедура, в которую была вложена переданная в качестве параметра, уже завершила свою работу.
Это было исключено при штатном применении... Хотя, конечно, против лома нет приёма... Разумеется, адрес процедуры передавался параметром... и выглядело это примерно так:

Код:
procedure GlobalProcWithContext;
var x,y,z... //контекст

  procedure MyProc(p:pItem);
  begin
    ... //работаем с p в контексте x,y,z
  end;

begin
  ...
  SomeCollectionOrList.ForEach(@MyProc);
  ...
end;
Формат (тип, список параметров) процедурного параметра определялся отдельно, в стандартных объектах такой механизм использовался для итераторов (для коллекций и проч.) и в параметрах передаваемой процедуры был указатель на текущий элемент списка, коллекции... Вот уж не думал, что такой, в общем-то, удобный, механизм, будет дискутироваться тут на абстрактно-теоретическом уровне ;)

Info21 писал(а):
Речь же не о том, можно ли записать с локальной процедурой, а действительно ли это необходимо
Вот именно, рассматриваете Вы какие-то элементарные учебные примеры и делаете на их основе обобщающие выводы... А ведь контекст может быть огромным и включать, например, кучу временных вспомогательных массивов для какой-нибудь многокритериальной оптимизации над локальными же данными вызывающей процедуры... И сложный алгоритм обработки всего этого может быть на много-много страниц. и действий там повторяться - вагон, и чтобы не вынести их в процедуру - это надо быть даже не мазохистом, а я не знаю как и сказать ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 11:49 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Александр Ильин писал(а):
Axcel писал(а):
Вот тут http://www.ict.edu.ru/ft/002383/prolang.pdf написано про проблемы с вложенными процедурами в Паскале.
С грамотой у авторов местами нелады, но особенно порадовал язык "Huskill" : ))

Наверно студентка набирала с реального конспекта


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 12:01 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Alexey_Donskoy писал(а):
Так как для real*4 +1e37 (копейки округляем) - максимально возможное значение, то хотел сказать, что согласен в самой что ни на есть превосходной степени ;)

+inf 8)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 19:59 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Alexey_Donskoy писал(а):
Info21 писал(а):
Речь же не о том, можно ли записать с локальной процедурой, а действительно ли это необходимо
Вот именно, рассматриваете Вы какие-то элементарные учебные примеры и делаете на их основе обобщающие выводы... А ведь контекст может быть огромным и включать, например, кучу временных вспомогательных массивов для какой-нибудь многокритериальной оптимизации над локальными же данными вызывающей процедуры... И сложный алгоритм обработки всего этого может быть на много-много страниц. и действий там повторяться - вагон, и чтобы не вынести их в процедуру - это надо быть даже не мазохистом, а я не знаю как и сказать ;)
Элементарные учебные примеры рассматриваю не я, а И.Ермаков и Trurl. А я рассматриваю свои примеры за последние -нацать лет.
А то, что Вы описали, может появиться только у какого-нибудь старого фаната фортрана.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 15 Декабрь, 2008 20:29 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Причём же тут Фортран, интересно бы узнать? :)

Неужели Вы всерьёз считаете, что любая задача может быть подвергнута декомпозиции до такой степени, что большие контексты будут не нужны?


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

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


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

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


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

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