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

成绩管理系统第二弹

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

#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);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值