不使用跳转语句的结构化解决方案

时间:2009-06-18 17:50:06

标签: c++

来自Schaums C ++文本

删除goto-说使用标志

代码段:

const int N2 = 5;
int i, j, k;

  for (i = 0; i < N2; i++)
  { for (j = 0; j < N2; j++)
    { for (k = 0; k < N2; k++)
       if (i + j + k > N2)
           goto esc;
       else
          cout <<  i + j + k << " ";
       cout << "* ";
    }
   esc: cout << "." << endl;
  }

解决方案:

const int 5;
int i, j, k;
bool done = false;
  for (i = 0; i < N2; i++)
  { for (j = 0; j < N2 && !done; j++)
    { for (k = 0; k < N2 && !done; k++)
       if (i + j + k > N2)
           done true;
       else
          cout <<  i + j + k << " ";
       cout << "* ";
    }
   cout << "." << endl;
   done = false;
  }

结构化解决方案的输出不会产生相同的结果......如同转到... 我看不出问题

  1. 另外,消除goto的另一种方法是什么? - 我可以不使用旗帜而只是赞美这种情况。
  2. 谢谢...

5 个答案:

答案 0 :(得分:6)

编写这种循环转义功能的好方法是返回;声明。取:

const int N2 = 5;

void inner_loop(const int i) {
   for (int j = 0; j < N2; ++j)
   {
      for (int k = 0; k < N2; ++k)
      {
        if (i + j + k > N2)
           return;

        cout <<  i + j + k << " ";
      }
      cout << "* ";
   }
}


for (int i = 0; i < N2; ++i)
{
  inner_loop(i);
  cout << "." << endl;
}

答案 1 :(得分:3)

const int 5;
int i, j, k;
bool done = false;
  for (i = 0; i < N2; i++)
  { for (j = 0; j < N2 && !done; j++)
    { for (k = 0; k < N2 && !done; k++)
       if (i + j + k > N2)
           done = true;
       else
          cout <<  i + j + k << " ";
       if (!done) // <-- Add this line
          cout << "* ";
    }
   cout << "." << endl;
   done = false;
  }

答案 2 :(得分:1)

首先,您的格式很难阅读。这有很大帮助:

const int N2 = 5;
int i, j, k;

for (i = 0; i < N2; i++)
{ 
  for (j = 0; j < N2; j++)
  { 
    for (k = 0; k < N2; k++)
    {
      if (i + j + k > N2)
         goto esc;
     else
        cout <<  i + j + k << " ";
    }
    cout << "* ";
  }
 esc: cout << "." << endl;
}

现在我不知道这个Schaum家伙是谁,但他错了。 goto是在这种情况下使用的完全合法的声明。不过,这是你应该需要的唯一原因。消除goto不会让你获益。现在你有了一个额外的变量,每个循环都需要一个额外的分支和测试。

我建议你不要在这个问题上提出建议。

答案 3 :(得分:0)

您需要添加条件:

if (!done) cout << "* ";

答案 4 :(得分:-3)

抛出异常。