《C语言》课程设计——学生成绩统计

一、课题功能描述

在计算机文化基础课中讲了用EXCEL处理数据表,可以对数据表进行填充数据、分类汇总等操作,要求对表1所示的数据表填充总成绩,并按班级求期末成绩、平时成绩和总成绩的平均分,各班期末成绩的最高分和最低分。
对表1所示的数据表进行填充和分类汇总,具体操作如下:
(1)填充总成绩,公式为:总成绩=期末成绩70%+平时成绩30%。
(2)分类汇总:

  • 1)按班级求期末成绩、平时成绩和总成绩的平均分
  • 2)各班期末成绩的最高分和最低分。

二、基本原理

本程序应采用模块化设计方法,设计多个功能模块(函数)。数据组织形式采用结构体数组存放成绩信息。

三、主要技术问题的描述

(1)采用结构体数组存储表1的数据表,结构体的成员中班级、学号、姓名字段为字符型(char),期末成绩、平时成绩和总成绩成员为数值型,类型为double型。
定义如下:

struct student
{
    char bj[10];;
    char xh[9];
    char xm[8];
    double qmchj;
    double pshchj;
    double zchj ;
} std_s[10];    //此处结构体数组元素可以先设为10个,调好后,再增加。

(2)调试时,提供数据的方法可以采用初始化或输入的方法。首先,以5-10条记录进行测试,具体记录可在表1中选择,程序调试正确后,再增加记录量。
该题涉及到数组可参考教材第4章,函数参考教材第5章,结构体参考第6章。分类实际就是排序算法,讲过冒泡排序和选择排序,自己任选一种,注意,对班级排序是字符串排序,字符串比较要用字符串比较函数。
(3)输出结果要求:

  • (1)输出填充结果的数据表,形式如表1。
  • (2)输出按班级汇总后的期末成绩、平时成绩和总成绩平均分,形式如下:

班级 期末成绩平均分 平时成绩平均分 总成绩平均分
传媒1
传媒2
传媒3

  • (3)输出各班期末成绩的最高分和最低分,形式如下:

班级 最高分 最低分
传媒1
传媒2
传媒3

表1 各班学生成绩信息表(共38人)
班级 学号 姓名 期末成绩 平时成绩 总成绩
传媒1 10641301 刘晓玮 65 80  
传媒2 10641302 夏海霞 74 85  
传媒1 10641303 陈威 81 90  
传媒2 10641304 周莉 87 90  
传媒3 10641305 贾君 75 90  
传媒1 10641306 韩晓萍 58 80  
传媒2 10641307 奚景泊 80 90  
传媒3 10641308 胡华 85 95  
传媒1 10641309 李栋 93 95  
传媒2 10641310 李建炎 70 80  
传媒3 10641311 包黎年 69 90  
传媒1 10641312 李娟 92 95  
传媒2 10641313 何小卫 84 90  
传媒3 10641314 王平平 67 85  
传媒1 10641315 陈治同 80 90  
传媒2 10641316 赵荣 84 90  
传媒3 10641317 徐清泉 85 95  
传媒1 10641318 邹伟斌 75 90  
传媒2 10641319 李文辉 78 95  
传媒3 10641320 魏楠 87 90  
传媒1 10641321 朱敏敏 91 95  
传媒2 10641322 丁志刚 60 90  
传媒3 10641323 周开俊 70 90  
传媒1 10641324 吴俊 80 80  
传媒2 10641325 管峰 89 95  
传媒3 10641326 蒋佳佳 83 90  
传媒1 10641327 王奇安 88 80  
传媒2 10641328 张赛男 88 90  
传媒3 10641329 周玲玲 84 90  
传媒1 10641330 毛佳禹 91 95  
传媒2 10641331 赵金金 88 90  
传媒3 10641332 周天炯 67 90  
传媒1 10641333 卜英杰 67 85  
传媒2 10641334 杜宁波 74 90  
传媒3 10641336 侯蕴慧 62 80  
传媒1 10641337 陆菊杰 85 90  
传媒2 10641338 王贞 79 85  
传媒3 10641339 颜执栋 95 95

四、程序代码

#include<stdio.h>
#include<string.h>


struct student{
    char bj[10];    //学生班级
    char xh[9];     //学号
    char xm[8];     //姓名
    double qmchj;   //期末成绩
    double pshchj;  //平时成绩
    double zchj;    //总成绩
} std_s[100];

struct banji{       //由于班级有多个,所以定义一个结构体方便信息的记录和使用
	double qmchj;   //班级平均期末成绩
    double pshchj;  //班级平均平时成绩
    double zchj;    //班级平均总成绩
	double low;     //班级最低成绩
	double high;    //班级最高成绩
	int renshu;     //班级人数
}ban[10];

int stunum;         //导入的成绩条数

void main(){
	printf("请输入要导入成绩的人数:");
	scanf("%d",&stunum);
	printf("班级\t学号\t姓名\t期末\t平时\n");
	for(int i=0;i<stunum;i++){              //输入学生信息
		scanf("%s%s%s%lf%lf",&std_s[i].bj,&std_s[i].xh,&std_s[i].xm,&std_s[i].qmchj,&std_s[i].pshchj);
		std_s[i].zchj=std_s[i].pshchj*0.3+std_s[i].qmchj*0.7;       //计算个人总成绩
	}
	printf("\n班级\t学号\t姓名\t期末\t平时\t总成绩\n");     //循环输出成绩
	for(int i=0;i<stunum;i++){
		printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\n",std_s[i].bj,std_s[i].xh,std_s[i].xm,std_s[i].qmchj,std_s[i].pshchj,std_s[i].zchj);
	}

	ban[0].renshu=0;    //将各班班级人数初始化为0,每插入一条+1
	ban[1].renshu=0;
	ban[2].renshu=0;

	printf("\n按班级汇总");
	for(int i=0;i<stunum;i++){               //将各班各项成绩进行累加
		if(strcmp(std_s[i].bj,"传媒1")==0){
			ban[0].pshchj+=std_s[i].pshchj;      
			ban[0].qmchj+=std_s[i].qmchj;
			ban[0].zchj+=std_s[i].zchj;
			ban[0].renshu++;                 //每识别到一条 传媒1班的信息,人数+1
		}
		else if(strcmp(std_s[i].bj,"传媒2")==0){
			ban[1].pshchj+=std_s[i].pshchj;
			ban[1].qmchj+=std_s[i].qmchj;
			ban[1].zchj+=std_s[i].zchj;
			ban[1].renshu++;                //每识别到一条 传媒2班的信息,人数+1
		}
		else{
			ban[2].pshchj+=std_s[i].pshchj;
			ban[2].qmchj+=std_s[i].qmchj;
			ban[2].zchj+=std_s[i].zchj;
			ban[2].renshu++;                //每识别到一条 传媒3班的信息,人数+1
		}
	}

	printf("\n班级\t期末\t平时\t总成绩\n");
	for(int i=0;i<3;i++){                   //输出各班平均的期末成绩、平时成绩、总成绩
		printf("传媒%d\t%.1f\t%.1f\t%.1f\n",i+1,ban[i].qmchj/ban[i].renshu,ban[i].pshchj/ban[i].renshu,ban[i].zchj/ban[i].renshu);
	}

	ban[0].high=0;          //将各个班最高成绩初始化为0,最低成绩初始化为100
	ban[0].low=100;
	ban[1].high=0;
	ban[1].low=100;
	ban[2].high=0;
	ban[2].low=100;

	printf("\n各班最高最低分:\n");
	for(int i=0;i<stunum;i++){                      //通过strcmp函数,判断学生在哪个班
		if(strcmp(std_s[i].bj,"传媒1")==0){
			if(std_s[i].zchj<=ban[0].low)           //当发现学生成绩<=班级现在的最低成绩时,则将班级最低成绩改写为该同学成绩。
				ban[0].low=std_s[i].zchj;
			if(std_s[i].zchj>=ban[0].high) 
				ban[0].high=std_s[i].zchj;          //当发现学生成绩>=班级现在的最高成绩时,则将班级最高成绩改写为该同学成绩。
		}
		else if(strcmp(std_s[i].bj,"传媒2")==0){
			if(std_s[i].zchj<=ban[1].low)           //当发现学生成绩<=班级现在的最低成绩时,则将班级最低成绩改写为该同学成绩。
				ban[1].low=std_s[i].zchj;
			if(std_s[i].zchj>=ban[1].high)
				ban[1].high=std_s[i].zchj;          //当发现学生成绩>=班级现在的最高成绩时,则将班级最高成绩改写为该同学成绩。
		}
		else{
			if(std_s[i].zchj<=ban[2].low)
				ban[2].low=std_s[i].zchj;           //当发现学生成绩<=班级现在的最低成绩时,则将班级最低成绩改写为该同学成绩。
			if(std_s[i].zchj>=ban[2].high)
				ban[2].high=std_s[i].zchj;          //当发现学生成绩>=班级现在的最高成绩时,则将班级最高成绩改写为该同学成绩。
		}
	}
	printf("班级\t最高\t最低\n");         
	for(int i=0;i<3;i++){                           //输出各班最高最低信息
		printf("传媒%d\t%.1f\t%.1f\n",i+1,ban[i].high,ban[i].low);
	}
}


  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值