OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 18:42

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




Начать новую тему Ответить на тему  [ Сообщений: 259 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 07:37 
Модератор
Аватара пользователя

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


Люди тренируют свой аппарат анализа свойств программ.

Конечно, это имеет смысл только для тех, кто "строит по сопромату".

Ну а кто-то до сих пор не поймёт, зачем нужен "расчёт прочности" и "какие-то умные рассуждения", а строит дома в духе "ну, вот эту ...ню сделаем квадратной, а эту потолще... Ну, всё сразу видно, что выдержит. А у вас в выкладках ни хрена не понятно.".


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

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
Есть, массово применяемый сейчас, большой опыт программирования русскими программистами, на русских языках 1С.

Это использование стиля программирования "Скульптор", широкое применение заменителей Goto для обеспечения -
локальности принятия решений,
локальности реализации принятых решений,
снижения уровня вложенности,
создание переменных при их использовании.

В части циклов обработки процесса последовательности получения (чтения) информации из файлов и списковых структур в языках 1С сделано гораздо проще и нагляднее. К примеру, на языке 1С V7 -

Код:
// Найти в табличной части документу строку удовлетворяющую критерия XXX и YYY
// при поиске единственной строки прекратить простотр документа
//
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()=1 Цикл
  Если Док.ААА<>XXX Тогда
     Продолжить;
  ИначеЕсли Док.БББ<>YYY Тогда
     Продолжить;
  КонецЕсли;
  //
  ... // Обработать строку Док.
  Прервать;
КонецЦикла;


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

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


Последний раз редактировалось ilovb Пятница, 06 Декабрь, 2013 09:00, всего редактировалось 1 раз.

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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Геннадий Тышов писал(а):
...


Никто не будет лезть в тело вашего цикла и прогонять его по строкам, чтобы разобраться, когда он там заканчивается и что делает.
На этапе аудита кода аффтар будет отправлен переписывать свою "скульптуру".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 09:11 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Код:
Док.ВыбратьСтроки();
// поиск
Пока Док.ПолучитьСтроку()=1 И НЕ <Нашли> Цикл
КонецЦикла;
// обработка результата поиска
Если <Нашли> Тогда
     ... // Обработать строку Док.
КонецЕсли;


У защитников goto прямо любовь к смешению мух с котлетами...


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

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
Мысль понятна, но это никаким образом не связано ни с этнической принадлежностью программиста, ни к использованному языку.
Так, или примерно так, можно писать и на С и на MUMPSе и на OBERONе.
Может всё сводится к такой идее?
Любые безобразия разрешены, если они однообразны :)
PS.
На всякий случай прошу не обижаться, это не насмешка.


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Геннадий Тышов писал(а):
Код:
  Если Док.ААА<>XXX Тогда
     Продолжить;
  ИначеЕсли Док.БББ<>YYY Тогда
     Продолжить;
  КонецЕсли;
А дизъюнкцию условий сделать, никак?


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
albobin писал(а):
Может всё сводится к такой идее?
Любые безобразия разрешены, если они однообразны :)
Да это же один из армейских лозунгов. :)
(В оригинале: "Пусть безобразно, но единобразно!")


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 10:55 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
igor писал(а):
А дизъюнкцию условий сделать, никак?
Не надо делать логическое выражение, применяем принцип декомпозиции, ведь критерии независимы друг от друга.

У В.Д. Паронджанова есть рекомендация заменять логические выражения раздельными иконами Вопрос.
Вложение:
Новый_76(1).png


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 11:28 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Цитата:
применяем принцип декомпозиции

Вы уверены, что понимаете значение слова "декомпозиция" по отношению к коду?

ps Кстати, igor, вот вам просто замечательный пример как с помощью break превратить простейший поиск в ......


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 12:10 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Геннадий Тышов писал(а):
У В.Д. Паронджанова есть рекомендация заменять логические выражения раздельными иконами Вопрос.
Так вот откуда ветер дует. :)
Применительно к текстовым языкам это спорная рекомендация.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 12:14 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
ilovb писал(а):
ps Кстати, igor, вот вам просто замечательный пример как с помощью break превратить простейший поиск в ......
Да, я уже говорил, что не являюсь стороником всяких брейков и continue.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 12:24 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
ilovb писал(а):
У защитников goto прямо любовь к смешению мух с котлетами...
ilovb писал(а):
ps Кстати, igor, вот вам просто замечательный пример как с помощью break превратить простейший поиск в ......

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

Читает "Как улучшить работу ума" В.Д. Паронджанова -
Цитата:
Вариант 1 описывает ортодоксальную позицию Дейкстры, согласно которой оператор goto имеет “гибельные последствия” и поэтому “должен быть исключен из всех языков программирования высокого уровня”. Исходя из этого были разработаны языки без goto: PDL [3], BLISS и др.
Цитата:
Ортодоксальный метод Дейкстры, полностью запрещающий goto и заменители (см. с. 238, табл. 4, вариант 1), безусловно является строгим формальным методом. К сожалению, он полезен лишь как интересная теоретическая идея, которая, как показал всемирный опыт, в чистом виде оказалась непригодной для массового использования.


Смотрите также http://elementy.ru/lib/430680?context=286336&discuss=430680
Цитата:
это какая-то очень яркая демонстрация свойства человеческой психики, что если человеку что-то внушили в студенческой молодости, то он будет отстаивать очевидно неверный взгляд, ибо в противном случае ему прийдется отбросить сентиментальные воспоминания и десятилетия, на которых базируется его или ее самооценка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 12:47 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
Геннадий Тышов писал(а):
Смотрите также http://elementy.ru/lib/430680?context=286336&discuss=430680
Цитата:
это какая-то очень яркая демонстрация свойства человеческой психики, что если человеку что-то внушили в студенческой молодости, то он будет отстаивать очевидно неверный взгляд, ибо в противном случае ему прийдется отбросить сентиментальные воспоминания и десятилетия, на которых базируется его или ее самооценка.


А к себе данное высказывание не пробовали применять?

Я за большую структурность, т.к. иногда так доставляют всякие "Продолжить" в циклах, и особенно "Возвраты" в "русском" языке 1С, особенно когда они применяются совершенно не к месту. Я за "Возврат" либо в первой строке процедуры (тогда ясно, что она не выполняется, по сути пустышка), либо в последней.
"Продолжить" еще могу допустить в начале цикла, но в этом случае он легко заменяется "если". Выход же где либо из середины цикла, и при этом сам цикл на экран не помещается, это "вещь".

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 12:51 

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


Вы промахнулись чуть более чем полностью. Я 100% самоучка. И все мои представления сформировались на собственных ошибках.

Даже больше скажу. По Дейкстре из меня должен был получиться любитель goto, т.к. мой первый язык QBASIC.
Однако все получилось с точностью наоборот. Как раз благодаря васику я понял, что goto - это плохо. Мои первые опыты программирования дали хорошо прочувствовать сложность управления таким кодом. (и его анализа)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 13:35 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Геннадий, вот одна из моих самых первых программ (храню как память о тех временах) Можете оценить степень хаоса в голове самоучки во время первых шагов в программировании, когда рядом нет никого знающего. Эта программа примечательна тем, что тут я впервые столкнулся со сложностью логики.
Игра "Змейка"
Код:
CLS
SCREEN 12
RANDOMIZE TIMER
DIM h(490): DIM v(388)
FOR v = 2 TO 390 STEP 6
vi = vi + 1
hi = 0
FOR h = 2 TO 492 STEP 6
hi = hi + 1
h(hi) = h
PSET (h, v), 8
FOR z = 1 TO 50: NEXT z
NEXT h
v(vi) = v
NEXT v
DIM x(100): DIM y(100)
DIM nelzax(1000): DIM nelzay(1000)
KEY(4) ON: ON KEY(4) GOSUB pause
KEY(11) ON: ON KEY(11) GOSUB vverch
KEY(12) ON: ON KEY(12) GOSUB vlevo
KEY(13) ON: ON KEY(13) GOSUB vpravo
KEY(14) ON: ON KEY(14) GOSUB vniz
ON TIMER(15) GOSUB tuhloe
LINE (1, 1)-(489, 387), 15, B
LINE (2, 2)-(488, 386), 7, B
LINE (3, 3)-(487, 385), 8, B
PAINT (4, 4), 2, 8
live = 5
nachalo:

x = 236: y = 158
FOR n = 1 TO 4
x(n) = 230
y(n) = 152
NEXT n
dy = -6
n = 0
d = 4
c = 6
DO
LOOP UNTIL INKEY$ = CHR$(13)
GOSUB yabloco
WHILE INKEY$ <> CHR$(27)
IF x = h(hi) AND y = v(vi) AND clr = 1 THEN d = d + 3: TIMER OFF: c = 1: GOSUB yabloco
IF x = h(hi) AND y = v(vi) AND clr = 4 THEN d = d + 6: TIMER OFF: c = 6: GOSUB yabloco
IF c = 1 THEN GOSUB ponos
n = n + 1
IF x(n + 1) = 0 THEN x(n + 1) = -10
x = x + dx: y = y + dy
GOSUB proverka
x(n) = x: y(n) = y
IF n = d THEN n = 0
x1 = x(n + 1): y1 = y(n + 1)
CIRCLE (x, y), 2, c
CIRCLE (x, y), 1, c
PSET (x - 1, y - 1), c: PSET (x + 1, y + 1), c: PSET (x + 1, y - 1), c: PSET (x - 1, y + 1), c: PSET (x, y), c
CIRCLE (x1, y1), 2, 2
CIRCLE (x1, y1), 1, 2
PSET (x1 - 1, y1 - 1), 2: PSET (x1 + 1, y1 + 1), 2: PSET (x1 + 1, y1 - 1), 2: PSET (x1 - 1, y1 + 1), 2: PSET (x1, y1), 8
FOR i = 1 TO 5000: NEXT i
WEND
END
vverch:
IF dy <> 6 THEN dy = -6: dx = 0
RETURN
vniz:
IF dy <> -6 THEN dy = 6: dx = 0
RETURN
vlevo:
IF dx <> 6 THEN dx = -6: dy = 0
RETURN
vpravo:
IF dx <> -6 THEN dx = 6: dy = 0
RETURN

yabloco:
clr = 4
zan:
vi = 2 + RND * 61: hi = 2 + RND * 78
FOR prov = 1 TO d
IF h(hi) = x(prov) OR v(vi) = y(prov) THEN GOTO zan
NEXT prov
tuh:
CIRCLE (h(hi), v(vi)), 2, clr
CIRCLE (h(hi), v(vi)), 1, clr
PSET (h(hi) - 1, v(vi) - 1), clr: PSET (h(hi) + 1, v(vi) + 1), clr: PSET (h(hi) + 1, v(vi) - 1), clr: PSET (h(hi) - 1, v(vi) + 1), clr: PSET (h(hi), v(vi)), clr
TIMER ON
RETURN

proverka:
IF live = 0 THEN END
IF x > 3 AND x < 487 AND y = 2 OR y = 386 THEN live = live - 1: GOTO nachalo
IF y > 3 AND y < 385 AND x = 2 OR x = 488 THEN live = live - 1: GOTO nachalo
FOR prov = 1 TO d
IF x = x(prov) AND y = y(prov) THEN END
NEXT prov
FOR prov = 1 TO kolvo
IF x = nelzax(prov) AND y = nelzay(prov) THEN END
NEXT prov
RETURN

pause:
WHILE INKEY$ <> CHR$(13)
WEND
RETURN

ponos:
naugad = RND * 1000
IF naugad > 500 AND naugad < 600 THEN
CIRCLE (x1, y1), 1, 0: CIRCLE (x1, y1), 2, 0: kolvo = kolvo + 1: nelzax(kolvo) = x1: nelzay(kolvo) = y1
PSET (x1 - 1, y1 - 1), 0: PSET (x1 + 1, y1 + 1), 0: PSET (x1 + 1, y1 - 1), 0: PSET (x1 - 1, y1 + 1), 0: PSET (x1, y1), 0
END IF
RETURN
tuhloe:
clr = 1
GOTO tuh
END


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 14:07 

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

Тот, классический линейный поиск, он для последовательного выполнения сначала поиска, а затем обработки.
Его можно рассматривать как частный случай последовательности :
выбрать по некому критерию ;
обработать выборку;
Результатом выборки может быть произвольное к-во чего-то.

Другой вариант - это цикл поиска совмещённый с обработкой.
Крайние случаи: ДляВсехБезИсключения и ТолькоДляПервогоПодходящего.
Какой придумать типовой шаблон для этих целей - это отдельный вопрос.


Последний раз редактировалось albobin Пятница, 06 Декабрь, 2013 14:11, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 14:11 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
ilovb

Если первая программа работает, то замечательно, Вы достигли цели.

Следующей Вашей целью должна быть наработка критериев качества и техники программирования.
Для осмысливания должно быть написано еще множество вариантов программы.

==============

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

Из своего творчества привожу фрагмент кода из ИС Дракон текущего состояния.

Поиск строки Obraz во всех тестах всех Дракон-листов пользовательского проекта.
Код:
procedure PrktPoisk;
label L1;
var NMLt,NEl,NDr,FLt,Prohod:Integer; El:tEl; Dr:tDr; Lt:tLt; TObr,FName:String;
begin
  WListVyhod;
  TObr:=AnsiLowerCase(Obraz);
  for Prohod:=1 to 2 do begin   // 1-До конца,2-от начала
    FLt:=0;
    //
    for NMLt:=0 to Length(MLt)-1 do begin
      with MLt[NMLt] do FName:=MVer[Length(MVer)-1].VName;
      Lt:=Nil;
      LtLoad(FName,Lt);
      if Pos(TObr,AnsiLowerCase(Lt.Klt1))>0 then goto L1;
      if Pos(TObr,AnsiLowerCase(Lt.Klt2))>0 then goto L1;
      if Pos(TObr,AnsiLowerCase(Lt.Klt3))>0 then goto L1;
      if Pos(TObr,AnsiLowerCase(Lt.Klt4))>0 then goto L1;
      if Form1.MV_Txt.Checked then begin
        if Pos(TObr,AnsiLowerCase(Lt.ATxt))>0 then goto L1;
        if Pos(TObr,AnsiLowerCase(Lt.BTxt))>0 then goto L1;
        if Pos(TObr,AnsiLowerCase(Lt.PTxt))>0 then goto L1;
        end;
      //
      for NDr:=0 to Lt.SDr.Count-1 do begin
        Dr:=Lt.SDr.Items[NDr];
        if Pos(TObr,AnsiLowerCase(Dr.Id))>0 then goto L1;
        if Form1.MV_Txt.Checked then begin
          if Pos(TObr,AnsiLowerCase(Dr.ATxt))>0 then goto L1;
          if Pos(TObr,AnsiLowerCase(Dr.BTxt))>0 then goto L1;
          if Pos(TObr,AnsiLowerCase(Dr.PTxt))>0 then goto L1;
          end;
        //
        for NEl:=0 to Dr.SEl.Count-1 do begin
          El:=Dr.SEl.Items[NEl];
          if El.Tip in [elUzl,elUPD,elGChe] then Continue;
          if Pos(TObr,AnsiLowerCase(El.Id))>0 then goto L1;
          if Pos(TObr,AnsiLowerCase(El.TxT))>0 then goto L1;
          if (El.Tip in [elVvd,elVyv,elPlk,elGPlk,elPPr])and
             (Pos(TObr,AnsiLowerCase(El.TxB))>0) then goto L1;
          if Form1.MV_Txt.Checked then begin
            if Pos(TObr,AnsiLowerCase(El.ATxt))>0 then goto L1;
            if Pos(TObr,AnsiLowerCase(El.BTxt))>0 then goto L1;
            if Pos(TObr,AnsiLowerCase(El.PTxt))>0 then goto L1;
            end;
          end;
        //
        end;
      //
      Lt.Free;
      Continue;
L1:   // Нашли
      Lt.Free;
      Inc(FLt);
      if FLt<>PozPrkt then Continue;
      LtOLoad(FName); NLt:=NMLt;
      PozLt:=1; LtPoisk;
      with MLt[NLt] do Form1.StatusBar.Panels[1].Text:=MVer[NVer].Soob;
      Exit;
      end;
    //
    if Prohod=2 then
    else if frDown in Form1.FindPrkt.Options then begin
      if Application.MessageBox(
         PChar('Конец. Продолжить поиск с начала?'),
         PChar('Поиск'),
          mb_YesNo+mb_IconQuestion)<>idYes then Exit;
      PozPrkt:=1;
      end
    else begin
      if Application.MessageBox(
         PChar('Начало. Продолжить поиск с конца?'),
         PChar('Поиск'),
          mb_YesNo+mb_IconQuestion)<>idYes then Exit;
      PozPrkt:=FLt;
      end;
    end;
  //
  ShowMessage(Format('%s: %s',['Не найден',Obraz]));
end;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 14:23 

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

Цитата:
Если первая программа работает, то замечательно, Вы достигли цели.

Какой еще цели?


Последний раз редактировалось ilovb Пятница, 06 Декабрь, 2013 14:36, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Декабрь, 2013 14:33 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
Какое счастье, что на моём пути встретился MUMPS :D


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

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


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

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


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

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