#include<stdlib.h>
#include<string.h>struct record
{
char xuehao[10]//学号
char name[20]//姓名
char sex[3]//性别
int ke1//数学
int ke2 //语文
int ke3//英语
int pin
}stu[50]
int k=1,n,mvoid readfile()
void seek()
void insert()
void del()
void save()
void menu()
void seek()
{int i,j,item,flag<br>char s1[20]<br>printf("------------------\n")<br>printf("1.按学号查询\n")<br>printf("2.退出本菜单\n")<br>printf("------------------\n")<br>while(1)<br>{ printf("请选择子菜单编号:")<br>scanf("%d",&item)<br>flag=0<br>switch(item)<br>{<br>case 1:<br>printf("请输入要查询的学生的学号:\n")<br>scanf("%s",s1)<br>for(i=0i<ni++)<br>if(strcmp(stu[i].xuehao,s1)==0)<br>{ flag=1<br>printf("该学生学号,姓名,性别,数学,语文,英语 分别为:\n")<br>printf("%s%s%s %d%d%d",stu[i].xuehao,stu[i].name,<br>stu[i].sex,stu[i].ke1,stu[i].ke2,stu[i].ke3)<br>}
if(flag==0)
printf("该学号不存在!\n")break
case 2:return
default:printf("请在1-2之间选择\n")
}
}
}
void insert()
{ int i=n,j,flag
printf("请输入待增加的学生数:\n")
scanf("%d",&m)
do
{ flag=1
while(flag)
{ flag=0
printf("请输入第 %d 个学生的学号:\n",i+1)
scanf("%s",stu[i].xuehao)
for(j=0j<ij++)
if(strcmp(stu[i].xuehao,stu[j].xuehao)==0)
{ printf("已有该学号,请检查后重新录入!\n")
flag=1
break
}
}
printf("请输入第 %d 个学生的姓名:",i+1)
scanf("%s",stu[i].name)
printf("\n请输入第 %d 个学生的性别:",i+1)
scanf("%s",stu[i].sex)
printf("\n请输入第 %d 个学生的数学成绩:",i+1)
scanf("%d",&stu[i].ke1)
printf("\n请输入第 %d 个学生的语文成绩:",i+1)
scanf("%d",&stu[i].ke2)
printf("\n请输入第 %d 个学生的英语成绩:",i+1)
scanf("%d",&stu[i].ke3)if(flag==0)
{ i=i
i++
}
}while(i<n+m)
n+=m
printf("录入完毕!\n\n")
}void del()
{ int i,j,flag=0
char s1[20]
printf("请输入要删除学生的学号:\n")
scanf("%s",s1)
for(i=0i<ni++)
if(strcmp(stu[i].xuehao,s1)==0)
{ flag=1
for(j=ij<n-1j++)
stu[j]=stu[j+1]
}
if(flag==0)
printf("该学号不存在!\n")
if(flag==1)
{ printf("删除成功,显示结果请选择菜单6\n")
n--
}
}
void readfile()
{
char buf[80],*p="student.dat"
FILE *fp
int i=0
if ((fp=fopen("student.dat","r"))==NULL)
{ printf("Open file %s error! Strike any key to exit!",p)
system("pause")
exit(0)
}
while(fscanf(fp,"%s%s%s%d%d%d",stu[i].xuehao,stu[i].name,
stu[i].sex,&stu[i].ke1,&stu[i].ke2,&stu[i].ke3)==6)
{ i++
i=i
}
fclose(fp)
n=i
printf("录入完毕!\n")
}void save()
{ int i,j,k,flag=0
FILE *fp
fp=fopen("student.dat","w")
for(i=0i<mi++)
{
fprintf(fp,"%s%s%d%d%d",stu[i].xuehao,stu[i].name,stu[i].sex,&stu[i].ke1,
&stu[i].ke2,&stu[i].ke3)
fclose(fp)
printf("已储存")
}
}
void paixu()
{
int i,j,k,t
for(i=0i<mi++)
{
stu[i].pin=(stu[i].ke1+stu[i].ke2+stu[i].ke3)/3
}
for(i=0i<=m-2i++)
{
k=i
for(j=i+1j<=m-1j++)
if(stu[j].pin<stu[k].pin)
k=j
if(k!=i)
{
t=stu[k].pin
stu[k].pin=stu[i].pin
stu[i].pin=t
}
}
for(i=0i<mi++)
{printf("第 %d 个学生的姓名%s:",i+1,stu[i].name)<br> printf("\n第 %d 个学生的性别:%s",i+1,stu[i].sex)<br> printf("\n第 %d 个学生的数学成绩:%d",i+1,stu[i].ke1)<br> printf("\n第 %d 个学生的语文成绩:%d",i+1,stu[i].ke2)<br> printf("\n第 %d 个学生的英语成绩:%d",i+1,stu[i].ke3)<br> printf("\n第 %d 个学生的平均成绩:%d",i+1,stu[i].pin)<br>}
}
void menu()
{ int nub
printf(" \n\n学生成绩管理系统\n\n")
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")
printf("请选择菜单编号:")
scanf("%d",&nub)
switch(nub)
{
case 1:insert()break
case 2:seek()break
case 3:del()break
case 4:readfile()break
case 5:save()break
case 6:paixu()break
case 0:k=0break
default:printf("请在0-6之间选择\n")
}}
void main()
{
while(k)
menu()
}
//平均数是排序后,输出的,如果你不想直接输入,那就不要对每个学生进行选择排序了
程序如下: #include\x0d\x0avoid main()\x0d\x0a{\x0d\x0a float student[100][7]\x0d\x0a//student[][0]存放学号,student[][1]到student[][4]存放四门成绩,\x0d\x0a//student[][5]存放总分,student[][6]存放平均分,student[][7]存放排名\x0d\x0a int n,i,j,k,p,t,count,flag\x0d\x0a int a[100],b[100],c[100]\x0d\x0a//a[]存放排序后的下标,b[]存放总分(备份),c[]存放排名的数据\x0d\x0a printf("输入学生的个数:\n")\x0d\x0a scanf("%d",&n)\x0d\x0a for(i=0ib[i+1])\x0d\x0a{\x0d\x0a c[i]=count\x0d\x0a count++\x0d\x0a}\x0d\x0a }\x0d\x0a printf("\n以下是统计结果:\n")\x0d\x0a printf("学号 s[1]s[2]s[3]s[4] 总分 平均分排名\n")\x0d\x0a for(i=0i 回答于 2022-11-16按照你的要求,链表部分功能单独写。输入我没有写,直接传测试数据给函数的,你自己写scanf输入吧。所以函数我都详细备注了。
#include<stdio.h>#include<malloc.h>
#include<string.h>
typedef struct stuInfo
{
int id//学号
char name[10]//姓名
int score[3]//分数
int ave//平均分
int cont//信息总个数,只需在head中存储
struct stuInfo *next
}SIO
SIO *findSIObyID(int id,SIO *sioHead)// 通过ID查找,返回前一个节点
SIO *insertStu(int count,int id,char name[],int score[3],SIO *sioHead,SIO *sioTail)//插入学生信息。参数:count==-1时在链表末尾新增节点;count>=0时在指定学生位置,原学生后移
void printfSIO(SIO *sioHead)//打印链表
void deleteStu(int id,SIO *sioHead)//删除学生信息,并释放内存
void px(SIO *sioHead)//按照平均分数从高到低
void findMax(SIO *sioHead)//找到平均分最大学生信息
void findMin(SIO *sioHead)//找到平均分最小学生信息
int main()
{
int score[3]
SIO *sioTail=NULL,*sioHead=NULL
sioHead=(SIO *)malloc(sizeof(SIO))
sioHead->next=NULL
sioHead->cont=0
printf("1、显示所有学生成绩:\n")
score[0]=89score[1]=91score[2]=85
sioTail=insertStu(3,111101,"陈明",score,sioHead,sioTail)
score[0]=99score[1]=71score[2]=83
sioTail=insertStu(3,111102,"王大",score,sioHead,sioTail)
score[0]=79score[1]=81score[2]=85
sioTail=insertStu(3,111103,"李四",score,sioHead,sioTail)
score[0]=92score[1]=91score[2]=75
sioTail=insertStu(3,111104,"黄黄",score,sioHead,sioTail)
score[0]=81score[1]=87score[2]=95
sioTail=insertStu(3,111105,"吴郎",score,sioHead,sioTail)
printfSIO(sioHead)
findMax(sioHead)
findMin(sioHead)
printf("\n")
printf("2、删除学号111103的同学信息:\n")
deleteStu(111103,sioHead)
printfSIO(sioHead)
printf("3、按照平均分数从高到低进行排序\n")
px(sioHead)//排序
printfSIO(sioHead)
printf("4、在末尾插入新同学信息:111106,张宁\n")
score[0]=77score[1]=78score[2]=89
sioTail=insertStu(3,111106,"张宁",score,sioHead,sioTail)
printfSIO(sioHead)
printf("4、在中间插入同学信息:111107,张三\n")
score[0]=91score[1]=76score[2]=95
sioTail=insertStu(2,111107,"张三",score,sioHead,sioTail)
printfSIO(sioHead)
printf("4、在头部插入同学信息:111108,刘大\n")
score[0]=86score[1]=84score[2]=85
sioTail=insertStu(1,111108,"刘大",score,sioHead,sioTail)
printfSIO(sioHead)
return 0
}
void printfSIO(SIO *sioHead)//打印链表
{
printf(" %-9s%-8s%-8s%-8s%-8s%s\n","学号","姓名","成绩01","成绩02","成绩03","平均分")
while(sioHead->next!=NULL)
{
printf("%d %s %d %d %d %d\n",sioHead->next->id,sioHead->next->name,sioHead->next->score[0],sioHead->next->score[1],sioHead->next->score[2],sioHead->next->ave)
sioHead=sioHead->next
}
printf("\n\n")
}
void px(SIO *sioHead)//按照平均分数从高到低
{
SIO *sioNext=NULL,*nextSave=NULL,sioSave
while(sioHead->next!=NULL)
{
sioNext=sioHead->next
while(sioNext->next!=NULL)
{
if(sioHead->next->ave<sioNext->next->ave)
{
nextSave=sioHead->next->next
sioSave=*(sioHead->next)
*(sioHead->next)=*(sioNext->next)
sioHead->next->next=nextSave
nextSave=sioNext->next->next
*(sioNext->next)=sioSave
sioNext->next->next=nextSave
}
sioNext=sioNext->next
}
sioHead=sioHead->next
}
}
void findMax(SIO *sioHead)//找到平均分最大学生信息
{
int max=0
SIO *sioMax=NULL
while(sioHead->next!=NULL)
{
if(max<sioHead->next->ave)
{
max=sioHead->next->ave
sioMax=sioHead->next
}
sioHead=sioHead->next
}
printf("1、平均分最大的学生信息:\n")
printf(" %-9s%-8s%-8s%-8s%-8s%s\n","学号","姓名","成绩01","成绩02","成绩03","平均分")
printf("%d %s %d %d %d %d\n",sioMax->id,sioMax->name,sioMax->score[0],sioMax->score[1],sioMax->score[2],sioMax->ave)
}
void findMin(SIO *sioHead)//找到平均分最小学生信息
{
int min=999
SIO *sioMin=NULL
while(sioHead->next!=NULL)
{
if(min>sioHead->next->ave)
{
min=sioHead->next->ave
sioMin=sioHead->next
}
sioHead=sioHead->next
}
printf("1、平均分最小的学生信息:\n")
printf(" %-9s%-8s%-8s%-8s%-8s%s\n","学号","姓名","成绩01","成绩02","成绩03","平均分")
printf("%d %s %d %d %d %d\n",sioMin->id,sioMin->name,sioMin->score[0],sioMin->score[1],sioMin->score[2],sioMin->ave)
}
void deleteStu(int id,SIO *sioHead)//删除指定学号学生信息,并释放内存
{
SIO *dlsio=findSIObyID(id,sioHead)
SIO *dsio=dlsio->next
dlsio->next=dlsio->next->next
dsio->next=NULL
free(dsio)
}
SIO *insertStu(int count,int id,char name[],int score[3],SIO *sioHead,SIO *sioTail)//插入学生信息。count==1时在首节点位置插入;count==2在中间位置插入,原学生后移参数:count==3时在链表末尾新增节点;返回尾节点
{
int con=0,mid=sioHead->cont/2
SIO *sioNew=(SIO *)malloc(sizeof(SIO))
sioNew->next=NULL
sioNew->id=id
strcpy(sioNew->name,name)
sioNew->score[0]=score[0]
sioNew->score[1]=score[1]
sioNew->score[2]=score[2]
sioNew->ave=(score[0]+score[1]+score[2])/3
if(count==3)
{
if(sioHead->next==NULL)
sioHead->next=sioNew
else
sioTail->next=sioNew
sioTail=sioNew
sioHead->cont++
return sioTail
}
if(count==2)//插入中间
{
if(sioHead->cont<2)//如果节点总数小于2,添加在尾部
{
sioHead->cont++
return insertStu(3,id,name,score,sioHead,sioTail)
}
while(sioHead->next!=NULL)
{
con++
if(con==mid)
{
sioNew->next=sioHead->next->next
sioHead->next=sioNew
sioHead->cont++
return sioTail
}
sioHead=sioHead->next
}
}
if(count==1)//插入首节点
{
if(sioHead->next==NULL)
{
sioTail=sioHead->next=sioNew
}
else
{
sioNew->next=sioHead->next->next
sioHead->next=sioNew
}
sioHead->cont++
return sioTail
}
return 0
}
SIO *findSIObyID(int id,SIO *sioHead)// 通过ID查找,返回前一个节点
{
while(sioHead->next!=NULL)
{
if(sioHead->next->id==id)
{
return sioHead
}
sioHead=sioHead->next
}
return NULL
}