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函数核心问题
- 缺少查找函数:原代码调用未定义的
find函数,新增findStudent辅助函数,用strcmp完成字符串匹配(不能直接用==比较字符串)。 - 数组压缩逻辑缺失:原代码仅用最后一个学生覆盖删除位置,导致数组末尾出现重复数据,修复后通过循环将删除位置后的元素向前移动,完成数组压缩。
- 返回值错误:原函数声明为
int却无返回值,修复后删除成功返回-1(让currentstudents减1),失败返回0。 - 边界判断缺失:新增空列表判断,避免数组越界。
原addStudent函数小问题
- 无返回值导致
currentstudents += addStudent出现未定义行为,修复后添加成功返回1,失败返回0。 - 判断条件从
currentstudents != capacity改为currentstudents < capacity,逻辑更严谨。
原deletion函数问题
参数设计错误(操作char数组而非结构体数组)且为空,直接将删除逻辑整合到removeStudent中,无需单独保留。
更新功能实现说明
updateStudent函数逻辑:
- 输入要更新的学生名字,调用
findStudent获取索引。 - 找到后,依次输入新的各项成绩并覆盖原数据。
- 处理空列表、学生未找到的边界情况。
内容的提问来源于stack exchange,提问作者PapaPumpkin
相关产品推荐
相关产品推荐

