我花了10多分钟来分析,却花了1个多小时写论文给你解释,如果你还看不懂,我真的要吐血了。
1、输入5个数(100太多,举个小一点的例子来解释):10 20 30 40 50 -1
while循环体结束后,此时
a[0]=10,a[1]=20,a[2]=30,a[3]=40,a[4]=50,a[5]=-1,count=6;
2、执行count--,此时count=5,执行第一个for语句(i=0;i<count;i++),执行循环体里面这条b[a[i]]++语句,在这个for循环中,
要注意的是:在函数开头就初始化b[102]={0},即所有的元素的值均为0,所以当结束for循环之后,b[10]=1,b[20]=1,b[30]=1,b[40]=1,b[50]=1,除了这5个元素之外,其他元素的值在没有执行第二个for循环体里面的赋值语句之前都还是0的。
3、执行b[MAX+1]=1;for(i=MAX;i>=MIN;i--){b[i]=b[i]+b[i+1];}
b[MAX+1]=1的作用就是是b[101]=1,然后使1往前面的元素传送,发生值传递。
b[100]=b[100]+b[101]=0+1=1;
b[99]=b[99]+b[100]=0+1=1;
b[98]=b[98]+b[99]=0+1=1;
……//期间1一直不变,即b[51]—b[99]的元素的值均为1;
b[50]=b[50]+b[51]=1+1=2;
b[49]=b[49]+b[50]=0+2=2;
……//期间2一直不变,即b[41]—b[49]的所有元素的值均为2;
b[40]=b[40]+b[41]=1+2=3;
b[39]=b[39]+b[40]=0+3=3;
……//期间3一直不变,即b[31]—b[39]的所有元素的值均为3;
b[30]=b[30]+b[31]=1+3=4;
b[29]=b[29]+b[30]=0+4=4;
……//期间4一直不变,即b[21]—b[29]的所有元素的值均为4;
b[20]=b[20]+b[21]=1+4=5;
b[19]=b[19]+b[20]=0+5=5;
……//期间5一直不变,即b[11]—b[19]所有元素的值均为5;
b[10]=b[10]+b[11]=1+5=6;
总结以上for循环的最后结果:b[10]=6,b[11]~b[19]=5,b[20]=5,b[21]~b[29]=4,b[30]=4,b[31]~b[39]=3,b[40]=3,b[41]~b[49]=2,b[50]=2,b[51]~b[101]=1
4、输出printf("得分\t排行\n")这条语句
5、执行第三个for循环,在这里我只想说说输出b[a[i]+1]
i=0,每次自增1,i<5;i=0,i=1,i=2,i=3,i=4,分别代进去,得到b[a[0]+1],b[a[1]+1],b[a[2]+1],b[a[3]+1],b[a[4]+1],即是b[10+1],b[20+1],b[30+1],b[40+1],b[50+1],每个元素都+1是为了输出正确的排名
(因为b[10]=6,b[11]=5,b[20]=5,b[21]=4,b[30]=4,b[31]=3,b[40]=3,b[41]=2,b[50]=2,b[51]=1),如果不+1的话,则会输入b[10],……b[50]几个元素,这样的排名为6,5,4,3,2,没有第1名,所以要+1,使得其输出b[11],b[21],b[31],b[41],b[51],这样的排名就正确了,b[MAX+2]这个数组其实就是拿来计算排名的