C 语言书
模块二 · 流程与数据 / 第 12 课

12 · 模块二小项目:成绩统计

项目 45 分钟 跳到过关题
学习目标
  • 综合数组、循环、函数、if
  • 独立完成一个能跑的小程序
  • 学会「先想步骤再写代码」

需求

  • 存 5 个成绩
  • 算平均分、最高分、及格人数
  • 用函数拆开,不要全堆在 main

先拆步骤(很重要)

动手前先写清单
1) 定义数组并填数
2) 写 sum / max / pass 三个函数
3) main 里调用并打印结果

参考实现

#include <stdio.h>

#define N 5

int sum_all(int a[], int n)
{
    int i, s = 0;
    for (i = 0; i < n; i++) s += a[i];
    return s;
}

int max_all(int a[], int n)
{
    int i, m = a[0];
    for (i = 1; i < n; i++)
        if (a[i] > m) m = a[i];
    return m;
}

int count_pass(int a[], int n)
{
    int i, c = 0;
    for (i = 0; i < n; i++)
        if (a[i] >= 60) c++;
    return c;
}

int main(void)
{
    int scores[N] = {78, 92, 55, 60, 88};
    int total = sum_all(scores, N);

    printf("总分 %d\n", total);
    printf("平均 %.1f\n", (double)total / N);
    printf("最高 %d\n", max_all(scores, N));
    printf("及格人数 %d\n", count_pass(scores, N));
    return 0;
}

本课过关

必做

为什么建议把统计写成多个函数而不是全写在 main?

必做作业
  1. 把 N 改成 10,并改成从键盘读入成绩(可用 scanf)。
  2. 增加「最低分」函数 min_all。
  3. 如果有人考了 150 分,你的程序会怎样?要不要校验?
  4. 增加:打印「不及格名单」(只输出 <60 的分数)。
先自己写完,再点开看解答

1:循环 scanf("%d", &scores[i]),注意传地址 &。

2:和 max 对称:先假设 a[0] 最小,更小则更新。

3:可读入后 if (x<0 || x>100) 报错或重读,这叫输入校验。

4:遍历数组,if (scores[i] < 60) printf。