L4754 2021-12-26 15:17 采纳率: 50%
浏览 73
已结题

C语言学生成绩管理系统每次运行结果都不一样,有时候能成功运行,有时候运行到某一功能就停止 运行了

问题遇到的现象和发生背景

img

img

img

img

img

问题相关代码,请勿粘贴截图

以下为完整代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void menu()
{
    printf("|---------------------------------------|\n");
    printf("|\t XXX学生成绩管理系统            |\n");
    printf("|---------------------------------------|\n");
    printf("|\t请选择功能菜单,按0退出程序:   |\n");
    printf("|---------------------------------------|\n");
    printf("|\t1、从文件中导入原始数据         |\n");
    printf("|---------------------------------------|\n");
    printf("|\t2、添加学生信息                 |\n");
    printf("|---------------------------------------|\n");
    printf("|\t3、删除学生信息                 |\n");
    printf("|---------------------------------------|\n");
    printf("|\t4、统计每位同学的平均分         |\n");
    printf("|---------------------------------------|\n");
    printf("|\t5、统计每门课程的平均分         |\n");
    printf("|---------------------------------------|\n");
    printf("|\t6、分段统计人数                 |\n");
    printf("|---------------------------------------|\n");
    printf("|\t7、查询学生                     |\n");
    printf("|---------------------------------------|\n");
    printf("|\t8、报表输出                     |\n");
    printf("|---------------------------------------| \n");

}
struct student
{
    char num[30];
    char name[20];
    int score[3];
};
struct node
{
    struct student date;
    struct node* next;
};
struct node* creatlist()
{
    struct node* headnode = (struct node*)malloc(sizeof(struct node*));
    headnode->next = NULL;
    return headnode;
}
struct node* creatnode(struct student date)
{
    struct node* newnode = (struct node*)malloc(sizeof(struct node*));
    newnode->date = date;
    newnode->next = NULL;
    return newnode;
}
void insertnode(struct node* headnode, struct student date)
{
    struct node* newnode = creatnode(date);
    newnode->next = headnode->next;
    headnode->next = newnode;
}
void findnode(struct node* headnode, char* num)
{
    struct node* posnodefront = headnode;
    struct node* posnode = headnode->next;
    if (posnode == NULL)
    {
        printf("no find\n");
    }
    else
    {
        while (strcmp(posnode->date.num, num))
        {
            posnodefront = posnode;
            posnode = posnodefront->next;
            if (posnode == NULL)
            {
                printf("no found\n");
            }
        }
        printf("学号:%s\t姓名:%s\t高数成绩:%d\tC语言成绩:%d\t英语成绩:%d\t", posnode->date.num, posnode->date.name, posnode->date.score[0], posnode->date.score[1], posnode->date.score[2]);
        printf("\n");
    }
}
void deletenode(struct node* headnode, char* num)
{
    struct node* posnodefront = headnode;
    struct node* posnode = headnode->next;
    if (posnode == NULL)
    {
        printf("no find\n");
    }
    else
    {
        while (strcmp(posnode->date.num, num))
        {
            posnodefront = posnode;
            posnode = posnodefront->next;
            if (posnode == NULL)
            {
                printf("no found\n");
            }
        }
        posnodefront->next = posnode->next;
        posnode = NULL;//不加这个会报错野指针
        free(posnode);
        printf("delete\n");
    }
}
void printlist(struct node* headnode)
{
    struct node* pmove = headnode->next;
    while (pmove)
    {
        printf("学号:%s\t姓名:%s\t高数成绩:%d\tC语言成绩:%d\t英语成绩:%d\t", pmove->date.num, pmove->date.name, pmove->date.score[0], pmove->date.score[1], pmove->date.score[2]);
        printf("\n");
        pmove = pmove->next;
    }
}
void stuaver(struct node* headnode, struct student date)
{
    struct node* pmove = headnode->next;
    while (pmove)
    {
        int sum = 0;
        float aver;
        sum = pmove->date.score[0] + pmove->date.score[1] + pmove->date.score[2];
        aver = sum / 3.0;
        printf("%s的平均分=%f\n", pmove->date.name, aver);
        pmove = pmove->next;
    }
}
void courseaver(struct node* headnode, struct student date)
{
    int sum1 = 0, sum2 = 0, sum3 = 0, count = 0;
    struct node* pmove = headnode->next;
    while (pmove)
    {
        sum1 += pmove->date.score[0];
        sum2 += pmove->date.score[1];
        sum3 += pmove->date.score[2];
        count++;
        pmove = pmove->next;
    }
    float aver1 = float(sum1) / count;
    float aver2 = float(sum2) / count;
    float aver3 = float(sum3) / count;
    printf("高数平均分=%f\nC语言平均分=%f\n英语平均分=%f\n", aver1, aver2, aver3);
}
void readlistfromfile(struct node* headnode)
{
    FILE* fp;
    fp = fopen("C:\\Users\\ligang\\source\\repos\\Project6\\Project6\\filename.txt","r");
    if (fp  == NULL)
    {
        printf("文件打开失败\n");
    }
    else
    {
        printf("文件打开成功\n");
        struct student date = {0,0,0,0,0};
        do
        {
            fscanf(fp, "%s%s%d%d%d", date.num, date.name, &date.score[0], &date.score[1], &date.score[2]);
            insertnode(headnode, date);
        } while (!feof(fp));
    }
    rewind(fp);
    fclose(fp);
    
}
void savelistfromfile(struct node* headnode)
{
    FILE* fp;
    fp = fopen("C:\\Users\\ligang\\source\\repos\\Project6\\Project6\\filename.txt", "w");
    struct node* pmove=headnode->next ;
    while (pmove)
    {
        fprintf(fp, "%s\r\n%s\r\n%d\r\n%d\r\n%d\r\n", pmove->date.num, pmove->date.name, pmove->date.score[0], pmove->date.score[1], pmove->date.score[2]);
        pmove = pmove->next;
    }
    fclose(fp);
}
struct node* list = creatlist();
int main()
{
    struct student date = {0,0,0,0,0};
    menu();
    int a;
    do {
        printf("请输入功能键\n");
        scanf("%d", &a);
        switch (a)
        {
        case 0:printf("[你退出了程序]\n"); break;
        case 1: {printf("[从文件中导入原始数据]\n");
            readlistfromfile(list); 
            printlist(list);
            break; }
            break;
        case 2: {printf("[添加学生信息]\n");
            printf("请输入学生信息\n");
            printf("学号\t 姓名\t 高数成绩\t C语言成绩\t 英语成绩\n");
            scanf("%s%s%d%d%d", date.num, date.name, &date.score[0], &date.score[1], &date.score[2]);
            insertnode(list, date);
            break; }break;
        case 3: {printf("[删除学生]\n");
            printf("请输入要删除学生的学号\n");
            scanf("%s", date.num);
            deletenode(list, date.num);
            break; } break;
        case 4: {printf("[统计每位同学的平均分]\n");
            stuaver(list, date);
            break; } break;
        case 5: {printf("[统计每门课程的平均分]\n");
            courseaver(list, date);
            break; } break;
        case 6:printf("[分段统计人数]\n"); break;
        case 7: {printf("[查询学生]\n");
            printf("请输入要查找学生的学号\n");
            scanf("%s", date.num);
            findnode(list, date.num);
            break; } break;
        case 8: {printf("[报表输出]\n");
            printlist(list);
            break; }break;
        default:printf("[error]\n");
        }
    } while (a != 0);
    savelistfromfile(list);
    return 0;
}

########
以下为文件内的内容
202211105

小强

98

98

98

202211101

小华

98

98

98

202211102

小红

98

98

98

202211103

小蓝

98

98

98



202211109

小金

98

98

98

运行结果及报错内容

运行到某一功能就停止了

我的解答思路和尝试过的方法

应该是文件导入和写入有问题

我想要达到的结果

让程序正常运行,能够成功读取和写入文件。

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2021-12-26 15:19
    关注
    
    struct node* headnode = (struct node*)malloc(sizeof(struct node*))
    改为
    struct node* headnode = (struct node*)malloc(sizeof(struct node))
    
    

    分配的空间是节点结构的大小,不能是指针的大小,否则空间不够,数据的越界操作了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月26日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效