美文网首页
学生成绩管理系统C语言版

学生成绩管理系统C语言版

作者: 奋斗live | 来源:发表于2018-02-02 11:42 被阅读0次
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define MAX 10000
    void add_student();
    void edit_student();
    void del_student();
    void select_student_by_name();
    void select_student_by_score();
    void query_student();
    void print_student();
    void IO_write();
    void IO_read();
    void config_write();
    void config_read();
    //返回此学生学号对应的索引
    int verify_sno();
    typedef struct stu{
        char sno[40];//10大小
        char name[40];//20大小
        float math_score;//4
        float englist_score;//4
        long age;
        float avg_score;
    }Stu;
    char is_continue[0];
    char sno[10];char  name[20];
    float math_score,englist_score,avg_score;
    int num=0;//学生数量
    int res;
    FILE * fp;
    int main(){
        int choose_num;//选择方式
        Stu * student;
        student = (Stu *)malloc(10*(sizeof(Stu)));
        if(student==NULL){
            printf("动态分配内存失败\n");
        }
        if(num==0){//刚启动
            config_read();
        }
        while(1){
            printf("\n------ 学生成绩管理系统------\n");  
            printf("1. 增加学生记录\n");  
            printf("2. 修改学生记录\n");  
            printf("3. 删除学生记录\n");  
            printf("4. 显示所有学生信息\n");  
            printf("5. 按姓名查询学生记录\n");  
            printf("6. 按平均成绩排序\n");  
            printf("7. 退出\n");  
            printf("请选择(1-7):");
            scanf("%d",&choose_num);
            switch(choose_num){
                case 1://增加学生
                    add_student(student);
                    break;
                case 2://修改学生
                    edit_student(student);
                    break;
                case 3://删除学生记录
                    del_student(student);
                    break;
                case 4://显示所有学生信息
                    query_student(student);
                    break;
                case 5://按照学生姓名查询学生记录
                    select_student_by_name(student);
                    break;
                case 6://按照平均成绩查询学生记录
                    select_student_by_score(student);
                    break;
                default:
                    exit(0);
                    break;
            }
        }
    }
    
    void add_student(Stu * student){
        while(1){
            printf("请输入学生学号:");
            scanf("%s",sno);
            res = verify_sno(student);
            if(res != -1){
                printf("已经具有这个学号的学生了\n");
                printf("请重新输入\n");
                continue;
            }
            printf("请输入学生姓名:");
            scanf("%s",name);
            printf("请输入数学成绩:");
            scanf("%f",&math_score);
            printf("请输入英语成绩:");
            scanf("%f",&englist_score);
            memcpy(student[num].sno,sno,50);
            memcpy(student[num].name,name,50);
            student[num].math_score = math_score;
            student[num].englist_score = englist_score;
            student[num].avg_score = (math_score+englist_score)/2;
            num++;
            
            IO_write(student);
            printf("是否继续,请输入Y/N\n");
            scanf("%s",is_continue);
            getchar();//清除缓冲区中的欢迎符号
            if(strcmp(is_continue,"N")==0){
                break;
            }
        }
        
    }
    
    void query_student(Stu * student){
        while(1){
            IO_read(student);
            print_student(student);
            printf("是否继续,请输入Y/N\n");
            scanf("%s",is_continue);
            getchar();//清除缓冲区中的欢迎符号
            if(strcmp(is_continue,"N")==0){
                break;
            }
        }
    }
    
    void edit_student(Stu * student){
        while(1){
            int index;
            printf("输入要修改的学生的编号\n");
            scanf("%d",&index);
            if(index<1 || index>num){
                printf("输入的编号不存在\n");
                break;
            }
            printf("请输入学生学号:");
            scanf("%s",sno);
            res = verify_sno(student);
            if(res != -1){
                printf("已经具有这个学号的学生了\n");
                printf("请重新输入\n");
                continue;
            }
            printf("请输入学生姓名:");
            scanf("%s",name);
            printf("请输入数学成绩:");
            scanf("%f",&math_score);
            printf("请输入英语成绩:");
            scanf("%f",&englist_score);
            memcpy(student[index-1].sno,sno,50);
            memcpy(student[index-1].name,name,50);
            student[index-1].math_score = math_score;
            student[index-1].englist_score = englist_score;
            student[index-1].avg_score = (math_score+englist_score)/2;
            IO_write(student);
            printf("是否继续,请输入Y/N\n");
            scanf("%s",is_continue);
            getchar();//清除缓冲区中的欢迎符号
            if(strcmp(is_continue,"N")==0){
                break;
            }
            
        }
    }
    
    void del_student(Stu * student){
        IO_read(student);
        while(1){
            int i;
            int res;
            printf("输入要删除的学生的学号\n");
            scanf("%s",sno);
            res = verify_sno(student);
            if(res==-1){
                printf("没有此学生\n");
                printf("请重新输入\n");
                continue;
            }
            if((res+1)==num){//删除的学生是最后一位
                num--;
                IO_write(student);
            }else{//不是最后一位
                num--;
                for(i=res;i<num;i++){
                    memcpy(student[i].sno,student[i+1].sno,50);
                    memcpy(student[i].name,student[i+1].name,50);
                    student[i].math_score = student[i+1].math_score;
                    student[i].englist_score = student[i+1].englist_score;
                }
                IO_write(student);
            }
            printf("是否继续,请输入Y/N\n");
            scanf("%s",is_continue);
            getchar();//清除缓冲区中的欢迎符号
            if(strcmp(is_continue,"N")==0){
                break;
            }
            
        }
    }
    
    void select_student_by_name(Stu * student){
        while(1){
            IO_read(student);
            int i;
            printf("输入学生姓名\n");
            scanf("%s",name);
            printf("    编号      学生学号        学生姓名       数学成绩       英语成绩\n");
            for(i=0;i<num;i++){
                if(strcmp(student[i].name,name)==0){
                    printf("    %d          %s      %s      %f      %f \n",i+1,student[i].sno,student[i].name,student[i].math_score,student[i].englist_score);
                }
            }
            printf("是否继续,请输入Y/N\n");
            scanf("%s",is_continue);
            getchar();//清除缓冲区中的欢迎符号
            if(strcmp(is_continue,"N")==0){
                break;
            }
        }
        
    }
    
    void select_student_by_score(Stu * student){
        while(1){
            IO_read(student);
            int i,j;
            for(i=0;i<num-1;i++){
                for(j=0;j<num-i-1;j++){
                    if(student[j].avg_score>=student[j+1].avg_score){
                        memcpy(sno,student[j].sno,50);
                        memcpy(name,student[j].name,50);
                        math_score = student[j].math_score;
                        englist_score = student[j].englist_score;
                        avg_score = student[j].avg_score;
                        
                        
                        memcpy(student[j].sno,student[j+1].sno,50);
                        memcpy(student[j].name,student[j+1].name,50);
                        student[j].math_score = student[j+1].math_score;
                        student[j].englist_score = student[j+1].englist_score;
                        student[j].avg_score = student[j+1].avg_score;
                        
                        
                        memcpy(student[j+1].sno,sno,50);
                        memcpy(student[j+1].name,name,50);
                        student[j+1].math_score = math_score;
                        student[j+1].englist_score = englist_score;
                        student[j+1].avg_score = avg_score;
                    }
                }
            }
            printf("    编号      学生学号        学生姓名       数学成绩       英语成绩\n");
            for(i=0;i<num;i++){
                printf("    %d          %s      %s      %f      %f \n",i+1,student[i].sno,student[i].name,student[i].math_score,student[i].englist_score);
            }
            printf("是否继续,请输入Y/N\n");
            scanf("%s",is_continue);
            getchar();//清除缓冲区中的欢迎符号
            if(strcmp(is_continue,"N")==0){
                break;
            }
        }
    }
    
    void IO_write(Stu * student){
        FILE *fp;
        int i;
        fp = fopen("student.txt","wb");
        if(fp==NULL){
            printf("打开文件失败\n");
            exit(0);
        }
        for(i=0;i<num;i++){
            if(fwrite(&student[i],sizeof(struct stu),1,fp)!=1){
                printf("写入失败\n");
                fclose(fp);
            }
        }
        fclose(fp);
        config_write();
    }
    
    void print_student(Stu * student){
        int i;
        if(num==0){
            printf("暂无学生信息\n");
            return;
        }
        printf("    编号      学生学号        学生姓名       数学成绩       英语成绩\n");
        for(i=0;i<num;i++){
            printf("    %d          %s      %s      %f      %f \n",i+1,student[i].sno,student[i].name,student[i].math_score,student[i].englist_score);
        }
    }
    
    void IO_read(Stu * student){
        FILE *fp;
        int i;
        fp = fopen("student.txt","rb");
        if(fp==NULL){
            printf("打开文件失败\n");
            exit(0);
        }
        
        for(i=0;i<num;i++){
            fread(&student[i],sizeof(struct stu),1,fp);
        }
        fclose(fp);
    }
    
    
    void config_write(){
        fp = fopen("config.txt","wb");
        if(fp==NULL){
            printf("打开文件失败\n");
            exit(0);
        }
        if(fwrite(&num,sizeof(int),1,fp)!=1){
            printf("写入失败\n");
            fclose(fp);
        }
        fclose(fp);
    }
    
    void config_read(){
        fp = fopen("config.txt","rb");
        if(fp==NULL){
            printf("打开文件失败\n");
            exit(0);
        }
        fread(&num,sizeof(int),1,fp);
        fclose(fp);
    }
    
    /**
     *验证是否已经有重复的学号
     */
    int verify_sno(Stu * student){
        int i;
        IO_read(student);
        for(i=0;i<num;i++){
            if(strcmp(student[i].sno,sno)==0){//学号相同
                return i;
            }
        }
        return -1;
    }
    
    
    
     
    

    相关文章

      网友评论

          本文标题:学生成绩管理系统C语言版

          本文链接:https://www.haomeiwen.com/subject/hbwszxtx.html