关于C语言,本题为什么for循环用了两次呢,求详解 都是什么情况下for循环需要多次使用啊谢谢

三、编程题m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。例如:当sco... 三、编程题
m个人的成绩存放在score数组中,请编写函数 fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。例如:当score数组中的数据为10、20、30、40、50、60、70、80、90时,函数返回的人数应该是4,below中的数据应为10、20、30、40。

#include <stdio.h>
#include <string.h>
int fun(int score[], int m, int below[])
{int i,j=0,aver,sum=0;
for(i=0;i<m;i++)
sum=sum+score[i];
aver=sum/m;
for(i=0;i<m;i++)
if(score[i]<aver)
{below[j]=score[i];j++;}
return j;
}
main( )
{ int i, n, below[9] ;
int score[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90} ;

n = fun(score, 9, below) ;
printf( "\nBelow the average score are: " ) ;
for (i = 0 ; i < n ; i++) printf("%d ", below[i]) ;
}
展开
 我来答
gabriel1861
2012-02-15
知道答主
回答量:45
采纳率:0%
帮助的人:17.9万
展开全部
既然你要详细解释,我就从题目开始来分析:
题目要求函数能干3件事:
1、计算出平均分;2、统计低于平均分的人数;3、把低于平均分的分数保存在另一个数组中

我们来分析一下:
首先,要做到这些是就必须遍历数组中的每一个元素,因此循环是必须的,而且对于这种循环次数已知的问题(数组元素数为9),我们一般会用for循环
其次,在设计程序的时候我们应遵守一项原则,尽量少地使用for循环的个数,尤其最好能避免for循环的嵌套问题(这道题显然不需要)。因此,我们想一想用一次for循环是否能完成这3个任务。显然是不行的,因为如果不计算出总的得分我们就无法得到平均分(任务1),进而就无法比较哪些低于平均分(任务2,3)。所以一个循环是不够的,只能用两个循环。
最后,我们来设计这两个循环。第一个循环只做一件事,就是把数组中的每个元素依次相加得到总成绩。循环结束以后我们就可以计算出平均分了。接着我们发现任务2和3可以同时在第二个循环中进行,先判断每个元素是否小于平均数,如果小于,就把它存入新数组并且把用于统计人数的变量j自增,于是循环结束后我们所需要的人数和新数组就都得到了

纯手打,加个人分析
更多追问追答
追问
先谢谢你了,不过还想问一问,请您看一下,下面这道题为什么两次输出循环结构呢
他们是否可以去掉??感激不尽
main()
{int a[3][3],i,j;
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
a[i][j]=rand()%10;
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
printf("%d%d",a[i][j]);
printf("\n");
}
追答
你这个程序的输出结果太难看了,我给你改了一下输出格式,这样看着舒服点,你运行一下看看就容易理解我下面说的了。
main(){
int a[3][3],i,j;

for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
a[i][j]=rand()%10;

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

程序目的:利用随机数生成一个3*3的矩阵,并输出结果,由于矩阵保存在一个二维数组里,所以要用一次循环嵌套,也叫多重循环,不是两个循环。
最外层的循环(变量为i)控制行,内层的j控制列,这下明白了吧
naletive
2012-02-15 · TA获得超过1021个赞
知道小有建树答主
回答量:195
采纳率:0%
帮助的人:132万
展开全部
这里for用了两次是你解题的需要,
第一次for循环,将所有分数加和,然后算出平均分;
第二次for循环,将所有分数跟平均分对比,低于平均分的放到below数组中;

具体要用到几个for循环,就看解题的需要(正如此题)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ntn406133
2012-02-15 · 超过17用户采纳过TA的回答
知道答主
回答量:81
采纳率:0%
帮助的人:34.1万
展开全部
本题中两次for是分开的,彼此没有关系,删除一个不影响另一个,不是for循坏的叠加
一次循环用一个for,这个循环里面的每一项还有一个循环,再用一个for,循环下有循环再用……
比如一个级有5个班,用一个for,一个班有四组,第一个for循环中叠加第二个for循环,一组中有12人,叠加第三个for……
其实for循环多次使用的问题不用考虑,使用很自然的事,该用时水到渠成
追问
还是那个问题,下面这道题可不可以改成如下呢
原题
main(){ int a[3][3],i,j;

for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
a[i][j]=rand()%10;

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

改后
main(){
int a[3][3],i,j;

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

谢谢
追答
可以
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式