学生成绩管理系统

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

struct student
{
    char id[20];
    char name[20];
    int score1;
    int score2;
    int score3;
    int average;
}stu[100] = {0};

int setnum;    //设置当前记录并显示

//功能函数
void swap(struct student *a,struct student *b);
void showmenu();
void creat_base(void);

//界面函数
void list();
void add();
void rem();
void edit();
void set();
void sort();
void help();
void save();

int main()
{
    int m;
    creat_base();
    do
	{
		showmenu();
		scanf("%d",&m);
		switch(m)
		{
		    case 1:list();break;
		    case 2:add();break;
            case 3:rem();break;
            case 4:edit();break;
            case 5:set();break;
            case 6:sort();break;
            case 7:help();break;
		    case 8:save();break;
		    default:printf("输入错误,请重试!");getchar();
		}
	}while(m!=8);

    printf("Bye~~~~!\n");
    return 0;
}

//操作命令详解
/*7help帮助:*/
void help()
{
    char Eflag;
    while(1)
    {
        printf("具体命令已详细分配到各功能列表,如有不懂,请致电:\t18860958876\n");
        printf("是否退出帮助:y/n");
        fflush(stdin);
        scanf("%c",&Eflag);
        if(Eflag == 'y')
            break;
    }
}
/*6排序学生记录:
    1、sort:根据平均分排序;
    2、sort x:根据学号排序;
    3、sort n:根据姓名排序;
    4、sort s1:根据分数1排序;
    5、sort s2:根据分数2排序;
    6、sort s3:根据分数3排序;*/
void sort()
{
    int i,j;
    char flag,Eflag;
    for(i=0; strlen(stu[i].id) != 0; i++)
    {
        for(j=i+1; strlen(stu[j].id) != 0; j++)
        {
            if(stu[i].average < stu[j].average)
                swap(&stu[i],&stu[j]);
        }
    }
    printf("已按平均分排序\n");
    while(1)
    {
        printf("是否退出排序界面:y/n\t");
        fflush(stdin);
        scanf("%c",&Eflag);
        if(Eflag == 'y')
            break;
        printf("\t**x:根据学号排序;\n\t**n:根据姓名排序;\n\t**1:根据分数1排序;\n\t**2:根据分数2排序;\n\t**3:根据分数3排序;\n");
        fflush(stdin);
        scanf("%c",&flag);
        switch(flag)
        {
        case 'x':
            {
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    for(j=i+1; strlen(stu[j].id) != 0; j++)
                    {
                        if(strcmp(stu[i].id,stu[j].id) > 0)
                            swap(&stu[i],&stu[j]);
                    }
                }
                printf("已按学号排序\n");
                break;
            }
        case 'n':
            {
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    for(j=i+1; strlen(stu[j].id) != 0; j++)
                    {
                        if(strcmp(stu[i].name,stu[j].name) > 0)
                            swap(&stu[i],&stu[j]);
                    }
                }
                printf("已按姓名排序\n");
                break;
            }
        case '1':
            {
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    for(j=i+1; strlen(stu[j].id) != 0; j++)
                    {
                        if(stu[i].score1 < stu[j].score1)
                            swap(&stu[i],&stu[j]);
                    }
                }
                printf("已按成绩1排序\n");
                break;
            }
        case '2':
            {
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    for(j=i+1; strlen(stu[j].id) != 0; j++)
                    {
                        if(stu[i].score2 < stu[j].score2)
                            swap(&stu[i],&stu[j]);
                    }
                }
                printf("已按成绩2排序\n");
                break;
            }
        case '3':
            {
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    for(j=i+1; strlen(stu[j].id) != 0; j++)
                    {
                        if(stu[i].score3 < stu[j].score3)
                            swap(&stu[i],&stu[j]);
                    }
                }
                printf("已按成绩3排序\n");
                break;
            }
         default :printf("输入错误!\n");break;
        }
    }

}
//功能函数,两个结构体交换数据
void swap(struct student *a,struct student *b)
{
    struct student * temp = malloc(sizeof(struct student));

    memcpy(temp,a,sizeof(struct student));
    memcpy(a,b,sizeof(struct student));
    memcpy(b,temp,sizeof(struct student));

    free(temp);
}

/*5设置当前记录并显示
    set n:设置当前记录并显示*/
void set()
{
    char id_temp[20] = {0};
    int i,flag = 0;
    //printf("请输入你想设置的当前记录序号:\t");
    //fflush(stdin);
    //scanf("%d",&setnum);
    printf("请输入你想设置的当前记录学生的学号:\t");
    fflush(stdin);
    scanf("%s",id_temp);
    for(i=0; strlen(stu[i].id) != 0; i++)
    {
        if(!strcmp(id_temp,stu[i].id))
        {
            setnum = i;
            flag = 1;
            break;
        }
    }
    if(flag == 1)
    {
        printf("设置成功\n");
        printf("当前记录学生:\n");
        printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[setnum].id,stu[setnum].name,stu[setnum].score1,stu[setnum].score2,stu[setnum].score3,stu[setnum].average);
    }
    else
        printf("没有这个学号\n");
}


/*4修改当前记录
    1、edit:修改当前记录,需要输入所有项
    2、edit a:修改当前记录所有项
    3、edit x: 只修改当前记录学号;(要进行新输入学号存在性判断)
    4、edit n:只修改当前记录姓名;
    5、edit s1:只修改当前记录分数1;
    6、edit s2:只修改当前记录分数2;
    7、edit s3:只修改当前记录分数3*/
void edit()
{
    char ch,Eflag;
    char id_temp[20];
    int i,flag = 0;
    while(1)
    {
        printf("当前记录学生:\n");
        printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[setnum].id,stu[setnum].name,stu[setnum].score1,stu[setnum].score2,stu[setnum].score3,stu[setnum].average);

        printf("\t1、 a:修改当前记录所有项\n\t2、 x: 只修改当前记录学号;(要进行新输入学号存在性判断)\n\
\t3、 n:只修改当前记录姓名;\n\
\t4、 1:只修改当前记录分数1;\n\
\t5、 2:只修改当前记录分数2;\n\
\t6、 3:只修改当前记录分数3\n");
        printf("请输入你想进行的操作命令;\t");
        fflush(stdin);
        scanf("%c",&ch);
        switch(ch)
        {
        case 'a':
            {
                printf("请输入学生的学号:\n");
                scanf("%s",id_temp);
                getchar();
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    if(!strcmp(id_temp,stu[i].id))
                    {
                        printf("该学号学生的成绩已存在于成绩库\n");
                        printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
                        break ;
                   }
                }
                strcpy(stu[setnum].id,id_temp);
                printf("请输入学生的姓名:\n");
                scanf("%s",stu[setnum].name);
                getchar();
                printf("请输入学生的成绩1:\n");
                scanf("%d",&stu[setnum].score1);
                printf("请输入学生的成绩2:\n");
                scanf("%d",&stu[setnum].score2);
                printf("请输入学生的成绩3:\n");
                scanf("%d",&stu[setnum].score3);
                stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
                break;
            }
        case 'x':
            {
                printf("请输入学生的学号:\n");
                scanf("%s",id_temp);
                getchar();
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    if(!strcmp(id_temp,stu[i].id))
                    {
                        flag = 1;
                        printf("该学号学生的成绩已存在于成绩库\n");
                        printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
                        break ;
                   }
                }

                if(flag == 0)
                {
                    strcpy(stu[setnum].id,id_temp);
                    printf("修改成功!\n");
                }
                else
                    flag = 0;
                break;
            }
        case 'n':
            {
                printf("请输入学生的姓名:\n");
                scanf("%s",stu[setnum].name);
                break;
            }
        case '1':
            {
                printf("请输入学生的成绩1:\n");
                scanf("%d",&stu[setnum].score1);
                stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
                break;
            }
        case '2':
        {
            printf("请输入学生的成绩1:\n");
            scanf("%d",&stu[setnum].score2);
            stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
            break;
        }
        case '3':
        {
            printf("请输入学生的成绩1:\n");
            scanf("%d",&stu[setnum].score3);
            stu[setnum].average = (stu[setnum].score1+stu[setnum].score2+stu[setnum].score3)/3;
            break;
        }
        default:printf("命令输入错误!\n");break;
        }
        printf("是否继续修改:y/n");
        fflush(stdin);
        scanf("%c",&Eflag);
        if(Eflag == 'n')
            break;
    }
}

/*3删除学生记录:
    1、rem:删除当前记录;
    2、rem a:删除所有记录;
    3、rem x:删除指定学号对应记录*/
void rem()
{
    char Eflag,temp;
    int i,flag = 0;
    char id_temp[20];
    while(1)
    {
        printf("\t**       rem c:删除当前记录               **\n");
        printf("\t**       rem a:删除所有记录            **\n");
        printf("\t**       rem x:删除指定学号对应记录    **\n");
        fflush(stdin);
        scanf("%c",&temp);
        if(temp == 'a')
        {
            memset(stu,0,sizeof(stu));
        }
        else if(temp == 'x')
        {
            printf("请输入指定学号:\t");
            fflush(stdin);
            scanf("%s",id_temp);
            printf("\nerr1\n");
            for(i=0; strlen(stu[i].id) != 0; i++)
            {
                if(!strcmp(id_temp,stu[i].id))
                {
                    flag = 1;
                    break;
                }
            }
            printf("\nerr1\n");
            if(flag == 1)
            {
                while(strlen(stu[i].id))
                {
                    memcpy(&stu[i],&stu[i+1],sizeof(struct student));
                    i++;
                }
                printf("删除成功\n");
            }
            else
                printf("没有这个学号\n");
        }
        else if(temp == 'c')
        {
            i = setnum;
            while(strlen(stu[i].id))
            {
                memcpy(&stu[i],&stu[i+1],sizeof(struct student));
                i++;
            }
            printf("删除成功\n");
        }
        else
                printf("输入错误!\n");
        printf("是否继续删除:y/n");
        fflush(stdin);
        scanf("%c",&Eflag);
        if(Eflag == 'n')
            break;
    }
}



/* 8保存退出*/
void save()
{
    FILE *fp;
    int i = 0;
    fp = fopen("database.bin","wb");  //建立二进制文件
    if(fp == NULL)
    {
        printf("open database.bin error\n");
        exit(0);
    }
    for(i=0; strlen(stu[i].id) != 0; i++)
    {
        fwrite(&stu[i],sizeof(struct student),1,fp);
    }
    fclose(fp);
    fp = fopen("database.txt","w");    //建立或打开文本文件
    if(fp == NULL)
    {
        printf("open database.txt error\n");
        exit(0);
    }
    for(i=0; strlen(stu[i].id) != 0; i++)
    {
        fwrite(&stu[i],sizeof(struct student),1,fp);
    }
    fclose(fp);
}

/*2增加学生记录:
    ①add 根据提示输入(要进行新输入学号存在性判断)
    ②add 学号  姓名  分数1  分数2  分数3*/

void add()
{
    int i,flag = 0;
    char Eflag;
    char id_temp[20] = {0};
    while(1)
    {
        printf("请输入学生的学号:\n");
        scanf("%s",id_temp);
        getchar();
        for(i=0; strlen(stu[i].id) != 0; i++)
        {
            if(!strcmp(id_temp,stu[i].id))
            {
                flag = 1;
                printf("该学号学生的成绩已存在于成绩库\n");
                printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
                break ;
           }
        }
        if(flag == 1)
        {
            flag = 0;
            continue;
        }
        strcpy(stu[i].id,id_temp);
        printf("请输入学生的姓名:\n");
        scanf("%s",stu[i].name);
        getchar();
        printf("请输入学生的成绩1:\n");
        scanf("%d",&stu[i].score1);
        printf("请输入学生的成绩2:\n");
        scanf("%d",&stu[i].score2);
        printf("请输入学生的成绩3:\n");
        scanf("%d",&stu[i].score3);
        stu[i].average = (stu[i].score1+stu[i].score2+stu[i].score3)/3;
        i++;
        fflush(stdin);
        printf("是否继续录入成绩:y/n");
        scanf("%c",&Eflag);
        if(Eflag == 'n')
            break;
    }


}
/*1显示记录
    ①list 显示当前记录
    ②list a:显示所有记录
    ③list x:显示指定学号记录,并不改变当前记录
    ④list n:显示所有“姓名 = ”的记录,并不改变当前记录;
*/

void list()
{
    char ch,flag;
    char id_temp[20],name_temp[20];
    int i,flag_id = 0;
    printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[setnum].id,stu[setnum].name,stu[setnum].score1,stu[setnum].score2,stu[setnum].score3,stu[setnum].average);
    while(1)
    {
        printf("\t**        list a:显示所有记录                                     **\n");
        printf("\t**        list x:显示指定学号记录,并不改变当前记录               **\n");
        printf("\t**        list n:显示所有“姓名 = ”的记录,并不改变当前记录        **\n");
        fflush(stdin);
        scanf("%c",&ch);
        getchar();
        switch(ch)
        {
        case 'a':
            {
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
                }
                break;
            }
        case 'x':
            {
                printf("请输入您想查询的学生的学号:\n");
                scanf("%s",id_temp);
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    if(!strcmp(id_temp,stu[i].id))
                    {
                        printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
                        flag_id = 1;
                    }
                }
                if(flag_id == 0)
                {
                    printf("成绩库中没有这个学号\n");
                }
                break;
            }
        case 'n':
            {
                printf("请输入您想查询的学生的姓名:\n");
                scanf("%s",name_temp);
                for(i=0; strlen(stu[i].id) != 0; i++)
                {
                    if(!strcmp(name_temp,stu[i].name))
                    {
                        printf("\t 学号:%s\t姓名:%s\t成绩1:%d\t成绩2:%d\t成绩3:%d\t平均成绩:%d\n",stu[i].id,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].average);
                        flag_id = 1;
                    }
                }
                if(flag_id == 0)
                {
                    printf("成绩库中没有这个学生姓名\n");
                }
                break;
            }
        default :
            {
                printf("输入错误\n");break;
            }
        }
        printf("是否退出显示记录页面:y/n\n");
        fflush(stdin);
        scanf("%c",&flag);
        if(flag == 'y')
            break;
    }
}

//0显示菜单
void showmenu()
{
	system("cls");
	printf("------------------------------------------------------\n");
	printf("*               欢迎使用学生成绩管理系统               *\n");
	printf("------------------------------------------------------\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("------------------------------------------------------\n");
	printf("选择操作<1-8>                                         \n");
	return;
}

//1建立相关数据库,并从相关数据库中读取数据
void creat_base(void)
{
    FILE *fp;
    int i = 0;
    fp = fopen("database.bin","rb");  //建立二进制文件
    if(fp == NULL)
    {
        printf("open database.bin error\n");
        exit(0);
    }
    fclose(fp);
    fp = fopen("database.txt","r");    //建立或打开文本文件
    if(fp == NULL)
    {
        printf("open database.txt error\n");
        exit(0);
    }
    fseek(fp,0,0);
    while(!feof(fp))
    {
        fread(&stu[i],sizeof(struct student),1,fp);
        i++;
        if(i >= 100)
        {
            printf("memory overload!\n");
            break;
        }
    }
    fclose(fp);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值