c++语言,while循环问题。里面的变量change把我搞糊涂了,它起到了什么作用?

#include <stdio.h>
void main ()
{
int a[10],i,j,t,n,change;
for (j=0;j<=9;j++)
{
scanf ("%d",&a[j]);
n=9;
change=1; /*这个变量有什么用?*/
while (n>0&&change==1) /*为什么不直接写成n>0*/
{
change=0; /*这又是什么?*/
for (j=0;j<n;j++)
{
if (a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
change=1; /*为什么呢?*/
}
}
n--;

}
}

for (i=0;i<=9;i++)
{
printf ("%5d",a[i]);
}
printf ("\n");
}

change 是用来控制循环的,整个while循环是将当前已经输入的n的数据全部从小到大的排序。只有每次在循环里面的有发生数据的交换,change才会被值为1,如果change为0说明数组已经有序了,你是的只需要while(n<0)这样程序也是正确的,但是会增加很多不需要的比较,比如输入的a[j+1]就是最大的数了,没有change的情况下还会执行(n-1)(n-2)/2次比较。

这个算法之中,因为j变量是从小到大开始循环的,当a[j+1] < a[j] 的时候会交换,但是如果a[j+1]同时有小于a[j-1]的,由于j是从小往到的增长,一个for循环之中,无法再讲a[j+1] (将换后已经移到了a[j]的位置)和a[j-1]惊醒交换, 所以需要多次。
如下面的例子:
已有的数据为: 1 2 4 5
然后输入了 3, 在进入while循环之前数组中的数据为:
1 2 4 5 3
第一次进入while: n = 4
j = 0 时, a[j] = 1 < a[j+1] = 2, 不交换: 1 2 4 5 3
j = 1 时, a[j] = 2 < a[j+1] = 4, 不交换: 1 2 4 5 3
j = 2 时, a[j] = 4 < a[j+1] = 5, 不交换: 1 2 4 5 3
j = 3 时, a[j] = 5 > a[j+1] = 3, 交换: 1 2 4 3 5(change 置为1)
第一交换完,整个数组还不是有序的,需要继续的执行。
第二次进入while:
j = 0 时, a[j] = 1 < a[j+1] = 2, 不交换: 1 2 4 3 5
j = 1 时, a[j] = 2 < a[j+1] = 4, 不交换: 1 2 4 3 5
j = 2 时, a[j] = 4 > a[j+1] = 3, 交换: 1 2 3 4 5(change 置为1)
j = 3 时, a[j] = 4 < a[j+1] = 5, 不交换: 1 2 4 3 5

整个while之后, change为1, 主要再次的进入执行, 检查。
这次由于所以的数已经有排序了
j = 0 时, a[j] = 1 < a[j+1] = 2, 不交换: 1 2 3 4 5
j = 1 时, a[j] = 2 < a[j+1] = 3, 不交换: 1 2 3 4 5
j = 2 时, a[j] = 3 < a[j+1] = 4, 不交换: 1 2 3 4 5
j = 3 时, a[j] = 4 < a[j+1] = 5, 不交换: 1 2 3 4 5
这次完了之后change=0; 不用在继续执行while了。
这样有了change变量控制之后,循环的次数就少多了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-11
#include <stdio.h>
void main ()
{
int a[10],i,j,t,n,change;
for (j=0;j<=9;j++)
{
scanf ("%d",&a[j]);
n=9;
change=1; /*这个变量有什么用?*///定义一个判断变量
while (n>0&&change==1) /*为什么不直接写成n>0*///因为这里要当change==1才能进入循环,changge==0不进入循环。
{
change=0; /*这又是什么?*///如果a[j]<a[j+1]的话则change==0,就不执行下面的if,不交换。
for (j=0;j<n;j++)
{
if (a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
change=1; /*为什么呢?*///进入循环再次比较前后数大小,可以参照C++的简单排序法。
}
}
n--;

}
}

for (i=0;i<=9;i++)
{
printf ("%5d",a[i]);
}
printf ("\n");
}
第2个回答  2011-12-12
change的作用是进行条件判断,以减少程序执行时间,也就是说的当发现循环结束后,没有任何数据进行了交换,排序就完成了,不需要再进行n--后的循环操作了。
第3个回答  2011-12-11
首先明确,这是从键盘上输入十个数,然后按冒泡法排序输出。n为循环次数,change为每次大循环中有没有数据交换的情况,有则有继续下一能循环,否则可以提前退出(已经排好序了)。
第4个回答  2011-12-11
条件语句 for()循环语句在括号内的条件下进行循环 根据条件 循环 ..当然这个是C#里面的语句,在C语言中也是一样的啊。比如说 int i=0;int
第5个回答  2011-12-11
change 是个判断量 ,while (n>0&&change==1) 这里是判断 如果change 为1 不退出循环,因为找到前面一个大于后面一个则交换,但并不知道还有前面一个大于后面一个的,所以将change赋值为1继续检查,直到没有前面一个大于后面一个则while (n>0&&change==1) change=0;这里将使循环退出
相似回答