请各位大虾99我```帮我编个用C++编的<学生成绩查询系统>

2024-12-24 23:08:12
推荐回答(1个)
回答1:

#include
#include
#include
#include
/*学生信息结构体*/
typedef struct students
{
char classes[6];//所在班级名称
int numb;//班内学号(在班级内自动生成学号,取最大值加1)
char name[20];//姓名
float avgscore; //结业平均成绩(初始值为0)
}stuinfo;
stuinfo stu,*studel,*studelinfo;
/*学生成绩结构体*/
struct allscores
{
char classes[6];//所在班级名称,输入格式如:s1127
int numb;//班内学号
float c_score;//C语言成绩
float sql_score;//SQL语言成绩
float vb_score;//VB语言成绩
}score,*studelscore;
/*函数声明*/
void addinfo();/*录入学生基本信息*/
void addscore(char name[]);/*录入学生成绩*/
void updatescore(char name[],int numb);
void deleteall(char name[],int numb);/*删除某个班级某个学生的所有信息(包括成绩)*/
void queryclass();/*按 [班级] 查询学生信息*/
void queryclassscore();/*按 [班级] 查询学生成绩*/
void querypass();/*显示通过考试的学生信息*/

FILE *fpinfo;//指向学生信息的文件指针
FILE *fpscore;//指向成绩的文件指针

void main()
{
char choice;//菜单选择项
char classname[6];//输入的班级名称
int numb;//输入的学号

do{
printf("\t\t**********************\n"
"\t\t* 学生信息管理 *\n"
"\t\t**********************\n\n"
"\t┏━━━━━━━━━━━━━━━━━━┓\n"
"\t┃ 1. 录入学生基本信息 ┃\n"
"\t┃ 2. 录入成绩信息 ┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃ 3. 修改学生成绩 ┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃ 4. 删除学生全部信息 ┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃ 5. 按 [班级] 查询学生基本信息 ┃\n"
"\t┃ 6. 按 [班级] 查询成绩 ┃\n"
"\t┃ 7. 显示通过考试的学生信息 ┃\n"
"\t┃┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┃\n"
"\t┃ 8. 退出 ┃\n"
"\t┗━━━━━━━━━━━━━━━━━━┛\n\n"
"请输入您的选择(数字1-8): ");

scanf("\n%c", &choice);
system("cls");
switch(choice)
{
case '1':
printf("\t\t录入学生基本信息\n\n");
addinfo();//录入学生基本信息
break;
case '2':
printf("\t\t录入学生成绩\n\n");
printf("请先输入班级名称:");
scanf("%5s",classname);
addscore(classname);//录入成绩信息
break;
case '3':
printf("\t\t修改学生成绩\n\n");
printf("请先输入要修改的班级名称和学号:");
scanf("%5s%d",classname,&numb);
updatescore(classname,numb);
break;
case '4':
printf("\t\t删除学生全部信息\n\n");
printf("请先输入要删除的班级名称和学号:");
scanf("%5s%d",classname,&numb);
deleteall(classname,numb);
break;
case '5':
printf("\t\t按[班级]查询学生信息\n\n");
queryclass();//按 [班级] 查询学生基本信息
break;
case '6':
printf("\t\t按[班级] 查询成绩\n\n");
queryclassscore();//按 [班级] 查询成绩
break;
case '7':
printf("\t\t显示通过考试的学生信息\n\n");
querypass();//显示通过考试的学生信息
break;
case '8':
printf("程序退出。\t谢谢使用!:)\n\n");
exit(0);
default:
printf("您的输入有误,请重试!\n\n");
fflush(stdin);
break;
}
printf("\n按任意键返回......");
getch();
system("cls");
}while(choice!='8');
}
/****************************************/
/*录入学生基本信息*/
/****************************************/
void addinfo()
{
char flag;//是否继续输入
char clas[6];//输入的班级名称
int newno;
if((fpinfo=fopen("info.dat","ab+"))==NULL)//以追加方式打开学生信息表"info.dat"
{
printf("文件打开失败.\n");
exit(1);
}
do
{
printf("请输入学生基本信息");
printf("\n\t学生所在班级名称:");
scanf("%5s",&clas);//输入的班级名称
if (strlen(clas)<1)
{
printf("请输入班级名称.\n");;
return;
}
newno=0;
rewind(fpinfo);//文件指针置于文件开始位置
while(fread(&stu, sizeof(stuinfo),1,fpinfo)==1)//从文件中查找是否已经存在该班级的记录,如果存在找出最大学号
if (strcmp(stu.classes,clas)==0)
{
if (newno newno=stu.numb ;
}
strcpy(stu.classes,clas);
printf("\t班内学号:");
stu.numb =newno+1;//自动生成该班级的学号=最大学号+1
printf("%d",newno+1);
printf("\n\t学生姓名:");
scanf("%19s",&stu.name);
if (strlen(stu.name)<1)
{
printf("请输入学生名字.\n");;
return;
}
stu.avgscore =0.0;//向文件中追加记录时,平均成绩默认值为0
fwrite(&stu,sizeof(stuinfo),1,fpinfo);//将输入的结构体数据保存到文件中
printf("继续输入吗?:");
scanf("\n%c",&flag);
}while(flag=='Y'||flag=='y');
fclose(fpinfo);
return;
}
/****************************************/
/*录入学生成绩信息*/
//首先输入要录入班级名称,且该班级必须在info.dat中存在,然后再输入相应数据
/****************************************/
void addscore(char name[])
{
char flag,flagname='n',flagnumbi='n',flagnumbs='n';//是否继续输入,是否班级名称存在,info.dat是否学号存在,score.dat是否学号存在
int numb;
if((fpinfo=fopen("info.dat","rb+"))==NULL)//打开学生基本信息文件"info.dat"
{
printf("info.dat文件打开失败.\n");
return;
}
while (fread(&stu,sizeof(stuinfo),1,fpinfo)==1)
{
if (strcmp(name,stu.classes)==0)//通过循环在文件"info.dat"中查找是否有该班级的记录
{
flagname='y';//如果文件"info.dat"中存在该班级的记录,则flagname='y',循环结束
break;
}
else
flagname='n';
}
if (flagname=='n')//如果文件"info.dat"中不存在该班级的记录,关闭文件,函数结束
{
printf("info.dat文件中没有%s班级.\n",name);
fclose(fpinfo);
return;
}
if((fpscore=fopen("score.dat","ab+"))==NULL)//如果文件"info.dat"中存在该班级的记录,以追加方式打开成绩文件"score.dat"
{
printf("文件打开失败.\n");
return;
}
do
{
printf("\n\t请输入学号:");//输入学号
scanf("%d",&numb);
//numb=atoi(cnumb);
rewind(fpinfo);//"info.dat"文件指针指向文件开始位置
while (fread(&stu,sizeof(stuinfo),1,fpinfo)==1)
{
if ((strcmp(name,stu.classes)==0) && stu.numb==numb)//判断"info.dat"文件中是否存在该班级该学号的记录
{
flagnumbi='y';
rewind(fpscore);//如果存在,"score.dat"文件指针指向文件开始位置
while(fread(&score,sizeof(struct allscores),1,fpscore)==1)//循环判断"score.dat"文件中是否已经存在该学号的记录
{
if ((strcmp(name,score.classes)==0) && score.numb ==numb)
{
flagnumbs='y';//如果"score.dat"文件中存在该班级该学号的记录,flagnumbs='y'
break;
}
else
flagnumbs='n';
}
break;
}
else
flagnumbi='n';
}
if(flagnumbi=='n' || (flagnumbi=='y' && flagnumbs=='y'))//如果"info.dat","score.dat"文件都存在,则不允许向"score.dat"追加成绩信息
{
printf("info.dat文件中没有学号为%d学生信息,或者score.dat文件中已经存在改学号学生的成绩\n",numb);
fclose(fpinfo);
fclose(fpscore);
return;
}
strcpy(score.classes,name);//给结构score的classes成员赋值--班级名称
score.numb =numb;//学号
printf("\n\t请输入C语言的成绩:");
scanf("%f",&score.c_score); //C语言的成绩
printf("\t请输入SQL语言的成绩:");
scanf("%f",&score.sql_score);//SQL语言的成绩
printf("\t请输入VB语言的成绩:");
scanf("%f",&score.vb_score );//VB语言的成绩

stu.avgscore =(score.c_score+score.sql_score+score.vb_score)/3.0f;//计算平均成绩
fseek(fpinfo,-1L*(long)sizeof(stuinfo),SEEK_CUR);//修改"info.dat"中该班级该学号的记录
fwrite(&stu,sizeof(stuinfo),1,fpinfo);
fseek(fpinfo, 0, SEEK_CUR);//SEEK_CUR 当前位置

fwrite(&score,sizeof(struct allscores),1,fpscore);//向"score.dat"文件追加记录

printf("继续输入吗?:");
scanf("\n%c",&flag);
}while(flag=='Y'||flag=='y');
fclose(fpscore);
fclose(fpinfo);
return;
}
/**************************************/
//修改学生成绩
//输入参数是班级名称和学号
/**************************************/
void updatescore(char name[],int numb)
{
char flaginfo='n',flagscore='n';
if((fpinfo=fopen("info.dat","rb+"))==NULL)//打开学生基本信息文件"info.dat"
{
printf("info.dat文件打开失败.\n");
return;
}
while (fread(&stu,sizeof(stuinfo),1,fpinfo)==1)
if (strcmp(name,stu.classes)==0 && stu.numb ==numb)//通过循环在文件"info.dat"中查找是否有该班级的记录
{
flaginfo='y';
break;
}
if((fpscore=fopen("score.dat","rb+"))==NULL)//以读写方式打开学生基本信息文件"score.dat"
{
printf("score.dat文件打开失败.\n");
return;
}
while(fread(&score, sizeof(struct allscores),1,fpscore)==1)
if ((strcmp(name,score.classes)==0) && score.numb ==numb)
{
flagscore='y';
break;
}
if (flaginfo=='y' && flagscore=='y')
{
printf("\n\t请重新输入C语言的成绩:");
scanf("%f",&score.c_score); //C语言的成绩
printf("\t请重新输入SQL语言的成绩:");
scanf("%f",&score.sql_score);//SQL语言的成绩
printf("\t请重新输入VB语言的成绩:");
scanf("%f",&score.vb_score );//VB语言的成绩

stu.avgscore =(score.c_score+score.sql_score+score.vb_score)/3.0f;//计算平均成绩
fseek(fpinfo,-1L*(long)sizeof(stuinfo),SEEK_CUR);//修改"info.dat"中该班级该学号的记录
fwrite(&stu,sizeof(stuinfo),1,fpinfo);
fseek(fpinfo, 0, SEEK_CUR);

fseek(fpscore,-1L*(long)sizeof(struct allscores),SEEK_CUR);//修改"info.dat"中该班级该学号的记录
fwrite(&score,sizeof(struct allscores),1,fpscore);//向"score.dat"文件追加记录
fseek(fpscore, 0, SEEK_CUR);
fclose(fpinfo);
fclose(fpscore);
printf("\t恭喜您!!成绩修改成功!");
}
}
/****************************************/
/*删除某个班级某个学号的学生全部信息*/
/****************************************/
void deleteall(char name[],int numb)
{
int count=0,i=0,countscore=0;/*count是info文件的记录计数器,countscore是score文件的计数器*/
stuinfo *stufirst;
struct allscores *scorefirst;

if((fpinfo=fopen("info.dat","rb"))==NULL)//以只读方式打开学生基本信息文件"info.dat"
{
printf("info.dat文件打开失败.\n");
return;
}
while(fread(&stu, sizeof(stuinfo),1,fpinfo)==1)//获取"info.dat"文件中记录个数
++count;
studelinfo=(stuinfo *)malloc((count)*sizeof(stuinfo));//动态分配内存空间,分配"info.dat"文件中记录个结构体大小空间
/**************************对"score.dat"文件的操作*********************************/
if((fpscore=fopen("score.dat","rb"))==NULL)//以只读方式打开学生基本信息文件"score.dat"
{
printf("score.dat文件打开失败.\n");
return;
}
while(fread(&score, sizeof(struct allscores),1,fpscore)==1)//获取"score.dat"文件中记录个数
++countscore;
studelscore=(struct allscores *)malloc((countscore)*sizeof(struct allscores));//动态分配内存空间,分配"score.dat"文件中记录个结构体大小空间
/***********************************************************/
if (studelinfo!=NULL && studelscore!=NULL)//如果分配成功
{
stufirst=studelinfo;//记住结构体指针指向内存空间初始位置
rewind(fpinfo);
for(i=0;i {
fread(studelinfo+i, sizeof(stuinfo),1,fpinfo);
}
studelinfo=stufirst;//结构体指针指向内存空间初始位置
fclose(fpinfo);//关闭"info.dat"文件
/**************************对"score.dat"文件的操作*********************************/
scorefirst=studelscore;//记住结构体指针指向内存空间初始位置
rewind(fpscore);
for(i=0;i {
fread(studelscore+i, sizeof(struct allscores),1,fpscore);
}
studelscore=scorefirst;//结构体指针指向内存空间初始位置
fclose(fpscore);//关闭"score.dat"文件
/***********************************************************/
fpinfo=fopen("info.dat","wb+");//以写方式打开学生基本信息文件"info.dat",重新向文件中写结构体中记录
for(i=0;i {//如果当前结构体指针指向的记录是要删除的班级和学号,则将该位置以后的所有记录往前复制
if (((strcmp((studelinfo+i)->classes ,name)==0)) && (*(studelinfo+i)).numb==numb)
continue;
else
fwrite((studelinfo+i),sizeof(stuinfo),1,fpinfo);//如果当前结构体指针指向的记录不是要删除,则写入文件"info.dat"
}
/**************************对"score.dat"文件的操作*********************************/
fpscore=fopen("score.dat","wb+");//以写方式打开学生基本信息文件"info.dat",重新向文件中写结构体中记录
for(i=0;i {//如果当前结构体指针指向的记录是要删除的班级和学号,则将该位置以后的所有记录往前复制
if (((strcmp((studelscore+i)->classes ,name)==0)) && (*(studelscore+i)).numb==numb)
continue;
else
fwrite((studelscore+i),sizeof(struct allscores),1,fpscore);//如果当前结构体指针指向的记录不是要删除,则写入文件"info.dat"
}
/***********************************************************/
printf("\n删除操作成功.\n");
}
fclose(fpinfo);//关闭文件
fclose(fpscore);//关闭文件
free(studelscore);//释放内存空间
free(studelinfo);//释放内存空间
return;
}
/****************************************/
/*查询通过考试的学生信息*/
/****************************************/
void querypass()
{
int count=0,i=0,j;
stuinfo stutemp,*stuall,*stufirst;

if((fpinfo=fopen("info.dat","rb"))==NULL)//以只读方式打开学生基本信息文件"info.dat"
{
printf("info.dat文件打开失败.\n");
return;
}
while(fread(&stu, sizeof(stuinfo),1,fpinfo)==1)//获取"info.dat"文件中记录个数
++count;
stuall=(stuinfo *)malloc((count)*sizeof(stuinfo));//动态分配内存空间,分配"info.dat"文件中记录个结构体大小空间
if (stuall!=NULL)//如果分配成功
{
stufirst=stuall;;//记住结构体指针指向内存空间初始位置
rewind(fpinfo);
for(i=0;i {
fread(stuall+i, sizeof(stuinfo),1,fpinfo);
}
stuall=stufirst;//结构体指针指向内存空间初始位置
}
fclose(fpinfo);//关闭"info.dat"文件
for (i=1;i {
stutemp.avgscore = (stuall+i)->avgscore ;//先保存结构体(stuall+i)中值到stutemp
strcpy(stutemp.classes,(stuall+i)->classes);
stutemp.numb=(stuall+i)->numb;
strcpy(stutemp.name,(stuall+i)->name );
for(j = i; j > 0 && ((stuall+j - 1)->avgscore) < stutemp.avgscore; --j)
{
strcpy((stuall+j)->classes,(stuall+j-1)->classes);
(stuall+j)->numb=(stuall+j-1)->numb;
strcpy((stuall+j)->name,(stuall+j-1)->name );
(stuall+j)->avgscore =(stuall+j-1)->avgscore ;
}
(stuall+j)->avgscore = stutemp.avgscore;
strcpy((stuall+j)->classes,stutemp.classes);
(stuall+j)->numb=stutemp.numb;
strcpy((stuall+j)->name,stutemp.name);
}
stuall=stufirst;
printf("\t班级 \t学号\t姓名\t平均成绩\n");
for(i=0;i60的学生记录
if (((stuall+i)->avgscore)>60.0)
printf("\t%s\t%d\t%s\t%f\n",(stuall+i)->classes,(stuall+i)->numb,(stuall+i)->name,(stuall+i)->avgscore );

free(stuall);
if (count==0) printf("\n没有通过考试的学生.\n");
}
/****************************************/
/*按 [班级] 查询学生信息*/
/****************************************/
void queryclass()
{
int i=0;
char classname[6];
printf("\n请输入要查询的班级名称: ");
scanf("%5s",classname);
if((fpinfo=fopen("info.dat","rb"))==NULL)//以只读方式打开信息文件"info.dat"
{
printf("文件打开失败.\n");
exit(1);
}
printf("\t学号\t姓名\t平均成绩\n");
while(fread(&stu, sizeof(stuinfo),1,fpinfo)==1)//"info.dat"中存在该班级的信息则输出
{
if (strcmp(classname,stu.classes)==0)
{
printf("\t%d\t%s\t%f\n",stu.numb,stu.name,stu.avgscore );
++i;
}
}
fclose(fpinfo);
if (i==0) printf("\n没有录入%s班的学生信息.\n",classname);
return;
}
/****************************************/
/*按 [班级] 查询学生成绩*/
/***************************************/
void queryclassscore()
{
int i=0;
char classname[6];
if((fpscore=fopen("score.dat","rb"))==NULL)//以只读方式打开成绩文件"score.dat"
{
printf("文件打开失败.\n");
exit(1);
}
printf("\n请输入要查询的班级名称: ");
scanf("%5s",classname);
printf("\t学号\tc成绩\t\tsql成绩\t\tvb成绩\n");
while(fread(&score, sizeof(struct allscores),1,fpscore)==1)
{
if (strcmp(classname,score.classes)==0)//"score.dat"中存在该班级的信息则输出
{
printf("\t%d\t%f\t%f\t%f\n",score.numb,score.c_score ,score.sql_score,score.vb_score );
++i;
}
}
fclose(fpscore);
if (i==0) printf("\n没有录入%s班的学生信息.\n",classname);
return;
}