content_views"
class="markdown_views prism-tomorrow-night">
一、前言
ckquote>
本项目为学生信息管理系统c;使用C语言编写。
★★★项目详见本人class="tags" href="/tags/GIT.html" title=git>gitee仓库c;地址
https://class="tags" href="/tags/GIT.html" title=git>gitee.com/omnipotent-brother/student-information-manage-system.class="tags" href="/tags/GIT.html" title=git>git
★★★
ckquote>
二、项目介绍
ckquote>
开发环境:
基于windows 11系统下的Visual Studio 2022开发
提供功能:
- 学生信息的查询、修改、增加、删除
- 账户信息的查询、修改、增加、删除
登陆级别:
- 管理员级别-老师-0c;可使用所有系统功能。
- 普通 级别-学生-1c;仅查询功能。
配置文件:
- configure.txt 存放登陆账户信息文件和学生信息文件的绝对路径c;每个路径独占一行。
- usrer_cfg.txt 登录账户信息c;0表示管理员账户c;1表示普通用户。
- student_cfg.txt 学生信息。
注意: 配置文件要和可执行文件在同一目录下c;或者在程序中fopen的时候写入配置文件路径。
用户文件和登陆账户文件格式如下
usrer_cfg.txt
<code>账户名 密码 登陆级别 code>
student_cfg.txt
<code>id 姓名 课程id 成绩 课程id 成绩 课程id 成绩 ... code>
ckquote>
三、项目展示
ckquote>
登陆界面
首先选择身份c="https://img-blog.csdnimg.cn/b549a3e9e9e44847ad6236c805e44348.png" alt="在这里插入图片描述" />
登录界面输入的账户名和密码应该是usrer_cfg.txt配置文件中存在的记录。
c="https://img-blog.csdnimg.cn/afd7c798af454c0b8a8e876712c6e87c.png" alt="在这里插入图片描述" />
ckquote>
ckquote>
功能选择界面。
c="https://img-blog.csdnimg.cn/8f824fd74417419091147c7766c02642.png" alt="在这里插入图片描述" />
ckquote>
ckquote>
查询学生信息c;查询方式选择界面。
c="https://img-blog.csdnimg.cn/5bbd893ef4bb4b5d9632565e2695dfb4.png" alt="在这里插入图片描述" />
选择0c;查询所有信息。
c="https://img-blog.csdnimg.cn/e6948d95314d48749cdeaab36babc42d.png" alt="在这里插入图片描述" />
ckquote>
四、项目经验分享
ckquote>
通过项目实战可以大大提升C语言水平c;下面展示代码片段。
ckquote>
ckquote>
自定义数据结构
ckquote>
<code class="prism language-c">class="token comment">/*
* 用户结构体
*/
class="token keyword">typedef class="token keyword">struct class="token class-name">user
class="token punctuation">{
class="token keyword">char nameclass="token punctuation">[NAME_LENclass="token punctuation">]class="token punctuation">; class="token comment">/* 用户名称 */
class="token keyword">char passwordclass="token punctuation">[PASSWORD_LENclass="token punctuation">]class="token punctuation">; class="token comment">/* 用户密码 */
class="token keyword">int levelclass="token punctuation">; class="token comment">/* 权限级别 */
class="token keyword">struct class="token class-name">userclass="token operator">* nextclass="token punctuation">;
class="token punctuation">}class="token class-name">user_tclass="token punctuation">;
class="token comment">/*
* 课程结构体
*/
class="token keyword">typedef class="token keyword">struct class="token class-name">course
class="token punctuation">{
class="token keyword">int idclass="token punctuation">; class="token comment">/* 课程号 */
class="token keyword">double scoreclass="token punctuation">; class="token comment">/* 成绩c;尽量使用doublec;float容易失真 */
class="token punctuation">}class="token class-name">course_tclass="token punctuation">;
class="token comment">/*
* 学生结构体
*/
class="token keyword">typedef class="token keyword">struct class="token class-name">student
class="token punctuation">{
class="token keyword">int idclass="token punctuation">;
class="token keyword">char nameclass="token punctuation">[NAME_LENclass="token punctuation">]class="token punctuation">;
class="token class-name">course_t courseclass="token punctuation">[COURSE_NUMclass="token punctuation">]class="token punctuation">;
class="token keyword">struct class="token class-name">studentclass="token operator">* nextclass="token punctuation">;
class="token punctuation">}class="token class-name">student_tclass="token punctuation">;
class="token comment">/*
* 账户级别:admin管理员账户c;normal普通账户
*/
class="token keyword">enumclass="token punctuation">{ADMIN class="token operator">= class="token number">0class="token punctuation">, NORMALclass="token punctuation">}class="token punctuation">;
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name function">LEGAL_LEVELclass="token expression">class="token punctuation">(levelclass="token punctuation">) class="token punctuation">(class="token punctuation">(ADMIN class="token operator">== levelclass="token punctuation">) class="token operator">|| class="token punctuation">\
class="token expression">class="token punctuation">(NORMAL class="token operator">== levelclass="token punctuation">)class="token punctuation">)
class="token comment">/*
* 通过断言判定是否合法c;即是否在enum枚举范围内
*/
class="token macro property">class="token directive-hash">#class="token directive keyword">ifdef class="token expression">USE_FULL_ASSERT
class="token keyword">void class="token function">assert_failedclass="token punctuation">(class="token keyword">unsigned class="token keyword">charclass="token operator">* fileclass="token punctuation">, class="token keyword">unsigned class="token keyword">int lineclass="token punctuation">)class="token punctuation">;
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name function">assert_paramclass="token expression">class="token punctuation">(exprclass="token punctuation">) class="token punctuation">(class="token punctuation">(exprclass="token punctuation">) class="token operator">? class="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token number">0 class="token operator">: class="token function">assert_failedclass="token punctuation">(class="token punctuation">(class="token keyword">unsigned class="token keyword">char class="token operator">*class="token punctuation">)class="token constant">__FILE__class="token punctuation">, class="token constant">__LINE__class="token punctuation">)class="token punctuation">)
class="token macro property">class="token directive-hash">#class="token directive keyword">else
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name function">assert_paramclass="token expression">class="token punctuation">(exprclass="token punctuation">) class="token punctuation">(class="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token number">0class="token punctuation">)
class="token macro property">class="token directive-hash">#class="token directive keyword">endif
code>
ckquote>
主程序
ckquote>
<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">USE_FULL_ASSERT
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"sims.h"
class="token keyword">int class="token function">mainclass="token punctuation">(class="token keyword">charclass="token operator">* argvclass="token punctuation">[class="token punctuation">]class="token punctuation">, class="token keyword">int argcclass="token punctuation">)
class="token punctuation">{
class="token keyword">int option class="token operator">= class="token number">0class="token punctuation">; class="token comment">/* 用于记录用户选项 */
class="token class-name">student_tclass="token operator">* stu_list class="token operator">= class="token constant">NULLclass="token punctuation">;
class="token class-name">user_tclass="token operator">* user_list class="token operator">= class="token constant">NULLclass="token punctuation">;
class="token class-name">user_t userclass="token punctuation">;
class="token function">memsetclass="token punctuation">(class="token operator">&userclass="token punctuation">, class="token number">0class="token punctuation">, class="token keyword">sizeofclass="token punctuation">(userclass="token punctuation">)class="token punctuation">)class="token punctuation">;
FILEclass="token operator">* fp class="token operator">= class="token function">fopenclass="token punctuation">(class="token string">"E:\\project\\c\\my_sims\\configure.txt"class="token punctuation">, class="token string">"r"class="token punctuation">)class="token punctuation">; class="token comment">/* 打开配置文件 */
class="token function">fseekclass="token punctuation">(fpclass="token punctuation">, class="token number">0class="token punctuation">, class="token constant">SEEK_SETclass="token punctuation">)class="token punctuation">; class="token comment">/* 文件指针移至文件首 */
class="token keyword">char user_pathclass="token punctuation">[class="token number">128class="token punctuation">] class="token operator">= class="token string">""class="token punctuation">;
class="token keyword">char stu_pathclass="token punctuation">[class="token number">128class="token punctuation">] class="token operator">= class="token string">""class="token punctuation">;
class="token keyword">char strclass="token punctuation">[class="token number">128class="token punctuation">] class="token operator">= class="token string">""class="token punctuation">;
class="token comment">/* 获取配置文件信息 */
class="token function">fgetsclass="token punctuation">(strclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(strclass="token punctuation">)class="token punctuation">, fpclass="token punctuation">)class="token punctuation">; class="token comment">/* 读取一行 */
class="token function">strncpyclass="token punctuation">(user_pathclass="token punctuation">, strclass="token punctuation">, class="token function">strlenclass="token punctuation">(strclass="token punctuation">) class="token operator">- class="token number">1class="token punctuation">)class="token punctuation">; class="token comment">/* 不拷贝换行符 */
class="token function">memsetclass="token punctuation">(strclass="token punctuation">, class="token number">0class="token punctuation">, class="token keyword">sizeofclass="token punctuation">(strclass="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">/* 清空str防止脏数据 */
class="token function">fgetsclass="token punctuation">(strclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(strclass="token punctuation">)class="token punctuation">, fpclass="token punctuation">)class="token punctuation">;
class="token keyword">if class="token punctuation">(strclass="token punctuation">[class="token function">strlenclass="token punctuation">(strclass="token punctuation">)class="token punctuation">] class="token operator">== class="token char">'\n'class="token punctuation">)
class="token punctuation">{
class="token function">strncpyclass="token punctuation">(stu_pathclass="token punctuation">, strclass="token punctuation">, class="token function">strlenclass="token punctuation">(strclass="token punctuation">) class="token operator">- class="token number">1class="token punctuation">)class="token punctuation">; class="token comment">/* 如果有换行符c;不拷贝换行符 */
class="token punctuation">}
class="token keyword">else
class="token punctuation">{
class="token function">strncpyclass="token punctuation">(stu_pathclass="token punctuation">, strclass="token punctuation">, class="token function">strlenclass="token punctuation">(strclass="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">/* 无换行符全部拷贝 */
class="token punctuation">}
class="token comment">/* 测试打印
printf("%zd\n", strlen(str));
printf("user_path : %s\n", user_path);
printf("stu_path : %s\n", stu_path);*/
class="token comment">/* 系统初始化 */
class="token function">system_initclass="token punctuation">(class="token operator">&user_listclass="token punctuation">, class="token operator">&stu_listclass="token punctuation">, user_pathclass="token punctuation">, stu_pathclass="token punctuation">)class="token punctuation">;
class="token comment">/* 主循环 */
class="token keyword">while class="token punctuation">(class="token number">1class="token punctuation">)
class="token punctuation">{
class="token function">systemclass="token punctuation">(class="token string">"cls"class="token punctuation">)class="token punctuation">; class="token comment">/* 清屏 */
class="token function">menu_initclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token function">printfclass="token punctuation">(class="token string">"Please enter your number: "class="token punctuation">)class="token punctuation">;
option class="token operator">= class="token function">getcharclass="token punctuation">(class="token punctuation">) class="token operator">- class="token char">'0'class="token punctuation">; class="token comment">/* 获取输入的字符并转为数字 */
class="token keyword">if class="token punctuation">(class="token number">2 class="token operator">== optionclass="token punctuation">)
class="token punctuation">{
class="token function">system_exitclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token keyword">return class="token number">0class="token punctuation">;
class="token punctuation">}
class="token keyword">else class="token keyword">if class="token punctuation">(class="token function">LEGAL_LEVELclass="token punctuation">(optionclass="token punctuation">)class="token punctuation">)
class="token punctuation">{
userclass="token punctuation">.level class="token operator">= optionclass="token punctuation">;
class="token punctuation">}
class="token keyword">else
class="token punctuation">{
class="token function">fflushclass="token punctuation">(class="token constant">stdinclass="token punctuation">)class="token punctuation">; class="token comment">/* 刷新输入缓冲区 */
class="token function">printfclass="token punctuation">(class="token string">"Input error!\n"class="token punctuation">)class="token punctuation">;
class="token function">assert_paramclass="token punctuation">(class="token function">LEGAL_LEVELclass="token punctuation">(optionclass="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">/* 使用断言打印位置 */
class="token function">printfclass="token punctuation">(class="token string">"Press any key to re-enter..."class="token punctuation">)class="token punctuation">;
class="token function">_getchclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">/* 接受任意字符后继续运行c;getch()需要按Enter键才能继续运行 */
class="token keyword">continueclass="token punctuation">;
class="token punctuation">}
class="token function">systemclass="token punctuation">(class="token string">"cls"class="token punctuation">)class="token punctuation">;
class="token function">printfclass="token punctuation">(class="token string">"Please enter the user name and password...\n"class="token punctuation">)class="token punctuation">;
class="token function">printfclass="token punctuation">(class="token string">"user name: "class="token punctuation">)class="token punctuation">;
class="token function">scanfclass="token punctuation">(class="token string">"%s"class="token punctuation">, class="token operator">&userclass="token punctuation">.nameclass="token punctuation">)class="token punctuation">;
class="token function">printfclass="token punctuation">(class="token string">"password : "class="token punctuation">)class="token punctuation">;
class="token function">fflushclass="token punctuation">(class="token constant">stdinclass="token punctuation">)class="token punctuation">;
class="token function">get_passwoedclass="token punctuation">(userclass="token punctuation">.passwordclass="token punctuation">)class="token punctuation">;
class="token keyword">if class="token punctuation">(class="token function">search_userclass="token punctuation">(user_listclass="token punctuation">, userclass="token punctuation">)class="token punctuation">)
class="token punctuation">{
class="token comment">/* 在用户文件中找到了输入用户 */
class="token keyword">if class="token punctuation">(ADMIN class="token operator">== userclass="token punctuation">.levelclass="token punctuation">)
class="token punctuation">{
class="token function">admin_function_selectclass="token punctuation">(class="token operator">&user_listclass="token punctuation">, class="token operator">&stu_listclass="token punctuation">, user_pathclass="token punctuation">, stu_pathclass="token punctuation">)class="token punctuation">;
class="token punctuation">}
class="token keyword">else class="token keyword">if class="token punctuation">(NORMAL class="token operator">== userclass="token punctuation">.levelclass="token punctuation">)
class="token punctuation">{
class="token function">normal_function_selectclass="token punctuation">(stu_listclass="token punctuation">)class="token punctuation">;
class="token punctuation">}
class="token keyword">else
class="token punctuation">{
class="token function">printfclass="token punctuation">(class="token string">"user level error...\n"class="token punctuation">)class="token punctuation">;
class="token punctuation">}
class="token keyword">breakclass="token punctuation">;
class="token punctuation">}
class="token keyword">else
class="token punctuation">{
class="token function">printfclass="token punctuation">(class="token string">"Not found user!\n"class="token punctuation">)class="token punctuation">;
class="token function">fflushclass="token punctuation">(class="token constant">stdinclass="token punctuation">)class="token punctuation">;
class="token function">printfclass="token punctuation">(class="token string">"Please enter 'y' to login re-enter, or any other key to exit...\n"class="token punctuation">)class="token punctuation">;
class="token keyword">if class="token punctuation">(class="token char">'y' class="token operator">!= class="token function">_getchclass="token punctuation">(class="token punctuation">)class="token punctuation">)
class="token punctuation">{
class="token keyword">breakclass="token punctuation">;
class="token punctuation">}
class="token punctuation">}
class="token punctuation">}
class="token comment">/*system("pause");*/
class="token keyword">return class="token number">0class="token punctuation">;
class="token punctuation">}
code>