不使用跳转语句的结构化解决方案 < SaaunsC++文本< /P>
删除goto-表示使用标志 代码段:不使用跳转语句的结构化解决方案 < SaaunsC++文本< /P>,c++,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 <&
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解决方案相同的结果。。。
我看不出有什么问题
还有,还有什么方法可以消除后藤?-我能不能不用旗子,只是赞美一下这个条件。
谢谢…引发异常。引发异常。您需要添加条件:
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;
}
if (!done) cout << "* ";
您需要添加条件:
if (!done) cout << "* ";
编写这种循环转义功能的一个好方法是返回;陈述采取:
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;
}
编写这种循环转义功能的一个好方法是返回;陈述采取:
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;
}
首先,您的格式非常难阅读。这很有帮助:
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是本案中使用的完全合法的声明。但这是你需要它的唯一原因。消除后藤对你毫无益处。现在您有了一个额外的变量,每个循环都需要一个额外的分支和测试
我建议你在这个问题上不要听他的建议。首先,你的格式很难阅读。这很有帮助:
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是本案中使用的完全合法的声明。但这是你需要它的唯一原因。消除后藤对你毫无益处。现在您有了一个额外的变量,每个循环都需要一个额外的分支和测试
我建议您避免使用他的建议。在for循环中嵌套try块对我来说似乎不是一个好主意。异常应保留在异常情况下,我们没有迹象表明这是一个好主意。在for循环中嵌套try块对我来说似乎不是一个好主意。异常应保留在异常情况下,我们没有迹象表明这是真的;不是有效的代码。编译错误。是否有特定的原因要消除goto?多级中断和继续是合法的使用,其他的几乎没有。说真的,这是一个我想使用gotoneither is const int 5。。。但是很容易理解他的意思。另外,Schaum真的使用这样的格式吗?这很令人困惑。我花了一些时间才意识到k循环只应用于一个if语句。它的身体真的需要支架;不是有效的代码。编译错误。是否有特定的原因要消除goto?多级中断和继续是合法的使用,其他的几乎没有。说真的,这是一个我想使用gotoneither is const int 5。。。但是很容易理解他的意思。另外,Schaum真的使用这样的格式吗?这很令人困惑。我花了一些时间才意识到k循环只应用于一个if语句。它的主体确实需要大括号。为什么不在else语句中,在两行cout的周围加上大括号呢?这似乎与原来的更加一致。除了最里面的for语句只适用于一个语句,而且cout-Yeah-在格式混乱中遗漏了这一点。为什么我总是把所有的东西都包起来,而且我已经习惯了…为什么不在else语句中,在cout行的两边加上大括号呢?这似乎与原来的更加一致。除了最里面的for语句只适用于一个语句,而且cout-Yeah-在格式混乱中遗漏了这一点。这也是为什么我总是把所有东西都包装起来,而且我已经习惯了……在这种情况下,总有办法使用Todd Gardner这样的GoTo,我建议总是尝试找到它们。随着时间的推移,代码会发生变化,现在看起来合理的跳槽可能会在以后成为一个问题。我相信这是困扰教师的偏执狂之一。他们害怕意大利面代码,这是他们应该害怕的。我也同意,应该避免goto's。但是在这种情况下,它并没有使代码变得不易管理,因为我认为goto版本比另一个版本更容易阅读。所以goto是不好的,但是中断和继续是可以的?我一直认为继续、中断和返回并不是goto那么坏-一半的能力-如果你可以说…继续和中断是goto。他们只去一个地方。这次跳转和休息的唯一区别是,休息只上升一级。但我们想提高两个层次。所以,如果你说后藤更容易被滥用,那么是的。但是上面的goto的用法与break完全相同,只是它是2级而不是1级。在这种情况下,使用Todd Gardner这样的goto总是有办法的,我建议总是尝试找到它们。随着时间的推移,代码会发生变化,现在看起来合理的跳槽可能会在以后成为一个问题。我相信这是困扰教师的偏执狂之一。他们害怕意大利面代码,这是他们应该害怕的。我也同意,应该避免goto's。但在这种情况下,实际上不是马
king代码不易管理,因为我认为goto版本比另一个版本更容易阅读。所以goto不好,但是中断和继续可以吗?我一直认为继续、中断和返回与goto相比不是很坏-一半的能力-如果你可以说…继续和中断就是goto。他们只去一个地方。这次跳转和休息的唯一区别是,休息只上升一级。但我们想提高两个层次。所以,如果你说后藤更容易被滥用,那么是的。但是上面的goto的用法与break完全相同,只是它是2级而不是1+1级。为了使它更干净,丢失else并将两个cout语句合并为一个。我本来以为cout可以在一开始合并,但它改变了原始代码的含义,我花了一段时间才实现。我对它进行了编辑,在最远处添加了一些大括号,以使其更加清晰。+1。为了使它更干净,丢失else并将两个cout语句合并为一个。我本来以为cout可以在一开始合并,但它改变了原始代码的含义,我花了一段时间才实现。我对它进行了编辑,在中最远的部分添加了一些大括号,以使其更加清晰。