8.4输入某班学生某门课的成绩,用函数编程统计不及格人数

该博客介绍了一种编程方法,用于输入班级学生某一科目的成绩,并通过函数来统计不及格的人数。文章可能详细说明了函数的实现过程及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdlib.h>
#define N 40
int main()
{
  int n;
  int a[N];
  printf("请输入人数n:");
  scanf("%d",&n);
  cj(a,n);
  return 0;

}
int cj(int a[], int n)
{
    int i,b=0;
    printf("请输入几人的成绩:");
    for(i=0;i<n;i++)
    {
        scanf(
<think>嗯,用户让我用C语言写一个程序,参考例8.6中的ReadScore()和Average()函数输入学生成绩,直到输入负值为止,然后统计高于平均分的学生人数。这个问题看起来不算太难,但有几个地方需要注意。首先,我得回忆一下例8.6的结构,虽然用户没给出具体内容,但根据常见的例子,ReadScore可能负责读取成绩到数组,而Average计算平均分。 首先,我需要确定函数的参数和返回值。ReadScore应该接收一个数组,并返回实际输入学生人数。在读取过程中,当用户输入负数时停止。这里需要注意输入的循环控制,比如用while或do-while循环,每次读取一个数,检查是否为负,是的话就break,否则存入数组。同时,要确保不超过40人的限制,所以数组大小应该是40,循环次数最多40次。 然后是Average函数,它需要接收成绩数组和人数n,计算平均分并返回。这里要注意浮点数除法,可能需要将总和转为float或double类型。计算总和的时候用循环累加。 接下来,统计高于平均分的人数。这部分可以单独写一个函数,比如CountAboveAverage,同样接收数组和人数n,调用Average得到平均分,然后遍历数组,统计比平均分高的元素个数。或者,也可以在main函数里直接调用Average,然后遍历统计。不过按照用户要求,可能希望用函数实现,所以最好单独写一个函数。 主函数的流程大概是:声明数组,调用ReadScore获取实际人数,如果人数为0要处理(比如提示没有输入),否则计算平均分,统计人数并输出。 可能的错误点:忘记处理n为0的情况,导致除以0错误。所以在Average函数里需要检查n是否为0,或者在调用前检查。另外,输入成绩可能是整数,但平均分可能是小数,所以类型处理要注意,避免整数除法。 然后,测试一下各种情况,比如输入负数直接结束,输入刚好40人,输入超过40人时是否截断。例如,当输入40个成绩后,不管是不是负数,都结束输入?或者当输入40个成绩后,即使还没输入负数,也停止?这点需要明确题目要求。题目说最多不超过40人,所以当输入40个时,无论是否负数都应该停止?或者继续等待输入,但最多存40个,当输入负数时结束。例如,用户可能在输入到30个时输入负数,这时实际人数是30。或者如果用户输入40个正数,然后继续输入的话,后续的会被忽略。所以ReadScore函数里的循环应该最多循环40次,每次读取一个数,如果是负数就break,否则存入数组,直到数组满40个。 现在,具体编写ReadScore函数函数返回int,即实际人数。参数是数组,可能需要用指针传递,或者在函数参数中传入数组,然后在函数内修改。例如: int ReadScore(int scores[]) { int count = 0; int num; printf("输入成绩,负数结束:\n"); while (count < 40) { scanf("%d", &num); if (num < 0) { break; } scores[count] = num; count++; } return count; } 这样处理的话,当输入负数或达到40人时停止。这样是正确的。 然后Average函数: float Average(int scores[], int n) { if (n == 0) return 0.0f; // 避免除零错误 int sum = 0; for (int i=0; i<n; i++) { sum += scores[i]; } return (float)sum / n; } 统计人数函数: int CountAboveAverage(int scores[], int n, float avg) { int count = 0; for (int i=0; i<n; i++) { if (scores[i] > avg) { count++; } } return count; } 或者,也可以让这个函数内部调用Average,但那样可能需要再传一次n,不过用户可能希望将Average作为单独的函数。所以主函数中: int main() { int scores[40]; int n = ReadScore(scores); if (n == 0) { printf("没有输入有效成绩。\n"); return 0; } float avg = Average(scores, n); int count = CountAboveAverage(scores, n, avg); printf("平均分:%.2f,高于平均分的人数:%d\n", avg, count); return 0; } 这样结构清晰。需要注意,当n为0时,Average返回0,但主函数已经处理了这种情况,所以不会有问题。 测试案例:比如输入三个成绩:90 80 70,然后输入-1。平均分是80,高于的有两个(90和80?不,90和80比80高吗?平均是80的话,大于的有90和80?如果是整数的话,平均是80,那等于的情况不算。所以用户可能需要统计的是严格大于平均分的人数。所以上面的例子,输入90 80 70,平均是80,那么只有90高于,所以人数是1。那程序是否正确? 这时候需要确认,当成绩等于平均分时是否不计入。题目要求是“高于平均分”,所以等于不算。代码中的判断是scores[i] > avg,所以正确。 另外,当所有成绩都相同,比如都是60,平均分60,那么没有高于的,统计0人。这也是正确的情况。 所以,这样的程序应该可以满足用户的需求。</think>以下是用C语言实现该功能的步骤及代码: ### 实现步骤 1. **读取成绩**:用`ReadScore()`函数循环读取成绩,遇到负数或达到40人时停止。 2. **计算平均分**:用`Average()`函数计算班级平均分。 3. **统计人数**:编写函数统计高于平均分的学生人数。 ### 完整代码 ```c #include <stdio.h> #define MAX_N 40 // 最大学生人数 // 函数声明 int ReadScore(int scores[]); float Average(int scores[], int n); int CountAboveAverage(int scores[], int n, float avg); int main() { int scores[MAX_N]; // 存储成绩的数组 int n = ReadScore(scores); // 读取成绩并获取实际人数 if (n == 0) { printf("未输入有效成绩!\n"); return 0; } float avg = Average(scores, n); // 计算平均分 int count = CountAboveAverage(scores, n, avg); // 统计高于平均分的人数 printf("平均分: %.2f\n", avg); printf("成绩高于平均分的学生人数: %d\n", count); return 0; } // 读取成绩,返回实际人数 int ReadScore(int scores[]) { int count = 0; int num; printf("请输入学生成绩输入负数结束):\n"); while (count < MAX_N) { scanf("%d", &num); if (num < 0) break; // 输入负数时结束 scores[count] = num; count++; } return count; // 返回实际输入人数 } // 计算平均分 float Average(int scores[], int n) { if (n == 0) return 0.0f; // 防止除以0 int sum = 0; for (int i = 0; i < n; i++) { sum += scores[i]; } return (float)sum / n; // 强制类型转换确保浮点除法 } // 统计高于平均分的人数 int CountAboveAverage(int scores[], int n, float avg) { int cnt = 0; for (int i = 0; i < n; i++) { if (scores[i] > avg) cnt++; // 严格大于平均分 } return cnt; } ``` ### 关键代码解释 1. **`ReadScore()`函数**: - 通过`while`循环读取输入,最多读取40个成绩。 - 遇到负数时立即终止输入。 2. **`Average()`函数**: - 计算成绩总和后,通过`(float)sum / n`确保结果为浮点数。 - 添加`n == 0`的检查,避免除零错误。 3. **`CountAboveAverage()`函数**: - 遍历数组,严格统计大于平均分的学生数量。 ### 示例运行 ``` 请输入学生成绩输入负数结束): 85 92 78 60 -1 平均分: 78.75 成绩高于平均分的学生人数: 2 ``` ### 注意事项 - 输入成绩时,以空格或换行分隔。 - 平均分保留两位小数,便于观察结果。 - 若直接输入负数,程序会提示“未输入有效成绩”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值