Student achievement management system

濮宇定
2023-12-01
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#define SIZE 50
struct Student
{
    char name[10];      //定义结构体
    int ID;
    float Chinese;
    float Math;
    float English;
    float sum;
    float average;
} student[SIZE]= {0};       //初始化结构体

int p=0;

void add();             //功能 添加 模块
void rank();            //功能 排序 模块
void Menu();            //菜单页面
void query();           //功能 查询 模块
void revamp();          //功能 修改 模块
void browse();          //功能 浏览 模块
void mysort(int n);     //冒泡排序
void compute(int n);    //用于计算总分和平均分
void student_inf(int n);//打印单个学生信息
void change(int n,int t);//实现结构体数组两个元素的交换
int main()
{
    //system("color FA");   //设置控制台背景和字体颜色
    int ch;
    FILE *fp;
    fp=fopen("C:\\student.dat","rb+");      //每次运行读取文件(设置为只读)
    if(fp!=NULL)                    //若文件存在,则读取信息到结构体
    {
        while(!feof(fp))
        {
            if(!feof(fp))
            {
                fread(&student[p],sizeof(student[0]),1,fp);
                p++;
            }
        }
        p--;                //多加了
    }
    fclose(fp);
    while(1)
    {
        system("cls");  //清除屏幕
        Menu();
        printf("请输入对应编号(1-6):");
        ch=getche()-48;
        if(ch==6)
        {
            puts("\n\nThank You For Your Use!");        //退出系统
            break;
        }
        else
        {

            switch(ch)
            {
            case 1:
                query();
                break;
            case 2:
                add();
                break;
            case 3:
                revamp();
                break;
            case 4:
                browse();
                break;
            case 5:
                rank();
                break;
            default :
                printf("\a");
                MessageBox(0,"无此功能,请重新输入!","ERROR!",0);
            }
        }
    }
    return 0;
}
void Menu()
{
    puts("╔═════════════════════════════════════════╗");
    puts("║                        成    绩    管    理    系    统                          ║");
    puts("╠═════════════════════════════════════════╣");
    puts("║                                                                                  ║");
    puts("║                          1.查  询            2.添  加                            ║");
    puts("║                                                                                  ║");
    puts("║                          3.删  改            4.浏  览                            ║");
    puts("║                                                                                  ║");
    puts("║                          5.排  序            6.退  出                            ║");
    puts("║                                                                                  ║");
    puts("╚═════════════════════════════════════════╝");
}
void add()
{
    FILE *fp;
    fp=fopen("C:\\student.dat","ab+");          //以追加读写模式打开
    if(fp==NULL)
    {
        puts("ERROR!");
        return;
    }
    system("cls");
    puts("╔═════════════════════════════════════════╗");
    puts("║                                                                                  ║");
    puts("║                            学  生  信  息  添  加                                ║");
    puts("║                                                                                  ║");
    puts("╚═════════════════════════════════════════╝");
    printf("请输入学生学号:");
    scanf("%d",&student[p].ID);
    getchar();
    printf("请输入学生姓名:");
    gets(student[p].name);
    printf("请输入该生的语文成绩:");
    scanf("%f",&student[p].Chinese);
    printf("请输入该生的数学成绩:");
    scanf("%f",&student[p].Math);
    printf("请输入该生的英语成绩:");
    scanf("%f",&student[p].English);
    compute(p);
    fwrite(&student[p],sizeof(student[p]),1,fp);        //信息写入文件
    fclose(fp);
    puts("你添加的信息如下:");
    student_inf(p);
    puts("按任意键返回主菜单...");
    getch();
    p++;
}
void compute(int n)
{
    student[n].sum=student[n].Chinese+student[n].Math+student[n].English;
    student[n].average=student[n].sum/3;        //用于计算总分和平均分
}
void query()
{
    int id=0,j=0;
    char ch;
    char name[20];
    system("cls");
    puts("╔═════════════════════════════════════════╗");
    puts("║                            学  生  信  息  查  询                                ║");
    puts("║                                                                                  ║");
    puts("║              1.按 学 号 查 询                2.按 姓 名 查 询                    ║");
    puts("╚═════════════════════════════════════════╝");
    printf("你的选择是:");
    fflush(stdin);
    ch=getche();
    if(ch!='1'&&ch!='2')
    {
        printf("\a");
        MessageBox(0,"无此功能!","ERROR!",0);
        return;
    }
    if(ch=='1')
    {
        printf("\n请输入学生学号:");
        scanf("%d",&id);
        while(student[j].ID!=0)
        {
            if(student[j].ID==id)
            {
                student_inf(j);
                puts("按任意键返回主菜单...");
                getch();    //暂停等待确认
                return;
            }
            j++;
        }
    }
    else if(ch=='2')
    {
        printf("\n请输入学生姓名:");
        gets(name);
        while(student[j].ID!=0)
        {
            if(strcmp(name,student[j].name)==0)
            {
                student_inf(j);
                puts("按任意键返回主菜单...");
                getch();    //暂停等待确认
                return;
            }
            j++;
        }
    }
    printf("\a");
    MessageBox(0,"未找到该生信息!","ERROR!",0);
    //打印提示信息
}
void student_inf(int n)
{
    puts("╔═════╦═════╦═════╦═════╦═════╦═════╦═════╗");
    puts("║  姓  名  ║  学  号  ║  语  文  ║  数  学  ║  英  语  ║  总  分  ║ 平 均 分 ║");
    puts("╠═════╬═════╬═════╬═════╬═════╬═════╬═════╣");
    printf("║  %-6s  ║%-10d║  %-6.1f  ║",student[n].name,student[n].ID,student[n].Chinese);
    printf("  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║\n",
           student[n].Math,student[n].English,student[n].sum,student[n].average);
    puts("╚═════╩═════╩═════╩═════╩═════╩═════╩═════╝");
}
void revamp()
{
    int id,j=0,i,f=0;
    FILE *fp;
    char ch;
    system("cls");
    puts("╔═════════════════════════════════════════╗");
    puts("║                             删    改    功    能                                 ║");
    puts("║                                                                                  ║");
    puts("║                       1.修  改                2.删  除                           ║");
    puts("╚═════════════════════════════════════════╝");
    printf("请输入你的选择:");
    fflush(stdin);
    ch=getche();
    if(ch!='1'&&ch!='2')
    {
        printf("\a");
        MessageBox(0,"无此功能!","ERROR!",0);
        return;
    }
    printf("\n请输入学生学号:");
    scanf("%d",&id);    //保存id用于遍历查找此id
    while(student[j].ID!=0)
    {
        if(student[j].ID==id)       //找到则打印学生信息
        {
            student_inf(j);
            f=1;
            break;
        }
        j++;
    }
    if(f==0)
    {
        printf("\a");
        MessageBox(0,"未找到该生信息!","ERROR!",0);
        //打印提示信息
        return;
    }
    if(ch=='1')
    {
        printf("请输入该生的语文成绩:");
        scanf("%f",&student[j].Chinese);
        printf("请输入该生的数学成绩:");
        scanf("%f",&student[j].Math);
        printf("请输入该生的英语成绩:");
        scanf("%f",&student[j].English);
        compute(j);
        student_inf(j);
        FILE *fp;
        fp=fopen("C:\\student.dat","wb+");
        i=p-1;
        while(i>=0)
        {
            fwrite(&student[i],sizeof(student[i]),1,fp);
            i--;
        }
        puts("信息修改并保存成功!");
        fclose(fp);
    }
    else if(ch=='2')
    {
        printf("确认删除该学生信息?是(Y)否(N):");
        ch=getche();
        if(ch!='y'&&ch!='Y')
        {
            puts("\n未删除该学生信息!");
            puts("\n按任意键返回主菜单...");
            getch();
            return;
        }
        while(student[j].ID!=0)
        {
            if(student[j].ID==id)
            {
                change(j,p-1);
                fp=fopen("C:\\student.dat","wb+");
                i=p-2;
                //删除机制:将最后一位(即p-1)的信息与待删除的信息交换
                //        然后重新写入前数据 (p-1)位数据,最后一位舍弃
                while(i>=0)
                {
                    fwrite(&student[i],sizeof(student[i]),1,fp);
                    i--;
                }
                puts("\n该学生信息删除成功!");
                fclose(fp);
                break;
            }
        }
    }
    p=0;            //修改或删除信息后重新读取信息
    fp=fopen("C:\\student.dat","rb+");
    if(fp!=NULL)
    {
        while(!feof(fp))
        {
            if(!feof(fp))
            {
                fread(&student[p],sizeof(student[0]),1,fp);
                p++;
            }
        }
        p--;
    }
    fclose(fp);
    puts("\n按任意键返回主菜单...");
    getch();
    return;
}
void mysort(int n)              //冒泡排序,以形参来决定以哪一个属性排序
{
    int i,j;                    //然后调用change(a,b)交换结构体数组两个元素的值
    switch(n)
    {
    case 1:
        for(i=0; i<p; i++)
        {
            for(j=0; j<p-i-1; j++)
            {
                if(student[j].Chinese>student[j+1].Chinese)
                {
                    change(j,j+1);
                }
            }
        }
        break;
    case 2:
        for(i=0; i<p; i++)
        {
            for(j=0; j<p-i-1; j++)
            {
                if(student[j].Math>student[j+1].Math)
                {
                    change(j,j+1);
                }
            }
        }
        break;
    case 3:
        for(i=0; i<p; i++)
        {
            for(j=0; j<p-i-1; j++)
            {
                if(student[j].English>student[j+1].English)
                {
                    change(j,j+1);
                }
            }
        }
        break;
    case 4:
        for(i=0; i<p; i++)
        {
            for(j=0; j<p-i-1; j++)
            {
                if(student[j].average>student[j+1].average)
                {
                    change(j,j+1);
                }
            }
        }
        break;
    case 5:
        for(i=0; i<p; i++)
        {
            for(j=0; j<p-i-1; j++)
            {
                if(student[j].sum>student[j+1].sum)
                {
                    change(j,j+1);
                }
            }
        }
        break;
    }
}
void change(int n,int t)
{
    float temp;
    char h[SIZE];
    int x;
    temp=student[n].average;
    student[n].average=student[t].average;
    student[t].average=temp;
    temp=student[n].Chinese;
    student[n].Chinese=student[t].Chinese;
    student[t].Chinese=temp;
    temp=student[n].English;
    student[n].English=student[t].English;
    student[t].English=temp;
    temp=student[n].Math;
    student[n].Math=student[t].Math;
    student[t].Math=temp;
    temp=student[n].sum;
    student[n].sum=student[t].sum;
    student[t].sum=temp;
    x=student[n].ID;
    student[n].ID=student[t].ID;
    student[t].ID=x;
    strcpy(h,student[n].name);
    strcpy(student[n].name,student[t].name);
    strcpy(student[t].name,h);
}
void rank()
{
    int ch,j;
    system("cls");
    puts("╔═════════════════════════════════════════╗");
    puts("║                              排    序    功    能                                ║");
    puts("║                                                                                  ║");
    puts("║                1.语 文 成 绩 排 序           2.数 学 成 绩 排 序                 ║");
    puts("║                                                                                  ║");
    puts("║                3.英 语 成 绩 排 序           4.平 均 成 绩 排 序                 ║");
    puts("║                                                                                  ║");
    puts("║                              5.总  成  绩  排  序                                ║");
    puts("╚═════════════════════════════════════════╝");
    printf("你的选择是:");
    ch=getche()-48;
    printf("\n");
    if(ch>5)
    {
        printf("\a");
        MessageBox(0,"无此功能!","ERROR!",0);
        return;
    }
    puts("╔═════╦═════╦═════╦═════╦═════╦═════╦═════╗");
    puts("║  姓  名  ║  学  号  ║  语  文  ║  数  学  ║  英  语  ║  总  分  ║ 平 均 分 ║");
    puts("╠═════╬═════╬═════╬═════╬═════╬═════╬═════╣");
    mysort(ch);
    for(j=0; j<p; j++)
    {
        printf("║  %-6s  ║%-10d║  %-6.1f  ║",student[j].name,student[j].ID,student[j].Chinese);
        printf("  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║\n",
               student[j].Math,student[j].English,student[j].sum,student[j].average);
    }
    puts("╚═════╩═════╩═════╩═════╩═════╩═════╩═════╝");
    puts("按任意键返回主菜单...");
    getch();
}
void browse()
{
    int ch,j;
    system("cls");
    puts("╔═════════════════════════════════════════╗");
    puts("║                            学  生  信  息  浏  览                                ║");
    puts("║                                                                                  ║");
    puts("║                 1.语 文 成 绩                2.数 学 成 绩                       ║");
    puts("║                                                                                  ║");
    puts("║                 3.英 语 成 绩                4.所 有 成 绩                       ║");
    puts("╚═════════════════════════════════════════╝");
    printf("你的选择是:");
    ch=getche()-48;
    printf("\n");
    if(ch<4)
        mysort(ch);
    switch(ch)
    {
    case 1:
        puts("╔═════════════════════════════════════════╗");
        puts("║                语    文   不     及    格    学   生    信    息                 ║");
        puts("╠═════╦═════╦═════╦═════╦═════╦═════╦═════╣");
        puts("║  姓  名  ║  学  号  ║  语  文  ║  数  学  ║  英  语  ║  总  分  ║ 平 均 分 ║");
        puts("╠═════╬═════╬═════╬═════╬═════╬═════╬═════╣");
        for(j=0; j<p; j++)
            if(student[j].Chinese<90)
            {
                printf("║  %-6s  ║%-10d║  %-6.1f  ║",student[j].name,student[j].ID,student[j].Chinese);
                printf("  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║\n",
                       student[j].Math,student[j].English,student[j].sum,student[j].average);
            }
        puts("╚═════╩═════╩═════╩═════╩═════╩═════╩═════╝");
        break;
    case 2:
        puts("╔═════════════════════════════════════════╗");
        puts("║                数    学   不     及    格    学   生    信    息                 ║");
        puts("╠═════╦═════╦═════╦═════╦═════╦═════╦═════╣");
        puts("║  姓  名  ║  学  号  ║  语  文  ║  数  学  ║  英  语  ║  总  分  ║ 平 均 分 ║");
        puts("╠═════╬═════╬═════╬═════╬═════╬═════╬═════╣");
        for(j=0; j<p; j++)
            if(student[j].Math<90)
            {
                printf("║  %-6s  ║%-10d║  %-6.1f  ║",student[j].name,student[j].ID,student[j].Chinese);
                printf("  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║\n",
                       student[j].Math,student[j].English,student[j].sum,student[j].average);
            }
        puts("╚═════╩═════╩═════╩═════╩═════╩═════╩═════╝");
        break;
    case 3:
        puts("╔═════════════════════════════════════════╗");
        puts("║                英    语   不     及    格    学   生    信    息                 ║");
        puts("╠═════╦═════╦═════╦═════╦═════╦═════╦═════╣");
        puts("║  姓  名  ║  学  号  ║  语  文  ║  数  学  ║  英  语  ║  总  分  ║ 平 均 分 ║");
        puts("╠═════╬═════╬═════╬═════╬═════╬═════╬═════╣");
        for(j=0; j<p; j++)
            if(student[j].English<90)
            {
                printf("║  %-6s  ║%-10d║  %-6.1f  ║",student[j].name,student[j].ID,student[j].Chinese);
                printf("  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║\n",
                       student[j].Math,student[j].English,student[j].sum,student[j].average);
            }
        puts("╚═════╩═════╩═════╩═════╩═════╩═════╩═════╝");
        break;
    case 4:
        puts("╔═════════════════════════════════════════╗");
        puts("║          学          生          信          息          浏          览          ║");
        puts("╠═════╦═════╦═════╦═════╦═════╦═════╦═════╣");
        puts("║  姓  名  ║  学  号  ║  语  文  ║  数  学  ║  英  语  ║  总  分  ║ 平 均 分 ║");
        puts("╠═════╬═════╬═════╬═════╬═════╬═════╬═════╣");
        for(j=0; j<p; j++)
        {
            printf("║  %-6s  ║%-10d║  %-6.1f  ║",student[j].name,student[j].ID,student[j].Chinese);
            printf("  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║  %-6.1f  ║\n",
                   student[j].Math,student[j].English,student[j].sum,student[j].average);
        }
        puts("╚═════╩═════╩═════╩═════╩═════╩═════╩═════╝");
        break;
    default :
        printf("\a");
        MessageBox(0,"无此功能!","ERROR!",0);
        break;
    }
    puts("按任意键返回主菜单...");
    getch();
}

 类似资料:

相关阅读

相关文章

相关问答