1、程序功能
编程实现一个基础的成绩管理系统。
2、设计目的
通过本程序综合掌握结构体类型、指针、链表、函数、文件等知识的综合使用。
3、功能要求(可扩充功能)
(1)实现简单的菜单设计,如下所示:
1 添加学生信息
2 显示学生信息
3 查找学生信息
4 插入学生信息
5 删除学生信息
6 成绩计算
7 按总分降序输出
0 退出
(2)每个学生的信息至少包括姓名、学号、3门课程的成绩、班级等信息。
(3)“添加学生信息”:输入新的学生信息以后,系统将把相关信息存储到文件中。以班级为单位存放到不同的文件中。至少有3个班,每个班级至少10个学生。
(4)“显示学生信息”:系统将从文件中读取数据,按要求显示所有的学生信息。为使界面美观,可考虑用二维表格的形式输出。
(5)“查找学生信息”:可进一步设计,如按姓名查找或按学号查找,或者查找某门课程的最高/最低成绩、或者在所有学生中查找平均分最高/最低的学生信息等。
(6)“插入学生信息”:根据学号顺序进行插入。
(7)“删除学生信息”:可进一步设计,根据姓名删除还是根据学号删除。删除前显示该条记录,并提交用户确认。
(8)“成绩计算”:可扩充,如计算每个学生的总分、平均分;计算每个班级每门课程的平均分。
(9)“按总分降序输出”:可扩展,按总分降序或升序。
4、要求采用模块化设计,独立的功能(如添加、显示、查询、删除等)应在各个自定义函数中实现。
5、撰写课程设计报告,内容包括:功能结构图、程序流程图、函数列表、各函数功能简介及完整的源程序(包含必要的注释)、程序运行结果、小结等。
思维脑图
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct student{
char name[20];//学生的姓名
int id;//学生的学号
char cla[20];//保存学生班级
double score[3];//学生的三门成绩,分别为语文、数学、英语
double sum; //学生的总分
struct student *next;//用来建立链表
}stu;
void lianbiao();//建立链表
void print();//显示功能菜单
void tianjia();//接收输入的学生信息
void paixu();//提供排序选择
void chazhao();//提供查找信息的选择(学号、姓名、分数最高最低)
void charu();//插入学生信息
void shanchu();//提供删除学生信息的选择(姓名、学号)
void xiugai();//用于修改学生信息
void jisuan();//计算数据( 总分、平均分、每个班级课程平均分)
void shuchu();//按总分输出数据(降序、升序)
int main()
{ int x;printf("***************************欢迎使用成绩系统*************************\n");
print();scanf("%d",&x);
while(x!=0){
switch(x){
case 1: tianjia();break;
case 2: shuchu();break;
case 3: chazhao();break;
case 4: charu();break;
case 5: shanchu();break;
case 6: xiugai();break;
case 7: jisuan();break;
case 8: paixu(); break;
default:printf("输入错误!请重新输入选项");break;
}
print();scanf("%d",&x);
}
}
void print(){
printf("\n");
printf(" 学生管理系统 \n");
printf("**********************************************************\n" );
printf("* 请选择操作的序号,如果输入0,程序结束 *\n");
printf("* *\n");
printf("* 1 添加n个学生信息 2 显示所有学生成绩 *\n");
printf("* *\n");
printf("* 3 查找学生信息 4 按学号升序插入学生信息 *\n");
printf("* *\n");
printf("* 5 删除学生信息 6 修改学生信息 *\n");
printf("* *\n");
printf("* 7 成绩计算 8 按总分降序输出 *\n" );
printf("* *\n");
printf("***********************************************************\n");
}
void tianjia()
{
stu *p,*p1,*head;
head=(stu*)malloc(sizeof(stu));
head->next=NULL;
p1=head;
while(1){
p=(stu*)malloc(sizeof(stu));
p1->next=p;getchar();//消除换行的影响
printf("请输入以下信息(姓名为0时输入结束)\n");//避免用户需要搞清学生数量,增加用户的体验感
printf("学生的姓名:");gets(p->name);
if(p->name[0]=='0') {
p->next=NULL;break;
}
printf("学生的学号:");scanf("%d",&p->id);getchar();
printf("学生的班级:"); gets(p->cla);
printf("学生的语文成绩:");scanf("%lf",&p->score[0]);
printf("学生的数学成绩:");scanf("%lf",&p->score[1]);
printf("学生的英语成绩:");scanf("%lf",&p->score[2]);
p->sum=p->score[0]+p->score[1]+p->score[2];
p1=p;} //建立了学生信息链表
p1=head;p=head->next;
FILE *fp,*fp1; //fp用于储存各个班级的同学,fp1用于储存全部学生
char file[20],txt[10]=".txt";
while(p->name!=0){
strcpy(file,p->cla);strcat(file,txt);
fp=fopen(file,"ab");fp1=fopen("student.txt","ab");
if(p->next!=NULL){ fwrite(p,sizeof(stu),1,fp);
fwrite(p,sizeof(stu),1,fp1);
}
fclose(fp);fclose(fp1);
p1=p;p=p->next;
}
}
void shuchu(){
stu *p;
FILE *fp;
p=(stu*)malloc(sizeof(stu));
fp=fopen("student.txt","rb");
if(fp==NULL) {
printf("没有学生信息!请先添加学生信息!\n");
exit(1);
}
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
while(fread(p,sizeof(stu),1,fp)==1)
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n"
,p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);
fclose(fp);free(p);
}
void chazhao(){
double max=0,min=100;//用于存储最大值和最小值
FILE *fp;
stu *p,*head,*p1;
int i=0;//用于判断是否有无该学生
char name[20];//存储查找学生姓名的变量
int id;//储存查找学生学号的变量
char cla[20];//储存查找学生班级的变量
int y,n;//用于提供查找选项的选择
printf("请输入相应数字选择相应的查找功能\n");
printf("******1:根据姓名查找 2:根据学号查找\n"
"******3:查找相应班级的全部学生 4:查找最高分\n"
"******5:查找最低分 0:退出查找程序\n");
scanf("%d",&y); getchar();
while(y!=0){
i=0;fp=fopen("student.txt","rb"); if(fp==NULL) {
printf("没有学生信息,请先输入!\n");exit(1);
}
switch(y){
case 1:
p=(stu*)malloc(sizeof(stu));
printf("请输入要查找的学生姓名:");gets(name);
while(fread(p,sizeof(stu),1,fp)==1){
if(strcmp(p->name,name)==0)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n"
,p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);i++; break;
} else continue;
} if(i==0) printf("没有该学生!\n");
fclose(fp);free(p);break;
case 2: fp=fopen("student.txt","rb"); if(fp==NULL) {
printf("没有学生信息,请先输入!\n");exit(1);
}
p=(stu*)malloc(sizeof(stu));
printf("请输入要查找的学生学号:");scanf("%d",&id);
while(fread(p,sizeof(stu),1,fp)==1){
if(p->id==id)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n"
,p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);i++; break;
} else continue;
} if(i==0) printf("没有该学生!\n");
fclose(fp);free(p);break;
case 3: fp=fopen("student.txt","rb"); if(fp==NULL) {
printf("没有学生信息,请先输入!\n");exit(1);
}
p=(stu*)malloc(sizeof(stu));
printf("请输入要查找的班级:");gets(cla);
while(fread(p,sizeof(stu),1,fp)==1){
if(strcmp(p->cla,cla)==0)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n"
,p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum); i++;
} else continue;
} if(i==0) printf("没有该班级!\n");
fclose(fp);free(p);break;
case 4: printf("输入数字选择相应的功能(输入0退出)\n");
printf("1:查找语文最高分 2:查找数学最高分\n"
"3:查找英语最高分 4:查找总分最高分\n");
scanf("%d",&n); while(n!=0){
fp=fopen("student.txt","rb"); if(fp==NULL) {
printf("没有学生信息,请先输入!\n");exit(1);
}
switch(n){
case 1:
max=0;head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->score[0]>max) max=p->score[0];
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为语文分数最高的学生信息\n");
while(p->next!=NULL){
if(p->score[0]==max)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
case 2:
max=0;head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->score[1]>max) max=p->score[1];
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为数学分数最高的学生信息\n");
while(p->next!=NULL){
if(p->score[1]==max)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
case 3:
max=0; head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->score[2]>max) max=p->score[2];
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为英语分数最高的学生信息\n");
while(p->next!=NULL){
if(p->score[2]==max)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
case 4:head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->sum>max) max=p->sum;
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为总分最高的学生信息\n");
while(p->next!=NULL){
if(p->sum==max)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
default:fclose(fp);printf("输入错误!请重新输入选项");break;
} printf("输入数字选择相应的功能(输入0退出)\n");
printf("1:查找语文最高分 2:查找数学最高分\n"
"3:查找英语最高分 4:查找总分最高分\n");
scanf("%d",&n);
} break;
case 5: printf("输入数字选择相应的功能(输入0退出)\n");
printf("1:查找语文最低分 2:查找数学最低分\n"
"3:查找英语最低分 4:查找总分最低分\n");
scanf("%d",&n); while(n!=0){
fp=fopen("student.txt","rb"); if(fp==NULL) {
printf("没有学生信息,请先输入!\n");exit(1);
}
switch(n){
case 1:
min=100;head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->score[0]<min) min=p->score[0];
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为语文分数最低的学生信息\n");
while(p->next!=NULL){
if(p->score[0]==min)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
case 2:
min=100;head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->score[1]<min) min=p->score[1];
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为数学分数最低的学生信息\n");
while(p->next!=NULL){
if(p->score[1]==min)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-16d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
case 3:
min=100; head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->score[2]<min) min=p->score[2];
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为英语分数最低的学生信息\n");
while(p->next!=NULL){
if(p->score[2]==min)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
case 4:
min=300; head=(stu*)malloc(sizeof(stu));
p1=head;p=(stu*)malloc(sizeof(stu));
while(fread(p,sizeof(stu),1,fp)==1){
if(p->sum<min) min=p->sum;
p1->next=p;p1=p;
p=(stu*)malloc(sizeof(stu));
}
p1=head; p=p1->next;
printf("*********下面为总分最低的学生信息\n");
while(p->next!=NULL){
if(p->sum==min)
{
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);}
p1=p;p=p->next;
} free(p);free(head);fclose(fp);break;
default:fclose(fp);printf("没有该选项!请重新输入现有的选项!\n");
break;
} printf("输入数字选择相应的功能(输入0退出)\n");
printf("1:查找语文最低分 2:查找数学最低分\n"
"3:查找英语最低分 4:查找总分最低分\n");
scanf("%d",&n);
} break;
default: printf("没有该选项!请重新输入现有的选项!\n");
break;
}
printf("请输入相应数字选择相应的查找功能\n");
printf("******1:根据姓名查找 2:根据学号查找\n"
"******3:查找相应班级的全部学生 4:查找最高分\n"
"******5:查找最低分 0:退出查找程序\n");
scanf("%d",&y); getchar();
}
}
void charu(){
FILE *fp,*fp1;
char file[20],txt[10]=".txt";
stu *head,*p,*p1,*p2,*p3;
fp=fopen("student.txt","rb");
if(fp==NULL) {
printf("请先添加学生信息在进行插入!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu)); p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
}while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;
p2=(stu*)malloc(sizeof(stu));
printf("请输入你要插入学生的相关信息\n"); getchar();
printf("学生姓名:"); gets(p2->name);
printf("学生学号:"); scanf("%d",&p2->id);getchar();
printf("学生班级:"); gets(p2->cla);
printf("学生语文成绩:"); scanf("%lf",&p2->score[0]);
printf("学生的数学成绩:");scanf("%lf",&p2->score[1]);
printf("学生的英语成绩:"); scanf("%lf",&p2->score[2]);
p2->sum=p2->score[0]+p2->score[1]+p2->score[2];
strcpy(file,p2->cla);strcat(file,txt);
fp1=fopen(file,"ab");fwrite(p2,sizeof(stu),1,fp1);fclose(fp1);
p=head->next; p1=head;
while(1)
{
if(p->id<p2->id)
{ p1=p;p=p->next;continue;
}
if(p->id>p2->id) {
p1->next=p2;p2->next=p;break;
}
}
p=head->next;
fp=fopen("student.txt","wb");
while(p->next!=NULL) {
fwrite(p,sizeof(stu),1,fp); p=p->next;
} fclose(fp);free(head);free(p2);
printf("该学生数据以插入成功!\n");
}
void shanchu(){
int y,cnt=0;
int m;
char name[20];
int id;
FILE *fp;
stu *head,*p,*p1;
printf("请选择删除选项\n 1:输入姓名删除 2:输入学号删除 0:退出删除程序\n");
scanf("%d",&y); while(y!=0){
cnt=0;
fp=fopen("student.txt","rb");
if(fp==NULL) {
printf("请先添加学生信息在进行删除!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu));p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
}while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;fclose(fp);
switch(y)
{
case 1: printf("请输入你要删除学生的姓名:");getchar();gets(name);
p1=head; p=head->next;while(p->next!=NULL) {
if(strcmp(p->name,name)==0) {
printf("下列是你要删除的学生信息,请输入数字选择是否删除: 1:删除 0:不删除\n");
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);
printf("请输入你的选项:");scanf("%d",&m);if(m==0) { cnt=2;break;}
else {
p1->next=p->next; cnt=1;break;}
}
else { p1=p;p=p->next;
}
} if(cnt==0) printf("没有该学生信息!\n");
else if(cnt==1) { printf("该学生信息已删除\n");
fp=fopen("student.txt","wb"); p=head->next;
while(p->next!=NULL) { fwrite(p,sizeof(stu),1,fp);p=p->next; }
} fclose(fp);
if(cnt==2) printf("未删除该学生信息\n");break;
case 2:printf("请输入你要删除学生的学号:");scanf("%d",&id);
p1=head; p=head->next;while(p->next!=NULL) {
if(p->id==id) {
printf("下列是你要删除的学生信息,请输入数字选择是否删除: 1:删除 0:不删除\n");
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);
printf("请输入你的选项:");scanf("%d",&m);if(m==0) { cnt=2;break;}
else {
p1->next=p->next; cnt=1;break;}
}
else { p1=p;p=p->next;
}
} if(cnt==0) printf("没有该学生信息!\n");
else if(cnt==1) { printf("该学生信息已删除\n");
fp=fopen("student.txt","wb"); p=head->next;
while(p->next!=NULL) { fwrite(p,sizeof(stu),1,fp);p=p->next; }
} fclose(fp);
if(cnt==2) printf("未删除该学生信息\n");break;
default: printf("没有该选项,请重新输入!\n");break;
} printf("请选择删除选项\n 1:输入姓名删除 2:输入学号删除 0:退出删除程序\n");
scanf("%d",&y);
}
}
void xiugai(){
FILE *fp;
stu *head,*p,*p1;
int cnt=0;
int m;
int n;
char name[20];
int id;
double score;
char cla[20];
printf("请输入你要修改学生信息的姓名或者学号\n 1:输入学生姓名 2:输入学生学号 0:退出删除程序\n");
scanf("%d",&n); while(n!=0) { cnt=0;
fp=fopen("student.txt","rb");
if(fp==NULL) {
printf("请先添加学生信息在进行删除!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu));p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
}while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;fclose(fp);
switch(n) {
case 1: printf("请输入你要修改学生信息的姓名:\n");getchar();gets(name);
p1=head; p=head->next;while(p->next!=NULL) {
if(strcmp(p->name,name)==0) {
printf("下列是你要修改的学生信息\n");
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);
printf("请输入你想修改的信息:1:姓名 2:学号 3:班级 4:语文成绩 5:数学成绩 6:英语成绩 \n 0:返回上一级\n ");
printf("请输入你的选项:"); scanf("%d",&m);break;}
else { p1=p;p=p->next;
} } switch(m) {
case 1:printf("请输入修改后的姓名:");getchar();gets(name); strcpy(p->name,name);break;
case 2:printf("请输入修改后的学号:");scanf("%d",&id);p->id=id;break;
case 3:printf("请输入修改后的班级:");getchar();gets(cla);strcpy(p->cla,cla);break;
case 4:printf("求输入修改后的语文成绩:");scanf("%lf",&score);p->score[0]=score;
p->sum=p->score[0]+p->score[1]+p->score[2];break;
case 5:printf("求输入修改后的数学成绩:");scanf("%lf",&score);p->score[1]=score;
p->sum=p->score[0]+p->score[1]+p->score[2];break;
case 6:printf("求输入修改后的英语成绩:");scanf("%lf",&score);p->score[2]=score;
p->sum=p->score[0]+p->score[1]+p->score[2];break;
case 0: break;
} fp=fopen("student.txt","wb"); p=head->next;
while(p->next!=NULL) { fwrite(p,sizeof(stu),1,fp);p=p->next;
} fclose(fp); break;
case 2:printf("请输入你要修改学生信息的学号:\n");scanf("%d",&id);
p1=head; p=head->next;while(p->next!=NULL) {
if(p->id==id) {
printf("下列是你要修改的学生信息\n");
printf("姓名 学号 班级 语文 数学 英语 总分 \n");
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f\n",p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum);
printf("请输入你想修改的信息:1:姓名 2:学号 3:班级 4:语文成绩 5:数学成绩 6:英语成绩 \n 0:返回上一级\n ");
printf("请输入你的选项:"); scanf("%d",&m);break;}
else { p1=p;p=p->next;
} } switch(m) {
case 1:printf("请输入修改后的姓名:");getchar();gets(name); strcpy(p->name,name);break;
case 2:printf("请输入修改后的学号:");scanf("%d",&id);p->id=id;break;
case 3:printf("请输入修改后的班级:");getchar();gets(cla);strcpy(p->cla,cla);break;
case 4:printf("求输入修改后的语文成绩:");scanf("%lf",&score);p->score[0]=score;
p->sum=p->score[0]+p->score[1]+p->score[2];break;
case 5:printf("求输入修改后的数学成绩:");scanf("%lf",&score);p->score[1]=score;
p->sum=p->score[0]+p->score[1]+p->score[2];break;
case 6:printf("求输入修改后的英语成绩:");scanf("%lf",&score);p->score[2]=score;
p->sum=p->score[0]+p->score[1]+p->score[2];break;
case 0: break;
} fp=fopen("student.txt","wb"); p=head->next;
while(p->next!=NULL) { fwrite(p,sizeof(stu),1,fp);p=p->next;
} fclose(fp); break;
default:printf("没有该选项,请重新输入\n");break;
}printf("请输入你要修改学生信息的姓名或者学号\n 1:输入学生姓名 2:输入学生学号 0:退出删除程序\n");
scanf("%d",&n);
}
}
void jisuan()
{
FILE *fp;
stu *head,*p,*p1;
int cnt=0;
int n;
double sum;
double yw;
double sx;
double yy;
printf("请输入相应数字选择相应的成绩计算\n 1:计算年级平均分 2:计算各班级平均分 0:退出成绩计算\n");
scanf("%d",&n);while(n!=0)
{ sum=0;yw=0;sx=0;yy=0;
switch(n){
case 1:fp=fopen("student.txt","rb");
if(fp==NULL) {
printf("请先添加学生信息在进行删除!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu));p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
}while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;fclose(fp); p=head->next;
while(p->next!=NULL) {
yw+=p->score[0];sx+=p->score[1];yy+=p->score[2];sum+=p->sum;cnt++;p=p->next;
} printf("该年纪的语文平均分为:%.2f\n数学平均分为:%.2f\n英语平均分为:%.2f\n总分平均分为:%.2f\n",yw/cnt,sx/cnt,yy/cnt,sum/cnt);break;
case 2:cnt=0;yw=0;sx=0;yy=0;sum=0;
fp=fopen("class1.txt","rb");
if(fp==NULL) {
printf("请先添加学生信息在进行计算!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu));p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
}while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;fclose(fp);
p=head->next;sum=0;yw=0;sx=0;yy=0;cnt=0;
while(p->next!=NULL) {
yw+=p->score[0];sx+=p->score[1];yy+=p->score[2];sum+=p->sum;cnt++;p=p->next;
}printf("班级1的语文平均分为:%.2f\n数学平均分为:%.2f\n英语平均分为:%.2f\n总分平均分为:%.2f\n",yw/cnt,sx/cnt,yy/cnt,sum/cnt);
printf("\n"); fp=fopen("class2.txt","rb");
if(fp==NULL) {
printf("请先添加学生信息在进行计算!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu));p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
} while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;fclose(fp); cnt=0;yw=0;sx=0;yy=0;sum=0;
p=head->next; while(p->next!=NULL) {
yw+=p->score[0];sx+=p->score[1];yy+=p->score[2];sum+=p->sum;cnt++;p=p->next;
}printf("班级2的语文平均分为:%.2f\n数学平均分为:%.2f\n英语平均分为:%.2f\n总分平均分为:%.2f\n",yw/cnt,sx/cnt,yy/cnt,sum/cnt);
fp=fopen("class3.txt","rb");printf("\n");
if(fp==NULL) {
printf("请先添加学生信息在进行计算!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu));p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
}while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;fclose(fp);
p=head->next; cnt=0;yw=0;sx=0;yy=0;sum=0;
while(p->next!=NULL) {
yw+=p->score[0];sx+=p->score[1];yy+=p->score[2];sum+=p->sum;cnt++;p=p->next;
}printf("班级3的语文平均分为:%.2f\n数学平均分为:%.2f\n英语平均分为:%.2f\n总分平均分为:%.2f\n",yw/cnt,sx/cnt,yy/cnt,sum/cnt);
break;
case 0:break;
default:printf("没有该选项,请重新输入!\n");break;
}
printf("请输入相应数字选择相应的成绩计算\n 1:计算年级平均分 2:计算各班级平均分 0:退出成绩计算\n");
scanf("%d",&n);
}
}
void paixu()
{
FILE *fp;
stu *head,*p,*p1;
double sum[1000];
int i,j,cnt=0;
int max;
double t;
fp=fopen("student.txt","rb");
if(fp==NULL) {
printf("请先添加学生信息在进行打印成绩单!\n");exit(1);
}
head=(stu*)malloc(sizeof(stu));p1=head;
do{
p=(stu*)malloc(sizeof(stu));
p1->next=p;p1=p;
}while(fread(p,sizeof(stu),1,fp)==1);
fclose(fp);p->next=NULL;p=head->next;
while(p->next!=NULL) {
sum[cnt]=p->sum; cnt++;
p=p->next;
}
for(i=0;i<cnt-1;i++) {
max=i; for(j=i+1;j<cnt;j++){
if(sum[j]>sum[max]) max=j;
} if(max!=i) {
t=sum[i];sum[i]=sum[max];sum[max]=t;
}
} printf("**********下面为本次考试的年纪成绩单*************\n");
printf("姓名 学号 班级 语文 数学 英语 总分 排名\n");
j=1; p=head->next; while(p->next!=NULL) {
if(p->sum==sum[0])
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f%d\n"
,p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum,j++);p=p->next;}
for(i=1;i<cnt;i++) {
p=head->next; while(p->next!=NULL) {
if(p->sum==sum[i]&&sum[i]!=sum[i-1])
printf("%-15s%-15d%-15s%-15.2f%-15.2f%-15.2f%-15.2f%d\n"
,p->name,p->id,p->cla,p->score[0],p->score[1],p->score[2],p->sum,j++);p=p->next;}
}
}