Есть ли способ написать такую ​​программу без использования goto?

Есть ли способ написать такую ​​программу без использования goto? Если так, то как?

блок-схема

0

Решение

Это одно из многих потенциальных решений, которые ваш компилятор может сделать так же эффективно, как и при использовании gotos.

Одна ветвь обрабатывается в состоянии do / while. Другая ветвь обрабатывается return,

bool func();

int main()
{
statement1();
while( func() ) {}
statement5();
}

bool func()
{
statement2();
do
{
statement3();
if ( condition1() )
{
return true;
}
statement4();
} while( condition2() )
return false;
}

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

В реальной программе это может быть признаком необходимости пересмотра логики программы.

3

Другие решения

«Есть ли способ написать такую ​​программу без использования goto?»
— Филипп Морейра

Да. Технически говоря, C ++ достаточно гибок, чтобы вы могли запретить практически любую конструкцию и при этом иметь возможность реализовать то, что вы хотите, включая goto,

Часть «как» немного неинтересна, поэтому давайте просто скажем, что вы сделаете это, взяв два цикла, используя дополнительные переменные-флажки в одном из условий, чтобы он больше не вел себя как цикл, и осторожно используйте if в конечном итоге что-то, что соответствует спецификации.

«Да, но есть ли способ естественно смоделировать эту блок-схему только с контролем потока высокого уровня? «
— Полезный голос за кадром

Нет.

На самом деле это один из канонических случаев, когда высокоуровневых конструкций C ++ недостаточно. Все они разработаны вокруг концепции вложенных областей (обработка исключений может сократить область действия, но это все). Эта блок-схема имеет два пересекла циклы, с достаточным количеством промежуточных операций, которые вы не можете просто перетасовать, чтобы получить вложенные циклы.

У вас есть два варианта:

  • Просто используйте goto, Запишите это, сделайте метку явной и примените другие обычные хорошие практики.

  • Попробуйте придерживаться «нет» goto«Править в ад и вперед, изгибая другие структуры управления из формы, пока вы эффективно не подражаете goto, с боковой подачей мошеннических логических и сложных условий.

Второе решение может оказаться более разборчивым, чем первое (они никогда не говорят «никогда», говорят они), но вам определенно не следует отказываться от первого, прежде чем пытаться.

Для справки, вот как вы бы перевели свою потоковую диаграмму (действия и условия пронумерованы от их порядка в потоковой диаграмме):

action_one;

properlyNamedLabel:
action_two;

do {
action_three;

if(condition_one)
goto properlyNamedLabel;

action_four;

} while(condition_two);

action_five;
2

Я не думаю, что кто-либо когда-либо попытался бы сделать эту блок-схему «как есть», но с некоторыми изменениями это можно было бы сделать.

Первый цикл явно do {} while(), Давайте сделаем это сейчас, чтобы сделать нашу жизнь проще.
Второй цикл хочет, чтобы мы прыгнули в середину do while. Ну, а не делать это с goto’s; нам лучше вызывать нашу функцию; с флагом, чтобы не делать первое.

Обратите внимание, что я использовал 2-е задание в блок-схеме в качестве 1-го; так как это первый в цикле.

Таким образом, вы получите что-то вроде

void myFirstLoopFunc(bool doFirstTask) {
do {
if (doFirstTask)
firstTask();
doFirstTask = true;
secondTask();
}
while(firstTest());
}

void mySecondLoopFunc() {
bool doFirstThing = true;
do {
myFirstLoopFunc(doFirstThing);
thirdTask();
doFirstThing = false;
} while (secondTest());
}

Затем можно вызвать mySecondLoopFunc для запуска цепочки.

1
По вопросам рекламы [email protected]