学生信息管理系统(student information manage system, SIMS)

news2024/12/28 18:50:58

一、前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL Server 服务器安装配置和使用

目录 一、SQL Server概述 1、SQL Server 环境需求 2、SQL Server的特点和组成 (1)SQL Server 特点 (2)SQL Server 基本组成 3、SQL Server 安装需注意 (1)数据文件的存储位置 (2&#xf…

【Visual Studio Code】编码速度提升小技巧

简言 用了这么久的vscode。在此记录下我常用的快捷键和小技巧。 小技巧 这个是vscode的工作界面。 值得一提的是,界面下边一行是快捷显示信息和快捷操作。可以快速了解打开文件的描述信息。 使用扩展 在使用vscode的时候,一定要安装相应的扩展包。 扩…

08 - 智能编程语言

一、为什么需要智能编程语言 1. 语义鸿沟 传统C/C++等是以面向通用计算的加、减、乘、除等基本标量操作为基础的,通常不具有和具体任务及应用场景相关的高层语义。例如:使用纯标量计算的C++语言编写的卷积运算包含7重循环,而采用向量语义的Python语言编写的卷积运算只需要…

PowerToys——免费、强大、高效的微软官方效率提升工具集,办公学习宝藏软件

名人说:博观而约取,厚积而薄发。——宋苏轼 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、简单介绍1、PowToys是什么?2、它的功能有哪些? 二、下载安装三、功能示例1、始终置顶2、…

弱算法MD5、SHA1、DES、AES CBC-修复建议

一、修复原则 修复原则上2条走: 1、新产品、新业务 不应使用弱算法,如果使用应及时修复 2、已经产品 【金融类】业务应自行根据涉及广度 排期修复 【非金融】 类,在修复难度大、涉及面广的情况下 可以暂时不修复,择机修复。 …

线程等待其他线程执行同步类CountDownLatch

文章目录 前言核心原理源码解析同步源码分析await源码分析countDown源码分析 实战演示1、创建演示代码2、创建测试用例3、测试结果演示 写在最后 前言 大家都知道多线程在我们实际编码过程中运用很多,很多情况我们需要靠多线程来提升系统性能。但是有些时候我们需要…

Flink系列-7、Flink DataSet—Sink广播变量分布式缓存累加器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录 数据输出Da…

图的简单处理(C/C++)

目录 1 存图方法 1.1 邻接矩阵 1.2 邻接表 1.3 链式前向星 2 树形DP 2.1 简介 2.2 例题1:公司聚会 2.3 例题2:士兵部署 2.4 例题3:强力党逗志芃 2.5 例题4:作物杂交(不确定树的结构) …

N1盒子使用U外挂HomeAssistant

目录 感谢1.准备工作2.将固件写入U盘(32G)3.将N1设为U盘启动4.将U盘插入到HDMI旁边的USB接口上5.网页打开HomeAssistant 感谢 HomeAssistant智能家居方案 配套教程 视频 源码 硬件 智能家庭HomeAssistant N1 4月全集成固件 小米米家涂鸦HASS nodered m…

Python图像处理【12】基于小波变换执行图像去噪

基于小波变换执行图像去噪 0. 前言1. 小波变换基础2. 小波变换去噪原理3. 使用 pywt 执行小波变换图像去噪4. 使用 scikit-image 执行小波变换图像去噪4.1 循环旋转技术4.2 改进图像去噪质量 小结系列链接 0. 前言 小波 (wavelets) 变换是表示和分析多分辨率图像的通用方法&am…

上海震坤行工业超市建设数字化采购供应链的实践

上海震坤行工业超市建设数字化采购供应链的实践 对客户而言,MRO工业用品采购一直存在着SKU繁杂、紧急需求多、计划性不强、库存难以管理等特点。有企业统计,MRO零星采购金额占其全类目采购总金额的2%,但是用于管理的时间精力却占到了总体的6…

[使用指南]在使用MyEclipse时如何添加 更新插件

MyEclipse v2022.1.0正式版下载 通过Eclipse市场目录或各种更新站点类型添加插件,可以定制你的MyEclipse IDE(或Angular IDE)。 一、从目录中添加插件 添加额外插件最简单方法是通过Eclipse Marketplace目录。 1. 要打开目录,请从Catalog中选择Help&…

腾讯云服务器网络收发包PPS是什么?性能介绍

什么是网络收发包PPS?云服务器网络收发包PPS多少合适?网络收发包PPS是指云服务器每秒可以处理的网络数据包数量,单位是PPS即packets per second每秒发包数量。云服务器吧来详细说下阿里云服务器网络收发包PPS和腾讯云网络收发包性能参数表&am…

k8s安装部署apollo配置中心

一、文章大纲 二、安装MySQL5.7 三、创建apollo-config 四、创建apollo-admin 五、创建apollo-portal 六、查看apollo各个组件服务状态 七、访问apollo 八、nginx代理配置转发#注意 一定要先启动apollo-config,再启动apollo-admin,最后启动apollo-porta…

什么才是好CDN

选择一种领先于网络和移动技术不断进步以及不断演变的威胁格局的CDN,将使您能够始终如一地为客户提供尽可能好的在线体验,同时最大限度地降低运营复杂性和管理成本。 但问题来了:什么才是最好的CDN? 这个问题的唯一答案是&#x…

HBase高手之路7—HBase之全文检索Phoneix

文章目录 HBase之全文检索Phoenix一、全文检索二、全文检索工具phoenix简介1. 简介2. 使用Phoenix是否会影响HBase性能3. 哪些公司在使用Phoenix4. 官方性能测试4.1 Phoenix对标Hive(基于HDFS和HBase)4.2 Phoenix对标Impala4.3 关于上述官网两张性能测试…

python基础案例题:进制转换、字符串加密的实现、猜拳游戏、多种方法计算π

目录 前言1.进制转换2.字符串加密的实现3.猜拳游戏4.多种方法计算π尾语 💝 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 1.进制转换 功能: 获取十进制整数的二进制串,相当于内置函数bin。 算法分析: 对2辗转相除&…

pyecharts从入门到精通-地图专题Map-世界地图和中国城市地图

文章目录 参考安装与查看pyecharts地图实现-Geo数据集查看读取数据生成中文国家名称国家中文和英文名称字典:根据字典,生成国家中文名查看没有转换成功的国家中文有哪些过滤包含中文国家名的数据 可视化人口数据显示中国城市地图数据 拓展-pyecharts中Map源码拓展-p…

开放耳机有什么优缺点,推荐几款不错的开放式耳机

​由于骨传导耳机可以保持耳朵的开放,长时间佩戴不会有闷热感,同时可以在运动中保持安全,因此被越来越多的人接受。在目前市面上骨传导耳机品牌众多,价格从几十元到上千元不等,为了让大家更好地挑选适合自己的骨传导耳…

java获取两个日期之间的所有日期

1、获取日期的过程: 首先创建一个数组,然后在数组的末尾加上一个日期。当我们有两个日期时,可以把这两个日期当做是不同的数组,然后使用 next函数把这两个日期之间的所有时间都获取出来。 2、代码演示: 3、实现效果&am…