Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19268545
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-03-20 18:50:37

来源: 作者:antigloss 等级:精品
发布于2006-11-04 22:41 被读2506次 【字体: 】

题目:假设某位老师需要分别统计若干个班某项考试的平均分,但每个班的人数都不相同,请写个程序辅助他尽快完成任务。要求保留两位小数。

    在往下看之前,请读者先自己试着写一个,说不定您写的比我下面写的那个要好得多。

解答:

        #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 标准

本文版权归 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。

阅读(1002) | 评论(0) | 转发(0) |
0

上一篇:43. 循环嵌套

下一篇:45. 循环应用实例 2

给主人留下些什么吧!~~