C语言课程设计-学生信息管理

目 录
1.需求分析 1
2.概要设计 2
3.详细设计 3
4.系统运行结果展示 4
总结 5
附录:源代码 5

1 需求分析
1.1 问题描述
学生成绩管理系统学生数据由学号、姓名、班级、三门课(数学、英语、计算机)的成绩和平均成绩构成。
实现功能包括:
(1)添加学生的记录
(2)查询学生(分别按学号和姓名)
(3)对学生数据排序(分别按平均成绩和计算机成绩的降序)
(4)删除学生记录
(5)修改学生记录
(6)班级成绩分析(各科平均成绩、最高分、最低分、及格率)
(7)输出学生信息表

1.2 系统功能需求分析
该系统用于管理学生的成绩信息,支持添加、查询、排序、删除、修改学生记录,并进行班级成绩分析。系统的用户包括教师和管理员,系统需具备良好的交互性和易用性。
1.1添加学生记录
需求描述:允许用户添加新的学生记录,包括学号、姓名、班级、数学成绩、英语成绩和计算机成绩。
输入:学号、姓名、班级、数学成绩、英语成绩、计算机成绩。
输出:确认记录已成功添加。
异常处理:如果达到最大学生数量限制,提示用户无法添加更多记录。
1.2查询学生记录
1.2.1按学号查询
需求描述:根据学号查询学生信息。
输入:学号。
输出:显示学生的所有信息(学号、姓名、班级、数学成绩、英语成绩、计算机成绩、平均成绩)。
异常处理:如果未找到对应学号的学生,提示未找到。
1.2.2按姓名查询
需求描述:根据姓名查询学生信息。
输入:姓名。
输出:显示学生的所有信息(学号、姓名、班级、数学成绩、英语成绩、计算机成绩、平均成绩)。
异常处理:如果未找到对应姓名的学生,提示未找到。
1.3学生数据排序
1.3.1按平均成绩排序
需求描述:按平均成绩降序排列所有学生记录。
输出:确认记录已成功排序。
1.3.2按计算机成绩排序
需求描述:按计算机成绩降序排列所有学生记录。
输出:确认记录已成功排序。
1.4删除学生记录
需求描述:根据学号删除学生记录。
输入:学号。
输出:确认记录已成功删除。
异常处理:如果未找到对应学号的学生,提示未找到。
1.5修改学生记录
需求描述:根据学号修改学生的所有信息。
输入:学号、新的姓名、新的班级、新的数学成绩、新的英语成绩、新的计算机成绩。
输出:确认记录已成功修改。
异常处理:如果未找到对应学号的学生,提示未找到。
1.6班级成绩分析
需求描述:分析指定班级的成绩情况,包括各科平均成绩、最高分、最低分和及格率。
输入:班级名称。
输出:显示班级的数学、英语、计算机三科的平均成绩、最高分、最低分和及格率。
异常处理:如果未找到对应班级的学生,提示未找到。
1.7输出学生信息表
需求描述:输出所有学生的完整信息表。
输出:显示所有学生的所有信息。
2.数据需求
学生信息:学号、姓名、班级、数学成绩、英语成绩、计算机成绩、平均成绩。
数据存储:采用数组存储学生信息,限制最大记录数量。

2.概要设计
2.1总体设计
学生成绩管理系统的总体设计,包括主函数和各个子函数的详细设计。首先通过定义结构体确定学生信息的项目和大小,然后逐步实现输入、显示、查找、删除、修改和退出功能。结构体定义:定义学生信息的结构体,包含学号、姓名、班级、三门课程成绩和平均成绩。主函数:通过菜单选择实现不同功能。子函数设计:包括输入、显示、查找、删除、修改和退出功能的子函数。
系统功能模块图如图1所示:

2.1系统功能模块
2.2系统功能运行流程图

2.2系统功能运行流程图

3.详细设计
3.1 数据结构设计
#define MAX_STUDENTS 100
#define MAX_NAME_LEN 50
#define MAX_CLASS_LEN 20

// 定义学生信息的结构体
typedef struct {
int id; // 学号
char name[MAX_NAME_LEN]; // 姓名
char class_name[MAX_CLASS_LEN]; // 班级
float math_score; // 数学成绩
float english_score; // 英语成绩
float cs_score; // 计算机成绩
float avg_score; // 平均成绩
} Student;
// 学生数组和当前学生数量
Student students[MAX_STUDENTS];
int student_count = 0;

3.2 各功能模块设计
3.2.1添加学生记录模块

函数:添加学生记录()
如果 student_count >= MAX_STUDENTS
输出 “无法添加更多学生记录”
返回
结束如果
创建 Student 对象 student
输入 "输入学号: "
读取 student.id
输入 "输入姓名: "
读取 student.name
输入 "输入班级: "
读取 student.class_name
输入 "输入数学成绩: "
读取 student.math_score
输入 "输入英语成绩: "
读取 student.english_score
输入 "输入计算机成绩: "
读取 student.cs_score

调用计算平均成绩(student)

将 student 添加到 students 数组
student_count 增加 1
输出 "学生记录添加成功"

结束函数

3.2.2查询学生记录模块
按学号查询
函数:按学号查询学生(id)
循环 i 从 0 到 student_count - 1
如果 students[i].id 等于 id
输出 "学号: " + students[i].id + ", 姓名: " + students[i].name + ", 班级: " + students[i].class_name
输出 "数学成绩: " + students[i].math_score + ", 英语成绩: " + students[i].english_score + ", 计算机成绩: " + students[i].cs_score + ", 平均成绩: " + students[i].avg_score
返回
结束如果
结束循环
输出 “未找到学号为 " + id + " 的学生”
结束函数
按姓名查询
函数:按姓名查询学生(name)
循环 i 从 0 到 student_count - 1
如果 students[i].name 等于 name
输出 "学号: " + students[i].id + ", 姓名: " + students[i].name + ", 班级: " + students[i].class_name
输出 "数学成绩: " + students[i].math_score + ", 英语成绩: " + students[i].english_score + ", 计算机成绩: " + students[i].cs_score + ", 平均成绩: " + students[i].avg_score
返回
结束如果
结束循环
输出 “未找到姓名为 " + name + " 的学生”
结束函数

3.2.3排序学生记录模块
按平均成绩排序
函数:按平均成绩排序()
循环 i 从 0 到 student_count - 2
循环 j 从 i + 1 到 student_count - 1
如果 students[i].avg_score < students[j].avg_score
交换 students[i] 和 students[j]
结束如果
结束循环
结束循环
输出 “学生记录已按平均成绩降序排序”
结束函数

按计算机成绩排序
函数:按计算机成绩排序()
循环 i 从 0 到 student_count - 2
循环 j 从 i + 1 到 student_count - 1
如果 students[i].cs_score < students[j].cs_score
交换 students[i] 和 students[j]
结束如果
结束循环
结束循环
输出 “学生记录已按计算机成绩降序排序”
结束函数

3.2.4 删除学生记录模块
函数:删除学生记录(id)
设 found 为假
循环 i 从 0 到 student_count - 1
如果 students[i].id 等于 id
循环 j 从 i 到 student_count - 2
students[j] = students[j + 1]
结束循环
student_count 减少 1
found 为真
输出 “学生记录删除成功”
结束循环
结束如果
结束循环
如果 found 为假
输出 “未找到学号为 " + id + " 的学生”
结束如果
结束函数

3.2.5修改学生记录模块
函数:修改学生记录(id)
循环 i 从 0 到 student_count - 1
如果 students[i].id 等于 id
输入 "输入新的姓名: "
读取 students[i].name
输入 "输入新的班级: "
读取 students[i].class_name
输入 "输入新的数学成绩: "
读取 students[i].math_score
输入 "输入新的英语成绩: "
读取 students[i].english_score
输入 "输入新的计算机成绩: "
读取 students[i].cs_score

        调用计算平均成绩(students[i])
        输出 "学生记录修改成功"
        返回
    结束如果
结束循环
输出 "未找到学号为 " + id + " 的学生"

结束函数

3.2.6班级成绩分析模块
函数:班级成绩分析(class_name)
设 count, math_sum, english_sum, cs_sum 为 0
设 math_max, english_max, cs_max 为 0
设 math_min, english_min, cs_min 为 100
设 pass_count 为 0

循环 i 从 0 到 student_count - 1
    如果 students[i].class_name 等于 class_name
        count 增加 1
        math_sum += students[i].math_score
        english_sum += students[i].english_score
        cs_sum += students[i].cs_score

        如果 students[i].math_score > math_max
            math_max = students[i].math_score
        结束如果
        如果 students[i].english_score > english_max
            english_max = students[i].english_score
        结束如果
        如果 students[i].cs_score > cs_max
            cs_max = students[i].cs_score
        结束如果

        如果 students[i].math_score < math_min
            math_min = students[i].math_score
        结束如果
        如果 students[i].english_score < english_min
            english_min = students[i].english_score
        结束如果
        如果 students[i].cs_score < cs_min
            cs_min = students[i].cs_score
        结束如果

        如果 students[i].math_score >= 60 且 students[i].english_score >= 60 且 students[i].cs_score >= 60
            pass_count 增加 1
        结束如果
    结束如果
结束循环

如果 count == 0
    输出 "未找到班级 " + class_name + " 的学生"
    返回
结束如果

输出 "班级 " + class_name + " 成绩分析:"
输出 "数学平均成绩: " + (math_sum / count) + ", 最高分: " + math_max + ", 最低分: " + math_min
输出 "英语平均成绩: " + (english_sum / count) + ", 最高分: " + english_max + ", 最低分: " + english_min
输出 "计算机平均成绩: " + (cs_sum / count) + ", 最高分: " + cs_max + ", 最低分: " + cs_min
输出 "及格率: " + (pass_count / count * 100) + "%"

结束函数

3.2.7 输出学生信息表模块
函数:输出学生信息表()
循环 i 从 0 到 student_count - 1
输出 "学号: " + students[i].id + ", 姓名: " + students[i].name + ", 班级: " + students[i].class_name
输出 "数学成绩: " + students[i].math_score + ", 英语成绩: " + students[i].english_score + ", 计算机成绩: " + students[i].cs_score + ", 平均成绩: " + students[i].avg_score
结束循环
结束函数

4.系统运行结果展示
4.1 各功能模块运行结果
进入系统后,系统会出现图12所示菜单。

4.1系统菜单

4.2添加学生记录

4.3按学号查询学生

4.4按姓名查询学生

4.5按平均成绩排序

4.6按计算机成绩排序

4.7删除学生记录

4.8修改学生记录

4.9班级成绩分析

4.2 调试分析
查询学生记录模块
调试步骤:
输入存在的学号和姓名,检查是否能正确查询并显示学生信息。输入不存在的学号和姓名,检查是否能正确提示未找到记录。
可能的问题及解决方案:
问题:查询存在的记录时,显示信息不完整或错误。
解决方案:检查查询逻辑,确保信息正确存储和显示。
问题:查询不存在的记录时,没有正确提示用户。
解决方案:在未找到匹配记录时,确保系统输出相应的提示信息。
4.2.1 错误显示及分析
错误显示(按学号查询),原因:输入的学号或姓名不存在于系统记录中。
解决方案:提示用户检查输入的学号或姓名是否正确,如果确实存在此记录,则需要检查数据存储是否出错。
4.2.2修改完善
添加学生记录模块
改进内容:
增加输入验证,确保学号唯一且成绩在合理范围内(0-100)。
改进提示信息,确保用户知道如何正确输入数据。
void add_student() {
if (student_count >= MAX_STUDENTS) {
printf(“无法添加更多学生记录\n”);
return;
}

Student student;
int idExists = 0;

do {
    printf("输入学号: ");
    scanf("%d", &student.id);
    idExists = 0;
    for (int i = 0; i < student_count; i++) {
        if (students[i].id == student.id) {
            printf("学号已存在,请重新输入。\n");
            idExists = 1;
            break;
        }
    }
} while (idExists);

printf("输入姓名: ");
scanf("%s", student.name);
printf("输入班级: ");
scanf("%s", student.class_name);

do {
    printf("输入数学成绩 (0-100): ");
    scanf("%f", &student.math_score);
} while (student.math_score < 0 || student.math_score > 100);

do {
    printf("输入英语成绩 (0-100): ");
    scanf("%f", &student.english_score);
} while (student.english_score < 0 || student.english_score > 100);

do {
    printf("输入计算机成绩 (0-100): ");
    scanf("%f", &student.cs_score);
} while (student.cs_score < 0 || student.cs_score > 100);

calculate_average(&student);
students[student_count++] = student;
printf("学生记录添加成功\n");

}

总 结
说明:该课程设计结束后的收获与体会

附录:源代码
#include <stdio.h>
#include <string.h>

#define MAX_STUDENTS 100
#define MAX_NAME_LEN 50
#define MAX_CLASS_LEN 20

typedef struct {
int id;
char name[MAX_NAME_LEN];
char class_name[MAX_CLASS_LEN];
float math_score;
float english_score;
float cs_score;
float avg_score;
} Student;

Student students[MAX_STUDENTS];
int student_count = 0;

void calculate_average(Student *student) {
student->avg_score = (student->math_score + student->english_score + student->cs_score) / 3;
}

void add_student() {
if (student_count >= MAX_STUDENTS) {
printf(“无法添加更多学生记录\n”);
return;
}
Student student;
printf(“输入学号: “);
scanf(”%d”, &student.id);
printf(“输入姓名: “);
scanf(”%s”, student.name);
printf(“输入班级: “);
scanf(”%s”, student.class_name);
printf(“输入数学成绩: “);
scanf(”%f”, &student.math_score);
printf(“输入英语成绩: “);
scanf(”%f”, &student.english_score);
printf(“输入计算机成绩: “);
scanf(”%f”, &student.cs_score);

calculate_average(&student);
students[student_count++] = student;
printf("学生记录添加成功\n");

}

void query_student_by_id(int id) {
for (int i = 0; i < student_count; i++) {
if (students[i].id == id) {
printf(“学号: %d, 姓名: %s, 班级: %s, 数学成绩: %.2f, 英语成绩: %.2f, 计算机成绩: %.2f, 平均成绩: %.2f\n”,
students[i].id, students[i].name, students[i].class_name,
students[i].math_score, students[i].english_score, students[i].cs_score,
students[i].avg_score);
return;
}
}
printf(“未找到学号为 %d 的学生\n”, id);
}

void query_student_by_name(char *name) {
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].name, name) == 0) {
printf(“学号: %d, 姓名: %s, 班级: %s, 数学成绩: %.2f, 英语成绩: %.2f, 计算机成绩: %.2f, 平均成绩: %.2f\n”,
students[i].id, students[i].name, students[i].class_name,
students[i].math_score, students[i].english_score, students[i].cs_score,
students[i].avg_score);
return;
}
}
printf(“未找到姓名为 %s 的学生\n”, name);
}

void sort_students_by_avg() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = i + 1; j < student_count; j++) {
if (students[i].avg_score < students[j].avg_score) {
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
printf(“学生记录已按平均成绩降序排序\n”);
}

void sort_students_by_cs() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = i + 1; j < student_count; j++) {
if (students[i].cs_score < students[j].cs_score) {
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
printf(“学生记录已按计算机成绩降序排序\n”);
}

void delete_student(int id) {
int found = 0;
for (int i = 0; i < student_count; i++) {
if (students[i].id == id) {
for (int j = i; j < student_count - 1; j++) {
students[j] = students[j + 1];
}
student_count–;
found = 1;
printf(“学生记录删除成功\n”);
break;
}
}
if (!found) {
printf(“未找到学号为 %d 的学生\n”, id);
}
}

void modify_student(int id) {
for (int i = 0; i < student_count; i++) {
if (students[i].id == id) {
printf(“输入新的姓名: “);
scanf(”%s”, students[i].name);
printf(“输入新的班级: “);
scanf(”%s”, students[i].class_name);
printf(“输入新的数学成绩: “);
scanf(”%f”, &students[i].math_score);
printf(“输入新的英语成绩: “);
scanf(”%f”, &students[i].english_score);
printf(“输入新的计算机成绩: “);
scanf(”%f”, &students[i].cs_score);

        calculate_average(&students[i]);
        printf("学生记录修改成功\n");
        return;
    }
}
printf("未找到学号为 %d 的学生\n", id);

}

void analyze_class(char *class_name) {
int count = 0;
float math_sum = 0, english_sum = 0, cs_sum = 0;
float math_max = 0, english_max = 0, cs_max = 0;
float math_min = 100, english_min = 100, cs_min = 100;
int pass_count = 0;

for (int i = 0; i < student_count; i++) {
    if (strcmp(students[i].class_name, class_name) == 0) {
        count++;
        math_sum += students[i].math_score;
        english_sum += students[i].english_score;
        cs_sum += students[i].cs_score;

        if (students[i].math_score > math_max) math_max = students[i].math_score;
        if (students[i].english_score > english_max) english_max = students[i].english_score;
        if (students[i].cs_score > cs_max) cs_max = students[i].cs_score;

        if (students[i].math_score < math_min) math_min = students[i].math_score;
        if (students[i].english_score < english_min) english_min = students[i].english_score;
        if (students[i].cs_score < cs_min) cs_min = students[i].cs_score;

        if (students[i].math_score >= 60 && students[i].english_score >= 60 && students[i].cs_score >= 60) {
            pass_count++;
        }
    }
}

if (count == 0) {
    printf("未找到班级 %s 的学生\n", class_name);
    return;
}

printf("班级 %s 成绩分析:\n", class_name);
printf("数学平均成绩: %.2f, 最高分: %.2f, 最低分: %.2f\n", math_sum / count, math_max, math_min);
printf("英语平均成绩: %.2f, 最高分: %.2f, 最低分: %.2f\n", english_sum / count, english_max, english_min);
printf("计算机平均成绩: %.2f, 最高分: %.2f, 最低分: %.2f\n", cs_sum / count, cs_max, cs_min);
printf("及格率: %.2f%%\n", (float)pass_count / count * 100);

}

void print_students() {
for (int i = 0; i < student_count; i++) {
printf(“学号: %d, 姓名: %s, 班级: %s, 数学成绩: %.2f, 英语成绩: %.2f, 计算机成绩: %.2f, 平均成绩: %.2f\n”,
students[i].id, students[i].name, students[i].class_name,
students[i].math_score, students[i].english_score, students[i].cs_score,
students[i].avg_score);
}
}

int main() {
int choice, id;
char name[MAX_NAME_LEN], class_name[MAX_CLASS_LEN];

while (1) {
    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("10. 退出\n");
    printf("选择操作: ");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
            add_student();
            break;
        case 2:
            printf("输入学号: ");
            scanf("%d", &id);
            query_student_by_id(id);
            break;
        case 3:
            printf("输入姓名: ");
            scanf("%s", name);
            query_student_by_name(name);
            break;
        case 4:
            sort_students_by_avg();
            break;
        case 5:
            sort_students_by_cs();
            break;
        case 6:
            printf("输入学号: ");
            scanf("%d", &id);
            delete_student(id);
            break;
        case 7:
            printf("输入学号: ");
            scanf("%d", &id);
            modify_student(id);
            break;
        case 8:
            printf("输入班级: ");
            scanf("%s", class_name);
            analyze_class(class_name);
            break;
        case 9:
            print_students();
            break;
        case 10:
            return 0;
        default:
            printf("无效选择,请重新选择\n");
    }
}
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值