硅酸钠的模数:关于循环和循环嵌套的问题

来源:百度文库 编辑:高考问答 时间:2024/04/30 15:51:26
我老是把循环搞不好,请问for语句的流程里,表达式2的值为假的时候,就跳出循环,那么他下面的if语句是此时执行,还是每一次循环都执行?
.........
{...
for(1;2;3)
s;
if()
}
上面的式子里面,if是在for里的2为假的时候执行,还是不论什么时候都执行?
-------------
更进一步是关于循环嵌套的问题,我老是搞不清楚它的流程是怎么样的?
for的嵌套,请高手把流程给我详解一下.
比如
for(i=0;i<a;i++)
{...
for(j=0;j<b;j+)
s;
....
}
这种类型,外层for先执行一次,然后等内层循环b次以后,再执行第i+1次外层吗?
以上问题我主演的目的是想弄清楚那个选择排序的一个小问题---把数从小到大排列,方法是把第一个数和数组里最小的数比较,然后把最小数放到最前面.
#inclue
#define N 7
main()
{
int i,j,k,temp;
int a[N];

for(i=0;i<N;i++)
scanf("%d",&a[N]);
for(i=0;i<N-1;i++) /*这里他说排序开始,我知道这里为什么要这样给条件呢?我用i=N-1;i>0;i--不行马?*/
{
k=i;
for(j=i+1;j<N;j++)
if(a[k]>a[j])
k=j;
if(i!=k) /*这里的if是什么什么时候执行?是j<N为假的时候执行,还是每次循环完都执行?*/
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
for.........../*输出结果了*/
以上程序另我头昏的地方就是
1.循环嵌套的流程.
2.在"开始排序"的循环里面,如果每次都执行交换位置,那么还比较什么?不是依次换位么?k=j这一附值会在a[k]>a[j]的起什么作用呢?
----------------
可能我说的太头昏了,因为我已经头昏了,请高手帮我解释一下那个排序程序的流程,特别是嵌套那一节

还有就是请教一下,for里面的条件是怎么确定的?
------
拜托了~~~请一定把循环这里给我详细的讲一讲!!!!!
3楼和4楼的高手答案都很好啊。。。我现在对这个循环基本懂了。。

如果谁再给我讲讲嵌套的流程图,我就把分给他

非常感谢您们的回答。确实不知道把分给谁好。。所以只好再请你们给我讲讲,呵呵

第一个问题:if在循环体内,则每次循环都会执行,但只有符合if条件的,才会执行if语句中包含的内容。

第二个问题:外循环执行a次,内循环每当外循环执行1次就执行b次,所以一共执行a*b次,你说的没有错。

第三个问题:这里你问了很多,我一个一个回答吧。

1、用i=N-1;i>0;i--是可以的,但你要改里面所有的循环,因为这个排序算法逻辑是先找出最大的一个数和第一个数交换,再从第二个数开始找出最大的一个数和它交换,如果用i=N-1;i>0;i--,你就要改变算法,找出最小的一个数和最后一个交换,再找出最小的数和倒数第二个交换……

2、if(i!=k)是每次循环都执行的,只有发现更大的数(k值发生变化)后才会执行交换语句。

3、并不是每次都执行交换位置的,你对这个算法理解不太清楚,可能你的编程老师没有讲解清楚吧,另外这个程序也有个问题,k其实是没有用的,你把程序改成下面的就好理解多了:

int i,j,temp;
int a[N]; //一开始所有要排序的数存储在数组a里

for(i=0;i<N-1;i++) //从第一个数开始循环到最后一个数
{

for(j=i+1;j<N;j++) //对每一个数,和其后的所有数进行比较(因为前面的数通过排序已经是最大的数了,不用比较)

{

if(a[i]>a[j]) //如果发现一个数a[j]比当前数a[i]更大
{
temp=a[i];
a[i]=a[j];
a[j]=temp; //通过临时变量temp实现a[i]和a[j]的交换
}

}

}

这样你应该对这个算法更理解了吧?它是依次找出数组中第一大、第二大、……、第N大的数,来和数组的第一个、第二个、……、第N个数交换,最终完成排序。这个算法可以实现排序功能,但性能不如冒泡排序法。

嵌套的流程图?我画个给你。这里没办法帖图,你看链接吧。

http://211.157.108.18/t.gif

第一个问题;if是在for里的2为假的时候执行
应该是先执行完for(1,2,3)后再执行if语句,因为"for(1;2;3) s;"是一个循环体而"if()"在它外面,只有在for里的2为假的时候循环才结束接下来按顺序执行,for里的2为真时继续执行循环.如果要每次循环时执行则应改为:
for(1;2;3)
{
s;
if()
}
你可以在调试时具体的看看它是怎么执行的

"这种类型,外层for先执行一次,然后等内层循环b次以后,再执行第i+1次外层吗?"回答是肯定的

/*这里他说排序开始,我知道这里为什么要这样给条件呢?我用i=N-1;i>0;i--不行吗?*/
可以但后面的应该改改,否则就成了 从大到小排列了

/*这里的if是什么什么时候执行?是j<N为假的时候执行,还是每次循环完都执行?*/
如前所述是j<N为假的时候执行

for里面的条件是怎么确定的? 看情况而定

c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句.
for(表达式 1;表达式 2;表达式 3)语句
它的执行过程如下:
(1)先求表达式 1.
(2)求表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第三步 做若为假(值为0),则结束循环,转到第5步.
(3)求解表达式3
(4)转回上面第(2)步骤继续执行;
(5)结束循环,执行for语句下面的一个语句;
for(循环变量赋初值;循环条件;循环变量增值)语句

for(i=1;i<=100;i++)sum=sum+i;
它的执行相当于
i=1;
while(i<=100){
sum=sum+i;
i++;
}
显然,用for语句更简单、方便。
说明:
(1)for语句的一般形式中的"表达式1"可以省略,此时应在for语句之前给循环变量赋初值.注意省略表达式1时,其后的分号不能省略.如for(;i<=100;i++){....};
(2)如果表达式2省略 即不判断循环条件,循环无终止地循环下去,也就是认为表达式2始终为真.
例如:for(i=1;;i++){.....};
相当于

i=1;
while(1)
{sum=sum+1;
i++;
}
(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束.如:
for(i=1;i<=100;)
{sum=sum+1;
i++;
}
这个例子的循环增量没有放在表达式三的位置 而是作为循环体的一部分 其效果是一样的.
(4)可以省略表达式1和表达式3,只有表达式2 即只给循环条件.

for(;i<=100;)
{
sum=sum+i;
i++;
}
这个相当于
whlie(i<=100)
{
sum=sum+i;
i++;
}
(5)三个表达式都可以省略,如:
for(;;)语句
相当于
while(1)语句
即不设初值 不判断条件(认为表达式2为真值)循环变量不增值,无终止的执行循环体.
(6)表达式1也可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式.如:

for(sum=0;i<=100;i++)
{
sum=sum+i;
}
for(sum=0,i=0;i<=100;i++)
{
sum=sum+i;
}

跳出后的都不执行了。。