《C语言及程序设计》实践参考——成绩统计

返回:贺老师课程教学链接  项目要求

【项目3-成绩统计】
文件english.dat(这个文件中的数据量,超出了你之前所有的体验)中已经有了学生的英语考试成绩数据。
(1)请编程从english.dat中读取数据,求出这次考试的平均成绩,并统计输出优秀人数和不及格人数。请在下面程序基础上填空完成:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int score; //读入的成绩
    int excelent=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数
    double sum=0,ave; //sum: 成绩和,ave: 平均分
    //以输入的方式(ios::in)打开文件
    FILE ____(1)____;
    fp=fopen(____(2)____);
    if(fp==NULL)
    {
        printf("open error!\n");
        exit(1);
    }
    while(fscanf(____(3)____)!=EOF)   //当读取成功……
    {
        count++;
        sum+=score;
        if(____(4)____)
            excelent++;
        else if(score<60)
            ____(5)____;
    }
    ____(6)____;
    //下面输出结果
    ave=sum/count;
    printf("总人数为:%d\n", count);
    printf("平均成绩为:%.2f\n", ave);
    printf("优秀人数:%d\n", excelent);
    printf("不及格人数:%d\n", fail);
    return 0;
}

[参考解答]

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int score; //读入的成绩
    int excelent=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数
    double sum=0,ave; //sum: 成绩和,ave: 平均分
    //以输入的方式(ios::in)打开文件
    FILE *fp;
    fp=fopen("english.dat","r");
    if(fp==NULL)
    {
        printf("open error!\n");
        exit(1);
    }
    while(fscanf(fp, "%d", &score)!=EOF)   //当读取成功……
    {
        count++;
        sum+=score;
        if(score>=90)
            excelent++;
        else if(score<60)
            fail++;
    }
    fclose(fp);          //读入完毕要关闭文件
    //下面输出结果
    ave=sum/count;
    printf("总人数为:%d\n", count);
    printf("平均成绩为:%.2f\n", ave);
    printf("优秀人数:%d\n", excelent);
    printf("不及格人数:%d\n", fail);
    return 0;
}

(2)扩充上面的程序,要求将统计结果保存到数据文件statictic.dat中(提示:要用fprintf写入文件了)
[参考解答]

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int score; //读入的成绩
    int excelent=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数
    double sum=0,ave; //sum: 成绩和,ave: 平均分
    //以输入的方式(ios::in)打开文件
    FILE *fp;
    fp=fopen("english.dat","r");
    if(fp==NULL)
    {
        printf("source file open error!\n");
        exit(1);
    }
    while(fscanf(fp, "%d", &score)!=EOF)   //当读取成功……
    {
        count++;
        sum+=score;
        if(score>=90)
            excelent++;
        else if(score<60)
            fail++;
    }
    fclose(fp);          //读入完毕要关闭文件
    //下面输出结果
     ave=sum/count;
    printf("总人数为:%d\n", count);
    printf("平均成绩为:%.2f\n", ave);
    printf("优秀人数:%d\n", excelent);
    printf("不及格人数:%d\n", fail);
    fp=fopen("statictic.dat","w");
    if(fp==NULL)
    {
        printf("output file open error!\n");
        exit(1);
    }
    fprintf(fp, "总人数为:%d\n", count);
    fprintf(fp, "平均成绩为:%.2f\n", ave);
    fprintf(fp, "优秀人数:%d\n", excelent);
    fprintf(fp, "不及格人数:%d\n", fail);
    fclose(fp);          //读入完毕要关闭文件
    //下面打开文件查看结果
    return 0;
}

(3)(用柱状图输出)编程序,求出这次考试的平均成绩,并统计各分数段的人数(优秀:≥90,良好:≥80,中等:≥70,及格:≥60,不及格:<60)。运行结果如图所示。试着将输出界面改变成成下面的样子(仅变输出方式)

[参考解答]

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int score; //读入的成绩
    int rate; //根据成绩确定的等级
    int excelent=0, good=0, medium=0, passing=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数
    double sum=0,ave; //sum: 成绩和,ave: 平均分
    //以输入的方式(ios::in)打开文件
    FILE *fp;
    fp=fopen("english.dat","r");
    if(fp==NULL)
    {
        printf("source file open error!\n");
        exit(1);
    }
    while(fscanf(fp, "%d", &score)!=EOF)   //当读取成功……
    {
        count++;
        sum+=score;
        rate=score/10;  //rate用于分出“档次”
        switch(rate)
        {
        case 10:
        case 9:
            excelent++;
            break;
        case 8:
            good++;
            break;
        case 7:
            medium++;
            break;
        case 6:
            passing++;
            break;
        default:
            fail++;
            break;
        }
    }
    fclose(fp);          //读入完毕要关闭文件
    //下面输出结果,不同的数字对应的#数目不同
    ave=sum/count;
    int max; //将存储这几个分数段中的最多人数
    max=excelent;
    if(max<good) max=good;
    if(max<medium) max=medium;
    if(max<passing) max=passing;
    if(max<fail) max=fail;
    printf("平均成绩为:%.2f\n", ave);
    //现确定各个档次一共输出50个#,据此按比例可算出各档需要多少格子

    printf("优秀 ");
    int l=((double)excelent)/max*50;
    int i;
    for(i=0; i<l; ++i)
        printf("#");
    printf("  %d\n", excelent);
    printf("良好 ");
    l=((double)good)/max*50;
    for(i=0; i<l; ++i)
        printf("#");
    printf("  %d\n", good);
    printf("中等 ");
    l=((double)medium)/max*50;
    for(i=0; i<l; ++i)
        printf("#");
    printf("  %d\n", medium);
    printf("及格 ");
    l=((double)passing)/max*50;
    for(i=0; i<l; ++i)
        printf("#");
    printf("  %d\n", passing);
    printf("挂科 ");
    l=((double)fail)/max*50;
    for(i=0; i<l; ++i)
        printf("#");
    printf("  %d\n", fail);
    return 0;

}
时间: 2024-12-22 01:55:14

《C语言及程序设计》实践参考——成绩统计的相关文章

《C语言及程序设计》实践参考——字符统计

返回:贺老师课程教学链接  实践要求 [项目2-字符统计]下面的程序可以统计出一个字符串中数字字符的个数: #include <stdio.h> int main() { char str[50]; int i=0,n=0; printf("输入字符串:"); gets(str); while(str[i]!='\0') { if(str[i]>='0'&&str[i]<='9') n++; i++; } printf("其中的数字个数

《C语言及程序设计》实践参考——成绩处理

返回:贺老师课程教学链接   项目要求 [项目2- 成绩处理]在数组score中将要存储某小组C程序设计的成绩,请完成下面的处理:(1)输入小组人数及成绩,要保证成绩在0-100之间:(2)输出该小组的最高成绩.最低成绩.平均成绩:(3)输出考得最高成绩和最低成绩的同学的人数:(4)输出考得最高成绩和最低成绩的同学的学号(设数组下标即学号,可能有相同的成绩).(5)(选做)求出所有同学成绩的标准偏差,标准偏差公式为,其中为样本(即某同学成绩),为均值(前面已经求出),N为样本数目:提示1:可以采

《C语言及程序设计》实践参考——血型统计

返回:贺老师课程教学链接  项目要求 [项目4:血型统计]黑猫警长在犯罪现场发现了一些血迹,现已经委托检验机构确定了血型,需要统计各种血型的样本数目.输入:血型序列(A/B/O/C,C代表AB型血,输入以X结束)输出:各种血型的数量输入样例:ABCAOCOAOOBX输出样例:A:3  B:2  O:4  AB:2 [参考解答] #include<stdio.h> int main() { int a=0, b=0, ab=0, o=0; char blood; scanf("%c&q

《C语言及程序设计》实践参考——成绩等级

返回:贺老师课程教学链接  项目要求 [项目:成绩等级]给出一百分制成绩,要求输出成绩等级'A','B','C','D','E'.90分以上为'A',80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'. [参考解答] #include <stdio.h> int main() { int grade, rate; scanf("%d", &grade); rate = grade/10; switch(grade) { case 1

《C++语言基础》实践参考—— 链表类

返回:贺老师课程教学链接  项目要求 [项目 - 链表类]动态链表也是程序设计中的一种非常有用的数据结构.可以说,是否能够理解有关操作的原理,决定了你是否有资格称为"科班"出身.在后续的专业基础课中,相关的内容还会从不同的角度,反复地认识,反复地实践.不过,在现阶段多些体验,也是很有必要的了.(1)阅读下面的程序,回顾一下动态链表,阅读程序过程中,请用笔画一画形成链表的过程中指针值的变化. #include <iostream> using namespace std; s

《C++语言基础》实践参考——指向学生类的指针

返回:贺老师课程教学链接 [项目4-指向学生类的指针] 设计一个学生类Student,数据成员包括学号(num)和成绩(score),成员函数根据需要自行设计(建议配备需要的set.get函数,以及必要的输入或输出,给出的代码中也可以找到需要成员函数的线索).在main函数中,要做到: 建立一个对象数组,通过初始化,设置5个学生的数据,要求: 用指针指向数组首元素,输出第1.3.5个学生的信息: 设计一个函数int max(Student *arr);,用指向对象的指针作函数参数,在max函数中

《C++语言基础》实践参考——小玩文件

返回:贺老师课程教学链接  项目要求 [项目1 - 小玩文件](1)下面程序的功能是统计文本文件abc.txt中的字符个数,请填空将程序补充完整. #include <iostream> #include <cstdlib> #include _____________ // (1) using namespace std; int main() { fstream file; file.open("abc.txt", _________); // (2) if

《C++语言基础》实践参考——考了语文数学的学生

返回:贺老师课程教学链接 [项目4 - 考了语文数学的学生]下面提供了类Stu的数据成员定义,和用于测试的main函数,参考如图的运行结果,完成类的定义,并用多文件形式组织程序 #include<iostream> using namespace std; class Stu { private: string name; //学生姓名 float chinese; //语文成绩 float math; //数学成绩 //接下去写 }; int main() { Stu s1,s2; s1.s

《C++语言基础》实践参考——旱冰场造价

返回:贺老师课程教学链接 [项目1 - 旱冰场造价] 有一个圆形的旱冰场地,场地内抹水泥,造价为每平方米M元,围栏用木条围成,每米造价N元,输入旱冰场半径,用程序计算出其造价. 一级提示: 先定义类,确定其数据成员和成员函数.在这里要定义的旱冰场类,实际我们只关心其面积和周长,根据面积计算场地内抹水泥的造价,根据周长计算围栏的造价.有了类的定义,在main函数中定义该类对象,调用成员函数即可以完成求解.二级提示: 实际上,对于旱冰场,我们只关心它就是一个圆.这就是设计中抓住了本质.于是,设计一个