for语句有4个部分内容for ( A;B;C ) D;其中A是初始化语句,每个for只执行A一次,B是循环条件,每次循环前执行判断,如果不满足则结束循环,D是在满足循环条件时执行的,可以是一句或多句(多句时用大括号括起来做整体处理),C是在执行D之后进行的后续处理。for语句执行的顺序是:A,B,D,C,B,D,C,B,D,C,...,B结束
for ( i=0;i<9;i++ ) {
iTemp=a[i]; iPos=i;
for ( j=i+1;j<10;j++ ) {
if ( a[j]}
a[iPos]=a[i]; a[i]=iTemp;
}
假设数组a中输入了十个数为:1,2,5,4,6,8,7,9,10,3,通过手动单步执行程序(把自己当成计算机),分析理解for语句的含义。
i=0;[i=0],i<9成立,开始循环
iTemp=a[i];[iTemp=a[0]=1],iPos=i;[iPos=0]
j=i+1;[j=0+1=1],j<10成立,开始循环:a[j]j++;[j=2],j<10成立,继续循环:a[j] j++;[j=3],j<10成立,继续循环:a[j] j++;[j=4],j<10成立,继续循环:a[j] ... //没有条件满足让if语句条件能得到执行,因为a[1]~a[9]都不小于iTemp
j++;[j=10],j<10不成立,结束循环
a[0]=a[0]; a[0]=1;实际上a[0]值未变,通过以上处理a[0]保存a[0]之后所有数组中最小值
i++;[i=1],i<9成立,继续循环
iTemp=a[i];[iTemp=a[1]=2],iPos=i;[iPos=1]
j=i+1;[j=2],j<10成立,开始循环:a[j]j++;[j=3],j<10成立,继续循环:a[j] ... //没有条件满足让if语句条件能得到执行,因为a[2]~a[9]都不小于iTemp
j++;[j=10],j<10不成立,结束循环
a[1]=a[1]; a[1]=2;实际上a[1]值未变,通过以上处理a[1]保存a[1]之后所有数组中最小值
i++;[i=2],i<9成立,继续循环
iTemp=a[i];[iTemp=a[2]=5],iPos=i;[iPos=2]
j=i+1;[j=3],j<10成立,开始循环:a[j]j++;[j=4],j<10成立,继续循环:a[j] ...
j++;[j=9],j<10成立,继续循环:a[j]j++;[j=10],j<10不成立,结束循环
a[9]=a[2]; a[2]=3;通过以上处理a[2]与a[2]之后所有数组中最小值的a[9]值互换
现在数组变成: 1,2,3,4,6,8,7,9,10,5
...//每次i循环都会导致当前a[i]与之后最小值的元素互换值,结果是a[i]保存之后最小值
i++;[i=9],i<9不成立,结束循环
至此数组按照从小到大顺序排序
上述循环中,i值指定当前要处理的元素,j值负责每次提供之后所有元素下标,在进行比较后,当前i指向元素会与之后最小值进行交换,保证当前元素是之后元素中最小的,从而进行9次这样的处理后数组按顺序已经排好序了。
#include
struct Student
{
char num[10];
char name[10];
int score[4];
};
main()
{
struct Student exc,stu[5]={{"5001","zhang",85,82,75,66,},
{"5002","liu",75,85,92,78},{"5003","li",66,88,93,85},
{"5004","huang",82,72,80,77},{"5005","wang",92,75,73,83}};
int a,all[5]={0},i,j;
for(i=0;i<5;i++)
for(j=0;j<4;j++)
all[i]+=stu[i].score[j];
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(all[j]
exc=stu[j];
stu[j]=stu[j+1];
stu[j+1]=exc;
a=all[j];
all[j]=all[j+1];
all[j+1]=a;
}
printf("按总分降序排列如下:\n");
for(i=0;i<5;i++)
{
printf("%s %-6s ",stu[i].num,stu[i].name);
for(j=0;j<4;j++)
printf("%d ",stu[i].score[j]);
printf("%d \n",all[i]);
};
}
for(j=i+1;j<10;j++)
变量j,从i位置的后一个开始,直到数组的最后一个。