题目:假设某位老师需要分别统计若干个班某项考试的平均分,但每个班的人数都不相同,请写个程序辅助他尽快完成任务。要求保留两位小数。
在往下看之前,请读者先自己试着写一个,说不定您写的比我下面写的那个要好得多。
解答:
#include <stdio.h>
int main(void)
{
unsigned num_of_students, i;
double score, total_score, avg_score;
printf("Please tell me how many students are there in this class: ");
/* 读取用户输入的学生数目。因为 num_of_students 是 unsigned 类型的, */
/* 所以必须用 %u,切记不要用错了,否则可能导致意想不到的结果。 */
scanf("%u", &num_of_students);
printf("Got it! %u students in this class.\n\n"
"Please tell me the score of each student:\n",
num_of_students);
for ( i = 0, total_score = 0; i != num_of_students; ++i )
{
/* 读取用户输入的学生分数。因为 score 是 double 类型的,所以 */
/* 必须用 %lf,切记不要用错了,否则可能导致意想不到的结果。 */
scanf("%lf", &score);
total_score += score; /* 计算总分 */
}
/* 计算平均分 */
avg_score = total_score / num_of_students;
/* 输出总分和平均分 */
printf("Total score : %.2f\n"
"Average score : %.2f\n",
total_score, avg_score);
}
运行结果:
Please tell me how many students are there in this class: 5
Got it! 5 students in this class.
Please tell me the score of each student:
90 85 60 88
78 68
Total score : 401.00
Average score : 80.20
程序重点:
1. 要算出平均分,就必须知道学生数目。学生数目需要由用户(本例中是老师)输入,
而通过 scanf 函数可以获取用户输入。故本例使用 scanf 获取老师输入的学生数目。
2. 您可能已经发现了,本例第二个 printf 调用写得有点奇怪,也许您会觉得我写错了。
其实不然,这样写是完全正确的。因为仅由空格或者换行隔开的字符串字面量会自动
被连接成一个字符串字面量,所以本例中的
"Got it! %u students in this class.\n\n"
"Please tell me the score of each student:\n"
等同于
"Got it! ...(略) class.\n\nPlease ... student:\n"
为了便于排版,我对上面这个字符串作了一些省略。除了这点,您肯定还发现了另一个
特别之处:num_of_students); 明明不是字符串字面量呀,怎么也可以另起一行书写?没错!
的确可以另起一行书写!C 语言的书写格式非常自由,可以把很多句语句写在同一行上,
也可以把一句语句分开几行来写。语句之间空多少格,空多少行,都无所谓,对目标代码
的生成毫无影响。唯一影响的是代码的可读性。例如:
#include <stdio.h> /* 注意,预处理指令需要一行写完!*/
int main( void ) { int four; four
=
4
;
printf(
"%d\n",
four); return 0;}
这样写是完全合法的,但是非常难看,毫无可读性可言!我们应该利用这种自由来书写
美观易读的代码;切不可滥用,写出乱七八糟的代码!本例中,为了使代码美观易读,
我们把第二个 printf 调用分成三行来写。
3. 通过循环算出总分。该循环每次获取用户输入的一个分数,每获取一个分数都和前面已
获取了的分数的总和进行累加,直到获取到的分数数目等于学生数目为止。
4. 输入分数时,分数之间可用空格隔开,也可用回车隔开。本例同时使用了这两种方法。
5. 也许您注意到了,程序运行时,我输入了 6 个分数,但算出来的结果只是前 5 个分数
的和。这是因为我前面输入的学生数目是 5,所以循环次数只有五次,仅获取了前面的
那五个分数。
6. 输入的数据会先被放入缓冲区中,等到按了回车键之后才会被送到我们编写的程序里。
这点我们以后会详细讲解。
7. 输入非数字字符(如 abc#@,.?=-+ 等)会导致该程序出问题,解决办法我们以后会详细
讲解。
参考资料:C Primer 5th Edition
The C Programming Language 2nd Edition
C99 标准
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。