学生信息管理系统

2023-11-04

学生信息管理系统

基于动态链表的增、删、改、查和文件的存储,实现对学生信息(姓名、性别、年龄、学号、电话、语文、数学、英语)的管理

存储学生信息的文件:#define FILEPATH "information.txt"

学生基本信息结构体

//学生基本信息信息
struct Student {
	int data;
	char name[10];				//姓名
	char sex[10];				//性别
	int age;					//年龄
	int id;						//学号
	int tel;					//电话
	float Chinese;                //语文
	float Math;                   //数学
	float English;                //英语
};

存放学生信息的链表结点

//存入、查找、删除、修改、输出学生信息,学生信息包括姓名,性别,年龄,学号,电话,成绩; 
typedef struct LNode {
	struct Student stu;		//结点存储学生信息
	struct LNode *next;     //保存下一节点的地址
}LNode, *LinkList;

对学生信息的基本操作函数

LinkList CreatNode(struct Student *pData);							  //创建一个链表结点
void AppendNode(LinkList *root, struct Student *pData);				   //添加一个结点到链表末尾
void Foreach(LinkList root);										//遍历链表并输出
LinkList FindNodeByPos(LinkList root, int pos);						  //找到链表中第pos个结点
void DeleteNode(LinkList *root, int pos);							 //删除链表中第pos个结点
void DeleteList(LinkList *root);									//删除整个链表
LinkList FindNodeById(LinkList root, int id);						 //找到链表中与id相同的结点
LinkList FindNodeByName(LinkList root, char *name);					 //找到链表中与naem相同的结点
void Print(LinkList root);											//打印单个学生信息
void choose();														//功能选择函数
void menu();														//菜单函数
void AppendStudent();												 //增
void DeleteStudent();												 //删
void ChangeStudent();												 //改
void SearchStudentById();											 //查  --- 按ID
void SearchStudentByName();											 //查  --- 按Name
void ShowAllStudent();												 //输出函数
LinkList ReadFile(LinkList root, FILE *fp, struct Student temp);	     //读取文件内容
void WriteFile(LinkList root, FILE *fp);							   //更新文件内容

系统入口菜单函数实现

void menu() {
	cout << endl << endl;
	printf("\t     欢迎使用学生信息管理系统\n");
	printf("\t\t1.查看所有学生信息\n");
	printf("\t\t2.增加学生信息\n");
	printf("\t\t3.删除学生信息\n");
	printf("\t\t4.修改学生信息\n");
	printf("\t\t5.按学号查询学生信息\n");
	printf("\t\t6.按姓名查询学生信息\n");
	printf("\t\t7.退出\n");
}

系统功能选择函数实现

用户根据菜单界面选择相应的功能并输入对应的序号调用对应的函数

void choose() {
	int number;            //功能编号
	while (1) {
		system("cls");     //清屏
		menu();
		cout << "请选择功能:";
		cin >> number;
		switch (number)
		{
			case 1:ShowAllStudent(); cout << "请按任意键继续"; getchar(); getchar(); break;
			case 2:AppendStudent(); cout << "请按任意键继续"; getchar(); getchar(); break;
			case 3:DeleteStudent(); cout << "请按任意键继续"; getchar(); getchar(); break;
			case 4:ChangeStudent(); cout << "请按任意键继续"; getchar(); getchar(); break;
			case 5:SearchStudentById(); cout << "请按任意键继续";  getchar(); getchar(); break;
			case 6:SearchStudentByName(); cout << "请按任意键继续";  getchar(); getchar(); break;
			default:cout << "Bye bye!" << endl; Sleep(3000);  exit(1); break;
		}
	}
}

学生信息的插入操作

  1. 建立空链表
  2. 读取文件内容保存在链表中
  3. 新建链表结点,将新的学生信息保存在该结点,并将该结点插入到链表的末尾
  4. 将整个链表写回到文件中,更新文件的信息
  5. 最后销毁链表回收资源
void AppendStudent() {
	LinkList pList = NULL;   //链表
	struct Student temp;     //临时存储一个学生的信息
	memset(&temp, 0x00, sizeof(struct Student));
	FILE *fp = NULL;         //文件指针

	//读取文件内容
	pList = ReadFile(pList, fp, temp);	
	
	cout << "请输入要插入学生的信息:" << endl;
	cout << "学号:"; cin >> temp.id;
	cout << "姓名:"; cin >> temp.name;
	cout << "年龄:"; cin >> temp.age;
	cout << "性别:"; cin >> temp.sex;
	cout << "电话:"; cin >> temp.tel;
	cout << "成绩:语文 数学 英语";
	cin >> temp.Chinese >> temp.Math >> temp.English;
	AppendNode(&pList, &temp);  //把结点添加到链表末尾

	//更新文件内容
	WriteFile(pList, fp);

	//删除整个链表
	DeleteList(&pList);
}

学生信息的删除操作

  1. 建立空链表
  2. 读取文件内容保存在链表中
  3. 输入要删除学生的学号,并在链表中查找该结点是否存在,如果存在则在链表中删除该结点,
  4. 将整个链表写回到文件中,更新文件的信息
  5. 最后销毁链表回收资源
void DeleteStudent() {
	LinkList pList = NULL;   //链表
	struct Student temp;     //临时存储一个学生的信息
	memset(&temp, 0x00, sizeof(struct Student));
	FILE *fp = NULL;         //文件指针

	//读取文件内容
	pList = ReadFile(pList, fp, temp);

	cout << "请输入要删除学生的的学号:";
	int id;
	cin >> id;
	LinkList node = FindNodeById(pList, id);
	if (node && node->next) {
		LinkList FNode = node->next;
		node->next = FNode->next;
		delete FNode;

		//更新文件信息
		WriteFile(pList, fp);
	}
	else {
		cout << "输入的ID有误!" << endl;
	}
	
	//删除整个链表
	DeleteList(&pList);
}

学生信息的修改操作

  1. 建立空链表
  2. 读取文件内容保存在链表中
  3. 输入要修改学生的学号,并在链表中查找该结点是否存在,如果存在则在链表中修改该结点的信息,
  4. 将整个链表写回到文件中,更新文件的信息
  5. 最后销毁链表回收资源
void ChangeStudent() {
	LinkList pList = NULL;   //链表
	struct Student temp;     //临时存储一个学生的信息
	memset(&temp, 0x00, sizeof(struct Student));
	FILE *fp = NULL;         //文件指针

	//读取文件内容
	pList = ReadFile(pList, fp, temp);

	cout << "请输入要修改学生的的学号:";
	int id;
	cin >> id;
	LinkList node = FindNodeById(pList, id);
	if (node && node->next) {
		cout << "请输入要修改的学生信息:" << endl;
		cout << "学号:"; cin >> node->next->stu.id;
		cout << "姓名:"; cin >> node->next->stu.name;
		cout << "年龄:"; cin >> node->next->stu.age;
		cout << "性别:"; cin >> node->next->stu.sex;
		cout << "电话:"; cin >> node->next->stu.tel;
		cout << "成绩:语文 数学 英语";
		cin >> node->stu.Chinese >> node->stu.Math >> node->stu.English;

		//更新文件信息
		WriteFile(pList, fp);
	}
	else {
		cout << "输入的ID有误!" << endl;
	}

	//删除整个链表
	DeleteList(&pList);
}

学生信息的查找操作

  1. 建立空链表
  2. 读取文件内容保存在链表中
  3. 输入要查找学生的姓名,并在链表中查找该结点是否存在,如果存在则输出该结点的信息,
  4. 最后销毁链表回收资源
//查找  ----   按名字
void SearchStudentByName() {
	LinkList pList = NULL;   //链表
	struct Student temp;     //临时存储一个学生的信息
	memset(&temp, 0x00, sizeof(struct Student));
	FILE *fp = NULL;         //文件指针

	//读取文件内容
	pList = ReadFile(pList, fp, temp);

	cout << "请输入要查找学生的Name:";
	char name[10] = { 0 };
	cin >> name;
	LinkList node = FindNodeByName(pList, name);
	if (node && node->next) {
		Print(node->next);
	}
	else {
		cout << "查无此人! 请查看输入的Name是否正确!" << endl;
	}
}

创建新的链表结点函数封装

//创建一个链表结点
LinkList CreatNode(struct Student *pData) {
	//LinkList pNew = (LinkList)malloc(sizeof(LNode));
	LinkList pNew = new LNode;  //新结点
	if (NULL == pNew) {
		return NULL;
	}
	else {
		pNew->next = NULL;
		strcpy(pNew->stu.name, pData->name);
		strcpy(pNew->stu.sex, pData->sex);
		pNew->stu.age = pData->age;
		pNew->stu.id = pData->id;
		pNew->stu.data = pData->data;
		pNew->stu.tel = pData->tel;
		pNew->stu.Chinese = pData->Chinese;
		pNew->stu.Math = pData->Math;
		pNew->stu.English = pData->English;
	}
	return pNew;
}

添加一个新结点到链表末尾函数封装

//添加一个结点到链表末尾
void AppendNode(LinkList *root, struct Student *pData) {
	if (NULL == root) return;
	else {
		LinkList pTemp = *root;

		//让pTemp指向链表的最后一个结点
		while (pTemp->next) pTemp = pTemp->next;

		pTemp->next = CreatNode(pData);  //链表末尾连接新结点
	}
}

遍历并输出链表结点信息

//遍历链表并输出
void Foreach(LinkList root) {
	if (NULL == root) return;
	while (root) {
		printf("%3d\t", root->stu.id);
		printf("%3s\t", root->stu.name);
		printf("%3d\t", root->stu.age);
		printf("%3s\t", root->stu.sex);
		printf("%3d\t", root->stu.tel);
		printf("%3.1f\t", root->stu.Chinese);
		printf("%3.1f\t", root->stu.Math);
		printf("%3.1f\t", root->stu.English);
		root = root->next;
		cout << endl << "-----------------------------------------------------------------" << endl;
	}
}

按位置查找链表中的结点

//找到链表中第pos个结点
LinkList FindNodeByPos(LinkList root, int pos) {
	if (NULL == root || pos < 0)  return NULL;
	if (pos == 0) return root;

	for (size_t i = 0; i < pos; i++){
		if (NULL == root) return NULL;
		root = root->next;
	}
	return root;
}

删除链表中的指定结点

//删除链表中第pos个结点
void DeleteNode(LinkList *root, int pos) {
	if (NULL == root || NULL == *root || pos < 0) return;
	LinkList pDel = *root;
	LinkList pDelPre = NULL;
	if (pos == 0) {
		*root = pDel->next;
		delete pDel;
		return;
	}

	//pDel = FindNodeByPos(*root, pos);
	pDelPre = FindNodeByPos(*root, pos-1);
	pDel = pDelPre->next;
	if (NULL == pDel) return;
	pDelPre->next = pDel->next;
	delete pDel;
}

按ID查找链表中的结点

//找到链表中与id相同的结点
LinkList FindNodeById(LinkList root, int id) {
	if (NULL == root) return NULL;
	LinkList FNode = root->next;
	while (root->next) {
		if (FNode->stu.id == id) {
			return root;
		}
		root = FNode;
		FNode = FNode->next;
	}
	return root;
}

按Name查找链表中的结点

//找到链表中与naem相同的结点
LinkList FindNodeByName(LinkList root, char *name) {
	if (NULL == root) return NULL;
	LinkList FNode = root->next;
	while (root->next) {
		if (!strcmp(FNode->stu.name, name)) {
			return root;
		}
		root = FNode;
		FNode = FNode->next;
	}
	return root;
}

销毁整个链表

//删除整个链表
void DeleteList(LinkList *root) {
	while (1) {
		if (NULL == *root) return;
		DeleteNode(root, 0);
	}
}

输出所有学生信息的函数封装

//输出函数
void ShowAllStudent() {
	LinkList pList = NULL;      //链表
	struct Student temp;		//临时存储一个学生的信息
	memset(&temp, 0x00, sizeof(struct Student));
	FILE *fp = NULL;		    //文件指针

	//读取文件内容
	pList = ReadFile(pList, fp, temp);

	//遍历容器并输出
	printf("学号    姓名    年龄    性别    电话    语文    数学    英语\n");
	Foreach(pList->next);

	//删除整个链表
	DeleteList(&pList);
}

输出单个学习信息的函数封装

//打印单个学生信息
void Print(LinkList root) {
	if (root != NULL)
	{
		printf("学号    姓名    年龄    性别    电话    语文    数学    英语\n");
		printf("%3d\t", root->stu.id);
		printf("%3s\t", root->stu.name);
		printf("%3d\t", root->stu.age);
		printf("%3s\t", root->stu.sex);
		printf("%3d\t", root->stu.tel);
		printf("%3.1f\t", root->stu.Chinese);
		printf("%3.1f\t", root->stu.Math);
		printf("%3.1f\t", root->stu.English);
		cout << endl << "-----------------------------------------------------------------" << endl;
	}
}

读取文件内容函数封装

  1. 打开文件
  2. 按学生信息结构体大小读取文件内容
  3. 读取一个学生信息就建立一个新的链表结点,并将结点插入到链表的末尾
  4. 关闭文件
//读取文件内容
LinkList ReadFile(LinkList root, FILE *fp, struct Student temp) {
	LinkList Head = new LNode;   //头结点
	Head->next = NULL;

	root = Head;  //链表

	//打开文件
	fp = fopen(FILEPATH, "ab+");
	if (fp != NULL) {
		//读取文件内容并存放在容器中
		int r;
		while (1) {
			r = fread(&temp, 1, sizeof(struct Student), fp);
			if (r <= 0) {  //没读到
				break;
			}
			else {  //读到了一个学生的信息
				//创建一个新链表结点结点并添加到链表末尾
				AppendNode(&root, &temp);
			}
		}
	}
	//关闭文件
	fclose(fp);

	return root;
}

更新文件内容

  1. 打开文件
  2. 将整个链表写入到文件
  3. 关闭文件
//更新文件内容
void WriteFile(LinkList root, FILE *fp) {
	//打开文件
	fp = fopen(FILEPATH, "wb");
	LinkList pTemp = root->next;
	while (pTemp) {
		fwrite(&(pTemp->stu), 1, sizeof(struct Student), fp);
		pTemp = pTemp->next;
	}

	//关闭文件
	fclose(fp);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学生信息管理系统 的相关文章

  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 使用 C# 读取 Soap 消息

  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock

随机推荐

  • 机器学习策略二——优化深度学习系统

    进行误差分析 Carrying out error analysis 如果你希望让学习算法能够胜任人类能做的任务 但你的学习算法还没有达到人类的表现 那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么 这个过程称为错误分析 假
  • C++如何做字符串分割(5种方法)

    1 用strtok函数进行字符串分割 原型 char strtok char str const char delim 功能 分解字符串为一组字符串 参数说明 str为要分解的字符串 delim为分隔符字符串 返回值 从str开头开始的一个
  • 卷积神经网络(CNN)详解与代码实现

    1 应用场景 卷积神经网络的应用不可谓不广泛 主要有两大类 数据预测和图片处理 数据预测自然不需要多说 图片处理主要包含有图像分类 检测 识别 以及分割方面的应用 图像分类 场景分类 目标分类 图像检测 显著性检测 物体检测 语义检测等等
  • 关于二阶锥优化(SOCP)的学习

    原来 数学不好的时候 真的很难深入下去做研究 最近的两个月时间里 我就边学习SOCP相关的理论知识 一边拿它当工具来分析多视角几何中的问题 包括Triangulation Homography Estimation等 接触到SOCP的起因在
  • Linux脚本启动jar包

    注意 以下脚本笔者是在Windows上编辑的 因此默认格式是dos 如果在Linux上使用 请使用vi命令编该文件 改为Unix格式 笔者使用的SpringBoot jsp 因此使用的是war包 如果你使用的是jar包 在文中用到war的地
  • 【notepad++】中删除中文字符

    一 龥
  • html中图片自动循环滚动代码,实现长图片自动循环滚动效果

    实现思路 滚动效果用实现 有个方法 可以滚动到指定位置 有滚动效果 不是直接到指定位置 不了解的看这里种定位滚动方式演示 每一个Item是一张长图 这样首尾相接滚动起来 滚到无限远 就是无限循环的效果 然后再改变滚动的速度 就可以了 sav
  • SVM实现MNIST手写数字识别的实验

    本文是对手写数字识别 二 SVM 实现Mnist image 手写数字图像识别 Sanger1990的博客 CSDN博客 mnist svm 文章中程序的小修改 使代码正常完成预定工作 原代码不能正常完成运行 from PIL import
  • 如何移植和使用QJson?

    一 QJson库的下载 下载链接 http qjson sourceforge net build 二 使用Qt4 8 Mingw编译QJson 1 解压QJson master压缩包 新建一个QJson目录 将QJson master中的
  • 北大AI公开课2019

    2019年2月20日 北京大学 人工智能前沿与产业趋势 正式开课 本学期的课程邀请到了商汤科技副总裁沈徽 驭势科技CEO吴甘沙 微软亚洲研究院副院长周明 360人工智能研究院院长颜水成 YC中国创始人及CEO 百度集团副董事长陆奇等14位来
  • RGMII接口延时问题分析

    问题1 为什么RGMII时钟线和数据线要做延时处理 由于RGMII的数据传输是根据时钟信号采样获得的 RGMII时钟在1000Mb s速率下在上升沿和下降沿均进行采样 在100Mb s速率及10Mb s速率下 仅在上升沿采样数据位 这就会出
  • IEC60601-1-2并列标准:电磁兼容第四版(2014 ed4.0/2020ed 4.1 )对比第三版2007更新内容VS新YY9706.102-2021ed3和旧YY0505-2012ed2.1

    目录 旧版YY 0505 2012 IEC60601 1 2 2004 ed2 1 与新版YY 9706 102 2021 IEC60601 1 2 2007 ed3 IEC 60601 1 2版本迭代 IEC 60601 1 2 2007
  • X-Frame-Options(点击劫持)

    漏洞描述 点击劫持 ClickJacking 是一种视觉上的欺骗手段 攻击者使用一个透明的iframe 覆盖在一个网页上 然后诱使用户在网页上进行操作 此时用户将在不知情的情况下点击透明的iframe页面 通过调整iframe页面的位置 可
  • 计算机层次结构的四个纬度,2014年计算机一级考试MS Office第四章考点解析(12)

    4 5 图标 4 5 1图表的基本概念 1 图表类型 Excel提供了标准图表类型 每一种图表类型又分为多个子类型 可以根据需要选择不同的 图表类型表现数据 常用的图表类型有 柱形图 条形图 饼图 面积图 XY散点图 圆 环图 股价图 曲面
  • 让VBS脚本也有GUI图形界面

    set ie wscript createobject internetexplorer application event 创建ie对象 ie menubar 0 取消菜单栏 ie addressbar 0 取消地址栏 ie toolba
  • js实现前端HTML操作用户文件的读写(已封装)

    readFile 第一个方法是 readFile 用于读取文件内容并以 Promise 对象的形式返回 它接受一个 File 对象和一个可选的编码格式参数 使用 FileReader 对象读取文件内容 当读取完成时调用 resolve 方法
  • RuntimeError: expected dtype Double but got dtype Float 问题解决

    利用Pytorch框架自己构建网络结构 在程序运行到 loss backward 的时候报错 RuntimeError expected dtype Double but got dtype Float validate dtype at
  • 万字长文讲述我是怎样保送清华的

    点击 小卡片 回复 1024 获取大厂面试指南 背景 大家好 我是石头哥 本篇是系列文章第 4 篇 前三篇如下 家穷应该读大学吗 寒门学子的奋斗史 一 第一篇回忆了自己读小学的场景 寒门学子的奋斗史 二 第二篇讲了自己就读的贫困山区中学的
  • Python RSA加密解密

    Python RSA加密解密 RSA是一种非对称加密算法 非对称加密需要公钥 publickey 和私钥 privatekey 消息传递前需要先生成公钥和私钥 发送方将待发送消息用公钥加密 发送给接收方 接收方收到消息后 用私钥解密 在这个
  • 学生信息管理系统

    学生信息管理系统 基于动态链表的增 删 改 查和文件的存储 实现对学生信息 姓名 性别 年龄 学号 电话 语文 数学 英语 的管理 存储学生信息的文件 define FILEPATH information txt 学生基本信息结构体 学生