代码之家  ›  专栏  ›  技术社区  ›  iwanttoprogram

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

c++
  •  1
  • iwanttoprogram  · 技术社区  · 17 年前

    从ScAuxC++文本

    移除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;
      }
    

    结构化解决方案的输出不会产生与goto解决方案相同的结果… 我看不出问题所在

    1. 另外,还有什么方法可以消除goto?-我不能用一面旗子来赞美这个条件吗?

    谢谢。。。

    5 回复  |  直到 17 年前
        1
  •  3
  •   Sean Bright Sean Stinehour    17 年前
    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
  •  6
  •   Todd Gardner    17 年前

    编写这种循环转义功能的一个好方法是返回;语句。取:

    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;
    }
    
        3
  •  1
  •   rlbond    17 年前

    首先,您的格式非常难以读取。这有很大帮助:

    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;
    }
    

    现在我不知道这个沙姆是谁,但他错了。goto是在这种情况下要使用的完全合法的语句。不过,这是你需要的唯一原因。消灭Goto什么也得不到。现在您有了一个额外的变量,并且每个循环都需要一个额外的分支和测试。

    我建议你避免他在这个问题上的建议。

        4
  •  0
  •   klew    17 年前

    您需要添加条件:

    if (!done) cout << "* ";
    
        5
  •  -3
  •   Vladimir Obrizan    17 年前

    引发异常。