学生管理系统项目实现
学生管理系统项目预期:
1.平台开发环境 Linux 系统 + gcc + gdb + make
2.相关结构信息 学生信息: 基本数据信息: 学号: int 姓名: char 128 密码: char 32 年龄: int 班级: int 成绩信息: 数学成绩: int C语言成绩: int 语文成绩: int 名次: int
3. 功能描述 使用终端命令界面,作为系统的输入输出界面
3.1 登录功能 登录功能: 学生的账户,密码 老师的账户,密码 系统启动后提示登录界面。使用用户名和密码登录。学生和老师都可登录 用户名和密码正确登录成功,显示欢迎界面:“欢迎XX同学(老师)登录”显示操作界面 如果输入用户名和密码错误连续提示,超过3次自动退出
3.2 学生功能: 实现对学生信息基本信息的录入,其中名次根据成绩自动计算(添加). 学号不能重复 删除学生信息 修改学生信息 查找学生信息根据学号查找 根据姓名查找 根据班级群体查找,把属于这个班的学生全部显示 显示所有学生信息列表 按学号顺序显示 按名次显示 按某学科(可选)成绩顺序显示,并在最后显示出此科平均分 退出系统
4.项目实施计划 完成学生信息管理的部分 5.项目要求 使用Makefile对项目进行编译 参考代码存放到不同文件中 main.c、menu.c、student.c、student.h、Makefile
运行代码:
main.c主函数文件
//main.c主函数文件
#include "student.h"
// 初始化系统
void init_system() {
// 添加初始化代码,如从文件加载数据
student_count = 0;
// 测试数据
Student test_student1 = {1, "zhangsan", "123456", 20, 1, 85.5, 90.0, 78.5, 0, 0};
Student test_student2 = {2, "lisilisi", "123456", 21, 1, 92.0, 88.5, 95.0, 0, 0};
Student test_student3 = {3, "wangwu", "123456", 20, 2, 76.5, 82.0, 89.0, 0, 0};
students[student_count++] = test_student1;
students[student_count++] = test_student2;
students[student_count++] = test_student3;
// 计算排名
calculate_ranks();
printf("系统初始化完成,加载了 %d 名学生信息\n", student_count);
}
int main() {
// 初始化系统
init_system();
// 登录验证
int user_type = login();
if (user_type == -1) {
printf("登录失败,程序退出\n");
return 1;
}
// 根据用户类型显示不同菜单
if (user_type == 1) {
// 教师菜单
teacher_menu();
} else {
// 学生菜单
student_menu();
}
return 0;
}
makefile文件
//makefile自动执行文件
CC = gcc
CFLAGS = -Wall -g
TARGET = student_manage
SRCS = main.c menu.c student.c
OBJS = $(SRCS:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c student.h
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: all clean
menu.c 菜单
//menu.c菜单
#include "student.h"
// 用户结构体定义和用户数据
User users[] = {
{"root", "123", 1}, // 管理账号
{"stu1", "123", 0}, // 学生账号
{"stu2", "123", 0} // 学生账号
};
int user_count = 1000;
// 学生菜单
void student_menu() {
int choice;
int current_id;
printf("\n请输入你的学号: ");
scanf("%d", ¤t_id);
int found = 0;
for (int i = 0; i < student_count; i++) {
if (students[i].id == current_id) {
found = 1;
break;
}
}
if (!found) {
printf("未找到该学号的学生\n");
return;
}
do {
printf("\n===== 学生菜单 =====\n");
printf("1. 查看个人信息\n");
printf("2. 修改个人信息\n");
printf("3. 查看班级排名\n");
printf("0. 返回\n");
printf("请选择: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("\n个人信息:\n");
for (int i = 0; i < student_count; i++) {
if (students[i].id == current_id) {
printf("学号: %d\n", students[i].id);
printf("姓名: %s\n", students[i].name);
printf("年龄: %d\n", students[i].age);
printf("班级: %d\n", students[i].class_id);
printf("数学成绩: %.2f\n", students[i].math);
printf("C语言成绩: %.2f\n", students[i].c_lang);
printf("语文成绩: %.2f\n", students[i].chinese);
printf("平均分: %.2f\n", students[i].average);
printf("班级排名: %d\n", students[i].rank);
break;
}
}
break;
case 2:
printf("\n修改个人信息:\n");
for (int i = 0; i < student_count; i++) {
if (students[i].id == current_id) {
printf("请输入新的姓名(不修改请输入0): ");
char input[MAX_NAME_LEN];
scanf("%s", input);
if (strcmp(input, "0") != 0) {
strcpy(students[i].name, input);
}
printf("请输入新的年龄(不修改请输入0): ");
int age;
scanf("%d", &age);
if (age != 0) {
students[i].age = age;
}
printf("请输入新的密码(不修改请输入0): ");
scanf("%s", input);
if (strcmp(input, "0") != 0) {
strcpy(students[i].password, input);
}
printf("个人信息修改成功!\n");
break;
}
}
break;
case 3:
// 先按排名排序
sort_students_by_rank();
break;
case 0:
printf("返回主菜单\n");
break;
default:
printf("无效的选择,请重新输入\n");
}
} while (choice != 0);
}
// 管理菜单
void teacher_menu() {
int choice;
do {
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. 按C语言成绩排序\n");
printf("9. 按语文成绩排序\n");
printf("10. 按总分排名排序\n");
printf("0. 退出\n");
printf("请选择: ");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student();
break;
case 2:
delete_student();
break;
case 3:
modify_student();
break;
case 4:
query_student();
break;
case 5:
display_all_students();
break;
case 6:
sort_students_by_id();
break;
case 7:
sort_students_by_math();
break;
case 8:
sort_students_by_c_lang();
break;
case 9:
sort_students_by_chinese();
break;
case 10:
sort_students_by_rank();
break;
case 0:
printf("退出系统\n");
break;
default:
printf("无效的选择,请重新输入\n");
}
} while (choice != 0);
}
// 登录验证
int login() {
char username[MAX_USERNAME_LEN];
char password[MAX_PWD_LEN];
int attempts = 0;
int max_attempts = 3;
int is_teacher = -1;
while (attempts < max_attempts) {
printf("\n===== 登录系统 =====\n");
printf("请输入用户名: ");
scanf("%s", username);
printf("请输入密码: ");
scanf("%s", password);
for (int i = 0; i < user_count; i++) {
if (strcmp(username, users[i].username) == 0 &&
strcmp(password, users[i].password) == 0) {
is_teacher = users[i].is_teacher;
printf("登录成功!\n");
return is_teacher;
}
}
attempts++;
printf("用户名或密码错误,还有%d次尝试机会\n", max_attempts - attempts);
}
printf("登录失败,尝试次数过多\n");
return -1; // 登录失败
}
学生信息功能函数文件student.c
//student.c学生信息功能函数文件
#include "student.h"
// 全局变量定义
Student students[MAX_STUDENTS];
int student_count = 0;
// 计算平均分
void calculate_averages() {
for (int i = 0; i < student_count; i++) {
students[i].average = (students[i].math + students[i].c_lang + students[i].chinese) / 3.0;
}
}
// 计算排名
void calculate_ranks() {
// 先计算平均分
calculate_averages();
// 创建一个临时数组用于排序
Student temp[MAX_STUDENTS];
memcpy(temp, students, sizeof(Student) * student_count);
// 按平均分降序排序
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (temp[j].average < temp[j + 1].average) {
Student t = temp[j];
temp[j] = temp[j + 1];
temp[j + 1] = t;
}
}
}
// 分配排名
for (int i = 0; i < student_count; i++) {
for (int j = 0; j < student_count; j++) {
if (students[j].id == temp[i].id) {
students[j].rank = i + 1;
break;
}
}
}
}
// 添加学生信息
void add_student() {
if (student_count >= MAX_STUDENTS) {
printf("学生数量已达上限,无法添加更多学生\n");
return;
}
Student new_student;
printf("\n===== 添加学生信息 =====\n");
// 检查学号是否已存在
int id_exists;
do {
id_exists = 0;
printf("请输入学号: ");
scanf("%d", &new_student.id);
for (int i = 0; i < student_count; i++) {
if (students[i].id == new_student.id) {
id_exists = 1;
printf("该学号已存在,请重新输入\n");
break;
}
}
} while (id_exists);
printf("请输入姓名: ");
scanf("%s", new_student.name);
printf("请输入密码: ");
scanf("%s", new_student.password);
printf("请输入年龄: ");
scanf("%d", &new_student.age);
printf("请输入班级ID: ");
scanf("%d", &new_student.class_id);
printf("请输入数学成绩: ");
scanf("%f", &new_student.math);
printf("请输入C语言成绩: ");
scanf("%f", &new_student.c_lang);
printf("请输入语文成绩: ");
scanf("%f", &new_student.chinese);
// 计算平均分
new_student.average = (new_student.math + new_student.c_lang + new_student.chinese) / 3.0;
// 添加到数组
students[student_count++] = new_student;
// 重新计算排名
calculate_ranks();
printf("学生信息添加成功!\n");
}
// 删除学生信息
void delete_student() {
int id;
printf("\n===== 删除学生信息 =====\n");
printf("请输入要删除的学生学号: ");
scanf("%d", &id);
int found = 0;
for (int i = 0; i < student_count; i++) {
if (students[i].id == id) {
found = 1;
// 将后面的学生信息前移
for (int j = i; j < student_count - 1; j++) {
students[j] = students[j + 1];
}
student_count--;
printf("学生信息删除成功!\n");
break;
}
}
if (!found) {
printf("未找到该学号的学生\n");
} else {
// 重新计算排名
calculate_ranks();
}
}
// 修改学生信C
void modify_student() {
int id;
printf("\n===== 修改学生信息 =====\n");
printf("请输入要修改的学生学号: ");
scanf("%d", &id);
int found = 0;
for (int i = 0; i < student_count; i++) {
if (students[i].id == id) {
found = 1;
printf("找到学生: %s\n", students[i].name);
printf("请输入新的姓名(不修改请输入0): ");
char input[MAX_NAME_LEN];
scanf("%s", input);
if (strcmp(input, "0") != 0) {
strcpy(students[i].name, input);
}
printf("请输入新的密码(不修改请输入0): ");
scanf("%s", input);
if (strcmp(input, "0") != 0) {
strcpy(students[i].password, input);
}
printf("请输入新的年龄(不修改请输入0): ");
int age;
scanf("%d", &age);
if (age != 0) {
students[i].age = age;
}
printf("请输入新的班级ID(不修改请输入0): ");
int class_id;
scanf("%d", &class_id);
if (class_id != 0) {
students[i].class_id = class_id;
}
printf("请输入新的数学成绩(不修改请输入0): ");
float math;
scanf("%f", &math);
if (math != 0) {
students[i].math = math;
}
printf("请输入新的C语言成绩(不修改请输入0): ");
float c_lang;
scanf("%f", &c_lang);
if (c_lang != 0) {
students[i].c_lang = c_lang;
}
printf("请输入新的语文成绩(不修改请输入0): ");
float chinese;
scanf("%f", &chinese);
if (chinese != 0) {
students[i].chinese = chinese;
}
// 重新计算平均分
students[i].average = (students[i].math + students[i].c_lang + students[i].chinese) / 3.0;
printf("学生信息修改成功!\n");
break;
}
}
if (!found) {
printf("未找到该学号的学生\n");
} else {
// 重新计算排名
calculate_ranks();
}
}
// 查询学生信息
void query_student() {
int choice;
printf("\n===== 查询学生信息 =====\n");
printf("1. 按学号查询\n");
printf("2. 按姓名查询\n");
printf("3. 按班级查询\n");
printf("请选择查询方式: ");
scanf("%d", &choice);
int found = 0;
if (choice == 1) {
int id;
printf("请输入学号: ");
scanf("%d", &id);
for (int i = 0; i < student_count; i++) {
if (students[i].id == id) {
found = 1;
printf("\n学号: %d\n", students[i].id);
printf("姓名: %s\n", students[i].name);
printf("年龄: %d\n", students[i].age);
printf("班级: %d\n", students[i].class_id);
printf("数学成绩: %.2f\n", students[i].math);
printf("C语言成绩: %.2f\n", students[i].c_lang);
printf("语文成绩: %.2f\n", students[i].chinese);
printf("平均分: %.2f\n", students[i].average);
printf("排名: %d\n", students[i].rank);
break;
}
}
} else if (choice == 2) {
char name[MAX_NAME_LEN];
printf("请输入姓名: ");
scanf("%s", name);
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].name, name) == 0) {
if (!found) {
printf("\n找到以下学生:\n");
found = 1;
}
printf("\n学号: %d\n", students[i].id);
printf("姓名: %s\n", students[i].name);
printf("年龄: %d\n", students[i].age);
printf("班级: %d\n", students[i].class_id);
printf("数学成绩: %.2f\n", students[i].math);
printf("C语言成绩: %.2f\n", students[i].c_lang);
printf("语文成绩: %.2f\n", students[i].chinese);
printf("平均分: %.2f\n", students[i].average);
printf("排名: %d\n", students[i].rank);
}
}
} else if (choice == 3) {
int class_id;
printf("请输入班级ID: ");
scanf("%d", &class_id);
for (int i = 0; i < student_count; i++) {
if (students[i].class_id == class_id) {
if (!found) {
printf("\n班级 %d 的学生:\n", class_id);
found = 1;
}
printf("\n学号: %d\n", students[i].id);
printf("姓名: %s\n", students[i].name);
printf("年龄: %d\n", students[i].age);
printf("数学成绩: %.2f\n", students[i].math);
printf("C语言成绩: %.2f\n", students[i].c_lang);
printf("语文成绩: %.2f\n", students[i].chinese);
printf("平均分: %.2f\n", students[i].average);
printf("排名: %d\n", students[i].rank);
}
}
} else {
printf("无效的选择\n");
}
if (!found) {
printf("未找到符合条件的学生\n");
}
}
// 显示所有学生信息
void display_all_students() {
if (student_count == 0) {
printf("\n当前没有学生信息\n");
return;
}
printf("\n===== 所有学生信息 =====\n");
printf("%-8s\t %-10s\t %-6s\t %-8s\t\t %-10s\t %-10s\t %-10s\t %-10s\t %-8s\n",
"学号", "姓名", "年龄", "班级", "数学", "C语言", "语文", "平均分", "排名");
for (int i = 0; i < student_count; i++) {
printf("%-2d\t %-8s\t %-6d\t %-8d\t %-10.2f\t %-10.2f\t %-10.2f\t %-10.2f\t %-8d\n",
students[i].id, students[i].name, students[i].age, students[i].class_id,
students[i].math, students[i].c_lang, students[i].chinese,
students[i].average, students[i].rank);
}
// 计算并显示各科平均分
if (student_count > 0) {
float total_math = 0, total_c_lang = 0, total_chinese = 0;
for (int i = 0; i < student_count; i++) {
total_math += students[i].math;
total_c_lang += students[i].c_lang;
total_chinese += students[i].chinese;
}
printf("\n各科平均分: 数学=%.2f, C语言=%.2f, 语文=%.2f\n",
total_math / student_count,
total_c_lang / student_count,
total_chinese / student_count);
}
}
// 按学号排序
void sort_students_by_id() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].id > students[j + 1].id) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("已按学号排序\n");
display_all_students();
}
// 按排名排序
void sort_students_by_rank() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].rank > students[j + 1].rank) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("已按排名排序\n");
display_all_students();
}
// 按数学成绩排序
void sort_students_by_math() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].math < students[j + 1].math) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("已按数学成绩排序(从高到低)\n");
display_all_students();
}
// 按C语言成绩排序
void sort_students_by_c_lang() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].c_lang < students[j + 1].c_lang) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("已按C语言成绩排序(从高到低)\n");
display_all_students();
}
// 按语文成绩排序
void sort_students_by_chinese() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].chinese < students[j + 1].chinese) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("已按语文成绩排序(从高到低)\n");
display_all_students();
}
学生信息头文件student.h头文件
//student.h头文件
#ifndef STUDENT_H
#define STUDENT_H
#include
#include
#include
#define MAX_STUDENTS 100
#define MAX_NAME_LEN 50
#define MAX_PWD_LEN 20
#define MAX_USERNAME_LEN 20
// 学生结构体定义
typedef struct {
int id; // 学号
char name[MAX_NAME_LEN]; // 姓名
char password[MAX_PWD_LEN]; // 密码
int age; // 年龄
int class_id; // 班级ID
float math; // 数学成绩
float c_lang; // C语言成绩
float chinese; // 语文成绩
float average; // 平均分
int rank; // 名次
} Student;
// 用户结构体定义
typedef struct {
char username[MAX_USERNAME_LEN];
char password[MAX_PWD_LEN];
int is_teacher; // 1表示老师,0表示学生
} User;
// 全局变量
extern Student students[MAX_STUDENTS];
extern int student_count;
extern User users[];
extern int user_count;
// 函数声明
void init_system();
int login();
void student_menu();
void teacher_menu();
// 学生管理功能
void add_student();
void delete_student();
void modify_student();
void query_student();
void display_all_students();
void sort_students_by_id();
void sort_students_by_rank();
void sort_students_by_math();
void sort_students_by_c_lang();
void sort_students_by_chinese();
void calculate_averages();
void calculate_ranks();
#endif // STUDENT_H