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语言知识点

  • 函数
  • 多维数组
  • 指针
  • 结构体
  • 循环

C语言实战项目——学生试卷分数统计的更多相关文章

  1. Kafka项目实战-用户日志上报实时统计之应用概述

    1.概述 本课程的视频教程地址:<Kafka实战项目之应用概述> 本课程是通过一个用户实时上报日志来展开的,通过介绍 Kafka 的业务和应用场景,并带着大家搭建本 Kafka 项目的实战 ...

  2. Kafka项目实战-用户日志上报实时统计之编码实践

    1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践>  该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ...

  3. Kafka项目实战-用户日志上报实时统计之分析与设计

    1.概述 本课程的视频教程地址:<Kafka实战项目之分析与设计>  本课程我通过一个用户实时上报日志案例作为基础,带着大家去分析Kafka这样一个项目的各个环节,从而对项目的整体设计做比 ...

  4. WinForm多语言版本实战项目演练

    一.课程介绍 关于如何实现“WinForm多语言版本”网上有很多实现技术方案,可以说是“琳琅满目”,"包罗万象".俗话说的好:一千个读者就有一千个哈姆雷特!如果您工作中恰好也遇到这 ...

  5. go语言实战教程:Redis实战项目应用

    项目Redis配置 在实战项目中使用Redis功能,首先需要进行Redis配置.本实战项目中,关与Redis的配置项包含:连接类型.地址.端口.公共前缀.以上配置项被定义包含在Iris框架的redis ...

  6. Go语言实战爬虫项目

    Go语言爬虫框架之Colly和Goquery Python爬虫框架比较多有requests.urllib, pyquery,scrapy等,解析库有BeautifulSoup.pyquery.Scra ...

  7. C语言 · 分数统计

    算法提高 分数统计   时间限制:1.0s   内存限制:512.0MB      问题描述 2016.4.5已更新此题,此前的程序需要重新提交. 问题描述 给定一个百分制成绩T,将其划分为如下五个等 ...

  8. go语言实战教程:项目文件配置和项目初始化运行

    在上节内容中,我们已经搭建了实战项目框架,并将实战项目开发所需要的静态资源文件进行了导入.在本节内容中,我们将讲解如何通过相关的配置,并初始化运行项目. conf配置文件读取配置信息 我们前面说过,使 ...

  9. go语言实战教程:实战项目资源导入和项目框架搭建

    从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...

  10. R语言实战(九)主成分和因子分析

    本文对应<R语言实战>第14章:主成分和因子分析 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量成为主成分. 探索性因子分析(EFA)是 ...

随机推荐

  1. baselines库中atari_wrappers.py中的环境包装器的顺序问题

    如题: 在baselines中对atari游戏环境进行包装的代码在atari_wrappers.py模块中, def make_atari(env_id, max_episode_steps=None ...

  2. 第 356 场周赛 - 力扣(LeetCode)

    第 356 场周赛 - 力扣(LeetCode) 2798. 满足目标工作时长的员工数目 - 力扣(LeetCode) 一次遍历 class Solution { public: int number ...

  3. dfs剪枝与优化

    搜索树 剪枝方法 1.优化搜索顺序 2.排除等效冗余 3.可行性 4.最优性(估价) 5.记忆化(树形不会重复计算时不需要) A.针对每个维度边界信息缩放.推倒 B.计算未来最少花费 C.结合各维度的 ...

  4. 技术如何通过API接口获取自己想要同款商品的数据

    确定数据源: 首先,你需要确定哪些平台或服务提供商提供了你感兴趣的商品数据.例如,电商平台.品牌商.市场调研公司等. 了解API文档: 访问提供商的开发者门户网站,阅读API文档.文档会详细介绍如何使 ...

  5. 生产者消费者模式,以及基于BlockingQueue的快速实现

    生产者消费者模式,以及基于BlockingQueue的快速实现什么是生产者消费者模式,简单来说就是有两个角色,一个角色主要负责生产数据,一个角色主要负责消费(使用)数据.那么生产者直接依赖消费者,然后 ...

  6. 【VMware VCF】VCF 5.2:挂载远程 vSAN 数据存储。

    VMware vSAN 解决方案中,为了充分利用 vSAN HCI 集群内的存储资源, vSAN HCI 和 vSAN HCI 集群之间可以相互共享存储资源,这种解决方案早期叫 vSAN HCI Me ...

  7. 【前端js】之小数点保留时的四舍五入问题

    项目遇到金额小数点保留位数,极个别的数会差一分,经调查是因为js的问题. 解决办法: # 方法一:保留两位小数 function keepTwoDecimal(num) { var result = ...

  8. MJUCTF—WP

    1.猫娘 点开发现有两个文件, 一个加密压缩包, 一个word文档 点开word发现是兽音加密, 点开在线网站进行解密 # 得到一段文本, 先进行分割 小小年内则伏勤, 阵阵寒风刺骨寒. 是处寂寞无人 ...

  9. Android : Found byte-order-mark in the middle of a file

    1. 首先,打包App,然后打包报错, views里提示,要加上 android { lintOptions { checkReleaseBuilds false //不检查发布版中的错误 abort ...

  10. OpenTelemetry 实战:gRPC 监控的实现原理

    前言 最近在给 opentelemetry-java-instrumentation 提交了一个 PR,是关于给 gRPC 新增四个 metrics: rpc.client.request.size: ...