模块二 · 流程与数据 / 第 12 课
12 · 模块二小项目:成绩统计
学习目标
- 综合数组、循环、函数、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?
逐步解析
编译器不会强制你把逻辑写成多个函数,全塞在 main 里往往也能跑。拆函数的价值在工程:①一段逻辑只写一次,可重复调用;②每个函数只做一件事,读代码时可以「先看名字、再点进去」;③出 bug 时范围更小,便于定位和单测;④以后改需求只需改一处。类比:写作文分段落,不是因为不分段不能写,而是因为分了才好读、好改。
必做作业
- 把 N 改成 10,并改成从键盘读入成绩(可用 scanf)。
- 增加「最低分」函数 min_all。
- 如果有人考了 150 分,你的程序会怎样?要不要校验?
- 增加:打印「不及格名单」(只输出 <60 的分数)。
先自己写完,再点开看解答
1:循环 scanf("%d", &scores[i]),注意传地址 &。
2:和 max 对称:先假设 a[0] 最小,更小则更新。
3:可读入后 if (x<0 || x>100) 报错或重读,这叫输入校验。
4:遍历数组,if (scores[i] < 60) printf。
学完去哪
进入模块三:指针、结构体、预处理,再做综合项目。