Форум программистов, компьютерный форум, киберфорум
CoderHuligan
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

goto и switch

Запись от CoderHuligan размещена 24.06.2019 в 10:22
Показов 6204 Комментарии 46

Вижу, что многие не понимают сути "народного" подхода, поступают вопросы, на которые следует ответить.
Цитата Сообщение от 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
Сути не меняет, я тоже именно про условную конструкцию, она всегда имеет, по сути одну точку выхода, эта точка следует срезу после конструкции... "Внутри" возможны лишь искусственные выходы, а это уже дело рук программиста. И вот тут и проявляется правильность подхода. В общем случае программ не должна улетать куда либо (как раз в вашем случае она делает это всегда). И лишь четко в обоснованных случаях это обоснованно
Если эта конструкция имеет не одну точку выхода, то она уже не имеет права называться структурной. Это первое.
Во-вторых, моя программа никуда "не улетает". Она просто делает то, что предписано алгоритмом решения задачи. Если алгоритм предписывает куда-то перейти, например в начало, то код обеспечивает эту возможность. Вы же видите, даже такой простой код, уже настолько умён, что позволяет прерывать программу на любом шаге, входить в режим помощи на любом шаге и рестартовать программу. Даже если мы находимся на полпути расстановки кораблей на поле, можно сразу всё начать заново, сбросив все настройки. Из режима помощи можно вернутся в туже точку расстановки кораблей и продолжить с того же самого места. Напишите это в традиционном стиле.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 46
Комментарии
  1. Старый комментарий
    Аватар для CoderHuligan
    Цитата Сообщение от liv
    А именно больше о Embedded системах и идёт речь в лекции...
    ВЫ читали "автоматное программирование"? Вы смотрели лекцию до конца? Если да, то не несли бы полную чушь. Я давно замечаю, что вы занимаетесь искажением фактов.

    Цитата Сообщение от liv
    Так понял, до Вас даже не дошла идея автоматного программирования. Подошли к этому поверхностно... Лектор говорит совершенно о другом...
    Лектор говорит о вреде использования флагов и пр. Чем вы структурщики и занимаетесь. По сути вы занимаетесь чистейшим вредительством. Это если правду матку.
    Цитата Сообщение от liv
    Отсюда и Ваши "упрощения", которые на деле являются усложнениями, т.к. ведут к запутыванию кода.
    Все гениальное - просто.
    Запись от CoderHuligan размещена 29.06.2019 в 14:11 CoderHuligan вне форума
  2. Старый комментарий
    Аватар для liv
    Лектор говорит о вреде использования флагов и пр.
    Именно это для Вас является главным в автоматном программировании, так понимаю...
    Вообще-то флаги флагам рознь... Они могут отражать, например, текущее состояние. Ещё раз повторяю, я практически так и пишу свои программы для встроенных систем: как набор блоков, имеющих вход и выход, в терминологии лектора: автоматов. Прекрасный подход и замечательно работает!
    Но спрашиваю ещё раз, при чем тут goto?!!! Повсеместное их использование не даёт простоты, а только усложнение понимания и сопровождения кода.
    Да,Вам так писать проще, допускаю... Но поставьте себя на место человека, который будет читать Ваш код! Лично я не хотел бы, чтобы мне досталось возиться с таким кодом. Легче переписать заново!
    Запись от liv размещена 29.06.2019 в 14:36 liv вне форума
  3. Старый комментарий
    А что на ассемблере можно писать без оператора GOTO, или речь идёт о чём-то другом?
    Мне что-то непонятно как на ассемблере можно написать без оператора GOTO.
    Брать любую емкую программу - и в структуре switch будет присутствовать тот-же GOTO.

    И видимо добавить функционала для редактора оказалось очень сложно, чтобы всплывающими окнами показывать код на который ведёт GOTO?
    Ведь речь идёт именно о визуабельности кода, а не понимании его сути.
    Визуабельный код - когда ты его суть понимаешь просто читая его, без дополнительных каких-то средств.

    Для меня предметом разговора о GOTO стало отсутствие возможности перехода по значению переменной, да, вот это прабла. А что такое визуабельность, о чём речь вообще? Да и то в ассемблере нет такого отстутствия. В Ассемблере можно свободно перейти по значению переменной. Это заменено массивами процедур и меток на функции в ООП. Почему-бы не поправить название что тема не связана с ООП?
    Зачем мне её читать из-за не раскрытого предмета в названии? Кто-то может читать только журналы "мурзилка"?
    Запись от Hrethgir размещена 29.06.2019 в 20:16 Hrethgir вне форума
  4. Старый комментарий
    Аватар для Croessmah
    Цитата Сообщение от Hretgir
    Мне что-то непонятно как на ассемблере можно написать без оператора GOTO.
    Нет в ассемблере goto. Это не jmp. Это такая же конструкция языка, подчиняющаяся правилам.
    К примеру:
    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    int square(int a, int b) {
        if (a != 42)  {
            b += 10;
            goto DONE;
        }
        return b;
    DONE:
        return a * b;
    }
    Получаем:
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    square:
            push    rbp
            mov     rbp, rsp
            mov     DWORD PTR [rbp-4], edi
            mov     DWORD PTR [rbp-8], esi
            cmp     DWORD PTR [rbp-4], 42
            je      .L2
            add     DWORD PTR [rbp-8], 10
            nop
            mov     eax, DWORD PTR [rbp-4]
            imul    eax, DWORD PTR [rbp-8]
            jmp     .L4
    .L2:
            mov     eax, DWORD PTR [rbp-8]
    .L4:
            pop     rbp
            ret
    т.е. компилятор может переделывать код как угодно, сохраняя видимое поведение.
    В данном случае произошло нечто такое:
    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    int square2(int a, int b) {
        register int eax;
        if (a == 42) JMP RET_B;
        b += 10;
        eax = a * b;
        JMP RET;
    RET_B:
        eax = b;
    RET:
        return eax;
    }
    т.е. goto - это не требование поставить jmp.
    Запись от Croessmah размещена 29.06.2019 в 23:33 Croessmah вне форума
  5. Старый комментарий
    Аватар для Usaga
    Цитата Сообщение от CoderHuligan
    ВЫ читали "автоматное программирование"? Вы смотрели лекцию до конца? Если да, то не несли бы полную чушь. Я давно замечаю, что вы занимаетесь искажением фактов.


    Лектор говорит о вреде использования флагов и пр. Чем вы структурщики и занимаетесь. По сути вы занимаетесь чистейшим вредительством. Это если правду матку.

    Все гениальное - просто.
    Вот, чтобы не было ада с флагами, и придумали инкапсуляцию состояния в объектах. Кстати, лично вы много ПО написали до конца в своём стиле? Чтобы и написано было и работало?
    Запись от Usaga размещена 30.06.2019 в 07:07 Usaga на форуме
  6. Старый комментарий
    Аватар для Croessmah
    Цитата Сообщение от Usaga
    Вот, чтобы не было ада с флагами, и придумали инкапсуляцию состояния в объектах. Кстати, лично вы много ПО написали до конца в своём стиле? Чтобы и написано было и работало?
    Зачем? Он не для этого рожден. )
    Знаю одного человека, он утверждает, что ростил себя не для работы на заводе.
    Видимо, поэтому работает на автомойке.
    Запись от Croessmah размещена 30.06.2019 в 08:03 Croessmah вне форума
 
Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru