Блок-схемы
От: eXon Россия  
Дата: 07.05.03 09:10
Оценка:
Я почти написал уже прогу для конверта прог на пасе в блок-схемы. Дело в том, что это мой курсач, а мне препод попался зашибись. Наши споры из-за блока "Предопределённый процесс" перерастают в драки .
Вопрос: Нужно ли рисовать этот блок, если он находтся, наприсер, в структурах if, case, for etc.? Препод с пеной у рта док-ет, что надо, да ещё как. Пример:

if (Check(a)) then...

Check — функция, опред-я выше по проге. Препод говорит: надо рисовать сначало вызов функции а потом if. Но тогда для for вызов будет происходить только перед циклом, а это не правильно. Но эта сволочь не отступает, а сдавать курсач ему...
Если кому попадалась такая програ — рассудите.

08.05.03 03:07: Перенесено модератором из 'Прочее' — _MM_
Just eXon
Re: Блок-схемы
От: Аноним  
Дата: 07.05.03 09:39
Оценка:
Здравствуйте, eXon, Вы писали:

X>Если кому попадалась такая програ — рассудите.


Примеры своего for надо давать.
А так, в общем, правильно тебе говорят.
Re: Блок-схемы
От: UgN  
Дата: 07.05.03 09:57
Оценка: +2
Здравствуйте, eXon, Вы писали:

X>Я почти написал уже прогу для конверта прог на пасе в блок-схемы. Дело в том, что это мой курсач, а мне препод попался зашибись. Наши споры из-за блока "Предопределённый процесс" перерастают в драки .

X>Вопрос: Нужно ли рисовать этот блок, если он находтся, наприсер, в структурах if, case, for etc.? Препод с пеной у рта док-ет, что надо, да ещё П

Имхо:
правильно препод говорит

for( <I>; <C>; <A> );
будет как-то так:

     
    |
 -------
|   I   |
 ------- 
    |
 -------
|   C   |------------------
 -------                   |
    |                      |
    /\           _______   |
  /  C \ _______|   A   |__|
  \    /        |_______|
    \/
     |
Re: Блок-схемы
От: Кодт Россия  
Дата: 07.05.03 13:52
Оценка: 10 (1)
Здравствуйте, eXon, Вы писали:

X>Я почти написал уже прогу для конверта прог на пасе в блок-схемы. Дело в том, что это мой курсач, а мне препод попался зашибись. Наши споры из-за блока "Предопределённый процесс" перерастают в драки .

X>Вопрос: Нужно ли рисовать этот блок, если он находтся, наприсер, в структурах if, case, for etc.? Препод с пеной у рта док-ет, что надо, да ещё как. Пример:

for i := Start() to Finish() do
  Something();

{ эквивалентно }

s := Start(); { единожды }
f := Finish(); { единожды }
if s < f then begin { если диапазон пуст - вообще ничего делать не будем }
  i := s; { поехали }
  repeat
    Something(); { тело цикла }

    i := i+1;
  until i = f;
  { по окончании цикла индекс останется на финише }
end;
{ хотя, вообще-то, значение индекса по выходу из цикла - не определено }


В этом легко убедиться, взглянув на дизассемблер или написав тестовую программу.
var s, f, i: integer;

function start() : integer;
begin
  writeln("вычиляем start!");
  start := s;
end;

function finish() : integer;
begin
  writeln("вычиляем finish!");
  finish := f;
end;

procedure something(i: integer)
begin
  writeln("i = ", i);
end;

procedure play;
begin
  i := 100;
  writeln("for i := ", s, " to ", f);
  for i := start() to finish() do something(i);
  writeln("finally, i = ", i);
end;

begin
  s := 1; f := 5; play;
  s := 5; f := 1; play;
end.
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[2]: Блок-схемы
От: eXon Россия  
Дата: 07.05.03 17:19
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>Имхо:

UgN>правильно препод говорит

UgN>for( <I>; <C>; <A> );

UgN> будет как-то так:

UgN>
     
UgN>    |
UgN> -------
UgN>|   I   |
UgN> ------- 
UgN>    |
UgN> -------
UgN>|   C   |------------------
UgN> -------                   |
UgN>    |                      |
UgN>    /\           _______   |
UgN>  /  C \ _______|   A   |__|
UgN>  \    /        |_______|
UgN>    \/
UgN>     |
UgN>


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

  --------    -------------
 /   A    \   |           |
|          |  |     A     |
|  COND    |   \---------/
------------



где A — имя цикла, а COND — условие выхода из цикла.
И ещё процедуры и функции вызываются в таком блоке:


----------------------
| |                | |
| |  Имя_функции   | |
| |                | |
----------------------



И вопрос состоял вот в чём: как запишется условие

...
if Chreck(a) then Routine(b);
...
Just eXon
Re[3]: Блок-схемы
От: Кодт Россия  
Дата: 08.05.03 06:51
Оценка:
Здравствуйте, eXon, Вы писали:

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


конструкция C/C++:
for( init(); condition(); step() ) body();

не может быть записана иначе, как
        |
    +-------+
    | init  |
    +-------+
        |
+------>+
|       |
|  /---------\
| < condition >-+
|  \---------/  |
|       |       |
|   +-------+   |
|   | body  |   |
|   +-------+   |
|       |       |
|   +-------+   |
|   | step  |   |
|   +-------+   |
|       |       |
+-------+       |
                |
        +<------+
        |

Из-за своей обобщенности ее не так-то просто записать в блок-схему. Как, впрочем, и другие сложные конструкции.
Вот, например, как ты запишешь выполнение выражения f(g(), h()), где каждая функция имеет важные побочные эффекты?
++-----++
|| g() ||
++-----++
    |
++-----++
|| h() ||
++-----++
    |
++-----++
|| f() ||
++-----++
Это будет неправда, так как порядок следования вызовов g и h - это добрая воля компилятора.

++------------++
|| f(g(),h()) ||
++------------++
А так скроется факт исполнения трех процедур.


X>Любой цикл организуется двумя специальными блоками: "Начало цикла" и "Конец цикла":

X>  --------    -------------
X> /   A    \   |           |
X>|          |  |     A     |
X>|  COND    |   \---------/
X>------------

X>где A — имя цикла, а COND — условие выхода из цикла.
Не любой. Циклы for, while и repeat-until должны иметь разную форму.

Если язык блок-схем не способен выразить это на высоком уровне, то изволь рисовать низкоуровневые схемы, с переходами назад.
Учти, что язык блок-схем возник во времена Фортрана, если не раньше.

С другой стороны, ты можешь ввести расширения языка блок-схем для твоего языка программирования. А хрен ли? Запросто.
### for i := start() to end() do body ###

+-------------+
| s := start()|
| e := end()  |
+-------------+
       |
/-------------\
|     :A:     |
| for i:=s..e |
+-------------+
       |
+-------------+
|     body    |
+-------------+
       |
   +-------+
   |  :A:  |
   \-------/

### while cond() do body ###

/-------------\
|     :A:     |
|    cond()   |
+-------------+
       |
+-------------+
|     body    |
+-------------+
       |
   +-------+
   |  :A:  |
   \-------/

### repeat body until cond() ###

   /-------\
   |  :A:  |
   +-------+
       |
+-------------+
|     body    |
+-------------+
       |
+-------------+
|     :A:     |
|    cond()   |
\-------------/


X>И ещё процедуры и функции вызываются в таком блоке:

X>----------------------
X>| |                | |
X>| |  Имя_функции   | |
X>| |                | |
X>----------------------

X>И вопрос состоял вот в чём: как запишется условие
X>...
X>if Chreck(a) then Routine(b);
X>...


Распиши его в
c:=check(a);
if с then
  routine(b)
else
  begin end; { пустая ветка - пойдет параллельно }

Дальше — очевидно
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.