Вижу, что многие не понимают сути "народного" подхода, поступают вопросы, на которые следует ответить.

Сообщение от voral
Более того применение флагов не имеет отношение к выбору с GOTO или без оного. Это вещи разного порядка. (Мне все больше кажется, что вы не совсем верно толкуете "структурное" программирование). Флаги это не состояние программы в целом, или на какой то момент времени... Это лишь характеристика конкретной сущности. Которая может меняться, а может не меняться.
| Вы несколько ошибаетесь. Флаги не описывают свойства обьекта управления. Флаг это чисто логическая переменная, которая может содержать лишь два значения - false и true. В структурном программировании, так как goto запрещен, флаги используются для изменения потока управления. По сути это костыль, который неуклюжим образом заменяет прямой переход. Если с goto я могу перейти в единственное состояние, то с флагами я вынужден дробить это состояние на множество блоков кода и множество идентичных флагов, при помощи которых, эти блоки кода "включаются" и "выключаются". Прямо скажем: ужасный подход, что отмечали многие. Доцент кафедры программирования ИТМО Шалыто говорит, что это просто преступный подход, так программировать нельзя. Он предлагает свитч-технологию для избавления от этих флагов. Например взять прежний пример подсчёта слов на goto:
| C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| #include <stdio.h>
#define N 255
char s[N]="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed";
int main(void)
{
int nw = 0;
char *p=s;
--p;
OUT:
++p;
if(!*p)
goto K;
if(*p == ' ' || *p == ',' || *p == '\n')
goto OUT;
nw++;
goto IN;
IN:
if(!*p)
goto K;
if(*p == ' ' || *p == ',' || *p == '\n')
goto OUT;
++p;
goto IN;
K:
printf ("%d \n", nw);
return 0;
} |
|
и преобразуем его в соответствии с свитч-технологией:
| C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| #include <stdio.h>
#define N 255
#define IN 1
#define OUT 2
#define K 3
#define END 4
char s[N]="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed";
int main(void)
{
int nw = 0, state;
char *p=s;
state = OUT;
--p;
while(state!=END)
{
switch(state)
{
case OUT:
++p;
if(!*p)
{state = K; break;}
if(*p == ' ' || *p == ',' || *p == '\n')
{state = OUT; break;}
nw++;
{state = IN; break;}
break;
case IN:
if(!*p)
{state = K; break;}
if(*p == ' ' || *p == ',' || *p == '\n')
{state = OUT; break;}
++p;
{state = IN; break;}
break;
case K:
printf ("%d \n", nw);
state = END; break;
}
}
return 0;
} |
|
Как видим логика осталась практически той же. Переходы обеспечиваются попаданием через цикл в соответствующие ветки case. Умный компилятор преобразует их в таблицу указателей на метки и на выходе получим те же самые goto. Эта технология гораздо лучше структурного подхода, так как позволяет избавится от флагов, и позволяет реализовать даже самый супер-пупер сложный алгоритм. Это будущее робототехники и ИИ.
В моём случае я действую по старинке, не пряча оператор goto. Мой код может обработать любой компилятор, даже самый "тупой".

Сообщение от voral
Сути не меняет, я тоже именно про условную конструкцию, она всегда имеет, по сути одну точку выхода, эта точка следует срезу после конструкции... "Внутри" возможны лишь искусственные выходы, а это уже дело рук программиста. И вот тут и проявляется правильность подхода. В общем случае программ не должна улетать куда либо (как раз в вашем случае она делает это всегда). И лишь четко в обоснованных случаях это обоснованно
| Если эта конструкция имеет не одну точку выхода, то она уже не имеет права называться структурной. Это первое.
Во-вторых, моя программа никуда "не улетает". Она просто делает то, что предписано алгоритмом решения задачи. Если алгоритм предписывает куда-то перейти, например в начало, то код обеспечивает эту возможность. Вы же видите, даже такой простой код, уже настолько умён, что позволяет прерывать программу на любом шаге, входить в режим помощи на любом шаге и рестартовать программу. Даже если мы находимся на полпути расстановки кораблей на поле, можно сразу всё начать заново, сбросив все настройки. Из режима помощи можно вернутся в туже точку расстановки кораблей и продолжить с того же самого места. Напишите это в традиционном стиле.
|