我目前正在处理我的学期工作,这是我的一部分代码。正如你所看到的那样,有一个带有if语句的for循环,我正在使用一个结构。我想把这个for循环转换成while循环,但我不太确定如何。也许有人可能会给我一个提示?
for(X = 1; X <= 100; X++)
{
if(structure[X].number == -1)
{
structure[X].number = number;
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
if(structure[X].number == number)
{
if(structure[X].first_info == -1)
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
}
答案 0 :(得分:2)
您可以执行此操作以转换为while
循环。但我建议您自己搜索并理解loop
结构。
X=0; /* for arrays indexing always starts at 0 */
while(X<100)
{
if(structure[X].number == -1)
{
structure[X].number = number;
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
if(structure[X].number == number)
{
if(structure[X].first_info == -1) /* adding braces */
{
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
}
X++;
}
答案 1 :(得分:2)
所有基本循环都有三个组成部分:
使用for循环,你会注意到这里的所有三个:
for(X = 1; X <= 100; X++)
括号中的第一个组件是初始化器(X = 1),下一个组件是条件(X <= 100),最后一个组件是修饰符(X ++)。
我们可以使用与while循环完全相同的组件。我们只是以不同的方式放置它们:
int x = 1; //our intializer
while (x <= 100){ //our condition
if(structure[X].number == -1)
{
structure[X].number = number;
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
if(structure[X].number == number)
{
if(structure[X].first_info == -1){
structure[X].first_info = position;
}
structure[X].second_info = position;
break;
}
x++; //our modifier
}
有了这个说法,C中的数组总是从索引0开始。我保持你的代码与你的代码相同,但一般来说无论你是使用for循环还是while循环,你都需要更改你的初始化程序和条件如下:
这是因为包含100个项目的数组将具有0到99的索引。
还有两点:
通过像这样的索引数组进行计数时,代码通常更容易被读取为for循环而不是while循环。您是否有理由想要使用while循环?
根据您的缩进,不清楚最后一个if子句应包含哪些内容。我已经在你的最后一个if子句中添加了大括号以便于阅读,但也许其他行也应该包含在大括号中?
答案 2 :(得分:2)
将for
循环转换为while
循环很容易,但for
循环是一个更安全的构造,因为它将索引变量的初始化,测试和增量分组在一个清楚的地方。
顺便提一下,您的代码是错误的,嵌套的if
语句可能不一致:
if(structure[X].number == number)
{
if(structure[X].first_info == -1)
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
正确重新格式化后,它变为:
if (structure[X].number == number) {
if (structure[X].first_info == -1)
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
这是你的意图吗?对缩进更加小心,它有助于避免愚蠢的错误。
以下是已转换的代码,但请注意,与for
语句相反,continue
语句将绕过X++
更新表达式。另外值得注意的是,X
令人惊讶地使用了基于1的索引值。索引值为0,基于C,可以使用<
比较而不是<=
来检查数组大小。
X = 1;
while (X <= 100) {
if (structure[X].number == -1) {
structure[X].number = number;
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
if (structure[X].number == number) {
if (structure[X].first_info == -1)
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
X++;
}
如果structure
有100个元素,则必须将代码更改为:
X = 0;
while (X < 100) {
if (structure[X].number == -1) {
structure[X].number = number;
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
if (structure[X].number == number) {
if (structure[X].first_info == -1)
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
X++;
}
答案 3 :(得分:0)
for
循环构造将循环的索引变量初始化,循环条件和索引增量步骤分组到一个语句中。因此,为了将for
循环转换为while
循环,您只需将此分组解包为三个单独的语句。通常,您可以使用以下算法将任何for
循环转换为while
循环。像这样循环for
:
for(A;B;C) { /* where A,B,C are valid C statements (e.g., X=0), not variables */
/* operational code */
}
使用A,B,C占位符中的相同语句转到以下while
循环:
A;
while(B) {
/* operational code */
C;
}
使用此算法,您应该能够将任何for
循环转换为等效的while
循环。
答案 4 :(得分:-2)
我觉得这个很简单。也许我误解了你的情况,如果那时请原谅我:)。
我的方法是这样的:
var X = 1;
while (X<=100)
{
if(structure[X].number == -1)
{
structure[X].number = number;
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
if(structure[X].number == number)
{
if(structure[X].first_info == -1)
structure[X].first_info = position;
structure[X].second_info = position;
break;
}
X++;
}
答案 5 :(得分:-2)
现有代码可以转换为以下内容
int x =1;
while(x!=100)
{
//Your code here
x++;
}