Huang_Jason_ 2023-06-16 21:52 采纳率: 50%
浏览 19

c增删改查,代码实现出错

c增删改查,不知道哪出了问题,找了好久都没找到,有没有uu帮帮忙呀


#include <stdio.h>
#include <stdlib.h>
#define year 4 //定义大学年份为4年
#define MAX 10 //定义最大值

int getStuSumFromStruct(); //获取学生个数
void cleanTemp();         //格式化temp
void meakTextToStruct();     //更新结构体数组
void meakStructureToText(int writeNum );  //更新文本文本
void addStudent();           //添加学生
void findStudentGrade();      //查询成绩
void loginGrade( );             //登记成绩
void removeStu(int id);         //删除学生
void showStuFromStudent();    //展示全部学生


typedef      //添加结构体名称
struct Student{
    char name[10]; //存储学生姓名
    int id;
    int yw[4];
    int sx [4];
    int yy[4];
} stu; //修改结构体名称
stu student[10],temp; //声明 学生数组 和temp


int getStuSumFromStruct(){ //获取学生个数
    int i=0;
    int count;
    for(;i<MAX; i++){
        if( student[i].id==0  ){
            count++;
        }
    }
    return i;
}

void cleanTemp(){   //格式化temp
    temp.name[0] = '\0';
    temp.id      = '\0';
    temp.yw[0]   = '\0';
    temp.sx[0]   = '\0';
    temp.yy[0]   = '\0';
//    printf("格式化temp成功,当前temp内容为:\n");
//    int i=0;
//    printf("学号%d姓名%s \n",temp.id,temp.name);
//    for(;i<year; i++){
//        printf("temp: 第%d年 语文成绩为:%d   数学成绩为%d:   英语成绩为%d:\n", i+1, temp.yw[i], temp.sx[i], temp.yy[i]);
//    }
}

void cleanStudent(){ //格式化student
    int i=0;
    for(;i<MAX;i++){
        student[i].name[0] = '\0';
        student[i].id      = '\0';
        int j1=0;
        for(;j1<year;j1++){
            student[i].yw[j1]   = '\0';
            student[i].sx[j1]   = '\0';
            student[i].yy[j1]   = '\0';
        }
        printf("**********************清除student[%d]*******************\n",i);
        printf("      name:%s\n",student[i].name);
        printf("      id  :%d\n",student[i].id);
        int j2=0;
        for(;j2<year;j2++){
            printf("yw  :%d\n",student[i].yw[j2]);
            printf("sx  :%d\n",student[i].sx[j2]);
            printf("yy  :%d\n",student[i].yy[j2]);
        }
    }
    printf(" 格式化学生成功!\n");
    meakStructureToText(MAX);
    showStuFromStudent();
}

void meakTextToStruct(){      //更新结构体数组
    FILE *fp;
    fp = fopen("student.txt","r+");
    if(fp == NULL){
        printf("学生成绩数据文件丢失,即将退出系统!\n");
        Sleep(3000);
        exit(0);
    }
    int r;
    int i=0; //记录读取到学生的个数
    int flag=0;
    r = fread(&student[i],sizeof(struct Student),1,fp);     //文本内容 导入 结构体student里面
    while(r){
        flag=1;
        i++;
        r = fread(&student[i],sizeof(struct Student),1,fp);
    }
    if(flag){
        printf("更新结构体数组成功!(已从文本导入内容)\n");
    }else{
        printf("文本无学生数据!(文本导入内容失败)请从管理员模式导入学生!\n");
    }
    fclose(fp);
}

void meakStructureToText(int writeStuCount ){  //更新文本文本
    FILE *fp = fopen("student.txt","wb"); //写入文本 并且把原来文本的内容清除
    int count=0;
    while(count<=writeStuCount){
        fwrite(&student[count],sizeof(struct Student),1,fp);//把结构体一次性写入文本
        count++;
    }
    fclose(fp);
}


void addStudent(){        //添加学生
    printf("请输入要添加学生的学号:");
    int id;
    scanf("%d",&id);
    int flag=0; //判断数组是否有该学号,默认不存在
    int i=0;
    int stuCount=0;
    for(; i<MAX; i++){
        if ( getStuSumFromStruct()>=10){
            break;
        }
        if( student[i].id == id ){
            printf("该学号 %d 已被录入!\n",student[i]);
            flag=1;
            break;
        }
    }
    if(flag==0){
        FILE *fp = fopen("student.txt","a+");//写入文件末尾
        cleanTemp();  //格式化temp
        temp.id = id;
        printf("请输入该学生%d的名字:",temp.id);
        char name[10];
        scanf("%s",&name);
        strcpy( temp.name , name );
        fwrite(&temp,sizeof(student),1,fp);
        
        fclose(fp);
        printf("学号 %d 录入成功\n",temp.id);
    }
}

void findStudentGrade(){    //查询成绩
    int count = getStuSumFromStruct(); //并且获取数组有效学生个数
    meakTextToStruct(); //更新结构体数组
    int id;
    int count2=0; //记录在结构体查找学生的次数
    printf("请输入学号:");
    scanf("%d",&id);
    for(;count2<=count;count2++){
        if( student[count2].id == id ){
            printf("已找到学生%s学号%d的成绩,其成绩如下\n",student[count2].name , student[count2].id );
            int i=0;
            for(;i<year; i++){
                printf("(count2为 %d)第%d年 语文成绩为:%d   数学成绩为%d:   英语成绩为%d:\n", count2,i+1, student[count2].yw[i], student[count2].sx[i], student[count2].yy[i]);
            }
            break;
        }
    }
    if(count2>count){
        printf("未找到该学生%s成绩\n",student[count2].name);
    }
}

void loginGrade( ){         //登记成绩
    FILE *fp;
    int yw;
    int sx;
    int yy;
    printf("请输入需要成绩的登记学生学号:");
    int id;
    scanf("%d",&id);
    int i=0;
    int flag =0; //默认结构体里面无该学生
    for(; i<MAX; i++){
        if(strcmp(student[i].id), id){
            printf("找到该学生!姓名:%s   学号:%d \n",student[i].name,student[i].id);
            flag =1;
            int i2=0;
            cleanTemp();//格式化temp
            for(; i2<year; i2++){
                printf("请依次这位学生大学第%d年的  语文、数学、英语成绩(xx xx xx):",i2+1);
                scanf("%d",&temp.yw[i2]);
                scanf("%d",&temp.sx[i2]);
                scanf("%d",&temp.yy[i2]);
            }
            temp.id = student[i].id;
            strcpy( temp.name , student[i].name );
            int willRemove=student[i].id;
            removeStu(willRemove);
            fp = fopen("student.txt","ab");
            fwrite(&(temp),sizeof(struct Student),1,fp);//把temp写入文本
            fclose(fp);
            meakTextToStruct();//更新结构体
            showStuFromStudent();//显示学生数据
            break;
        }
    }
    if(flag==0){
        printf("找不到该学生,请联系管理员添加学生!\n");
    }
}

void removeStu(int id){      //删除学生
    int i=0;
    int flag=0; //默认结构体里面无该学生
    int writeStuCount = 0;//默认写入学生数为0
    for(; i<MAX; i++){
        if( student[i].id == id){
            printf("找到该学生%s.%d!\n",student[i].name,student[i].id  );
            if(i==0){
                cleanStudent();
            }else{
                student[i].id = student[i+1].id  ;
                strcpy( student[i].name ,student[i+1].name );
                int j=0;
                for(;j<year;j++){
                    strcpy( student[i].yw[j] ,student[i+1].yw[j]  );
                    strcpy( student[i].sx[j] ,student[i+1].sx[j]  );
                    strcpy( student[i].yy[j] ,student[i+1].yy[j]  );
                }
                int writeStuCount = getStuSumFromStruct()-1 ;
            }
            meakStructureToText(writeStuCount);
            meakTextToStruct();
            printf("删除学生成功!\n");
            showStuFromStudent();
            break;
        }
        if(i>=MAX){
            printf("找不到该学生,删除失败!\n");
        }
    }
}

void showStuFromStudent(){ //展示全部学生
    int i=0;
    int j;
    for(;i<MAX;i++){
        printf("----------");
        printf("    姓名:%s      学号:%d          成绩如下\n",student[i].name,student[i].id);
        for(j=0;j<year; j++){
            printf("第%d年 语文成绩为:%d   数学成绩为:%d   英语成绩为:%d\n",j+1, student[i].yw[j], student[i].sx[j], student[i].yy[j]);
        }
    }
}

int main(){
    meakTextToStruct();//往结构体写入文本
    showStuFromStudent();
    while(1){
        printf("\n\n********************************************************************************************************\n");
        printf("请选择登录模式 (输入1为学生模式登录) (输入2为教师模式登录)(输入3为管理员模式登录)(退出系统输入-1):");
        int i ;
        scanf("%d",&i);
        if (i == 1){
            printf(" 当前为<学生模式>    请分别输入账号和密码 (xxxx xxxx)中间用空格隔开: ");
            int xxzh, xxmm;
            scanf("%d",&xxzh);
            scanf("%d",&xxmm);
            if(( xxzh == 123) && (xxmm == 456) ){
                printf("**登录成功,请选择模式**\n");
                while(1){
                    printf("(输入1查询成绩)(输入-1退出学生模式):");
                    int xxMs;
                    scanf("%d",&xxMs);
                    switch (xxMs){
                        case 1:
                        findStudentGrade(); //调用 查询成绩方法
                        continue;
                    }
                    if( xxMs == -1 ){
                        break;
                    }else{
                        printf("当时输入有误,请重新输入!\n");
                        continue;
                    }
                }
            }
        }
        if (i == 2){
            printf(" 当前为<教师模式>    请分别输入账号和密码 (xxxx xxxx)中间用空格隔开: ");
            int jszh, jsmm;
            scanf("%d",&jszh);
            scanf("%d",&jsmm);
            if(( jszh == 123) && (jsmm == 456) ){
                printf("**登录成功,请选择模式**\n");
                while(1){
                    printf("(输入1登记学生成绩)(输入2修改学生成绩)(输入-1退出教师模式):");
                    int jsMs;
                    scanf("%d",&jsMs);
                    switch (jsMs){
                        case 1:
                            loginGrade(); //登记成绩
                            continue;
                        case 2:

                            continue;
                    }
                    if(jsMs == -1){
                        break;
                    }else{
                        printf("当时输入有误,请重新输入!\n");
                        continue;
                    }
                }
            }
        }
        if (i == 3){
            printf(" 当前为<管理员模式>  请分别输入账号和密码 (xxxx xxxx)中间用空格隔开: ");
            int glyzh, glymm;
            scanf("%d",&glyzh);
            scanf("%d",&glymm);
            if(( glyzh == 123) && (glymm == 456) ){
                printf("**登录成功,请选择模式**\n");
                while(1){
                    printf("(输入1查询学生成绩)(输入2修改学生成绩)(输入3增加学生)(输入4删除学生)( 输入-1退出管理员模式 ):");
                    int glyMs;
                    scanf("%d",&glyMs);
                    switch (glyMs){
                        case 1:
                            findStudentGrade();
                            continue;
                        case 2:
                            cleanStudent();
                            continue;
                        case 3:
                            addStudent();//添加学生
                            continue;
                        case 4:
                            printf("请输入要删除学生的学号(学号) (xxx):");
                            int id;
                            scanf("%d",&id);
                            removeStu(id);//删除学生方法
                            continue;
                    }
                    if(glyMs == -1){
                        break;
                    }else{
                        printf("当时输入有误,请重新输入!\n");
                        continue;
                    }
                }
            }
        }
        if(i == -1){
            printf("\n你已退出系统,谢谢!");
                break;
        }
    }
    return 0;
}

  • 写回答

3条回答 默认 最新

  • u011870967 2023-06-16 23:03
    关注

    杰哥,你可以用ChatGPT检查代码

    评论

报告相同问题?

问题事件

  • 创建了问题 6月16日

悬赏问题

  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥20 看图片)删除这个自动化录屏脚本就一直报错找不到脚本文件,如何解决?(相关搜索:bat文件)
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件