一、前言
本项目为学生信息管理系统,使用C语言编写。
★★★项目详见本人gitee仓库,地址
https://gitee.com/omnipotent-brother/student-information-manage-system.git
★★★
二、项目介绍
开发环境:
基于windows 11系统下的Visual Studio 2022开发
提供功能:
- 学生信息的查询、修改、增加、删除
- 账户信息的查询、修改、增加、删除
登陆级别:
- 管理员级别-老师-0,可使用所有系统功能。
- 普通 级别-学生-1,仅查询功能。
配置文件:
- configure.txt 存放登陆账户信息文件和学生信息文件的绝对路径,每个路径独占一行。
- usrer_cfg.txt 登录账户信息,0表示管理员账户,1表示普通用户。
- student_cfg.txt 学生信息。
注意: 配置文件要和可执行文件在同一目录下,或者在程序中fopen的时候写入配置文件路径。
用户文件和登陆账户文件格式如下
usrer_cfg.txt
账户名 密码 登陆级别
student_cfg.txt
id 姓名 课程id 成绩 课程id 成绩 课程id 成绩 ...
三、项目展示
登陆界面
首先选择身份登录界面输入的账户名和密码应该是usrer_cfg.txt配置文件中存在的记录。
功能选择界面。
查询学生信息,查询方式选择界面。
选择0,查询所有信息。
四、项目经验分享
通过项目实战可以大大提升C语言水平,下面展示代码片段。
自定义数据结构
/* * 用户结构体 */ typedef struct user { char name[NAME_LEN]; /* 用户名称 */ char password[PASSWORD_LEN]; /* 用户密码 */ int level; /* 权限级别 */ struct user* next; }user_t; /* * 课程结构体 */ typedef struct course { int id; /* 课程号 */ double score; /* 成绩,尽量使用double,float容易失真 */ }course_t; /* * 学生结构体 */ typedef struct student { int id; char name[NAME_LEN]; course_t course[COURSE_NUM]; struct student* next; }student_t; /* * 账户级别:admin管理员账户,normal普通账户 */ enum{ADMIN = 0, NORMAL}; #define LEGAL_LEVEL(level) ((ADMIN == level) || \ (NORMAL == level)) /* * 通过断言判定是否合法,即是否在enum枚举范围内 */ #ifdef USE_FULL_ASSERT void assert_failed(unsigned char* file, unsigned int line); #define assert_param(expr) ((expr) ? (void)0 : assert_failed((unsigned char *)__FILE__, __LINE__)) #else #define assert_param(expr) ((void)0) #endif
主程序
#define USE_FULL_ASSERT #include "sims.h" int main(char* argv[], int argc) { int option = 0; /* 用于记录用户选项 */ student_t* stu_list = NULL; user_t* user_list = NULL; user_t user; memset(&user, 0, sizeof(user)); FILE* fp = fopen("E:\\project\\c\\my_sims\\configure.txt", "r"); /* 打开配置文件 */ fseek(fp, 0, SEEK_SET); /* 文件指针移至文件首 */ char user_path[128] = ""; char stu_path[128] = ""; char str[128] = ""; /* 获取配置文件信息 */ fgets(str, sizeof(str), fp); /* 读取一行 */ strncpy(user_path, str, strlen(str) - 1); /* 不拷贝换行符 */ memset(str, 0, sizeof(str)); /* 清空str防止脏数据 */ fgets(str, sizeof(str), fp); if (str[strlen(str)] == '\n') { strncpy(stu_path, str, strlen(str) - 1); /* 如果有换行符,不拷贝换行符 */ } else { strncpy(stu_path, str, strlen(str)); /* 无换行符全部拷贝 */ } /* 测试打印 printf("%zd\n", strlen(str)); printf("user_path : %s\n", user_path); printf("stu_path : %s\n", stu_path);*/ /* 系统初始化 */ system_init(&user_list, &stu_list, user_path, stu_path); /* 主循环 */ while (1) { system("cls"); /* 清屏 */ menu_init(); printf("Please enter your number: "); option = getchar() - '0'; /* 获取输入的字符并转为数字 */ if (2 == option) { system_exit(); return 0; } else if (LEGAL_LEVEL(option)) { user.level = option; } else { fflush(stdin); /* 刷新输入缓冲区 */ printf("Input error!\n"); assert_param(LEGAL_LEVEL(option)); /* 使用断言打印位置 */ printf("Press any key to re-enter..."); _getch(); /* 接受任意字符后继续运行,getch()需要按Enter键才能继续运行 */ continue; } system("cls"); printf("Please enter the user name and password...\n"); printf("user name: "); scanf("%s", &user.name); printf("password : "); fflush(stdin); get_passwoed(user.password); if (search_user(user_list, user)) { /* 在用户文件中找到了输入用户 */ if (ADMIN == user.level) { admin_function_select(&user_list, &stu_list, user_path, stu_path); } else if (NORMAL == user.level) { normal_function_select(stu_list); } else { printf("user level error...\n"); } break; } else { printf("Not found user!\n"); fflush(stdin); printf("Please enter 'y' to login re-enter, or any other key to exit...\n"); if ('y' != _getch()) { break; } } } /*system("pause");*/ return 0; }