学籍管理系统C语言课程设计.doc
#include <stdio.h>typedef struct int Id;char name10;char sex6; int room;int tel20; StudentInfo;typedef struct int Id;char courseNo10;char courseName20;float a; / 课程学分float b; / 平时成绩float c; / 实验成绩float d; / 卷面成绩float e; / 综合成绩float f; / 实际学分 GradeInfo;/ 定义结构数组为全局变量StudentInfo si100; / 学生信息结构数组GradeInfo gi500; / 学生成绩结构数组int sp=0; / 学生信息结构数组中学生数int gp=0; / 学生成绩结构数组中成绩数void ReadFile();/读取文件void DisplayMainMenu();/主菜单void DataInput();/数据录入void DataQuery();/数据查询void DataDelete();/数据删除void DataSort();/排序void QueryById(int );/按学号查询void QueryByRoom(int );/按宿舍查询void QueryGrade(int );/成绩查询void sort1();/按综合成绩排序void sort2();/按实得学分排序void gradeput();void e_min();void main()int x; ReadFile(); / 从文件中读取数据对两个结构数组赋值, 采用子函数的形式可以使主程序结构清楚int flag =1;while (flag) DisplayMainMenu(); / 因为要多次调用工作菜单,要采用子函数的形式scanf ("%d",&x);switch (x)case 1 :DataInput(); break; /case 2 :DataQuery(); break; /case 3 :DataDelete(); break; /case 4 :DataSort(); break; / case 5 :e_min(); break;case 6 :flag = 0;void ReadFile() FILE *fp;fp = fopen("C:A.txt","r+");while (!feof(fp)/检查文件是否结束fscanf(fp,"%d%s%s%d%s", &sisp.Id,sisp.name,sisp.sex,&sisp.room,sisp.tel);sp+;fclose (fp);fp = fopen("C:B.txt","r+");while (!feof(fp)fscanf (fp,"%d%s%s%f%f%f%f%f%f",&gigp.Id,gigp.courseNo,gigp.courseName,&gigp.a,&gigp.b,&gigp.c, &gigp.d,&gigp.e,&gigp.f);if (gigp.c=-1) gigp.e=0.3*gigp.b+0.7*gigp.d;else gigp.e=0.15*gigp.b+0.15*gigp.c+0.7*gigp.d;if ( gigp.e>=90.0) gigp.f = gigp.a;else if (gigp.e>=80.0) gigp.f=gigp.a *0.8;else if (gigp.e>=70.0)gigp.f=gigp.a *0.75;else if (gigp.e>=60.0) gigp.f=gigp.a*0.6;else gigp.f=0;gp+;/ 学生成绩结构数组中成绩数+1fclose(fp);void DisplayMainMenu()printf("*欢迎进入学籍信息系统*nn");printf(" (1) 数据录入 n ");printf(" (2) 数据查询 n ");printf(" (3) 数据删除 n ");printf(" (4) 数据排序 n ");printf(" (6) 程序结束 n ");printf("*");printf("n请输入你要执行的任务:");void DataInput()int m=0,i;printf("请输入您想录入的学生数目:");scanf("%d",&m);printf("学生的学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩n"); for(i=gp;i<=m+gp-1;i+)scanf ("%d%s%s%f%f%f%f",&gii.Id,gii.courseNo,gii.courseName,&gii.a,&gii.b,&gii.c, &gii.d);if (gii.c=-1) gii.e=0.3*gii.b+0.7*gii.d;/计算综合成绩else gii.e=0.15*gii.b+0.15*gii.c+0.7*gii.d;printf("综合成绩为:%f",gii.e);if ( gii.e>=90) gii.f=gii.a;else if ( gi i.e >= 80) gii.f=gii.a *0.8;else if ( gii.e >= 70)gii.f=gii.a *0.75;else if ( gii.e >= 60) gii.f=gii.a *0.6;else gii.f=0;/计算实得学分 printf("实得学分为:%fn",gii.f);FILE *fp;fp=fopen("C:B.TXT","w");if(fp=fopen("C:B.TXT","w")=NULL)printf("无法打开文件n");return;for(i=0;i<gp+m;i+)fprintf(fp,"n%d %s %s %.3f %.3f %.3f %f %f %f",gii.Id,gii.courseNo,gii.courseName,gii.a,gii.b,gigp.c, gii.d,gii.e, gii.f);fclose(fp);void DataQuery()int x,y,z;printf( "n 1)学生基本情况查询n 2)成绩查询n 3) 查询综合成绩最低分n");scanf("%d",&x);if (x = 1) / 查询学生信息printf ("1)按学号查询 2)按宿舍查询n");scanf("%d",&y);if (y = 1 ) printf ( " 输入学号n"); scanf ("%d",&z);QueryById(z);/按学号查询if (y = 2) printf ( " 输入宿舍号n"); scanf ("%d",&z);QueryByRoom(z);/按宿舍查询if ( x =2) / 查询成绩信息printf ( " 输入学号n"); scanf ("%d",&y);QueryGrade(y);if (x=3)e_min();void DataDelete()int x;int i=0;int k,d;printf("学生基本信息");printf ("n学号姓名性别宿舍号码电话号码n"); for( i=0;i<sp-1;i+) printf ("%d%s%s%d%sn",sii.Id,sii.name,sii.sex,sii.room,sii.tel);printf("学生成绩基本信息");printf("n学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分n");for( i=0;i<gp-1;i+)printf("%d %s %s %f%f %f %f %f %fn",gii.Id,gii.courseNo,gii.courseName,gii.a,gii.b,gii.c,gii.d,gii.e,gii.f);printf( "输入学号n");scanf( "%d",&x);i=0;while( sii.Id != x) i+;if (i<sp-1)for ( k=i; k<sp-1; k+)sik = sik+1; / 删除一个数据后,其他数据前移if (i<sp) sp-;d=0; / 成绩数组中,有多个相同的学号,都要删除,并且后面的数据需要前移for (k=0;k<gp;k+)if (gik.Id=x) d+;else gik-d=gik;gp=gp-d;printf("学生基本信息");printf ("n学号姓名性别宿舍号码电话号码n"); for(i=0;i<sp-1;i+) printf ("%d%s%s%d%sn",sii.Id,sii.name,sii.sex,sii.room,sii.tel);printf("学生成绩基本信息");printf("n学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分n");for(i=0;i<gp-1;i+)printf("%d %s %s %f%f %f %f %f %fn",gii.Id,gii.courseNo,gii.courseName,gii.a,gii.b,gii.c,gii.d,gii.e,gii.f);void QueryById(int x)int i;for (i=0;i<sp;i+)if ( sii.Id = x ) printf ("n学号姓名性别宿舍号码电话号码n");printf ("%d%s%s%d%sn",sii.Id,sii.name,sii.sex,sii.room,sii.tel);void QueryByRoom(int x)int i;for (i=0;i<sp;i+)if ( sii.room = x ) printf ("n学号姓名性别宿舍号码电话号码n");printf ("%d%s%s%d%sn",sii.Id,sii.name,sii.sex,sii.room,sii.tel);void QueryGrade(int x)int i;int sc=0;float sg=0;printf("n学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分n");for (i=0;i<gp;i+)if ( gii.Id = x ) sc+;sg += gii.f;printf("%d%s %s %.3f %.3f %.3f %f %f %fn",gii.Id,gii.courseNo,gii.courseName,gii.a,gii.b,gii.c,gii.d,gii.e,gii.f);printf ("共修:%d科,实得总分为:%fn",sc,sg);void DataSort()int x;printf ("1)综合成绩排序n2)实际学分排序n");scanf("%d",&x);if ( x = 1 ) sort1();if ( x = 2 ) sort2();void sort1()int i,j;GradeInfo t;for (i=gp-1;i>=1;i-)for (j=0;j<i;j+)if (gij.e>gij+1.e) / 如果改为 gij.e< gij+1.e 则为逆序 t=gij;gij = gij+1;gij+1 = t;gradeput();FILE *fp;fp=fopen("C:按综合成绩排序.TXT","w");if(fp=fopen("C:按综合成绩排序.TXT","w")=NULL)printf("无法打开文件n");return;for( i=0;i<gp;i+)fprintf(fp,"%d %s %s %f%f %f %f %f %fn",gii.Id,gii.courseNo,gii.courseName,gii.a,gii.b,gii.c,gii.d,gii.e,gii.f);fclose(fp);void sort2()int i,j;GradeInfo t;for (i=gp-1;i>=1;i-)for (j=0;j<i;j+)if (gij.f>gij+1.f) / 如果改为 gij.f< gij+1.f 则为逆序 t=gij;gij = gij+1;gij+1 = t;gradeput();FILE *fp;fp=fopen("C:按学分排序.TXT","w");if(fp=fopen("C:按学分排序.TXT","w")=NULL)printf("无法打开文件n");return;for( i=0;i<gp;i+)fprintf(fp,"%d %s %s %f%f %f %f %f %fn",gii.Id,gii.courseNo,gii.courseName,gii.a,gii.b,gii.c,gii.d,gii.e,gii.f);fclose(fp);void gradeput()int i;printf("n学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分n");for( i=0;i<gp;i+)printf("%d %s %s %f%f %f %f %f %fn",gii.Id,gii.courseNo,gii.courseName,gii.a,gii.b,gii.c,gii.d,gii.e,gii.f);void e_min()float emin=100;int i,j;for (i=gp-1;i>=1;i-)if(gii.e<emin)emin=gii.e;printf("综合成绩最低分为:%fn",emin);