学生信息管理系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
const char  *PATH="student.bin"; //文件的路径
int n=0;


typedef struct student
{
     char  cNo[13]; //12位的学号
     char  cName[11];//10个英文字符,或5个汉字
     float  chinese;
     float  math;
     float  english;         
     float  total; //总分
     float  aver;       //平均分
}STUDENT;
void  acceptData(STUDENT stu[],int n,int m);
void  calcByCourse(STUDENT stu[],int n,int m);
void  calcByStudent(STUDENT stu[],int n,int m);
void  sortByTotalAsc(STUDENT stu[],int n,int m);
void  sortByTotalDesc(STUDENT stu[],int n,int m);
void  sortByStuNo(STUDENT stu[],int n,int m);
void sortByName(STUDENT stu[],int n,int m);
void findByNo(STUDENT stu[],int n,int m);
void findByName(STUDENT stu[],int n,int m);
void calcByGrade(STUDENT stu[],int n,int m);
void printAllStu(STUDENT stu[],int n,int m);
void saveToFile(STUDENT stu[],int n,int m);
void loadFromFile(STUDENT stu[],int n);
void Swap(struct student *p,struct student *p1);
int main()
{
    STUDENT stu[N];
    int n,m=3;
    printf("1.Input record\n");
    printf("2.Caculate total and average score of every course\n");
    printf("3.Caculate total and average score of every student\n");
    printf("4.Sort in descending order by total score of every student\n");
    printf("5.Sort in ascending order by total score of every student\n");
    printf("6.Sort in ascending order by number\n");
    printf("7.Sort in dictionary order by name\n");
    printf("8.Search by number\n");
    printf("9.Search by name\n");
    printf("10.Statistic analysis for every course\n");
    printf("11.List record\n");
    printf("12.Write to a file\n");
    printf("13.Read from a file\n");
    printf("0.Exit\n");
    printf("Please enter your choice:\n");

    printf("How many students?\n");

    scanf("%d",&n);
    acceptData(stu,n,m);

    printf("\n计算每门课程的总分和平均分:\n");
    calcByCourse(stu,n,m);

    printf("\n计算每个学生的总分和平均分:\n");
    calcByStudent(stu,n,m);

    printf("\n按每个学生的总分由高到低排出名次表:\n");
    sortByTotalAsc(stu,n,m);

    printf("\n按每个学生的总分由低到高排出名次表\n");
    sortByTotalDesc(stu,n,m);

    printf("\n按学号由小到大排出成绩表:\n");
    sortByStuNo(stu,n,m);

    printf("\n按姓名的字典顺序排出成绩表:\n");
    sortByName(stu,n,m);

    printf("\n按学号查询学生排名及其考试成绩:\n");
    findByNo(stu,n,m);

    printf("\n按姓名查询学生排名及其考试成绩:\n");
    findByName(stu,n,m);

    calcByGrade(stu,n,m);

    printf("\n输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分:\n");
    printAllStu(stu,n,m);

    printf("\n将每个学生的记录信息写入文件\n");
    saveToFile(stu,n,m);

    printf("\n从文件中读出每个学生的记录信息并显示\n");
    loadFromFile(stu,n);
    return 0;
}

//录入每个学生的学号、姓名和各科考试成绩
void  acceptData(STUDENT stu[],int n,int m)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("Input record %d:\n",i+1);
        scanf("%s",&stu[i].cNo);
        stu[i].cNo[12]='\0';

        scanf("%s",&stu[i].cName);
        stu[i].cName[10]='\0';

        scanf("%f",&stu[i].chinese);
        if(stu[i].chinese<0||stu[i].chinese>100)//确保输入的成绩在0到100之间
        {
            printf("error!\n请重新输入:");
            scanf("%f",&stu[i].chinese);
        }

        scanf("%f",&stu[i].math);
        if(stu[i].math<0||stu[i].math>100)//确保输入的成绩在0到100之间
        {
            printf("error!\n请重新输入:");
            scanf("%f",&stu[i].math);
        }

        scanf("%f",&stu[i].english);
        if(stu[i].english<0||stu[i].english>100)//确保输入的成绩在0到100之间
        {
            printf("error!\n请重新输入:");
            scanf("%f",&stu[i].english);
        }
    }
}

//计算每门课程的总分和平均分
void  calcByCourse(STUDENT stu[],int n,int m)
{
    int i;
    float sum;
    sum=0;
    for(i=0;i<n;i++)
    {
        sum+=stu[i].chinese;
    }
    printf("语文的总分为:%f  ",sum);
    printf("语文的平均分为:%f\n",sum/n);

    sum=0;
    for(i=0;i<n;i++)
    {
        sum+=stu[i].math;
    }
    printf("数学的总分为:%f   ",sum);
    printf("数学的平均分为:%f\n",sum/n);

    sum=0;
    for(i=0;i<n;i++)
    {
        sum+=stu[i].english;
    }
    printf("英语的总分为:%f  ",sum);
    printf("英语的平均分为:%f\n",sum/n);

}

//计算每个学生的总分和平均分
void  calcByStudent(STUDENT stu[],int n,int m)
{
    int i;
    float sum;
    for(i=0;i<n;i++)
    {
        sum=0;
        sum+=stu[i].chinese;
        sum+=stu[i].math;
        sum+=stu[i].english;
        stu[i].total=sum;
        stu[i].aver=sum/m;
        printf("%d的总分为%f,平均分为%f\n",i,stu[i].total,stu[i].aver);
    }
}

//按每个学生的总分由高到低排出名次表
void  sortByTotalAsc(STUDENT stu[],int n,int m)
{
    int i,j;
    struct student *pstr;
    struct student *pstr1;  
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n;j++)
        {
            if(stu[i].total<stu[j].total)
            {
                pstr=&stu[i];
                pstr1=&stu[j];
                Swap(pstr,pstr1);
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("第%d名,%f分\n",i+1,stu[i].total);
    }
}


//按每个学生的总分由低到高排出名次表
void  sortByTotalDesc(STUDENT stu[],int n,int m)
{
    int i,j;
    struct student *pstr;
    struct student *pstr1;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n;j++)
        {
            if(stu[i].total>stu[j].total)
            {
                pstr=&stu[i];
                pstr1=&stu[j];
                Swap(pstr,pstr1);
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("第%d名,%f分\n",i+1,stu[i].total);
    }
}


//按学号由小到大排出成绩表
void  sortByStuNo(STUDENT stu[],int n,int m)
{
    int i,j;
    struct student *pstr;
    struct student *pstr1;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n;j++)
        {
            if(strcmp(stu[i].cNo,stu[j].cNo)>0)
            {
                pstr=&stu[i];
                pstr1=&stu[j];
                Swap(pstr,pstr1);
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%f,%f,%f,%f\n",stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
    }
}


//按姓名的字典顺序排出成绩表
void sortByName(STUDENT stu[],int n,int m)
{
    int i,j;
    struct student *pstr;
    struct student *pstr1;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n;j++)
        {
            if(strcmp(stu[i].cName,stu[j].cName)>0)
            {
                pstr=&stu[i];
                pstr1=&stu[j];
                Swap(pstr,pstr1);
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%f,%f,%f,%f\n",stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
    }
}


//按学号查询学生排名及其考试成绩
void findByNo(STUDENT stu[],int n,int m)
{
    char pNo[13];
    int i,flag=0;
    scanf("%s",pNo);
    pNo[12]='\0';
    for(i=0;i<n;i++)
    {
        flag=0;
        if(strcmp(pNo,stu[i].cNo)==0)
        {
            flag=1;
        }
        if(flag==1)
        {
            printf("该学生的学号排名为:%d,考试成绩为:%f ,%f ,%f ,%f\n",i+1,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
            break;
        }
    }

    if(flag==0)
    {
        printf("没有此学生!");
    }
}


//按姓名查询学生排名及其考试成绩
void findByName(STUDENT stu[],int n,int m)
{
    char pNo[13];
    int i,flag=0;
    scanf("%s",pNo);
    pNo[12]='\0';
    for(i=0;i<n;i++)
    {
        flag=0;
        if(strcmp(pNo,stu[i].cName)==0)
        {
            flag=1;
        }
        if(flag==1)
        {
            printf("该学生的学号排名为:%d,考试成绩为:%f ,%f ,%f ,%f\n",i+1,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
            break;
        }
    }

    if(flag==0)
    {
        printf("没有此学生!\n");
    }
}


//对每门课程分别统计每个类别的人数及所占的百分比
void calcByGrade(STUDENT stu[],int n,int m)
{
    float a[3][5];
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            a[i][j]=0;
        }
    }
    for(i=0;i<n;i++)
    {
        if(stu[i].chinese>=90)
        {
            (a[0][0])++;
        }
        else if(stu[i].chinese>80&&stu[i].chinese<90)
        {
            (a[0][1])++;
        }
        else if(stu[i].chinese>70&&stu[i].chinese<80)
        {
            (a[0][2])++;
        }
        else if(stu[i].chinese>60&&stu[i].chinese<70)
        {
            (a[0][3])++;
        }
        else
        {
            (a[0][4])++;
        }
    }
    for(i=0;i<n;i++)
    {
        if(stu[i].math>=90)
        {
            (a[1][0])++;
        }
        else if(stu[i].math>80&&stu[i].math<90)
        {
            (a[1][1])++;
        }
        else if(stu[i].math>70&&stu[i].math<80)
        {
            (a[1][2])++;
        }
        else if(stu[i].math>60&&stu[i].math<70)
        {
            (a[1][3])++;
        }
        else
        {
            (a[1][4])++;
        }
    }
    for(i=0;i<n;i++)
    {
        if(stu[i].english>=90)
        {
            (a[2][0])++;
        }
        else if(stu[i].english>80&&stu[i].english<90)
        {
            (a[2][1])++;
        }
        else if(stu[i].english>70&&stu[i].english<80)
        {
            (a[2][2])++;
        }
        else if(stu[i].english>60&&stu[i].english<70)
        {
            (a[2][3])++;
        }
        else
        {
            (a[2][4])++;
        }
    }
    for(i=0;i<5;i++)
    {
        printf("第%d等\n",i+1);
        printf("chinese %f,math %f,english %f\n",a[0][i]/n,a[1][i]/n,a[2][i]/n);
    }
}

//输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
void printAllStu(STUDENT stu[],int n,int m)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("\n%s,%s,%f,%f,%f,%f,%f\n",stu[i].cNo,stu[i].cName,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total,stu[i].aver);
    }

}


//将每个学生的记录信息写入文件student.txt中
void saveToFile(STUDENT stu[],int n,int m)
{
    FILE * fp;
    int i;
    if((fp = fopen("F:\\PATH","w")) == NULL)
    {
        printf("Failure to open student.bin!\n");
        exit(0);
    }
    fprintf(fp,"%d\t%d\n",n,m);
    for(i=0;i<n;i++)
    {
        fprintf(fp,"%s,%s,%f,%f,%f,%f,%f",stu[i].cNo,
                                    stu[i].cName,
                                    stu[i].chinese,
                                    stu[i].math,
                                    stu[i].english,
                                    stu[i].total,
                                    stu[i].aver);

    }
    fclose(fp);
}


//从文件中读出每个学生的记录信息并显示
void loadFromFile(STUDENT stu[],int n)
{
    FILE * fp;
    int i=0;
    if((fp = fopen("F:\\PATH","r")) == NULL)
    {
        printf("Failure to open student.txt!\n");
        exit(0);
    }
    while(!feof(fp))
    {
        fread(&stu[i],sizeof(STUDENT),1,fp);
        i++;
    }
    i=0;
    while(i<n)
    {
        printf("\n%s,%s,%f,%f,%f,%f,%f\n",stu[i].cNo,stu[i].cName,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total,stu[i].aver);
        i++;
    }

    fclose(fp);
}


//交换结构体内部的两组数据

void Swap(struct student *p,struct student *p1)
{
    struct student a;
    a=*p1;
    *p1=*p;
    *p=a;
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值