C语言实战项目——学生试卷分数统计

简介: C语言实战项目——学生试卷分数统计

1.题目要求

作为教师,考试以后对试卷进行分析和研究是必须做的一项工作,假定某学校要求老师在考试之后填写的一个表格,并要求教师根据考试分数分布情况画出直方图。下面就来解决这个实际问题。

2.题目分析

  1. 程序运行时,首先必须接收总评成绩的计算比例,因为针对不同的课程,平时成绩和期末考试成绩所占的比例可能不同。
  2. 接收若干同学的平时成绩和期末考试成绩,计算出总评成绩,总评成绩的计算方法是“平时成绩所占比例×平时成绩+期末成绩所占比例×期末成绩”。
  3. 根据考试成绩计算分数段的分布情况,画出直方图。
  4. 计算平时成绩、期末成绩和总评成绩的平均分和标准差,以及期末考试卷面的及格率、最高分和最低分等。

由于针对一个学生有3个有关成绩的数据,因此最简单的方法就是使用结构体数组。第1列为学生的学号,第2列为学生的平时成绩,第3列为学生的期末成绩,第4列为学生的总评成绩。

3.文件说明

main.c//主要的函数调用
function.c//函数执行
function.h//整个程序的头文件

4.函数说明

int accept_date(STUDENT stu[],int grade[] ,int size_t);//输入数据
void show_data(STUDENT stu[],int sum,int grade[]);//输出所有的学生学号,成绩
void count(int* max,int* min,double* pass,double ave[],double f[],STUDENT stu[],int sum);//计算期末考试成绩及格率、最高分最低分以及平时、期末和总评成绩的平均分和标准差
void show_data2(int max,int min,double pass,double ave[],double f[]);//显示期末考试成绩及格率、最高分最低分以及平时、期末和总评成绩的平均分和标准差
void draw(int grade[]);//画出频率分布直方图

5.程序编写

5.1 fuction.h

#ifndef TEXT5_7_FUNCTION_H
#define TEXT5_7_FUNCTION_H
#endif //TEXT5_7_FUNCTION_H
#include<stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
typedef struct student//定义一个结构体变量
{
    int number;//定义学号
    int source[3];//定义期中、期末、总评成绩
}STUDENT;
typedef enum { False, True } FLAG;//枚举定义

5.2 main.c

#include "function.h"
int accept_date(STUDENT stu[],int grade[] ,int size_t);//输入数据
void show_data(STUDENT stu[],int sum,int grade[]);//输出所有的学生学号,成绩
void count(int* max,int* min,double* pass,double ave[],double f[],STUDENT stu[],int sum);//计算期末考试成绩及格率、最高分最低分以及平时、期末和总评成绩的平均分和标准差
void show_data2(int max,int min,double pass,double ave[],double f[]);//显示期末考试成绩及格率、最高分最低分以及平时、期末和总评成绩的平均分和标准差
void draw(int grade[]);//画出频率分布直方图
int main()
{
    int sum = 0,max = 0,min = 0;//初始化数据
    double pass = 0;
    int SIZE = 0;
    printf("请输入学生人数\n");
    scanf("%d",&SIZE);
    int grade[11] = {0};
    STUDENT stu[SIZE];
    double ave[SIZE],f[SIZE];
    sum = accept_date(stu,grade,SIZE);//输入数据
    show_data(stu,sum,grade);//输出所有的学生学号,成绩
    count(&max,&min,&pass,ave,f,stu,sum);//计算期末考试成绩及格率、最高分最低分以及平时、期末和总评成绩的平均分和标准差
    show_data2(max ,min,pass,ave,f );//显示期末考试成绩及格率、最高分最低分以及平时、期末和总评成绩的平均分和标准差
    draw(grade);//画出直方图
    return 0;
}

5.3 fuction.c

#include "function.h"
int accept_date(STUDENT stu[],int grade[],int size_t)//输入数据声明
{
    int i = 0,sum = 0,temp = 0,a1 = 0,a2 = 0;
    FLAG flag;
    printf("请输入期中期末占总评成绩的百分比,用整数表示\n");
    scanf("%d %d",&a1,&a2);
    while(i<size_t){
        printf("请输入学号:\n");
        scanf("%d",&stu[i].number);
        if(stu[i].number==-1)
        {
            sum = i;
            break;//sum记录的是输入的人数
        }
        printf("请输入平时成绩和期末成绩:\n");
        flag = True;
        while(flag==True)//重复读取成绩,直到正确为止
        {
            scanf("%d %d",&stu[i].source[0],&stu[i].source[1]);
            if(stu[i].source[0]<=100&&stu[i].source[0]>=0&&stu[i].source[1]<=100&&stu[i].source[1]>=0)//输入成绩合理,停止循环
            {
                flag = False;
            }
            else//输入成绩不合理,重新输入
            {
                printf("输入错误,请重新输入。\n");
            }
        }
        temp = (int)(1.0*a1/100*stu[i].source[0]+1.0*a2/100*stu[i].source[1]);//计算总评成绩
        stu[i].source[2] = temp;
        temp = stu[i].source[1]/10; //分数分段
           if(temp==10)
           {
               grade[10]++;
           }
           else
           {
               grade[temp+1]++;
           }
           i++;
    }
    return sum;
}
void show_data(STUDENT stu[],int sum,int grade[])//输出成绩
{
    for (int i = 0; i < sum; ++i)
    {
        printf("%d",stu[i].number);//输出学号
        for (int j = 0; j < 3; ++j)
        {
            printf("%d",stu[i].source[j]);//输出期中期末总评
            printf("\n");
        }
    }
    for (int i = 0; i < 10; ++i)
    {
        printf("%d\n",grade[i]);
    }
}
void count(int* max,int* min,double* pass,double ave[],double f[],STUDENT stu[],int sum)
{
    int i = 0, j = 0, p_sum = 0;
    int total[3];
    double temp = 0;
    *max = *min = stu[0].source[1];//最大最小值初始化
    if(stu[0].source[1]>=60)
    {
        p_sum++;
    }
    for ( i = 1; i < sum; ++i)
    {
        if(stu[i].source[1]>*max)
        {
            *max = stu[i].source[1];//若高于最高分,将其覆盖
        }
        if(stu[i].source[1]<*min)
        {
            *min = stu[i].source[1];//若低于最低分,将其覆盖
        }
        if(stu[i].source[1]>=60)
        {
            p_sum++;//计算及格的人数
        }
    }
    *pass = (1.0*p_sum/sum)*100;//计算及格率
    for ( i = 0; i <= 2; ++i)
    {
        total[i] = 0;
    }
    for (j = 0; j < 3; j++)
    {
        for (int i = 0; i < sum; ++i)
        {
        total[j] = total[j] + stu[i].source[j];
        }
    }
    for ( j = 0; j < 3; ++j)
    {
     ave[j] = total[j]/sum;
    }
    for (j = 0; j < 3; j++)//计算标准差
    {
        f[j] = 0;
        for (i = 0; i < sum; i++)
        {
            temp = stu[i].source[j] - ave[j];
            f[j] = f[j] + temp*temp;
        }
        f[j] = sqrt(fabs(f[j])/sum);
    }
}
void show_data2(int max,int min,double pass,double ave[],double f[])
{
    int j = 0;
    char str1[3][20] = {"平时成绩平均分","期末成绩平均分","总评成绩平均分"};
    char str2[3][20] = {"平时成绩标准差","期末成绩标准差","总评成绩标准差"};
    printf("及格率:%f 最高分:%d 最低分:%d\n",pass,max,min);//输出期末及格率,最高分,最低分
    for (int i = 0; i < 3; ++i)
    {
        printf("%s = %f %s = %f\n",str1[i],ave[i],str2[i],f[i]);//循环输出平时期末总评成绩的平均分和标准差
    }
}
void draw(int grade[])
{
    int max = 0,k = 0, temp = 0, x = 0;
    char screen[22][24];
    printf("模拟直方图\n");
    for (int i = 1; i <= 10; ++i)
    {
        if(grade[i]>max)
        {
            max = grade[i];
        }
    }
    for (int i = 1; i <= 10; ++i)
    {
        grade[i]=(int)(20.0*grade[i]/max+0.5);//计算显示星号个数
    }
    for (int i = 0; i <= 21; i++)//现将所有点清零
    {
        for (int j = 0; j <= 42; j++)
        {
            screen[i][j] = 0;
        }
    }
    //画x轴
    for (int i = 0; i < 41; ++i)
    {
        screen[21][i] = '_';
    }
    screen[21][41] = 'x';
    //画y轴
    screen[0][0] = 'y';
    for (int i = 1; i <= 21;i++)
    {
        screen[i][0] = '|';
    }
    k = 1;
    for (x = 1; x <= 10; x++,k=k+4)
    {
        temp = grade[x];
        if(temp!=0)
        {
            for (int i =1 ; i <= temp; i++)
            {
                for (int j = 1; j <= 4; j++)
                {
                    screen[20-i+1][j+k] = '*';
                }
            }
        }
    }
    for (int i = 0; i <= 21; i++)
    {
        for (int j = 0;j <=41; j++)
        {
            if(screen[i][j]!=0)
            {
                printf("%c",screen[i][j]);
            }
            else
            {
                printf(" ");
            }
            printf("\n");
        }
        printf("0 10 20 30 40 50 60 70 80 90 100\n");
    }
    getch();
}

6 主要C语言知识点

  • 函数
  • 多维数组
  • 指针
  • 结构体
  • 循环
相关文章
|
1月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
52 13
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
36 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
19 2
|
7月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
106 0
C语言实战 | Flappy Bird游戏
|
3月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
53 1
|
5月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
544 8
|
5月前
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
108 2
|
5月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
127 2
|
5月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
5月前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。

热门文章

最新文章