一、前言
本项目为学生信息管理系统,使用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;
}