完成教务系统成绩批量导入和成绩统计功能。本系统由三大模块组成: 读入成绩模块、成绩统计模块、奖学金统计模块。
1.读入成绩模块
1)从文件.txt 文件中读取学生成绩信息,每个.txt文档记录着学生一门课的成绩,实例文件一共有2门课的成绩。(有可能不同的课程,不只一个文档,比如数据结构,由平时成绩文档和期末考试文档,你需要读取两个文档。)
显示成绩
2)成绩计算
计算每门课程的总成绩
每门课程的成绩又分为3项,分别是出勤成绩20%、平时成绩30%、和期末考试成绩50%。期末考试成绩没有过51分的,没有平时成绩,总成绩为考试成绩。期末考试高于51分的(大于等于51)计算平时成绩,总成绩 = 考试成绩*0.5+出勤成绩*0.2+平时成绩*0.3。计算每门课每位学生的总成绩。按降序对总成绩排序。
注:数据结构平时成绩取实验1、3、5、7成绩,每次5%,大作业成绩10%共同构成30%的平时成绩(注意:平时成绩需要以百分制显示)
显示:
数据结构成绩
学号 姓名 平时成绩 出勤 考试成绩 总成绩 绩点 学分
100001 Victor 100 100 100 100 5 4
100010 Jack 100 100 90 95 4 4
算法成绩
学号 姓名 平时成绩 出勤 考试成绩 总成绩 绩点 学分
100001 Victor 100 100 90 95 5 4
100010 Jack 100 100 80 90 4 4
2. 成绩统计模块
按课程对总成绩进行分数段成绩统计
统计最高分、最低分、各个分数段的人数,[90,100],[80,90),[80-70),[70-60],60以下。计算不及格率
显示:
数据结构:
最高分 最低分 不及格率
100 40 35%
[90,100] [80,90) [80-70) [70-60] 60以下
5 20 24 5 2
算法:
最高分 最低分 不及格率
90 30 33%
[90,100] [80,90) [80-70) [70-60] 60以下
1 5 24 13 2
3.奖学金统计模块。
计算每位学生的平均绩点
每门课程除了总成绩还有学分和绩点,100分绩点是5分,60分绩点是1分,80分绩点是3分,90分绩点是4分,求每位学生2门课的平均绩点,平均绩点 = (课程1绩点*课程1学分+课程2绩点*课程2学分)/(课程2学分+课程1学分)平均绩点降序排序
显示:
学号 姓名 平均绩点
100001 Victor
平均绩点位于前5%(按宁缺勿滥的原则)的学生给予1等奖学金,位于5%-10%获得2等奖学金,位于10%-20%获得3等奖学金。
一等奖奖学金名单:
二等奖奖学金名单:
三等奖奖学金名单:
成绩管理系统
1导入成绩
输入需要导入文件的路径:
选择序号输出单科成绩(1数据结构成绩/2算法成绩):
是否返回上层(Y/N):
2成绩统计
选择序号输出单科成绩(1数据结构成绩/2算法成绩):
是否返回上层(Y/N):
3奖学金统计
0退出系统:
将系统运行截图放入word文档提交,系统代码.c或.cpp文档提交到课堂派。注意不提交.txt的学生数据文件!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 40
typedef struct studentsf
{//存放学生数据及成绩的结构体
char name[12]; //姓名
char num[12]; //学号
int sy[7]; //实验1-7的成绩
int dzy; //大作业
int cq; //出勤成绩
int qm; //期末成绩
}stusf;
stusf s[N]; //结构体数组全局变量,用于存放40位学生的数据
typedef struct stugrade
{//存放学生总评成绩的结构体
char name[12]; //姓名
char num[12]; //学号
int daily,kq,final,zcj; //平时成绩,考勤成绩,期末成绩,总成绩
int jd,xf;
}stug;
stug sg[N]; //结构体数组全局变量,用于存放40位学生的总评成绩
int a[N]={0};
//成绩管理系统
//1导入成绩
// 输入需要导入文件的路径:
// 选择序号输出单科成绩(1数据结构成绩/2算法成绩):
// 是否返回上层(Y/N):
//2成绩统计
//选择序号输出单科成绩(1数据结构成绩/2算法成绩):
//是否返回上层(Y/N):
//3奖学金统计
//
//0退出系统:
void readfile1(char *ch)
{//读取学生平时成绩的文件
FILE *fp;
fp=fopen(ch,"r");
if(fp==NULL)
printf("打开文件失败\n");
char c_1[8],c_2[80];
int n,i,j;
fscanf(fp,"%s\n",c_1);
fscanf(fp,"%d\n",&n);
fgets(c_2,80,fp);
for(i=0;i<N;i++)
fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",s[i].num,s[i].name,&s[i].sy[1],&s[i].sy[2],&s[i].sy[3],&s[i].sy[4],&s[i].sy[5],&s[i].sy[6],&s[i].sy[7],&s[i].dzy,&s[i].cq);
fclose(fp);
}
void readfile2(char *ch)
{//读取学生期末成绩的文件
FILE *fp;
fp=fopen(ch,"r");
if(fp==NULL)
printf("打开文件失败\n");
char c_2[80];
int i;
fgets(c_2,80,fp);
for(i=0;i<N;i++)
fscanf(fp,"%s\t%s\t%d\n",s[i].num,s[i].name,&s[i].qm);
fclose(fp);
}
void display()
{//显示学生数据及成绩
int i,j;
printf("数据结构\t%d\n",N);
printf("学号\t\t姓名\t实验1\t实验2\t实验3\t实验4\t实验5\t实验6\t实验7\t大作业\t出勤\t期末成绩\n");
for(i=0;i<N;i++){
printf("%s\t%s\t",s[i].num,s[i].name);
for(j=1;j<=7;j++)
printf("%d\t",s[i].sy[j]);
printf("%d\t%d\t%d\n",s[i].dzy,s[i].cq,s[i].qm);
}
}
void culgrade()
{//计算成绩
int i;
for(i=0;i<N;i++){
strcpy(sg[i].name,s[i].name);
strcpy(sg[i].num,s[i].num);
sg[i].kq=(int)(s[i].cq/20*100);
sg[i].daily=(int)(((s[i].sy[1]+s[i].sy[3]+s[i].sy[5]+s[i].sy[7])*0.05+s[i].dzy*0.1)/30*100);
sg[i].final=s[i].qm;
if(s[i].qm<51)
sg[i].zcj=s[i].qm;
else
sg[i].zcj=(int)(sg[i].daily*0.3+sg[i].kq*0.2+sg[i].final*0.5);
if (sg[i].zcj==100)
sg[i].jd=5;//总成绩100分绩点为5
else if(sg[i].zcj>=90&&sg[i].zcj<100)
sg[i].jd=4;//总成绩在90到99之间绩点为4
else if(sg[i].zcj>=80&&sg[i].zcj<90)
sg[i].jd=3;//总成绩在80到89之间绩点为3
else if(sg[i].zcj>=70&&sg[i].zcj<80)
sg[i].jd=2;//总成绩在70到79之间绩点为2
else if(sg[i].zcj>=60&&sg[i].zcj<70)
sg[i].jd=1;//总成绩在60到69之间绩点为1
else
sg[i].jd=0;//总成绩低于60分,不及格绩点为0
sg[i].xf=4;
strcpy(sg[i].num,s[i].num);
strcpy(sg[i].name,s[i].name);
}
// printf("学号\t\t姓名\t平时成绩\t考勤成绩\t期末成绩\t总成绩\t绩点\t学分\n");
// for(i=0;i<N;i++)
// printf("%s\t%s\t%d\t\t%d\t\t%d\t\t%d\t%d\t%d\n",sg[i].num,sg[i].name,sg[i].daily,sg[i].kq,sg[i].final,sg[i].zcj,sg[i].jd,sg[i].xf);
}
void sort(){//排序
int num[39]={0},index[39]={0},i,j,t,n=0;
for (i=0;i<40;i++){
num[i]=sg[i].zcj;
index[i]=i;
}
for (i=0;i<39;i++){//利用index数组记录排序后的数组下标,不改变原来数组中的元素值
for (j=0;j<39-i;j++){
if (num[index[j]]>num[index[j+1]]){
t=index[j];
index[j]=index[j+1];
index[j+1]=t;
}
}
}
printf ("--------------------------------------我是分割线--------------------------------------------\n");
printf ("数据结构成绩为:\n");
printf ("学号\t\t姓名\t平时成绩\t出勤\t考试成绩\t总成绩\t绩点\t学分\n");
for (i=39;i>=0;i--){
a[i]=index[i];
printf ("%s\t%s\t%d\t\t%d\t\t%d\t%d\t%d\t%d\n",sg[index[i]].num,sg[index[i]].name,sg[index[i]].daily,sg[index[i]].kq,sg[index[i]].final,sg[index[i]].zcj,sg[index[i]].jd,sg[index[i]].xf);
}
}
void mark(){
int i,count[5]={0};
for (i=0;i<40;i++){//依次统计处于各分段的人数
if (sg[i].zcj>=90&&sg[i].zcj<=100)
count[0]++;
else if (sg[i].zcj>=80&&sg[i].zcj<90)
count[1]++;
else if (sg[i].zcj>=70&&sg[i].zcj<80)
count[2]++;
else if (sg[i].zcj>=60&&sg[i].zcj<70)
count[3]++;
else
count[4]++;
}
float notpass=0;
notpass=(float)count[4]/40*100;//计算不及格率
printf ("数据结构课程中:\n");
printf ("最高分\t\t最低分\t\t不及格率\n");
printf ("%d\t\t%d\t\t%.2lf%%\n",sg[a[39]].zcj,sg[a[0]].zcj,notpass);
printf ("[90,100] [80,90) [70,80) [60,70) [60以下]\n");
for(i=0;i<=4;i++)
printf("%d\t",count[i]);
printf("\n");
}
void jxj(){
int i,fst=0,snd=0,trd=0;//一等、二等、三等奖学金的数量
fst=40*0.05;
snd=40*0.1;
trd=40*0.2;
int s1=39-fst,s2=39-fst-snd,s3=39-fst-snd-trd;//计算所要输出名单的起始位置
for (i=39;i>=0;i--){
printf ("%s\t%s\t%d\n",sg[a[i]].num,sg[a[i]].name,sg[a[i]].jd);
}
printf ("一等奖学金名单为:\n");//依次输出奖学金名单
printf ("学号\t\t姓名\t\t绩点\n");
for (i=39;i>s1;i--)//从第一名开始依次输出2次
printf ("%s\t%s\t\t%d\n",sg[a[i]].num,sg[a[i]].name,sg[a[i]].jd);
printf ("二等奖学金名单为:\n");
printf ("学号\t\t姓名\t\t绩点\n");
for (i=s1;i>s2;i--)//从第三名开始输出4次
printf ("%s\t%s\t\t%d\n",sg[a[i]].num,sg[a[i]].name,sg[a[i]].jd);
printf ("三等奖学金名单为:\n");
printf ("学号\t\t姓名\t\t绩点\n");
for (i=s2;i>s3;i--)//从第七名开始输出8次
printf ("%s\t%s\t\t%d\n",sg[a[i]].num,sg[a[i]].name,sg[a[i]].jd);
}
void menu()
{//目录
printf ("=============================\n");
printf ("| 成绩管理系统 |\n");
printf ("| 1导入成绩 |\n");
printf ("| 2成绩统计 |\n");
printf ("| 3奖学金统计 |\n");
printf ("| 0退出系统 |\n");
printf ("=============================\n");
printf("请输入要执行的操作数(0-3):");
}
main()
{
int flag=1,a1;
char ch[]={0};
while(flag){
menu();
scanf("%d",&a1);
switch(a1){
case 1:
printf("输入要导入平时成绩文件的路径:\n");//F:\\数据结构18计算机二班平时成绩1.txt
scanf("%s",ch);
readfile1(ch);
// char ch1[] = "F:\\数据结构18计算机二班平时成绩1.txt";
// readfile1(ch1);
printf("输入要导入期末成绩文件的路径:\n");//F:\\数据结构18计算机2班期末考试成绩.txt
scanf("%s",ch);
readfile2(ch);
// char ch2[] = "F:\\数据结构18计算机2班期末考试成绩.txt";
// readfile2(ch2);
display();
break;
case 2:
culgrade();
sort();
break;
case 3:
mark();
jxj();
break;
case 0:
flag = 0;
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
}
}
运行截图省略;