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

.
Вопрос: Нужно ли рисовать этот блок, если он находтся, наприсер, в структурах if, case, for etc.? Препод с пеной у рта док-ет, что надо, да ещё как. Пример:
if (Check(a)) then...
Check — функция, опред-я выше по проге. Препод говорит: надо рисовать сначало вызов функции а потом if. Но тогда для for вызов будет происходить только перед циклом, а это не правильно. Но эта сволочь не отступает, а сдавать курсач ему...
Если кому попадалась такая програ — рассудите.
08.05.03 03:07: Перенесено модератором из 'Прочее' — _MM_
Здравствуйте, eXon, Вы писали:
X>Я почти написал уже прогу для конверта прог на пасе в блок-схемы. Дело в том, что это мой курсач, а мне препод попался зашибись. Наши споры из-за блока "Предопределённый процесс" перерастают в драки
.
X>Вопрос: Нужно ли рисовать этот блок, если он находтся, наприсер, в структурах if, case, for etc.? Препод с пеной у рта док-ет, что надо, да ещё П
Имхо:
правильно препод говорит
for( <I>; <C>; <A> );
будет как-то так:
|
-------
| I |
-------
|
-------
| C |------------------
------- |
| |
/\ _______ |
/ C \ _______| A |__|
\ / |_______|
\/
|
Здравствуйте, 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 >>
Здравствуйте, 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);
...
Здравствуйте, 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 >>