学生信息管理系统-结构体编写

来源:互联网 发布:初级程序员考什么语言 编辑:程序博客网 时间:2024/05/01 22:22

对学生基本信息,包括学号、姓名、至少三门课成绩。

①  学生基本信息录入;

②  学生基本信息的输出;

③  按学号查询学生信息;

④  按学号修改某学生信息并输出;

⑤  求每个人平均成绩;

⑥  求每门课程平均成绩;

⑦  删除某学生信息;

⑧  添加某学生信息;

⑨  输出个人平均分大于80分的同学信息;

根据总成绩或平均成绩综合排名

源代码:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define N 35 //35个学生

#define M 3 //3门课程

typedef struct student  //定义结构体student

{

    longstudentID;

    charstudentName[10];

    charstudentSex;

    float score[M];

    float sum;

    float aver;

}STUDENT;

STUDENT stu[N]; //定义结构体的数组

 

int n,m;

 

void inputscore(STUDENT stu[]); //输入学生信息

void ReadfromFile(STUDENT stu[],int *n,int *m);  //从文件中读取学生的信息到结构体数组stu中

void savescore(STUDENT stu[]);//保存学生成绩

void avergescore(STUDENT stu[]);//求平均分

void sum(STUDENT stu[]);//求总分

void lookscore(STUDENT stu[]);//按平均分高低排序输出

void searchscore(STUDENT stu[]);//通过输入学号查找学生成绩

void statistic(STUDENT stu[]);//输出班级及格率、>80分的学生名单

void add(STUDENT stu[]);//添加学生成绩

void modify(STUDENT stu[]);//通过学号修改学生成绩

void deletescore(STUDENT stu[]);//删除指定学生成绩

void menu();//主选择菜单

void main()

{

     short intflag=0;

     STUDENTstu[N];

     menu();

     do

     {

        flag=1;

         //scanf("%d",&h);

         switch(getchar())

         {

            case '0':         //从文件中读取成绩

                 ReadfromFile(stu,&n,&m);

                 break;

            case '1':         //输入成绩

                 inputscore(stu);

                 break;

            case'2':         //查看成绩

                 lookscore(stu);

                 break;

            case'3':         //按学号查找成绩

                 searchscore(stu);

                 break;

            case'4':         //统计成绩

                 statistic(stu);

                 break;

            case'5':         //按学号修改成绩

                 modify(stu);

                 break;

            case'6':         //按学号添加成绩

                 add(stu);

                 break;

            case'7':         //删除成绩

                 deletescore(stu);

                 break;

            case'8':         //保存成绩

                 savescore(stu);

                 break;

            case'9':         //退出程序

                return ; 

            default:

                printf("操作数无效,按任意键返回主菜单\n");

               

         }

     printf("按任意键继续\n");

     getchar();//等待用户输入任意字符

     getchar();

     system("CLS");//清屏

     menu();

     }while(flag==1);

 

}

 

 

//主选择菜单

void menu()

{

    

     printf(" ╭═══════════════════════════════╮\n"); 

    printf("║学生成绩管理程序                                               ║\n"); 

    printf("║                                                               ║\n"); 

    printf("║<0>从文件中读取成绩                                             ║\n");

    printf("║<1>输入成绩                                                    ║\n"); 

    printf("║<2>查看成绩                                                    ║\n"); 

    printf("║<3>按学号查找                                                  ║\n"); 

    printf("║<4>统计成绩                                                    ║\n"); 

    printf("║<5>按学号修改成绩                                               ║\n"); 

    printf("║<6>按学号添加成绩                                               ║\n"); 

    printf("║<7>按学号删除成绩                                               ║\n"); 

    printf("║<8>保存成绩                                                    ║\n"); 

    printf("║<9>退出                                                        ║\n");

     printf("╰════════════════════════════════╯\n\n");

    printf("请输入您的选择:");

}

 

//1号功能:输入各个同学的学生信息

void inputscore(STUDENT stu[])

{  

       system("CLS");

        int i,j;

        system("cls");//清屏

        printf("请输入学生总数:");

        scanf("%d",&n);

        system("cls");

        printf(" ╭══════════════════════════════════╮\n");

        printf("║提示:输入学号时请输入由9位数字组成的学号!,如201401***               ║\n");

        printf("╰═══════════════════════════════════╯\n\n");//因二维表上下需对正故有此要求//

        for(i=0;i<n;i++)

        {  

            printf("请输入学生%d的学号 姓名:\n",i+1);

            scanf(" %ld%s",&stu[i].studentID,stu[i].studentName);

            getchar();

           printf("请输入性别:");

            scanf("%c",&stu[i].studentSex);

            getchar();

            printf("请输入学生成绩:\n");

            printf("汇编\t数电\tC语言\n");

            for(j=0;j<M;j++)

                scanf("%f",&stu[i].score[j]);

        }

        printf("成功输入!\n");

}

 

//计算各个同学总分

void sum(STUDENT stu[])

{

    int i,j;

    for(i=0;i<n;i++)

    {

        stu[i].sum=0;

        for(j=0;j<M;j++)

        {

            stu[i].sum+=stu[i].score[j];

        }

    }

}

 

 

//计算各个同学平均分

void avergescore(STUDENT stu[])

{

    int i;

    for(i=0;i<n;i++)

    {

        stu[i].aver=0;

        stu[i].aver=stu[i].sum/M;

    }

}

 

 

//2号:查看学生成绩及根据平均分对学生进行排序

void lookscore(STUDENT stu[])

{

   

   system("CLS");

    int i,j,k;

   

    STUDENT t;

    sum(stu);

    avergescore(stu);

    system("cls");

    for(i=0;i<n-1;i++)

    {  

        for(k=i,j=i+1;j<n;j++)

            if(stu[j].aver>stu[k].aver)

                k=j;

            if(k!=j)

            {  

                t=stu[k];

                stu[k]=stu[i];

                stu[i]=t;

            }

    }

    printf("╭══════════════════════════════════════╮\n");

    printf("名次\t学号\t\t姓名\t性别\t汇编\t数电\tC语言\t总分\t平均分\n");

    for(i=0;i<n;i++)

    {  

        printf("%d\t%ld\t%s\t%3c\t",i+1,stu[i].studentID,stu[i].studentName,stu[i].studentSex);

            for(j=0;j<M;j++)

               printf("%4.2f\t",stu[i].score[j]);

            printf("%4.2f\t",stu[i].sum);

            printf("%4.2f\n",stu[i].aver);                      

    }

   printf("╰══════════════════════════════════════╯\n\n"); 

 

}

//3号功能:通过学号查找学生成绩

void searchscore(STUDENT stu[])

{  

    system("CLS");

    long a;

    int i,j;

    //system("cls");

    printf("请输入需查询的学生学号:");

    scanf("%ld",&a);

    printf("╭═════════════════════════════════════╮\n");

    for(i=0;i<n;i++)

    {  

        if(a==stu[i].studentID)

        {  

            printf("名次\t学号\t\t姓名\t性别\t汇编\t数电\tC语言\t总分\t平均分\n");

            printf("%d\t%9ld\t%s\t%3c\t",i+1,stu[i].studentID,stu[i].studentName,stu[i].studentSex);   

            for(j=0;j<M;j++)

            {

               printf("%4.2f\t",stu[i].score[j]);

            }

            printf("%4.2f\t",stu[i].sum);

            printf("%4.2f\n",stu[i].aver);

           printf("╰═════════════════════════════════════╯\n\n");

            break;

        }

    }

    if(i==n)

    {

       printf("未找到该学生信息!\n");

       printf("╰═════════════════════════════════════╯\n\n");

    }

}

//4号功能:统计学生成绩信息,平均分及大于80分的同学

void statistic(STUDENT stu[])

{

    STUDENT*p=stu;  //*p指向STUDENT结构体数组stu的第一个元素stu[0]

    int i,j;

    floatcount=0.0,sum=0.0;

    system("cls");

    for(i=0;i<n;i++)

    {

        sum+=(p+i)->aver;

    }

    printf("该班级平均分为%4.2f\n",sum/n);      //平均分计算

    for(i=0;i<n;i++)

    {  

        if((p+i)->aver>=60)

            count++;

    }

    printf("该班级及格率为%4.2f%%\n",count/n*100);  //及格率计算

    j=0;

    for(i=0;i<n;i++)

    {   if((p+i)->aver>=80)

        j++;

    }

    printf("该班级平均成绩大于80的同学有%d个!\n",j);  //大于80分的同学

    printf("平均成绩大于80的同学名单\n");

    for(i=0;i<n;i++)

    {  

            if(stu[i].aver>80)  

            printf("%s\n",stu[i].studentName);

    }

}

//5号功能:按学号修改某学生成绩并输出

void modify(STUDENT stu[])

{

    long a;

    int i,j;

    system("cls");

    printf("请输入需要修改成绩的学生学号:");

    scanf("%ld",&a);

    for(i=0;i<n;i++)

    {  

        if(a==stu[i].studentID)

        {  

            printf("╭═════════════════════════════════════╮\n");

            printf("名次\t学号\t\t姓名\t性别\t汇编\t数电\tC语言\t总分\t平均分\n");

           printf("%d\t%9ld\t%s\t%3c\t",i+1,stu[i].studentID,stu[i].studentName,stu[i].studentSex);   

            for(j=0;j<M;j++)

               printf("%4.2f\t",stu[i].score[j]);

            printf("%4.2f\t",stu[i].sum);

            printf("%4.2f\n",stu[i].aver); 

            printf("╰═════════════════════════════════════╯\n\n");

            printf("请重新输入该学生的学号 姓名:\n");

            scanf("%ld%s",&stu[i].studentID,stu[i].studentName);

            getchar();

            printf("请输入性别:");

            scanf("%c",&stu[i].studentSex);

            getchar();

            printf("请重新输入学生成绩:\n");

            printf("汇编\t数电\tC语言\n");

            for(j=0;j<M;j++)

                scanf("%f",&stu[i].score[j]);//找到该学生成绩后进行修改,跳出for循环

            printf("修改成功!\n");

            break;

        }

    }

    if(i==n)

      printf("请确认该学生是否为本班学生!\n");

   

}

//6号功能:添加学生成绩

void add(STUDENT stu[])

{

    int a,i,j;

    system("cls");

   

    printf("请输入新增加的学生人数:");

    scanf("%d",&a);

    n=n+a;

    for(i=n-a;i<n;i++)

    {  

        printf("请输入学生%d的学号 姓名:\n",i+1);

        scanf("%ld %s",&stu[i].studentID,stu[i].studentName);

        getchar();

        printf("请输入性别:");

        scanf("%c",&stu[i].studentSex);

        getchar();

        printf("请输入学生成绩: \n");

        printf("汇编\t数电\tC语言 \n");

        for(j=0;j<M;j++)

            scanf("%f",&stu[i].score[j]);

        printf("添加成功!\n");

    }

}

//7号功能:删除学生成绩

void deletescore(STUDENT stu[])

{  

    int i,j,c;

    long a;

    system("cls");

    printf("请输入学生学号:");

    scanf("%ld",&a);

    for(i=0;i<n;i++)

    {  

        if(a==stu[i].studentID)

        {

            printf("╭════════════════════════════════════╮\n");

            printf("名次\t学号\t\t姓名\t性别\t汇编\t数电\tC语言\t总分\t平均分\n");

            printf("%d\t%9ld\t%s\t%3c\t",i+1,stu[i].studentID,stu[i].studentName,stu[i].studentSex);

            for(j=0;j<M;j++)

            printf("%4.2f\t",stu[i].score[j]);

            printf("%4.2f\t",stu[i].sum);

            printf("%4.2f\n",stu[i].aver);

            printf("╰════════════════════════════════════=╯\n\n");

            c=i;

            break;

        }

       

    }

    if(i==n)

        printf("未找到该学生信息!\n");

 

        printf("是否删除该学生成绩?(y/n)\n");

        scanf("%s",&m);

        if(m=='y')

        {  

            for(i=c;i<n-1;i++)

                stu[i]=stu[i+1];            //结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置

                n=n-1;                      //删除该学生信息后学生总数减一

                printf("删除成绩成功!\n");

        }

        else

            printf("删除成绩失败!\n");

}

//8号功能:保存学生成绩

void savescore(STUDENT stu[])

{  

    FILE *fp;

    int m=3;

    inti,j,flag=1;

    char a;

    system("cls");

    puts("是否保存学生成绩?(y/n)");

    scanf("%s",&a);

    if(a=='y')

    {  

        if((fp=fopen("StudentInformation1.txt","w"))==NULL)  //以写的方式打开文本文件

        {  

            printf("文件打开失败!\n");

            exit(0);

        }

        fprintf(fp,"%4d%4d\n",n,m);

        for(i=0;i<n;i++)

        {

            fprintf(fp,"%9ld%10s%3c",stu[i].studentID,

                stu[i].studentName,

                stu[i].studentSex);

            for(j=0;j<m;j++)

            {

                fprintf(fp,"%4.2f",stu[i].score[j]);

            }

            fprintf(fp,"%4.2f",stu[i].sum);

            fprintf(fp,"%4.2f\n",stu[i].aver);

        }

        fclose(fp);

    }

}

 

//0号功能:从文件中读取学生的信息到结构体数组stu中

void ReadfromFile(STUDENT stu[],int *n,int *m)

{

   

    FILE *fp;

    *m=3;

    int i,j;

    if((fp=fopen("StudentInformation1.txt","r"))==NULL)//  以读方式打开文件

    {

        printf("Failureto open StudentInformation1.txt!\n");

        exit(0);

    }

    fscanf(fp,"%d%d",n,m);//从文件中读取学生人数和课程门数

    for(i=0;i<=*n;i++)  //学生人数保存在n指向的储存单元

    {

        fscanf(fp,"%9ld",&stu[i].studentID);

       fscanf(fp,"%10s",stu[i].studentName);

        fscanf(fp,"%c",&stu[i].studentSex);

        for(j=0;j<*m;j++)  //课程数保存在m指向的储存单元

        {

            fscanf(fp,"%f",&(stu[i].score[j]));

        }

        fscanf(fp,"%f",&stu[i].sum);

        fscanf(fp,"%f",&stu[i].aver);

    }

    fclose(fp);

}

0 0
原创粉丝点击