C 语言实现简易学生成绩管理系统

88 阅读4分钟

系统设计思路

我们将实现以下功能:

  • 定义稀土元素的数据结构(包含名称、符号、原子序数、发现年份等信息)
  • 初始化常见稀土元素数据
  • 实现元素信息的查询(按名称或原子序数)
  • 显示所有稀土元素的基本信息

代码实现

#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;
}

代码解析

  1. 结构体定义:使用Student结构体封装了学生的完整信息,包括姓名、学号、三门课程成绩和平均分,体现了 C 语言中数据封装的思想。

  2. 功能模块化:将系统功能拆分为多个函数(录入、显示、排序、查找),使代码结构清晰,便于维护和扩展。

  3. 核心算法

    • 使用嵌套循环实现冒泡排序,按平均分对学生进行排名
    • 使用strcmp函数比较字符串,实现按学号查找功能
    • 通过数组下标访问实现对多个学生信息的管理
  4. 用户交互:通过标准输入输出函数实现简单的用户交互,让用户可以输入数据并查看结果。

使用示例

程序运行时,会引导用户输入学生数量,然后依次录入每个学生的信息,包括姓名、学号和三门课程成绩。系统会自动计算平均分,并提供以下功能:

  • 显示所有学生的完整成绩表
  • 按平均分从高到低排序并显示
  • 根据学号查找特定学生的详细信息

扩展方向

这个简易系统可以进一步扩展:

  • 添加文件存储功能,实现数据持久化
  • 增加成绩修改和删除功能
  • 实现按姓名查找或按单科成绩排序
  • 添加数据统计功能(如平均分、最高分、最低分等)

通过这个实例,我们可以看到 C 语言虽然语法简洁,但能够实现各种实用的功能。结构体与数组的结合使用,使得处理批量同类数据变得高效而直观,这也是 C 语言在系统编程和嵌入式开发中广泛应用的重要原因。