创建一个学生信息管理系统,需满足以下需求:
系统中每个学生的信息包含:学号、姓名、数学成绩、英语成绩以及计算机成绩。程序应支持四项基本功能操作。
**功能一:新增学生信息**
当输入指令为1时,需读入学号、姓名及三门课程的成绩。若该学号尚未被使用,则将信息录入系统,并输出“Add success”;若学号已存在,则提示“Students already exist”。
**功能二:删除学生记录**
当输入指令为2时,仅需提供学号。若系统中无此学生,输出“Students do not exist”;否则将其标记为已删除(即取消有效标识),并输出“Delete success”。
**功能三:更新学生成绩**
当输入指令为3时,先输入学号,随后必须读取三门科目的新成绩(无论学生是否存在都需完成读取,以避免影响后续输入流)。如果学生不存在,输出“Students do not exist”;若存在,则用新成绩覆盖原成绩,并输出“Update success”。
**功能四:查询学生平均分**
当输入指令为4时,输入指定学号。若未找到对应学生,输出“Students do not exist”;若存在,则按如下格式逐行输出信息:
Student ID:2019989890 Name:Jerry Average Score:89.3其中平均分为三科总分除以3,结果保留一位小数。各字段间换行显示。
8
1 201817123 Tom 89 80 76
1 2019989890 Jerry 78 99 67
4 201817123
2 201817123
4 201817123
4 2019989890
3 2019989890 79 90 99
4 2019989890
输入说明:
首行为整数n(0 < n < 130),表示接下来有n条操作指令。每条指令占一行,第一个数字代表功能编号(1-4),后续参数依功能而定。题目保证:学号和姓名长度不超过10个字符,各科成绩为0至100之间的整数。
特别注意:在执行修改成绩操作时,即使学生不存在,也必须完整读入三门成绩,确保输入流正确推进。
输出示例:
Add success
Add success
Student ID:201817123
Name:Tom
Average Score:81.7
Delete success
Students do not exist
Student ID:2019989890
Name:Jerry
Average Score:81.3
Update success
Student ID:2019989890
Name:Jerry
Average Score:89.3
实现思路如下:
1. 使用结构体数组存储学生数据,结构体内包括学号、姓名、三门成绩,外加一个整型标志位`exam`用于标识该位置是否已被占用(1表示有效,0表示空闲)。初始化时遍历整个数组,将所有`exam`置为0。
2. 主循环读取n次操作,每次通过`switch`语句判断操作类型,分别处理四种情况。
3. 对于涉及学号查找的操作(添加、删除、修改、查询),均需遍历结构体数组,查找是否存在`exam==1`且学号匹配的记录。比较学号使用`strcmp`函数进行字符串对比。
4. 可优化点:重复的查找逻辑可封装成独立函数,但当前实现中直接内联处理。虽然代码稍显冗余,但逻辑清晰,不影响功能实现。
5. 具体功能细节处理:
- **添加功能**:设置标志变量`exis`,初始为0。遍历数组检查是否已存在相同学号。若存在,则跳过插入;否则寻找第一个`exam!=1`的位置,填入数据并设置`exam=1`。
- **删除功能**:定位到目标学生后,将其`exam`字段设为0,表示删除。
- **更新功能**:先读取三门成绩,再查找学生。若存在,则更新其成绩字段。
- **查询功能**:查找到学生后,计算三科平均值 `(math + english + computer) / 3.0`,保留一位小数输出,严格按照题目格式排版。
6. 所有输出必须与样例完全一致,包括大小写、标点和换行,因在线评测系统对格式敏感。
代码框架采用标准C语言编写,包含头文件`stdio.h`与`string.h`,定义结构体`inform`,并通过主函数实现上述逻辑流程。
switch (choice)
{
case 1:
{
int j;
for (j = 0; j < 130; j++)
{
if (student[j].exam == 0)
break;
}
if (j == 130)
{
printf("Student list is full\n");
}
else
{
char id[11], name[21];
int m, e, c;
scanf("%s %s %d %d %d", id, name, &m, &e, &c);
strcpy(student[j].number, id);
strcpy(student[j].name, name);
student[j].math = m;
student[j].english = e;
student[j].computer = c;
student[j].exam = 1;
break;
}
printf("Add success\n");
break;
}
case 4:
{
int label = -1;
char id[11];
scanf("%s", id);
for (int j = 0; j < 130; j++)
{
if (strcmp(student[j].number, id) == 0 && student[j].exam == 1)
{
label = j;
break;
}
}
if (label == -1)
printf("Students do not exist\n");
else
{
double average = (student[label].math + student[label].english + student[label].computer) / 3.0;
printf("Student ID:%s\nName:%s\nAverage Score:%.1lf\n", student[label].number, student[label].name, average);
}
break;
}
case 2:
{
int label = -1;
char id[11];
scanf("%s", id);
for (int j = 0; j < 130; j++)
{
if (strcmp(student[j].number, id) == 0 && student[j].exam == 1)
{
label = j;
break;
}
}
if (label == -1)
printf("Students do not exist\n");
else
{
student[label].exam = 0;
printf("Delete success\n");
}
break;
}
case 3:
{
int label = -1, m = 0, e = 0, c = 0;
char id[11];
scanf("%s %d %d %d", id, &m, &e, &c);
for (int j = 0; j < 130; j++)
{
if (strcmp(student[j].number, id) == 0 && student[j].exam == 1)
{
label = j;
break;
}
}
if (label == -1)
printf("Students do not exist\n");
else
{
student[label].math = m;
student[label].english = e;
student[label].computer = c;
printf("Update success\n");
}
break;
}
}
return 0;



雷达卡


京公网安备 11010802022788号







