系统设计思路
我们将实现以下功能:
- 定义稀土元素的数据结构(包含名称、符号、原子序数、发现年份等信息)
- 初始化常见稀土元素数据
- 实现元素信息的查询(按名称或原子序数)
- 显示所有稀土元素的基本信息
代码实现
#include <stdio.h>
#include <string.h>
// 定义学生结构体
typedef struct {
char name[20]; // 姓名
char id[10]; // 学号
float scores[3]; // 三门课程成绩
float avg; // 平均分
} Student;
// 录入学生信息
void inputStudents(Student students[], int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生信息:\n", i + 1);
printf("姓名:");
scanf("%s", students[i].name);
printf("学号:");
scanf("%s", students[i].id);
printf("请输入三门课程成绩:\n");
for (int j = 0; j < 3; j++) {
printf("第%d门课程:", j + 1);
scanf("%f", &students[i].scores[j]);
}
// 计算平均分
students[i].avg = (students[i].scores[0] +
students[i].scores[1] +
students[i].scores[2]) / 3.0;
printf("\n");
}
}
// 显示所有学生信息
void showAllStudents(Student students[], int n) {
printf("\n===== 学生成绩列表 =====\n");
printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
printf("-----------------------------------------\n");
for (int i = 0; i < n; i++) {
printf("%s\t%s\t%.1f\t%.1f\t%.1f\t%.2f\n",
students[i].id,
students[i].name,
students[i].scores[0],
students[i].scores[1],
students[i].scores[2],
students[i].avg);
}
printf("-----------------------------------------\n\n");
}
// 按平均分排序(从高到低)
void sortByAverage(Student students[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (students[j].avg < students[j + 1].avg) {
// 交换学生信息
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
// 查找学生(按学号)
void findStudent(Student students[], int n, char* id) {
for (int i = 0; i < n; i++) {
if (strcmp(students[i].id, id) == 0) {
printf("\n找到该学生信息:\n");
printf("学号:%s\n", students[i].id);
printf("姓名:%s\n", students[i].name);
printf("成绩:%.1f, %.1f, %.1f\n",
students[i].scores[0],
students[i].scores[1],
students[i].scores[2]);
printf("平均分:%.2f\n\n", students[i].avg);
return;
}
}
printf("\n未找到学号为%s的学生\n\n", id);
}
int main() {
int num;
char findId[10];
printf("请输入学生数量:");
scanf("%d", &num);
// 创建学生数组
Student students[num];
// 录入学生信息
inputStudents(students, num);
// 显示所有学生信息
showAllStudents(students, num);
// 排序并显示排名
sortByAverage(students, num);
printf("===== 按平均分排名 =====\n");
showAllStudents(students, num);
// 查找学生
printf("请输入要查找的学生学号:");
scanf("%s", findId);
findStudent(students, num, findId);
return 0;
}
代码解析
-
结构体定义:使用
Student结构体封装了学生的完整信息,包括姓名、学号、三门课程成绩和平均分,体现了 C 语言中数据封装的思想。 -
功能模块化:将系统功能拆分为多个函数(录入、显示、排序、查找),使代码结构清晰,便于维护和扩展。
-
核心算法:
- 使用嵌套循环实现冒泡排序,按平均分对学生进行排名
- 使用
strcmp函数比较字符串,实现按学号查找功能 - 通过数组下标访问实现对多个学生信息的管理
-
用户交互:通过标准输入输出函数实现简单的用户交互,让用户可以输入数据并查看结果。
使用示例
程序运行时,会引导用户输入学生数量,然后依次录入每个学生的信息,包括姓名、学号和三门课程成绩。系统会自动计算平均分,并提供以下功能:
- 显示所有学生的完整成绩表
- 按平均分从高到低排序并显示
- 根据学号查找特定学生的详细信息
扩展方向
这个简易系统可以进一步扩展:
- 添加文件存储功能,实现数据持久化
- 增加成绩修改和删除功能
- 实现按姓名查找或按单科成绩排序
- 添加数据统计功能(如平均分、最高分、最低分等)
通过这个实例,我们可以看到 C 语言虽然语法简洁,但能够实现各种实用的功能。结构体与数组的结合使用,使得处理批量同类数据变得高效而直观,这也是 C 语言在系统编程和嵌入式开发中广泛应用的重要原因。