【实现报告】学生信息管理系统(顺序表)

news2024/9/21 12:47:48

目录

实验一 线性表的基本操作

一、实验目的

二、实验内容

三、实验提示

四、实验要求

五、实验代码如下:

(一)顺序表的构建及初始化

(二)检查顺序表是否需要扩容

(三)根据指定学生个数,逐个输入学生信息

(四)逐个显示学生表中所有学生的相关信息

(五)根据姓名进行查找,返回此学生的学号和成绩

(六)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(七) 给定一个学生信息,插入到表中指定的位置

检查插入位置的有效性

检查并扩容

将插入位置及之后的元素后移

在指定位置插入新元素

更新顺序表长度

 (八)删除指定位置的学生记录

 (九)main函数

六、整体代码如下: 


实验一 线性表的基本操作

一、实验目的

1、掌握线性表的定义;

2、掌握线性表的基本操作,如建立、查找、插入和删除等。

二、实验内容

定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表,使其具有如下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(5) 给定一个学生信息,插入到表中指定的位置;

(6) 删除指定位置的学生记录;

(7) 统计表中学生个数。

三、实验提示

学生信息的定义:

typedef struct {

    char no[8];   //8位学号

    char name[20]; //姓名

    int grade;     //成绩

}Student;

顺序表的定义

typedef  struct {

  Student  *elem;     //指向数据元素的基地址

  int  length;       //线性表的当前长度                                                           

 }SqList;

链表的定义:

typedef struct LNode{

     Student   data;       //数据域

     struct LNode  *next;   //指针域

}LNode,*LinkList;

四、实验要求

(1) 程序要添加适当的注释,程序的书写要采用缩进格式。

(2) 程序要具有一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。

(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表根据姓名进行查找的算法和插入算法的流程图。

五、实验代码如下:

(一)顺序表的构建及初始化

  1. 动态内存分配:使用malloc函数为elem分配内存空间,空间大小为MAX_SIZE乘以sizeof(Student),即足够存储MAX_SIZEStudent类型的数据。MAX_SIZE是一个宏定义,表示顺序表的初始容量。

  2. 内存分配失败检查:如果malloc返回NULL,表示内存分配失败。此时,程序打印错误信息并通过exit(1)退出。

  3. 初始化顺序表属性:将length设置为0,表示顺序表当前没有任何元素。将capacity设置为MAX_SIZE,表示顺序表的当前容量为MAX_SIZE个元素。

  4. 内存清零:使用memset函数将新分配的内存区域全部清零。这是一种预防措施,确保所有的Student记录从一开始就处于一个定义良好的状态(即所有位都是0),避免了使用未初始化的内存。

typedef struct {
	char no[8];    // 8位学号
	char name[20]; // 姓名
	double grade;     // 成绩
}Student;

// 顺序表的定义
typedef  struct SqList
{
	Student* elem;     // 指向数据元素的基地址
	int  length;       // 线性表的当前长度 
	int  capacity;     // 线性表的容量
}SL;
typedef Student ElemType;

void SeqListInit(SL* ps)
{
	// 动态分配一个固定大小的数组用于存储学生信息
	ps->elem = (Student*)malloc(MAX_SIZE * sizeof(Student));
	if (!ps->elem) {
		// 如果内存分配失败,打印错误信息并退出程序
		printf("建立顺序表失败\n");
		exit(1);
	}
	ps->length = 0;  // 初始化顺序表当前长度为0
	ps->capacity = MAX_SIZE;  // 设置顺序表的容量为MAX_SIZE
	memset(ps->elem, 0, sizeof(Student) * MAX_SIZE); // 将分配的内存区域清零  
}

(二)检查顺序表是否需要扩容

  • 检查是否需要扩容:首先,函数检查顺序表ps的当前长度(ps->length)是否等于其容量(ps->capacity)。等于容量意味着顺序表已满,没有多余的空间来存储新的元素,因此需要扩容。

  • 计算新容量:如果顺序表需要扩容,函数计算新的容量newcapacity。新容量被设置为当前容量的两倍,这是一种常见的扩容策略,旨在平衡扩容操作的次数和每次扩容增加的空间。特殊情况是,如果当前容量为0(意味着顺序表尚未初始化或特殊设计),则初始化为4

  • 重新分配内存:通过realloc函数尝试重新分配内存。realloc不仅能够扩展或缩减已分配的内存块大小,还会保留原内存块的内容(在新内存块中复制原有数据),这对于顺序表的扩容操作是非常必要的。新内存的大小是newcapacity * sizeof(ElemType)ElemType是顺序表存储元素的类型,这里是Student结构体。

  • 检查内存分配结果:如果realloc返回NULL,意味着内存分配失败,函数会打印错误信息并退出程序。。

  • 更新顺序表属性:如果内存分配成功,realloc会返回新分配内存的地址,函数会将这个新地址赋给ps->elem,以此更新顺序表的基地址。同时,更新顺序表的容量为newcapacity

void SeqListCheckCapacity(SL* ps)
{
	// 如果当前长度达到容量限制,则需要扩容
	if (ps->length == ps->capacity) {
		// 新容量是当前容量的两倍,特殊情况下从0开始则初始化为4
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		// 尝试重新分配内存
		ElemType* tmp = (ElemType*)realloc(ps->elem, newcapacity * sizeof(ElemType));
		if (tmp == NULL) {
			// 如果内存分配失败,打印错误信息并退出程序
			perror("realloc fail!");
			exit(1);
		}
		ps->elem = tmp; // 更新顺序表的元素指针
		ps->capacity = newcapacity; // 更新顺序表的容量
	}
}

(三)根据指定学生个数,逐个输入学生信息

void Input(ElemType* e)
{
	 提示用户输入一个学生的学号、姓名和成绩
	//printf("请输入要读入的学生信息(包括学号, 姓名, 成绩):");
	//scanf("%s %s %lf", e->no, e->name, &e->grade);
    printf("学号:");	scanf("%s", e->no);
    printf("姓名:");	scanf("%s", e->name);
    printf("成绩:");	scanf("%lf", &e->price);
    printf("输入完成\n\n");
}

// 根据指定学生个数,逐个输入学生信息

printf("请输入要输入的学生个数:\n"); scanf("%d", &n);
while (n--)
{
	if (ps->length >= ps->capacity)
	{
		SeqListCheckCapacity(ps);
	}
	ps->length++;
	printf("请输入第 %d 个学生:\n", ps->length);
	Input(&ps->elem[ps->length]);
}

(四)逐个显示学生表中所有学生的相关信息

void Output(ElemType* e)
{
	// 格式化输出学生的学号、姓名和成绩
	printf(" 学号:%-10s\n 姓名:%-20s\n 成绩:%-10.2f\n\n", e->no, e->name, e->grade);
}

// 显示学生表信息
for (i = 1; i <= ps->length; i++) {
	Output(&ps->elem[i]);
}
break;

(五)根据姓名进行查找,返回此学生的学号和成绩

int Search(SqList* ps, char str[])
{
	// 遍历顺序表中的每个元素,查找姓名匹配的学生
	int i = 1; // 注意这里的索引从1开始,为了用户友好
	for (; i <= ps->length; i++)
	{
		if (strcmp(ps->elem[i].name, str) == 0)
			return i; // 如果找到,返回学生的位置
	}
	return 0;
}

printf("请输入要查找的学生姓名:");
scanf("%s", str);
//根据姓名进行查找,返回此学生的学号和成绩;
if (t = Search(ps, str))
	Output(&ps->elem[Search(ps, str)]);
else
	printf("没有此学生信息!\n");
*str = NULL;

(六)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

void Output(ElemType* e)
{
	// 格式化输出学生的学号、姓名和成绩
	printf(" 学号:%-10s\n 姓名:%-20s\n 成绩:%-10.2f\n\n", e->no, e->name, e->grade);
}

printf("请输入显示的位置:\n");
scanf("%d", &id1);
Output(&ps->elem[id1]);

(七) 给定一个学生信息,插入到表中指定的位置

检查插入位置的有效性

  • 函数首先检查提供的位置i是否在合法范围内。有效的插入位置从1开始,到ps->length + 1结束(含)。
  • 如果i小于1或大于ps->length + 1,函数返回false,表示插入操作失败。

检查并扩容

  • 如果顺序表的当前长度加1大于等于其容量(ps->length + 1 >= ps->capacity),意味着顺序表没有足够的空间来容纳新元素,因此需要扩容。
  • SeqListCheckCapacity函数被调用来处理可能的扩容。如果需要,这个函数会增加顺序表的容量,保证有足够的空间插入新元素。

将插入位置及之后的元素后移

  • 为了在指定位置i插入新元素,从该位置开始到顺序表末尾的所有元素都需要向后移动一位。这通过一个从ps->length开始,向下到i的逆序循环完成。循环中的每一步都将元素从j位置移动到j + 1位置。
  • 这个过程为新元素腾出了位置i

在指定位置插入新元素

  • 新元素通过解引用e指针(*e)获得,并被插入到顺序表的位置i。由于函数用户友好性考虑,位置i是从1开始计数的。

更新顺序表长度

  • 成功插入新元素后,顺序表的长度ps->length增加1,以反映新元素的添加。

返回值

  • 函数最后返回true,表示插入操作成功执行。

bool ListInsert(SqList* ps, int i, ElemType* e)
{
	// 检查插入位置的有效性
	if ((i < 1) || (i > ps->length + 1)) return false;
	// 检查并扩容
	if (1 + ps->length >= ps->capacity)
	{
		SeqListCheckCapacity(ps);
	}
	// 将插入位置及之后的元素后移
	for (int j = ps->length; j >= i; j--)
	{
		ps->elem[j + 1] = ps->elem[j];
	}
	// 在指定位置插入新元素
	ps->elem[i] = *e;
	ps->length++; // 更新顺序表长度
	return true;
}

//给定一个学生信息,插入到表中指定的位置;
printf("请输入要插入的位置:");
scanf("%d", &id2);
printf("输入要插入的人数:");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
	printf("请输入第 %d 个学生:\n", i);
	Input(&a);
	if (ListInsert(ps, id2, &a))
	{
		puts("插入成功");
	}
	else
	{
		puts("插入失败\n");
	}
}

 (八)删除指定位置的学生记录

  • 在执行删除操作之前,函数首先检查提供的索引i是否有效。索引有效的条件是它必须在1和顺序表当前长度ps->length之间(包含这两个值)
  • 如果i无效(即小于1或大于ps->length),函数立即返回false,表示删除操作失败。
  • 如果索引i有效,函数通过将从位置i+1开始的所有元素向前移动一位来删除位于位置i的元素。这通过一个for循环实现,循环的迭代变量ji开始,直到ps->length(包含)。
  • 循环内部的操作ps->elem[j] = ps->elem[j + 1];将每个后续元素复制到其前一个位置上,实际上是将位置i上的元素“覆盖”,从而实现删除效果。

bool ListDelete(SqList* ps, int i)
{
	// 首先检查给定的索引i是否有效。
	if ((i < 1) || (i > ps->length))return false;
	for (int j = i; j <= ps->length; j++)
	{
		ps->elem[j] = ps->elem[j + 1];
	}
	--ps->length;
	return true;
}

//删除指定位置的学生记录;
printf("请输入要删除的位置:");
int id3;
scanf("%d", &id3);
if (ListDelete(ps, id3))
{
	puts("删除成功");
}
else
{
	puts("删除失败");
}

 (九)main函数

int main()
{
	SL* ps = (SL*)malloc(sizeof(SL));
	ElemType a;


	printf("\n1.构造顺序表\n");
	printf("2.输入学生信息\n");
	printf("3.显示学生表信息\n");
	printf("4.根据姓名进行查找\n");
	printf("5.显示指定的位置学生信息\n");
	printf("6.在指定位置插入学生信息\n");
	printf("7.删除指定位置的学生记录\n");
	printf("8.统计学生人数\n");
	printf("9.退出\n\n");

	int choose, n = 0; char str[20]; int id1, t = 0, id2 = 0, i = 1;
	while (1) {
		printf("请选择:");
		scanf("%d", &choose);
		if (choose == 9) break;
		switch (choose) {
		......
		}
	}
	return 0;
}

六、整体代码如下: 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_SIZE 10
#define Case break;case

typedef struct {
	char no[8];    // 8位学号
	char name[20]; // 姓名
	double grade;     // 成绩
}Student;

// 顺序表的定义
typedef  struct SqList
{
	Student* elem;     // 指向数据元素的基地址
	int  length;       // 线性表的当前长度 
	int  capacity;     // 线性表的容量
}SL;
typedef Student ElemType;

void SeqListInit(SL* ps)
{
	// 动态分配一个固定大小的数组用于存储学生信息
	ps->elem = (Student*)malloc(MAX_SIZE * sizeof(Student));
	if (!ps->elem) {
		// 如果内存分配失败,打印错误信息并退出程序
		printf("建立顺序表失败\n");
		exit(1);
	}
	ps->length = 0;  // 初始化顺序表当前长度为0
	ps->capacity = MAX_SIZE;  // 设置顺序表的容量为MAX_SIZE
	memset(ps->elem, 0, sizeof(Student) * MAX_SIZE); // 将分配的内存区域清零  
}

void SeqListCheckCapacity(SL* ps)
{
	// 如果当前长度达到容量限制,则需要扩容
	if (ps->length == ps->capacity) {
		// 新容量是当前容量的两倍,特殊情况下从0开始则初始化为4
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		// 尝试重新分配内存
		ElemType* tmp = (ElemType*)realloc(ps->elem, newcapacity * sizeof(ElemType));
		if (tmp == NULL) {
			// 如果内存分配失败,打印错误信息并退出程序
			perror("realloc fail!");
			exit(1);
		}
		ps->elem = tmp; // 更新顺序表的元素指针
		ps->capacity = newcapacity; // 更新顺序表的容量
	}
}

void Input(ElemType* e)
{
	void Input(ElemType* e)
{
	 提示用户输入一个学生的学号、姓名和成绩
	//printf("请输入要读入的学生信息(包括学号, 姓名, 成绩):");
	//scanf("%s %s %lf", e->no, e->name, &e->grade);
    printf("学号:");	scanf("%s", e->no);
    printf("姓名:");	scanf("%s", e->name);
    printf("成绩:");	scanf("%lf", &e->price);
    printf("输入完成\n\n");
}
}

void Output(ElemType* e)
{
	// 格式化输出学生的学号、姓名和成绩
	printf(" 学号:%-10s\n 姓名:%-20s\n 成绩:%-10.2f\n\n", e->no, e->name, e->grade);
}

int Search(SqList* ps, char str[])
{
	// 遍历顺序表中的每个元素,查找姓名匹配的学生
	int i = 1; // 注意这里的索引从1开始,为了用户友好
	for (; i <= ps->length; i++)
	{
		if (strcmp(ps->elem[i].name, str) == 0)
			return i; // 如果找到,返回学生的位置
	}
	return 0;
}

bool ListInsert(SqList* ps, int i, ElemType* e)
{
	// 检查插入位置的有效性
	if ((i < 1) || (i > ps->length + 1)) return false;
	// 检查并扩容
	if (1 + ps->length >= ps->capacity)
	{
		SeqListCheckCapacity(ps);
	}
	// 将插入位置及之后的元素后移
	for (int j = ps->length; j >= i; j--)
	{
		ps->elem[j + 1] = ps->elem[j];
	}
	// 在指定位置插入新元素
	ps->elem[i] = *e;
	ps->length++; // 更新顺序表长度
	return true;
}

bool ListDelete(SqList* ps, int i)
{
	// 首先检查给定的索引i是否有效。
	if ((i < 1) || (i > ps->length))return false;
	// 将删除位置之后的元素前移
	for (int j = i; j <= ps->length; j++)
	{
		ps->elem[j] = ps->elem[j + 1];
	}
	--ps->length;// 更新顺序表长度
	return true;
}

int main()
{
	SL* ps = (SL*)malloc(sizeof(SL));
	ElemType a;


	printf("\n1.构造顺序表\n");
	printf("2.输入学生信息\n");
	printf("3.显示学生表信息\n");
	printf("4.根据姓名进行查找\n");
	printf("5.显示指定的位置学生信息\n");
	printf("6.在指定位置插入学生信息\n");
	printf("7.删除指定位置的学生记录\n");
	printf("8.统计学生人数\n");
	printf("9.退出\n\n");

	int choose, n = 0; char str[20]; int id1, t = 0, id2 = 0, i = 1;
	while (1) {
		printf("请选择:");
		scanf("%d", &choose);
		if (choose == 9) break;
		switch (choose) {
		case 1:// 初始化顺序表
			SeqListInit(ps);
			Case 2:
			// 根据指定学生个数,逐个输入学生信息

			printf("请输入要输入的学生个数:\n"); scanf("%d", &n);
			while (n--)
			{
				if (ps->length >= ps->capacity)
				{
					SeqListCheckCapacity(ps);
				}
				ps->length++;
				printf("请输入第 %d 个学生:\n", ps->length);
				Input(&ps->elem[ps->length]);
			}
			Case 3:
			// 显示学生表信息
			for (i = 1; i <= ps->length; i++) {
				Output(&ps->elem[i]);
			}
			break;
			Case 4:
			printf("请输入要查找的学生姓名:");
			scanf("%s", str);
			//根据姓名进行查找,返回此学生的学号和成绩;
			if (t = Search(ps, str))
				Output(&ps->elem[Search(ps, str)]);
			else
				printf("没有此学生信息!\n");
			*str = NULL;
			Case 5:
			//根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
			printf("请输入显示的位置:\n");
			scanf("%d", &id1);
			Output(&ps->elem[id1]);
			Case 6:
			//给定一个学生信息,插入到表中指定的位置;
			printf("请输入要插入的位置:");
			scanf("%d", &id2);
			printf("输入要插入的人数:");
			scanf("%d", &n);
			for (i = 1; i <= n; i++)
			{
				printf("请输入第 %d 个学生:\n", i);
				Input(&a);
				if (ListInsert(ps, id2, &a))
				{
					puts("插入成功");
				}
				else
				{
					puts("插入失败\n");
				}
			}
			Case 7:
			//删除指定位置的学生记录;
			printf("请输入要删除的位置:");
			int id3;
			scanf("%d", &id3);
			if (ListDelete(ps, id3))
			{
				puts("删除成功");
			}
			else
			{
				puts("删除失败");
			}

			Case 8:
			//统计表中学生个数。
			printf("表中学生个数有%d人\n", ps->length);
			break;
		default:
			printf("无效选项\n");
			break;
		}
	}
	return 0;
}

运行截图:

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

Redis命令-List命令

4.6 Redis命令-List命令 Redis中的List类型与Java中的LinkedList类似&#xff0c;可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似&#xff1a; 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据&#xff…

工控安全双评合规:等保测评与商用密码共铸新篇章

01.双评合规概述 2017年《中华人民共和国网络安全法》开始正式施行&#xff0c;网络安全等级测评工作也在全国范围内按照相关法律法规和技术标准要求全面落实实施。2020年1月《中华人民共和国密码法》开始正式施行&#xff0c;商用密码应用安全性评估也在有序推广和逐步推进。…

Day60-Nginx反向代理与负载均衡基于URI及USER_AGENT等跳转讲解

Day60-Nginx反向代理与负载均衡基于URI及USER_AGENT等跳转讲解 9. 基于uri实现动静分离、业务模块分离调度企业案例&#xff08;参考书籍&#xff09;10.基于user_agent及浏览器实现转发(参考书籍)11.根据文件扩展名实现代理转发12. Nginx负载均衡监测节点状态13.proxy_next_up…

FPGA高端项目:解码索尼IMX327 MIPI相机转HDMI输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 6、工程源码…

C/C++ ③ —— C++11新特性

1. 类型推导 1.1 auto auto可以让编译器在编译期就推导出变量的类型 auto的使⽤必须⻢上初始化&#xff0c;否则⽆法推导出类型auto在⼀⾏定义多个变量时&#xff0c;各个变量的推导不能产⽣⼆义性&#xff0c;否则编译失败auto不能⽤作函数参数在类中auto不能⽤作⾮静态成员…

构建智能未来:探索AI人工智能产品业务架构的创新之路

随着人工智能技术的快速发展&#xff0c;AI人工智能产品在各行各业中扮演着越来越重要的角色。本文将深入探讨AI人工智能产品业务架构的创新之路&#xff0c;探讨如何构建智能未来的商业生态。 ### AI人工智能产品业务架构的重要性 AI人工智能产品的业务架构是支撑产品成功的…

Zookeeper的选主流程

Zookeeper的核心是原子广播&#xff0c;这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式&#xff0c;它们分别是恢复模式&#xff08;选主&#xff09;和广播模式&#xff08;同步&#xff09;。当服务启动或者在领导者崩溃后&#xff…

学习vue3第十二节(组件的使用与类型)

1、组件的作用用途 目的&#xff1a; 提高代码的复用度&#xff0c;和便于维护&#xff0c;通过封装将复杂的功能代码拆分为更小的模块&#xff0c;方便管理&#xff0c; 当我们需要实现相同的功能时&#xff0c;我们只需要复用已经封装好的组件&#xff0c;而不需要重新编写相…

信息系统项目管理师——第10章项目进度管理(重要)

本章节内容属于10大管理知识领域中的重中之重&#xff0c;选择、案例、论文都会考&#xff0c;需要完全掌握。 选择题&#xff0c;大概考3分左右&#xff0c;有的时候会考一点理论大多数都是考计算。 案例题&#xff0c;必考内容&#xff0c;各种类型的计算题&#xff0c;网络图…

基于SpringBoot的“招聘信息管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“招聘信息管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 企业招聘界面…

免费软件“蓝莓投屏”:支持多个Airplay同时镜像的投屏软件。

引言&#xff1a; 由于定制盒子(3288)不支持投屏功能&#xff08;有些5.1不支持&#xff0c;安卓4.X本身也不支持&#xff09;&#xff0c;需要借助第三方的投屏软件来实现这一需求。所以&#xff0c;研究半天&#xff0c;蓝莓投屏以其简便易用的特性脱颖而出&#xff0c;只需…

《QT实用小工具·二》图片文字转base64编码

1、概述 源码放在文章末尾 base64编码转换类 图片转base64字符串。base64字符串转图片。字符转base64字符串。base64字符串转字符。后期增加数据压缩。Qt6对base64编码转换进行了重写效率提升至少200%。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifn…

【漏洞复现】浙大恩特客户资源管理系统 Quotegask_editAction-sql接口处存在SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深&#xff0c;制药行业作为国民经济的重要支柱之一&#xff0c;也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来&#xff0c;制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

FPGA 图像边缘检测(Canny算子)

1 顶层代码 timescale 1ns / 1ps //边缘检测二阶微分算子&#xff1a;canny算子module image_canny_edge_detect (input clk,input reset, //复位高电平有效input [10:0] img_width,input [ 9:0] img_height,input [ 7:0] low_threshold,input [ 7:0] high_threshold,input va…

【漏洞复现】chatgpt pictureproxy.php SSRF漏洞(CVE-2024-27564)

0x01 漏洞概述 ChatGPT pictureproxy.php接口存在服务器端请求伪造 漏洞&#xff08;SSRF&#xff09; &#xff0c;未授权的攻击者可以通过将构建的 URL 注入 url参数来强制应用程序发出任意请求。 0x02 测绘语句 fofa: icon_hash"-1999760920" 0x03 漏洞复现 G…

element-ui 自定义点击图标/文本/按钮触发el-date-picker时间组件,不使用插槽

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1. 图片预览 2.上代码 2.1html <el-button class"hide_input" size"small"><svg t"1711608996149" class"icon" viewBox"0 0 1024 1024" version"1.1"…

中国象棋AI在线对弈游戏源码

源码介绍 这是一款html5小游戏&#xff0c;主要功能在于js&#xff0c;带一套皮肤、内置ai算法&#xff0c;有能力的可以自行修改。 源码截图 下载地址 链接&#xff1a;https://pan.baidu.com/s/1fYp1HWsd91nJOdX1M8RFtQ?pwdh2iz 提取码&#xff1a;h2iz

最近Sentinel-2下载网站好像有点问题

最近Sentinel-2下载网站好像有点点问题&#xff0c;基本属于打不开的状态&#xff01; 这也难怪&#xff0c;Sentinel提供了全世界最好的免费遥感资源。其受欢迎程度可以想象的到&#xff01;这么多人访问网站&#xff0c;网站压力可以说是巨大的。这可是全世界的并发访问&…

快速上手Spring Cloud五:Spring Cloud与持续集成/持续部署(CI/CD)

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …