一、前言

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