简易学生成绩管理系统(C语言)

学生成绩管理系统(C语言实现)

前提:

一、基础语法

  1. 数据类型

    • 基本类型:int, float, char

    • 构造类型:struct(学生信息结构体)

    • 字符串处理:char name[20]

  2. 输入输出

    • printf()/scanf()格式化输入输出

    • %d, %f, %s等格式控制符

  3. 运算符

    • 算术运算符:+, /(计算总分和平均分)

    • 比较运算符:>, <, ==(成绩比较)

    • 逻辑运算符:&&, ||(复合条件判断)


二、流程控制

  1. 分支结构

    • if-else:成绩筛选条件判断

    • switch-case:菜单选择和多条件分支

  2. 循环结构

    • for循环:遍历学生数组

    • do-while:菜单循环

    • 嵌套循环:排序算法实现


三、核心数据结构

  1. 数组

    • 固定长度数组:Student students[MAX_STUDENTS]

    • 数组遍历和操作

  2. 结构体

    c

    复制

    下载

    复制代码
    typedef struct {
        int id;
        char name[20];
        float chinese, math, english;
        float total, average;
    } Student;
    • 复合数据类型组织学生信息

    • 结构体成员访问(.运算符)


四、算法实现

  1. 排序算法

    • 冒泡排序实现多条件排序(按学号/各科成绩等)

    c

    复制

    下载

    复制代码
    for(i=0; i<studentCount-1; i++){
        for(j=0; j<studentCount-1-i; j++){
            if(students[j].total < students[j+1].total){
                // 交换结构体
            }
        }
    }
  2. 查找算法

    • 线性查找:按学号/姓名查找学生

    • 条件筛选:阈值过滤(如score >= 60


五、内存与文件操作

  1. 文件I/O

    • fopen()/fclose()文件开关

    • fwrite()/fread()二进制读写

    c

    复制

    下载

    复制代码
    // 保存数据
    fwrite(&studentCount, sizeof(int), 1, file);
    fwrite(students, sizeof(Student), studentCount, file);
  2. 内存管理

    • 静态数组内存分配

    • 结构体整体读写(二进制安全)


六、工程化实践

  1. 模块化设计

    • 功能函数化(添加/查询/修改等独立函数)

    • 函数声明与实现分离

  2. 用户交互

    • 菜单驱动界面

    • 输入验证(未做完善处理,实际项目需要加强)

  3. 数据持久化

    • 程序退出保存状态

    • 启动时加载历史数据


七、可扩展方向

  1. 动态内存

    • 改用malloc()实现动态数组

    • 链表存储代替静态数组

  2. 高级特性

    • 指针优化结构体操作

    • 多文件编程(头文件分离)

  3. 增强功能

    • 输入错误处理

    • 成绩分段统计(优良率等)

    • 图形界面(如结合GTK)


这个项目综合运用了C语言90%的基础知识点,是典型的控制台应用程序范例。通过这个案例可以系统掌握:

  • 结构化编程思想

  • 数据+算法的结合实现

  • 小型系统开发流程

  • 调试和优化技巧

以下是一个完整的学生成绩管理系统,包含语文、数学、英语三科成绩,并支持多种筛选功能:

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_STUDENTS 100

// 学生结构体
typedef struct {
    int id;             // 学号
    char name[20];      // 姓名
    float chinese;      // 语文成绩
    float math;         // 数学成绩
    float english;      // 英语成绩
    float total;        // 总分
    float average;      // 平均分
} Student;

Student students[MAX_STUDENTS];
int studentCount = 0;

// 函数声明
void addStudent();
void displayAll();
void searchStudent();
void updateStudent();
void deleteStudent();
void sortStudents();
void filterStudents();
void calculateStats();
void saveToFile();
void loadFromFile();
void showMenu();

int main() {
    loadFromFile();
    
    int choice;
    do {
        showMenu();
        printf("请输入您的选择(0-9): ");
        scanf("%d", &choice);
        
        switch(choice) {
            case 1: addStudent(); break;
            case 2: displayAll(); break;
            case 3: searchStudent(); break;
            case 4: updateStudent(); break;
            case 5: deleteStudent(); break;
            case 6: sortStudents(); break;
            case 7: filterStudents(); break;
            case 8: calculateStats(); break;
            case 9: saveToFile(); break;
            case 0: printf("感谢使用,再见!\n"); break;
            default: printf("无效的选择,请重新输入!\n");
        }
    } while(choice != 0);
    
    return 0;
}

// 显示菜单
void showMenu() {
    printf("\n===== 学生成绩管理系统 =====\n");
    printf("1. 添加学生信息\n");
    printf("2. 显示所有学生信息\n");
    printf("3. 查找学生信息\n");
    printf("4. 修改学生信息\n");
    printf("5. 删除学生信息\n");
    printf("6. 排序学生信息\n");
    printf("7. 筛选学生信息\n");
    printf("8. 统计信息\n");
    printf("9. 保存数据到文件\n");
    printf("0. 退出系统\n");
    printf("============================\n");
}

// 添加学生信息
void addStudent() {
    if (studentCount >= MAX_STUDENTS) {
        printf("学生数量已达上限,无法添加!\n");
        return;
    }
    
    Student s;
    printf("请输入学号: ");
    scanf("%d", &s.id);
    printf("请输入姓名: ");
    scanf("%s", s.name);
    printf("请输入语文成绩: ");
    scanf("%f", &s.chinese);
    printf("请输入数学成绩: ");
    scanf("%f", &s.math);
    printf("请输入英语成绩: ");
    scanf("%f", &s.english);
    
    s.total = s.chinese + s.math + s.english;
    s.average = s.total / 3;
    
    students[studentCount++] = s;
    printf("学生信息添加成功!\n");
}

// 显示所有学生信息
void displayAll() {
    if (studentCount == 0) {
        printf("没有学生信息可显示!\n");
        return;
    }
    
    printf("\n%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", 
           "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");
    printf("------------------------------------------------------------\n");
    
    for (int i = 0; i < studentCount; i++) {
        Student s = students[i];
        printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", 
               s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);
    }
}

// 查找学生信息
void searchStudent() {
    if (studentCount == 0) {
        printf("没有学生信息可查找!\n");
        return;
    }
    
    int choice;
    printf("\n1. 按学号查找\n");
    printf("2. 按姓名查找\n");
    printf("请选择查找方式: ");
    scanf("%d", &choice);
    
    if (choice == 1) {
        int id;
        printf("请输入要查找的学号: ");
        scanf("%d", &id);
        
        int found = 0;
        for (int i = 0; i < studentCount; i++) {
            if (students[i].id == id) {
                printf("\n%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", 
                       "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");
                printf("------------------------------------------------------------\n");
                Student s = students[i];
                printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", 
                       s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);
                found = 1;
                break;
            }
        }
        if (!found) {
            printf("未找到学号为%d的学生!\n", id);
        }
    } else if (choice == 2) {
        char name[20];
        printf("请输入要查找的姓名: ");
        scanf("%s", name);
        
        int found = 0;
        printf("\n%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", 
               "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");
        printf("------------------------------------------------------------\n");
        
        for (int i = 0; i < studentCount; i++) {
            if (strcmp(students[i].name, name) == 0) {
                Student s = students[i];
                printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", 
                       s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);
                found = 1;
            }
        }
        if (!found) {
            printf("未找到姓名为%s的学生!\n", name);
        }
    } else {
        printf("无效的选择!\n");
    }
}

// 修改学生信息
void updateStudent() {
    if (studentCount == 0) {
        printf("没有学生信息可修改!\n");
        return;
    }
    
    int id;
    printf("请输入要修改的学生学号: ");
    scanf("%d", &id);
    
    int index = -1;
    for (int i = 0; i < studentCount; i++) {
        if (students[i].id == id) {
            index = i;
            break;
        }
    }
    
    if (index == -1) {
        printf("未找到学号为%d的学生!\n", id);
        return;
    }
    
    printf("当前学生信息:\n");
    printf("%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", 
           "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");
    printf("------------------------------------------------------------\n");
    Student s = students[index];
    printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", 
           s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);
    
    printf("\n请输入新的姓名(原值: %s): ", s.name);
    scanf("%s", s.name);
    printf("请输入新的语文成绩(原值: %.1f): ", s.chinese);
    scanf("%f", &s.chinese);
    printf("请输入新的数学成绩(原值: %.1f): ", s.math);
    scanf("%f", &s.math);
    printf("请输入新的英语成绩(原值: %.1f): ", s.english);
    scanf("%f", &s.english);
    
    s.total = s.chinese + s.math + s.english;
    s.average = s.total / 3;
    
    students[index] = s;
    printf("学生信息修改成功!\n");
}

// 删除学生信息
void deleteStudent() {
    if (studentCount == 0) {
        printf("没有学生信息可删除!\n");
        return;
    }
    
    int id;
    printf("请输入要删除的学生学号: ");
    scanf("%d", &id);
    
    int index = -1;
    for (int i = 0; i < studentCount; i++) {
        if (students[i].id == id) {
            index = i;
            break;
        }
    }
    
    if (index == -1) {
        printf("未找到学号为%d的学生!\n", id);
        return;
    }
    
    for (int i = index; i < studentCount - 1; i++) {
        students[i] = students[i + 1];
    }
    
    studentCount--;
    printf("学号为%d的学生信息已删除!\n", id);
}

// 排序学生信息
void sortStudents() {
    if (studentCount == 0) {
        printf("没有学生信息可排序!\n");
        return;
    }
    
    int choice;
    printf("\n1. 按学号排序\n");
    printf("2. 按语文成绩排序\n");
    printf("3. 按数学成绩排序\n");
    printf("4. 按英语成绩排序\n");
    printf("5. 按总分排序\n");
    printf("6. 按平均分排序\n");
    printf("请选择排序方式: ");
    scanf("%d", &choice);
    
    int i, j;
    Student temp;
    
    for (i = 0; i < studentCount - 1; i++) {
        for (j = 0; j < studentCount - 1 - i; j++) {
            int needSwap = 0;
            
            switch(choice) {
                case 1: needSwap = students[j].id > students[j+1].id; break;
                case 2: needSwap = students[j].chinese < students[j+1].chinese; break;
                case 3: needSwap = students[j].math < students[j+1].math; break;
                case 4: needSwap = students[j].english < students[j+1].english; break;
                case 5: needSwap = students[j].total < students[j+1].total; break;
                case 6: needSwap = students[j].average < students[j+1].average; break;
                default: printf("无效的选择!\n"); return;
            }
            
            if (needSwap) {
                temp = students[j];
                students[j] = students[j+1];
                students[j+1] = temp;
            }
        }
    }
    
    printf("排序完成!\n");
    displayAll();
}

// 筛选学生信息
void filterStudents() {
    if (studentCount == 0) {
        printf("没有学生信息可筛选!\n");
        return;
    }
    
    int choice;
    printf("\n1. 筛选语文成绩大于等于某值\n");
    printf("2. 筛选数学成绩大于等于某值\n");
    printf("3. 筛选英语成绩大于等于某值\n");
    printf("4. 筛选总分大于等于某值\n");
    printf("5. 筛选平均分大于等于某值\n");
    printf("请选择筛选方式: ");
    scanf("%d", &choice);
    
    float value;
    printf("请输入筛选阈值: ");
    scanf("%f", &value);
    
    printf("\n筛选结果:\n");
    printf("%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", 
           "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");
    printf("------------------------------------------------------------\n");
    
    int count = 0;
    for (int i = 0; i < studentCount; i++) {
        Student s = students[i];
        int match = 0;
        
        switch(choice) {
            case 1: match = s.chinese >= value; break;
            case 2: match = s.math >= value; break;
            case 3: match = s.english >= value; break;
            case 4: match = s.total >= value; break;
            case 5: match = s.average >= value; break;
            default: printf("无效的选择!\n"); return;
        }
        
        if (match) {
            printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", 
                   s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);
            count++;
        }
    }
    
    if (count == 0) {
        printf("没有符合条件的学生!\n");
    } else {
        printf("\n共找到%d名学生符合条件\n", count);
    }
}

// 统计信息
void calculateStats() {
    if (studentCount == 0) {
        printf("没有学生信息可统计!\n");
        return;
    }
    
    float chineseSum = 0, mathSum = 0, englishSum = 0;
    float chineseMax = students[0].chinese, chineseMin = students[0].chinese;
    float mathMax = students[0].math, mathMin = students[0].math;
    float englishMax = students[0].english, englishMin = students[0].english;
    
    for (int i = 0; i < studentCount; i++) {
        Student s = students[i];
        
        chineseSum += s.chinese;
        mathSum += s.math;
        englishSum += s.english;
        
        if (s.chinese > chineseMax) chineseMax = s.chinese;
        if (s.chinese < chineseMin) chineseMin = s.chinese;
        if (s.math > mathMax) mathMax = s.math;
        if (s.math < mathMin) mathMin = s.math;
        if (s.english > englishMax) englishMax = s.english;
        if (s.english < englishMin) englishMin = s.english;
    }
    
    printf("\n===== 成绩统计信息 =====\n");
    printf("语文 - 平均分: %.2f, 最高分: %.1f, 最低分: %.1f\n", 
           chineseSum/studentCount, chineseMax, chineseMin);
    printf("数学 - 平均分: %.2f, 最高分: %.1f, 最低分: %.1f\n", 
           mathSum/studentCount, mathMax, mathMin);
    printf("英语 - 平均分: %.2f, 最高分: %.1f, 最低分: %.1f\n", 
           englishSum/studentCount, englishMax, englishMin);
    printf("========================\n");
}

// 保存数据到文件
void saveToFile() {
    FILE *file = fopen("students.dat", "wb");
    if (file == NULL) {
        printf("无法打开文件进行保存!\n");
        return;
    }
    
    fwrite(&studentCount, sizeof(int), 1, file);
    fwrite(students, sizeof(Student), studentCount, file);
    
    fclose(file);
    printf("学生数据已保存到文件!\n");
}

// 从文件加载数据
void loadFromFile() {
    FILE *file = fopen("students.dat", "rb");
    if (file == NULL) {
        printf("未找到数据文件,将创建新文件。\n");
        return;
    }
    
    fread(&studentCount, sizeof(int), 1, file);
    fread(students, sizeof(Student), studentCount, file);
    
    fclose(file);
    printf("学生数据已从文件加载!\n");
}
复制代码

系统功能说明

  1. 基本功能

    • 添加学生信息(学号、姓名、语文、数学、英语成绩)

    • 显示所有学生信息

    • 查找学生(按学号或姓名)

    • 修改学生信息

    • 删除学生信息

  2. 成绩处理功能

    • 自动计算总分和平均分

    • 多种排序方式(按各科成绩、总分、平均分)

    • 成绩筛选(可按各科成绩、总分、平均分设置阈值筛选)

    • 成绩统计(各科平均分、最高分、最低分)

  3. 数据持久化

    • 保存数据到文件

    • 从文件加载数据

  4. 用户界面

    • 清晰的菜单导航

    • 格式化的数据展示

使用说明

  1. 编译运行程序后,会显示主菜单

  2. 选择相应数字执行对应功能

  3. 数据会自动计算总分和平均分

  4. 退出前建议选择"保存数据到文件"选项

  5. 下次启动时会自动加载之前保存的数据

这个系统可以满足基本的成绩管理需求,您可以根据需要进一步扩展功能。

相关推荐
球求了9 分钟前
C++:继承机制详解
开发语言·c++·学习
张槊哲32 分钟前
函数的定义与使用(python)
开发语言·python
北辰浮光40 分钟前
[Mybatis-plus]
java·开发语言·mybatis
光而不耀@lgy1 小时前
C++初登门槛
linux·开发语言·网络·c++·后端
lkbhua莱克瓦241 小时前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
Mr__Miss1 小时前
面试踩过的坑
java·开发语言
啊丢_1 小时前
C++——Lambda表达式
开发语言·c++
Chh07152 小时前
《R语言SCI期刊论文绘图专题计划》大纲
开发语言·r语言
Yeats_Liao2 小时前
Go 语言 TCP 端口扫描器实现与 Goroutine 池原理
开发语言·tcp/ip·golang
lwewan2 小时前
26考研——存储系统(3)
c语言·笔记·考研