c语言编写查询学生成绩管理程序。

Python028

c语言编写查询学生成绩管理程序。,第1张

#include<stdio.h>

#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

}