C语言程序设计实训课程设计(完成教务系统成绩批量导入和成绩统计功能)

完成教务系统成绩批量导入和成绩统计功能。本系统由三大模块组成: 读入成绩模块、成绩统计模块、奖学金统计模块。

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;

	  	}

	}

}

运行截图省略;

猜你喜欢

转载自blog.csdn.net/weixin_57398221/article/details/123788904