// 包含必须的头文件
#include<stdio.h> #include<stdlib.h> #include<string.h>
// 定义课程的结构体
struct course {
int num; //课程编号
char name[20]; // 课程名字
int result; // 学生的成绩
float credit; // 学分
};
// 定义成绩记录簿的结构体,每个学生修了4门课
struct scorelist { int num; //学号
char name[10]; //学生姓名
struct course subject[4]; //课程相关的数据。意思是一个学生修了4门课
};
int n=0; // n用来存储一共有多少个学生
struct scorelist score[200]; //初始化成绩记录簿,上限为200条学生成绩
// 查询课程的函数
void queryclass() { int number,i,j,max=0,count=0; float average;//平均分
float pass=0; //及格人数
printf("*********请输入要查询的课程编号:"); scanf("%d",&number);
// 遍历所有的学生,打印每个学生修的课程成绩 for(i=0;i<n;i++) // 遍历所有学生
{ for(j=0;j<4;j++) // 遍历当前学生所修的4门课 {
if(score[i].subject[j].num==number) // 如果符合此条件,说明当前条目即为用户查询的课程 {
printf("学号:%d 姓名:%s %s:%d\n",score[i].num,score[i].name,score[i].subject[j].name,score[i].subject[j].result);
if(score[i].subject[j].result>=60) pass++; max+=score[i].subject[j].result; count++; } } }
if(count!=0) {
average=(float)max/count; pass=pass/count;
printf("平均分:%f\n",average);
printf("及格率:%.2f%c\n\n",pass*100,37); } }
// 查询学生信息 void querystudent() { char xm[10]; int i,flag=0,j,a,xh;
printf("*********请输入要查询的项目: 1.学号 2.姓名;"); scanf("%d",&a);
if(a==1) scanf("%d",&xh); else scanf("%s",xm);
// 根据用户输入判定用户是根据学号还是姓名查询 switch(a) {
// 根据学号查询
case 1:
// 遍历查找用户所输入的学号
for(i=0;i<n;i++) if(score[i].num==xh){ j=i;flag=1;} if(flag==0) printf("*****抱歉没有找到.******"); // 没有找到,跳出 else //找到了用户输入的学号,打印 { printf("学号:%d 姓名: %s\n",score[j].num,score[j].name); printf("**课程编号 课程名称 课程成绩 课程学分**\n"); for(i=0;i<4;i++)
{printf("%d %s %d %5.2f\n",score[j].subject[i].num, score[j].subject[i].name,score[j].subject[i].result,score[j].subject[i].credit); } } break;
// 根据姓名查询 case 2:
// 遍历查找用户输入的姓名 for(i=0;i<n;i++) if(strcmp(score[i].name,xm)==0) {j=i;flag=1; } if(!flag) printf("*****抱歉没有找到.******"); else // 找到了用户输入的学生姓名,打印 { printf("学号:%d 姓名: %s\n",score[j].num,score[j].name); printf("课程编号 课程名称 课程成绩 课程学分\n"); for(i=0;i<4;i++) {
printf("%d %s %d %f\n",score[j].subject[i].num, score[j].subject[i].name,score[j].subject[i].result,score[j].subject[i].credit); } } break;
default:printf("****输入错误!!****"); } }
// 删除一条学生记录 void del() { char xm[10];
printf("****请输入姓名: "); scanf("%s",score[n].name);ch=getchar(); for(i=0;i<4;i++)
{ printf("***请输入第%d门的课程编号 : ",i+1); scanf("%d",&score[n].subject[i].num);
printf("***请输入第%d门的课程名称 : ",i+1); scanf("%s",score[n].subject[i].name);
printf("***请输入第%d门的课程成绩 : ",i+1); scanf("%d",&score[n].subject[i].result);
printf("***请输入第%d门的课程学分 : ",i+1); scanf("%f",&score[n].subject[i].credit); } n++;
printf("\n1、继续添加 2、退出[ ]\b\b"); scanf("%d",&choice); if(choice==2) break; } }
// 写入文件 void writefile() { FILE *fp; int i;
fp=fopen("score_list","wb");//以写二进制的模式打开文件
//遍历所有记录,并把每一个结构体对象以二进制形式写入文件 for(i=0;i<=n-1;i++)
fwrite(&score[i],sizeof(struct scorelist),1,fp); printf(" !!!文件已保存为scorelist\n\n"); fclose(fp); //关闭文件 }
// 读文件,并初始化学生成绩数组 void readfile()
{ struct scorelist add; FILE *fp; n=0; fp=fopen("score_list","rb"); // 以读取二进制文件的模式打开文件 fread(&add,sizeof(struct scorelist),1,fp); // 读取一个结构体长度的数据并把它付给add对象。
// 持续读取文件,初始化新的add对象,并把它加到score的数组中去 while(!feof(fp)){ score[n]=add;n++;
fread(&add,sizeof(struct scorelist),1,fp); } printf(" !!! 文件scorelist已读取\n"); fclose(fp); // 关闭文件 }
// 主程序入口 main() { int a; struct scorelist add; FILE *fp;
// 如果没有score_list这个文件,创建它 if((fp=fopen("score_list","rb"))==NULL) fp=fopen("score_list","wb");
else{ // 如果有score_list这个文件,那么将其中的数据读取到全局的score数组。参考readfile() fread(&add,sizeof(struct scorelist),1,fp); while(!feof(fp)){ score[n]=add;n++;
fread(&add,sizeof(struct scorelist),1,fp); } }
fclose(fp);
// 程序一直读取用户输入并解析,然后调用不同的函数进行处理,并返回结果。 while(1) {
printf("********************************************************************************");
printf("\t\t 欢迎 Welcome to\n");
printf("\n\t\t\t 使用成绩记录簿系统1.0\n");
printf("****copyright归山东超峰所有********************在此鸣谢 百度知道 老师****************\n")
printf("*************************************MENU***************************************"); printf("\n"); printf(" 成绩记录簿\n"); printf("** ****1.添加\n"); printf("** *****2.删除\n"); printf("** *****3.查学生成绩\n"); printf("** *****4.查班成绩表(附加功能@显示平均分和及格率@)\n"); printf("** *****5.写入文件\n"); printf("** *****6.读取文件\n");
printf("** *****0.退出\n"); printf("\n\t\t输入你的选择Enter your choice(0--6):"); scanf("%d",&a); getchar(); switch(a) {
case 1:append();break; case 2:del();break; case 3:querystudent();break; case 4:queryclass();break; case 5:writefile();break; case 6:writefile();readfile();break; case 0:writefile();exit(0);break; default:printf("*********错!请再输入一遍********"); } }
}
追问大神,你这个排版可能有问题,我编译的时候有好多问题。