You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言结构体数组删除学生信息及更新功能实现求助

C语言结构体成绩册系统:删除功能修复与更新功能实现

问题说明

正在开发基于C语言结构体的成绩册系统,addStudent和displayStudents功能正常,但removeStudent和deletion函数无法正常工作。作为结构体初学者,需基于结构体完成开发,同时需要实现学生信息更新功能。

修复与完善后的完整代码

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

typedef struct{
    char name[30];
    double havg;
    double qavg;
    double eavg;
}gradebook_t;

int addStudent(gradebook_t classr[], int currentstudents, int capacity);
int removeStudent(gradebook_t classr[], int currentstudents);
void updateStudent(gradebook_t classr[], int currentstudents);
void displayStudents(gradebook_t classr[], int currentstudents);
int findStudent(gradebook_t classr[], int currentstudents, const char* name);

int main()
{
    gradebook_t classr[5];
    int capacity = 5;
    int currentstudents = 0;
    int selection;
    int x = 0;
    
    while(x == 0)
    {
        printf("Choose a selection:\n");
        printf("1. Add a student\n");
        printf("2. Display students\n");
        printf("3. Remove a student\n");
        printf("4. Update student info\n");
        printf("0. Exit\n");
        
        scanf("%d",&selection);
        
        if(selection == 1)
        {
            currentstudents += addStudent(classr,currentstudents,capacity);
        }
        else if(selection == 2)
        {
            displayStudents(classr, currentstudents);
        }
        else if(selection == 3)
        {
            int result = removeStudent(classr, currentstudents);
            if(result == -1) currentstudents += result;
        }
        else if(selection == 4)
        {
            updateStudent(classr, currentstudents);
        }
        else if(selection == 0)
        {
            x += 1;
        }
        else
        {
            printf("Not a selection, try again...\n");
            printf("currentstudents = %d\n",currentstudents);
        }
    }
    return 0;
}

int addStudent(gradebook_t classr[], int currentstudents, int capacity)
{
    if(currentstudents < capacity)
    {
        printf("Enter a student name:");
        scanf("%s", classr[currentstudents].name);
        
        printf("Enter a homework average:");
        scanf("%lf", &classr[currentstudents].havg);
   
        printf("Enter a quiz average:");
        scanf("%lf", &classr[currentstudents].qavg);
   
        printf("Enter an exam average:");
        scanf("%lf", &classr[currentstudents].eavg);
        return 1;
    }
    else
    {
        printf("The class is full!\n");
        return 0;
    }
}

void displayStudents(gradebook_t classr[], int currentstudents)
{
    if(currentstudents == 0)
    {
        printf("No students in the class.\n");
        return;
    }
    for(int index = 0; index < currentstudents; index++)
    {
        printf("Student %d Name : %s\n",index+1, classr[index].name);
        printf("Student %d HW AVG : %.2lf\n",index+1, classr[index].havg);
        printf("Student %d QUIZ AVG : %.2lf\n",index+1, classr[index].qavg);
        printf("Student %d EXAM AVG : %.2lf\n\n",index+1, classr[index].eavg);
    }
}

int findStudent(gradebook_t classr[], int currentstudents, const char* name)
{
    for(int i = 0; i < currentstudents; i++)
    {
        if(strcmp(classr[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

int removeStudent(gradebook_t classr[], int currentstudents)
{
    if(currentstudents == 0)
    {
        printf("No students to remove.\n");
        return 0;
    }
    
    char find1[30];
    printf("Enter a student name to remove:");
    scanf("%s",find1);
    
    int index = findStudent(classr, currentstudents, find1);
    if(index == -1)
    {
        printf("Student not found.\n");
        return 0;
    }
    
    for(int i = index; i < currentstudents - 1; i++)
    {
        classr[i] = classr[i+1];
    }
    
    printf("Student removed successfully.\n");
    return -1;
}

void updateStudent(gradebook_t classr[], int currentstudents)
{
    if(currentstudents == 0)
    {
        printf("No students to update.\n");
        return;
    }
    
    char findName[30];
    printf("Enter the name of the student to update:");
    scanf("%s", findName);
    
    int index = findStudent(classr, currentstudents, findName);
    if(index == -1)
    {
        printf("Student not found.\n");
        return;
    }
    
    printf("Updating info for %s:\n", classr[index].name);
    printf("Enter new homework average:");
    scanf("%lf", &classr[index].havg);
    printf("Enter new quiz average:");
    scanf("%lf", &classr[index].qavg);
    printf("Enter new exam average:");
    scanf("%lf", &classr[index].eavg);
    
    printf("Student info updated successfully.\n");
}

错误分析与修复说明

原removeStudent函数核心问题

  1. 缺少查找函数:原代码调用未定义的find函数,新增findStudent辅助函数,用strcmp完成字符串匹配(不能直接用==比较字符串)。
  2. 数组压缩逻辑缺失:原代码仅用最后一个学生覆盖删除位置,导致数组末尾出现重复数据,修复后通过循环将删除位置后的元素向前移动,完成数组压缩。
  3. 返回值错误:原函数声明为int却无返回值,修复后删除成功返回-1(让currentstudents减1),失败返回0。
  4. 边界判断缺失:新增空列表判断,避免数组越界。

原addStudent函数小问题

  • 无返回值导致currentstudents += addStudent出现未定义行为,修复后添加成功返回1,失败返回0。
  • 判断条件从currentstudents != capacity改为currentstudents < capacity,逻辑更严谨。

原deletion函数问题

参数设计错误(操作char数组而非结构体数组)且为空,直接将删除逻辑整合到removeStudent中,无需单独保留。

更新功能实现说明

updateStudent函数逻辑:

  1. 输入要更新的学生名字,调用findStudent获取索引。
  2. 找到后,依次输入新的各项成绩并覆盖原数据。
  3. 处理空列表、学生未找到的边界情况。

内容的提问来源于stack exchange,提问作者PapaPumpkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:50:09