欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言学生成绩管理系统第二弹

程序员文章站 2024-03-22 21:39:22
...

成绩管理系统第二弹

之前发布了简易的学生成绩管理系统:点我跳转
今天这个版本,使用了结构体、文件指针。可将信息自定义保存到txt中,并且可以在txt读入信息。
本程序未使用动态申请内存,最大学生数量为50人。
整体程序结构较为严谨,多处验证。
C语言学生成绩管理系统第二弹

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

#define true 1
#define false 0
#define num_max 50 //宏定义最大学生人数

//定义学生结构体
struct student{
    int id;
    char name[20];
    int score[3];
    int sum;
    float aver;
};

//创建结构体数组
struct student stu[num_max];

//菜单选择函数
char menu_select();
//获取学生人数
int get_num();
//新创建输入
void input(struct student stu[],int num);
//输出函数
void output(struct student stu[],int num);
//交换结构体数组的整体信息
void change(struct student *stu1,struct student *stu2);
//删除函数
void del(struct student stu[],int num,int *p);
//查找函数
void search(struct student stu[],int num);
//插入函数
void input_again(struct student stu[],int num,int *p);
//排序函数
void sort(struct student stu[],int num);
//加载
void load_txt(struct student stu[],int num,int *p);
//保存
void save_txt(struct student stu[],int num);

int main()
{
    int num;
    char ch;
    int *p=&num;
    while(1)
    {
        ch=menu_select();
        switch(ch)
        {
            case '1':system("cls"),num=get_num(),input(stu,num),system("pause");break;
            case '2':system("cls"),output(stu,num),system("pause");break;
            case '3':system("cls"),search(stu,num),system("pause");break;
            case '4':system("cls"),del(stu,num,p),system("pause");break;
            case '5':system("cls"),sort(stu,num),system("pause");break;
            case '6':system("cls"),input_again(stu,num,p),system("pause");break;
            case '7':system("cls"),save_txt(stu,num),system("pause");break;
            case '8':system("cls"),load_txt(stu,num,p),system("pause");break;
            case '0':break;
            default :printf("输入错误");
        }
        if(ch=='0')
            break;
        system("cls");
    }
}

//菜单选择函数
char menu_select()
{
    char n;
    printf("********************************************************************************\n");
    printf("\t\t\t 欢迎 Welcome to\n");
    printf("\n\t\t\t 使用学生成绩查询管理系统\n\n\t\t\t\t\t\n");
    printf("*************************************MENU***************************************\n");
    printf("\t\t\t1. 输入学生成绩记录 Enter the record\n"); /*输入学生成绩记录*/
    printf("\t\t\t2. 显示 Print the record\n"); /*显示*/
    printf("\t\t\t3. 寻找 Search record on name\n"); /*寻找*/
    printf("\t\t\t4. 删除 mydelete a record\n"); /*删除*/
    printf("\t\t\t5. 排序 Sort by ID or sum or average\n"); /*排序*/
    printf("\t\t\t6. 插入 Insert record to list\n"); /*插入*/
    printf("\t\t\t7. 保存 Save the file\n"); /*保存*/
    printf("\t\t\t8. 读取 Load the file\n"); /*读取*/
    printf("\t\t\t0. 退出 Quit\n"); /*退出*/
    printf("********************************************************************************\n");
    do
    {
        printf("\n\t\t\t输入你的选择Enter your choice(0~8):");
        n=getch();
    }
    while(n<'0'||n>'8');  /*如果选择项不在1~9之间则重输*/
    return n;
}

//获取学生人数
int get_num()
{
    int num;
    do
    {
        printf("输入学生人数(<50人):");
        scanf("%d",&num);
    }while(num<=0||num>50);
    return num;
}

//新创建输入
void input(struct student stu[],int num)
{
    int i,j,flag;
    //printf("\n依次输入学生的ID、姓名、成绩:\n");
    for(i=0;i<num;i++)
    {
        flag=true;
        printf("\n输入学生的ID:\n");
        scanf("%d",&stu[i].id);
        for(j=0;j<i;j++)
        {
            if(stu[i].id==stu[j].id)
            {
                printf("此ID已录入。");
                i--;
                flag=false;
                break;
            }
        }
        if(flag==true)
        {
            printf("\n输入学生的姓名及三门课成绩(空格隔开):\n");
            scanf("%s %d %d %d",stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
            stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
            stu[i].aver=stu[i].sum/3.0;
        }
    }
}

//输出函数
void output(struct student stu[],int num)
{
    int i;
    printf("\n************************************STUDENT************************************\n");
    printf("-------------------------------------------------------------------------------\n");
    printf("|  ID  | Name | Sc1 | Sc2 | Sc3 | Sum | Ave   |\n");
    printf("-------------------------------------------------------------------------------\n");
    for(i=0;i<num;i++)
    {
        printf("| %4d | %-4s | %3d | %3d | %3d | %3d | %4.2f |\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum,stu[i].aver);
    }
}

//查找函数
void search(struct student stu[],int num)
{
    int i,j,id;
    char ch='a';
    char name[20];
    printf("选择查找方式:1:按ID查找;2:按姓名查找;0:退出。\n");
    while(1)
    {
        ch=getch();
        if(ch=='0')
            return ;
        if(ch=='1')
        {
            printf("输入ID:");
            scanf("%d",&id);
            for(i=0,j=-1;i<num;i++)
            {
                if(id==stu[i].id)
                {
                    j=i;
                    break;
                }
            }
        }
        if(ch=='2')
        {
            printf("输入Name:");
            scanf("%s",name);
            for(i=0,j=-1;i<num;i++)
            {
                if(strcmp(name,stu[i].name)==0)
                {
                    j=i;
                    break;
                }
                else
                    printf("没有找到此ID信息");
            }
        }
        if(j==-1)
            printf("未找到信息");
        else
        {
            printf("\n************************************STUDENT************************************\n");
            printf("-------------------------------------------------------------------------------\n");
            printf("|  ID  | Name | Sc1 | Sc2 | Sc3 | Sum | Ave   |\n");
            printf("-------------------------------------------------------------------------------\n");
            printf("| %4d | %-4s | %3d | %3d | %3d | %3d | %4.2f |\n",stu[j].id,stu[j].name,stu[j].score[0],stu[j].score[1],stu[j].score[2],stu[j].sum,stu[j].aver);
            return ;
        }
    }
}

//交换结构体数组的整体信息
void change(struct student *stu1,struct student *stu2)
{
    struct student temp;
    temp=*stu1;
    *stu1=*stu2;
    *stu2=temp;
}

//删除函数
void del(struct student stu[],int num,int *p)
{
    int i,j,id;
    char ch='a';
    char name[20];
    output(stu,num);
    printf("选择删除方式:1:按ID删除;2:按姓名删除。0:结束删除。\n");
    while(1)
    {
        ch=getch();
        if(ch=='0')
            return ;
        if(ch=='1')
        {
            printf("输入ID:");
            scanf("%d",&id);
            for(i=0,j=-1;i<num;i++)
            {
                if(id==stu[i].id)
                {
                    j=i;
                    break;
                }

            }
        }
        if(ch=='2')
        {
            printf("输入Name:");
            scanf("%s",name);
            for(i=0,j=-1;i<num;i++)
            {
                if(strcmp(name,stu[i].name)==0)
                {
                    j=i;
                    break;
                }
            }
        }
        if(j==-1)
        {
            printf("未找到此学生信息");
            return ;
        }
        else
        {
            for(;j<num;j++)
                stu[j]=stu[j+1];
            *p=*p-1;
            printf("删除成功");
            output(stu,num);
            return ;
        }
    }

}

//排序函数
void sort(struct student stu[],int num)
{
    int i,j,ch;
    printf("1:按总分排序;2:按平均分排序");
    ch=getch();
    switch(ch)
    {
    case '1':
        for(i=0;i<num;i++)
            for(j=0;j<num-1-i;j++)
            {
                if(stu[j].sum<stu[j+1].sum)
                    change(&stu[j],&stu[j+1]);
            }
    case '2':
        for(i=0;i<num;i++)
            for(j=0;j<num-1-i;j++)
            {
                if(stu[j].aver<stu[j+1].aver)
                    change(&stu[j],&stu[j+1]);
            }
    }
    output(stu,num);
}

//插入函数
void input_again(struct student stu[],int num,int *p)
{
    int i,j;
    if(num>num_max)
        printf("超过最大人数,无法继续添加");
    else
    {
        for(i=num,j=0;i<num_max;i++,j++)
        {
            printf("\n输入学生的ID(ID为0则退出插入):\n");
            scanf("%d",&stu[i].id);
            if(stu[i].id==0)
                break;
            printf("\n依次输入学生的姓名、成绩:\n");
            scanf("%s %d %d %d",stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
            stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
            stu[i].aver=stu[i].sum/3.0;
            printf("插入成功\n");
        }
        *p=*p+j;
    }
}
//保存
void save_txt(struct student stu[],int num)
{
    int i;
    FILE *fp;
    char file_name[50];
    printf("输入想要保存的文件名,建议为今日日期(2020-5-2.txt)");
    scanf("%s",file_name);
    fp=fopen(file_name,"w");
    for(i=0;i<num;i++)
    {
        fprintf(fp,"%d %s %d %d %d\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum,stu[i].aver);
    }
    printf("保存成功,文件名为:%s",file_name);
    fclose(fp);
}
//加载
void load_txt(struct student stu[],int num,int *p)
{
    int i;
    FILE *fp;
    char file_name[50];
    printf("输入加载的文件名,例如:(2020-5-2.txt)");
    scanf("%s",file_name);
    fp=fopen(file_name,"r");
    if(fp==NULL)
    {
        printf("未找到该文件。\n");
        printf("为避免文件异常,结束程序,请核对好文件名再重新打开本程序。");
        exit(1);
    }
    for(i=0;!feof(fp)&&i<num_max;i++)
    {
        fscanf(fp,"%d %s %d %d %d",&stu[i].id,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
        stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
        stu[i].aver=stu[i].sum/3.0;
    }
    *p=i-1;
    printf("读取文件名为 %s 信息成功",file_name);
    fclose(fp);
}