当前位置: 首页 > news >正文

数据结构——实验一·线性表

海~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种变成资源,那么你就来对地方啦🌟
Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐🔥
当然,如果你也好的资源推荐,欢迎在评论区分享,让我们共同打造一个丰富的编程资源库!🔥
本文专栏 ➡️ 数据结构

实验目的:

  • 掌握线性表的顺序/链接存储结构
  • 验证顺序表/链表及其基本操作的实现
  • 掌握数据结构及算法的程序实现的基本方法

实验内容:

请选择使用顺序表或链表(单链表或双链表)实现以下操作,要求设计菜单,并根据菜单提示进行操作:

  1. 插入一个新元素到第i个位置
  2. 删除第i个位置的元素
  3. 显示线性表中所有元素的值
  4. 检索表中第i个元素
  5. 求表的长度

顺序表操作

实验产出:

1.核心代码:

#include <bits/stdc++.h>
using namespace std;#define ERROR 	0
#define OK		1
#define ListSize 100typedef char ElemType; 
typedef struct 
{	ElemType data[ListSize];		// 存放顺序表元素int length;						// 存放顺序表的长度
} SeqList;							// 顺序表的类型定义// 构造一个空的顺序表L//顺序表的初始化 
int InitList_Sq (SeqList *&L)		 
{ L = new SeqList;			// 为顺序表分配空间if(!L)						// 存储分配失败return ERROR;			// 初始化失败L->length=0;					// 空表长度为0return OK;					// 初始化成功
}// 销毁顺序表
void DestroyList_Sq(SeqList *&L)
{delete L;L = NULL;
}// 清空顺序表L
void ClearList_Sq (SeqList *L)
{L->length=0; 	//将线性表的长度置为0
}// 求顺序表L的长度
int ListLength_Sq (SeqList *L)
{return (L->length);
}// 判断顺序表L是否为空
int ListEmpty_Sq (SeqList *L)
{return L->length == 0;
}// 根据给定元素的序号查找。
int GetElem_Sq (SeqList *L, int i, ElemType &e)
{if ( i<1 || i>L->length) return ERROR;	// 判断i值是否合理,若不合理,返回ERRRORe = L->data[i-1];   // 数组中第i-1的单元存储着线性表中第i个数据元素的内容return OK;
}// 根据给定的数据元素的值查找
int LocateElem_Sq (SeqList *L, ElemType e)
{for (int i=0; i< L->length; i++)if (L->data[i]==e) return i+1;return 0;
}// 插入数据元素
int ListInsert_Sq (SeqList *L,int i,ElemType e)
{if (L->length == ListSize)return ERROR;  // 检查是否有剩余空间if ( i<1|| i>L->length+1)return ERROR; 	// 检查i值是否合理for (int j=L->length-1; j>=i-1; j--)	// 将顺序表第i个元素之后的所有元素向后移动L->data[j+1]=L->data[j];L->data[i-1]=e; 	// 将新元素的内容放入顺序表的第i个位置,L->length++;		// 表长增1return OK;
}// 删除顺序表中的元素
int ListDelete_Sq (SeqList *L, int i, ElemType &e)
{if (ListEmpty_Sq(L))	// 检测顺序表是否为空return ERROR; if (i<1||i>L->length) 	// 检查i值是否合理return ERROR; e = L->data[i-1]; 	// 将欲删除的数据元素内容保留在变量e中for (int j=i;j<=L->length-1;j++) 	// 将线性表第i+1个元素之后的所有元素向前移动L->data[j-1]=L->data[j];L->length--;return OK;
}void DispList_Sq(SeqList *L)	//输出线性表
{int i;printf("顺序表:");if (ListEmpty_Sq(L)) {printf("表空!\n");return;     }for (i=0;i<L->length;i++)printf("%c ",L->data[i]);printf("\n");
}// 显示菜单
void showmenu()
{printf("\n\n\n");printf("       --线性表顺序存储基本运算演示--       \n");printf("********************************************\n");printf("*       1-------顺序表的初始化             *\n");printf("*       2-------销毁顺序表                 *\n");printf("*       3-------清空顺序表                 *\n");printf("*       4-------求顺序表的长度             *\n");printf("*       5-------判断顺序表是否为空         *\n");printf("*       6-------检索表中第i个元素的值      *\n");printf("*       7-------检索元素值为e的位序        *\n");printf("*       8-------插入数据元素               *\n");printf("*       9-------删除数据元素               *\n");printf("*                                          *\n");printf("*       0-------退出                       *\n");printf("********************************************\n");
}void List_Sq()
{int choice;ElemType item;		int Position;SeqList *L = NULL;int flag =0;   // 是否创建好了顺序表while (choice!=0){//flushall();printf("\n请选择菜单号(0--9): ");scanf("%d",&choice);switch(choice){case 1:printf("初始化顺序表操作\n");if (InitList_Sq(L)) {printf("初始化成功!\n");			flag = 1;		// 标志顺序表的存在}elseprintf("初始化失败!\n");			break;case 2:if (flag)  // 顺序表存在{DestroyList_Sq(L);flag = 0; // 顺序表已删除printf("顺序表删除成功!\n");}else {printf("顺序表不存在,操作失败!\n");}break;case 3:if (flag)  // 顺序表存在{ClearList_Sq (L);				printf("顺序表清空成功!\n");DispList_Sq(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 4:if (flag)  // 顺序表存在{								printf("顺序表元素个数为 %d \n",ListLength_Sq(L));DispList_Sq(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 5:if (flag)  // 顺序表存在{								printf("顺序表%s。\n",ListEmpty_Sq(L)?"空":"不空");DispList_Sq(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 6:if (flag)  // 顺序表存在{								printf("请输入元素的位序号:");scanf("%d",&Position);if (GetElem_Sq(L,Position,item)){printf("第%d个元素为:%c\n",Position,item);}else {printf("输入的位序号错误!\n");}							DispList_Sq(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 7:if (flag)  // 顺序表存在{								printf("请输入元素的值:");//flushall();scanf(" %c", &item);Position=LocateElem_Sq(L,item);if (Position){printf("该元素找到,位序是%d。\n",Position);}else {printf("该元素没找到!\n");}							DispList_Sq(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 8:if (flag)  // 顺序表存在{							printf("请输入元素的值:");scanf(" %c", &item);printf("请输入要插入数据元素的位置序号:");scanf("%d",&Position);if (ListInsert_Sq (L, Position, item))		printf("该元素插入成功。\n");else printf("输入的位序号错误!\n");DispList_Sq(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 9:if (flag)  // 顺序表存在{printf("请输入要删除元素的位置序号:");scanf("%d",&Position);if (ListDelete_Sq (L, Position, item)) {printf("删除的元素为 %c \n",item);} else {printf("输入的位序号错误!\n");}DispList_Sq(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 0:printf("\t 程序结束!\n");DestroyList_Sq(L);break;default:printf("\t 选择错误,请重新输入!\n");break;}		}}int main()
{showmenu();List_Sq();return 0;
}

2.运行结果:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
3.性能分析:
时间复杂度:
插入操作:由于需要从插入点开始向后移动所有后续元素,时间复杂度为O(n)。当插入位置接近表尾时效率较高,但插入到表头的效率较低。
删除操作:与插入类似,需要移动所有后续元素,时间复杂度也是O(n)。
检索操作:顺序表通过数组下标直接访问目标元素,时间复杂度为O(1)。
空间复杂度:
顺序表使用连续的数组存储元素,其空间复杂度为O(n),但需事先预留空间。如果表的最大容量(MaxSize)设置过大,可能导致空间浪费;若容量不足,则无法继续插入新元素。

实验总结与体会

(1) 掌握了线性表的顺序结构;
(2) 熟悉了顺序表及其基本操作的实现;
(3) 掌握了相关数据结构及算法的程序实现的基本方法。


单链表操作

实验产出:

1.核心代码:

#include <stdio.h>#define ERROR	0
#define OK		1
#define ListSize 100typedef char ElemType; 
typedef struct Node{ElemType data;		// 存放单链表元素值struct Node *next;
} LNode, *LinkList;// 构造一个空的单链表L
int InitList_L (LinkList &L)
{ 	L = new LNode; 	// 为头结点分配存储单元if  (!L) return ERROR;	// 无足够的内存空间,初始化失败L->next = NULL;return OK;
}// 销毁链表
int DestroyList_L (LinkList &L)
{LinkList p;while(L) {p=L;L=L->next;delete p;  }return OK;
}// 将L重置为空表 
void ClearList_L (LinkList & L)
{LinkList p,q;p=L->next;  		// p指向第一个结点while(p)    {  		// 没到表尾 q=p->next; delete p;p=q;}L->next=NULL;		// 头结点指针域为空 
}// 返回L中数据元素个数 
int  ListLength_L(LinkList L) 
{LinkList p=L->next;		// p指向第一个结点int  i=0;             while(p) {				// 遍历单链表,统计结点数i++;p=p->next;} return i;                             
}int ListEmpty_L (LinkList L)
{ 	// 若L为空表,则返回true,否则返回falsereturn  (L->next==NULL); 
}int LocateELem_L(LinkList L, ElemType e) 
{ LinkList p;int i=1;p=L->next; while(p && p->data!=e){p=p->next;i++;}                		return i;	// 返回L中值为e的数据元素的位置,查找失败返回NULL 
}int GetElem_L (LinkList L, int i, ElemType &e) 
{	// 在带头结点的单链表L中查找第i个元素LinkList p=L->next;int  j=1;while (p != NULL && j<i ) {p=p->next;j++;}if (!p || i<1 ) return ERROR;e = p->data;return OK;
}int ListInsert_L (LinkList &L, int i, ElemType e)
{	// 将值为e的新结点插入到表的第i个结点的位置上LinkList  p=L, q;int j=0; while (p&&j<i-1) { 	// 寻找第i-1个结点 p=p->next;++j;}	 if( !p || i<1) return ERROR;	// i大于表长+1或者小于1q=new LNode;			// 生成新结点q q->data=e;         		// 将结点q的数据域置为e q->next=p->next;		// 将结点q插入L中 p->next=q; return OK; 
}// 按序号删除结点
int ListDelete_L( LinkList &L, int i,ElemType &e)
{LinkList p=L, q;int j=0; while (p->next && j<i-1){	// 寻找第i个结点,并令p指向其前驱 p=p->next; ++j; } if( !(p->next) || i<1)return ERROR; 		// 删除位置不合理 q=p->next; 				// 临时保存被删结点的地址以备释放 p->next=q->next;		// 改变被删除结点前驱结点的指针域 e = q->data; 			// 保存被删除结点的数据域 delete q;				// 释放被删除结点的空间 return OK; 
} // 按值删除结点
int ListDeleteValue_L( LinkList &L, ElemType e)
{LinkList p=L, q=L->next;while (q && q->data != e){	// 寻找元素值等于e的结点,并令p指向其前驱 p = q;q=q->next; } if( !q)  return ERROR; 	// 没找到值为e的结点 p->next=q->next;		// 改变被删除结点前驱结点的指针域 delete q;				// 释放被删除结点的空间 return OK; 
} // 在单链表的头部插入结点建立单链表
void CreateList_F_L ( LinkList &L, int n)
{	// 逆位序输入n个元素的值,建立单链表L// 要求,在用前插法创建单链表之前,需要执行InitList_L()初始化单链表,// 即先建立一个带表头结点的空表LinkList p;printf("请按逆序依次输入元素的值: ");for (int i=n; i>0; --i ) { p= new LNode;			// 生成新结点scanf(" %c", &p->data); 	// 输入元素值 p->next = L->next; L->next=p; 				// 插入到表头 } 
} // 在单链表的尾部插入结点建立单链表
void CreateList_L_L ( LinkList &L, int n)
{	// 正位序输入n个元素的值,建立带头结点的单链表L// 要求,在用尾插法创建单链表之前,需要执行InitList_L()初始化单链表,// 即先建立一个带表头结点的空表LinkList p, r = L;printf("请按正序依次输入元素的值: ");for (int i=0; i<n; i++ ) { p= new LNode;	// 生成新结点scanf(" %c", &p->data); 	// 输入元素值 p->next = NULL;r->next = p; 			// 插入到表尾r = p; 				// r指向新的尾结点 } 
}void DispList_L(LinkList L)	//输出线性表
{printf("单链表:");if (ListEmpty_L(L)) {printf("表空!\n");return;     }LinkList p=L->next;while (p) {printf("%c ",p->data);p=p->next;}printf("\n");
}// 显示菜单
void showmenu()
{printf("\n\n\n");printf("       --线性表链式存储基本运算演示--       \n");printf("********************************************\n");printf("*       1-------单链表的初始化             *\n");printf("*       2-------销毁单链表                 *\n");printf("*       3-------清空单链表                 *\n");printf("*       4-------求单链表的长度             *\n");printf("*       5-------判断单链表是否为空         *\n");printf("*       6-------检索表中第i个元素的值      *\n");printf("*       7-------检索元素值为e的元素        *\n");printf("*       8-------插入数据元素               *\n");printf("*       9-------按序号删除数据元素         *\n");printf("*       a-------按值删除数据元素           *\n");printf("*       b-------按头插法创建单链表         *\n");printf("*       c-------按尾插法创建单链表         *\n");printf("*                                          *\n");printf("*       0-------退出                       *\n");printf("********************************************\n");}void List_L()
{char choice='N';ElemType	item;		int Position;int number;LinkList L;int flag =0;   // 是否创建好了单链表while (choice!='0'){//flushall();printf("\n请选择菜单号(0--c): ");scanf(" %c",&choice);switch(choice){case '1':printf("初始化单链表操作\n");if (InitList_L(L)) {printf("初始化成功!\n");			flag = 1;		// 标志顺序表的存在}elseprintf("初始化失败!\n");			break;case '2':if (flag) { // 单链表存在DestroyList_L(L);flag = 0; // 单链表已删除printf("单链表删除成功!\n");}else {printf("单链表不存在,操作失败!\n");}break;case '3':if (flag) { // 单链表存在ClearList_L(L);				printf("单链表清空成功!\n");DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '4':if (flag) { // 单链表存在printf("单链表元素个数为 %d \n",ListLength_L(L));DispList_L(L);			//输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case '5':if (flag) { // 单链表存在printf("单链表%s。\n",ListEmpty_L(L)?"空":"不空");DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '6':if (flag) { // 单链表存在printf("请输入元素的位序号:");scanf("%d",&Position);if (GetElem_L(L,Position,item)){printf("第%d个元素为:%c\n",Position,item);}else {printf("输入的位序号错误!\n");}							DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '7':if (flag) { // 单链表存在printf("请输入元素的值:");//flushall();scanf(" %c",&item);//LinkList P = LocateELem_L(L,item);int P = LocateELem_L(L,item);if (P){//printf("该元素找到,地址为%x!\n",P);printf("该元素找到,地址为%d\n",P);}else {printf("该元素没找到!\n");}							DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '8':if (flag)  { // 单链表存在printf("请输入元素的值:");//flushall();scanf(" %c",&item);printf("请输入要插入数据元素的位置序号:");scanf("%d",&Position);if (ListInsert_L(L, Position, item))		printf("该元素插入成功。\n");else printf("输入的位序号错误!\n");DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '9':if (flag)  { // 单链表存在printf("请输入要删除元素的位置序号:");scanf("%d",&Position);if (ListDelete_L(L, Position, item)) {printf("删除的元素为 %c \n",item);} else {printf("输入的位序号错误!\n");}DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case 'a':case 'A':if (flag)  { // 单链表存在printf("请输入要删除元素的值:");//flushall();scanf(" %c",&item);if (ListDeleteValue_L(L, item)) {printf("删除的元素为 %c \n",item);} else {printf("改元素不存在,删除失败!\n");}DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case 'b':case 'B':if (flag)  { // 单链表存在ClearList_L(L);	 // 清空单链表printf("按头插法创建单链表\n");printf("请输入要插入数据元素的个数:");				scanf("%d",&number);//flushall();CreateList_F_L(L, number);				DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case 'c':case 'C':if (flag)  { // 单链表存在ClearList_L(L);	 // 清空单链表printf("按尾插法创建单链表\n");printf("请输入要插入数据元素的个数:");				scanf("%d",&number);//flushall();CreateList_L_L(L, number);				DispList_L(L);			//输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '0':printf("\t 程序结束!\n");DestroyList_L(L);break;default:printf("\t 选择错误,请重新输入!\n");break;}		}
}int main()
{showmenu();List_L();return 0;
}

2.运行结果:
在这里插入图片描述在这里插入图片描述
3.性能分析:
时间复杂度:
插入操作:链表的插入只需找到第i-1个节点并修改指针,时间复杂度为O(n)(查找节点耗时),但不涉及元素移动操作。因此链表的插入效率比顺序表高,尤其在插入到表头或表尾时表现更为突出。
删除操作:链表删除同样需要找到目标节点及其前驱节点,时间复杂度为O(n)。与插入类似,删除操作无需移动后续节点,因此效率高于顺序表。
检索操作:由于链表需逐节点遍历才能找到目标元素,时间复杂度为O(n),随机访问效率较低。
空间复杂度:
链表的空间复杂度也是O(n),但因其动态分配存储空间,节省了顺序表中预留的多余空间。然而,链表每个节点需要额外存储一个指针,因此比顺序表更占用内存。


总结

在C语言中,scanf()函数用于从标准输入(通常是键盘)读取格式化输入。然而,scanf()函数在读取输入时会留下换行符(‘\n’)在输入缓冲区中,如果后面紧接着有需要读取字符的函数,比如getchar(),那么这个换行符就会被getchar()读取,导致程序的行为可能不是预期的。
使用getchar()来清除缓冲区中的换行符是一种常见的做法,这样可以确保下一次读取字符时,不会立即读取到这个残留的换行符。这样做可以避免程序逻辑中的错误,特别是在需要精确控制输入和输出时。
在scanf()函数中,在格式字符串的‘%’符号前加一个空格同样可以解决这个问题,这是用来告诉scanf()忽略任何空白字符,包括空格、制表符和换行符。这意味着,当在‘%’前面加一个空格时,scanf()会跳过这些空白字符,直到遇到非空白字符才开始匹配格式字符串。
这个空格告诉scanf()忽略前面的所有空白字符,所以即使用户在输入数字之前按下了空格键或者输入数字后按下了回车键,scanf()也会忽略这些空白字符,直接读取数字。
这样做的好处是,它不仅会忽略用户输入的换行符,还会忽略其他任何形式的空白字符,使得输入更加灵活。用户可以在数字之间插入任意数量的空格,而scanf()仍然能够正确地读取数字。

相关文章:

数据结构——实验一·线性表

海~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种变成资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…...

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)

本文基于服务器端环境展开&#xff0c;使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版&#xff0c;仅包含Conda和Python&#xff0c;如果只做深度学习&#xff0c;可使用miniconda。 [注]&#xff1a;Anaconda、Conda与Miniconda Conda&#xff1a;创建和管…...

OpenCV相机标定与3D重建(66)对立体匹配生成的视差图(disparity map)进行验证的函数validateDisparity()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用左右检查来验证视差。矩阵 “cost” 应该由立体对应算法计算。 cv::validateDisparity 函数是 OpenCV 库中用于对立体匹配生成的视差图&…...

2025年新开局!谁在引领汽车AI风潮?

汽车AI革命已来。 在2025年伊始开幕的CES展上&#xff0c;AI汽车、AI座舱无疑成为了今年汽车行业的最大热点。其中不少车企在2025年CES上展示了其新一代AI座舱&#xff0c;为下一代智能汽车的人机交互、场景创新率先打样。 其中&#xff0c;东软集团也携带AI驱动、大数据支撑…...

Spring自定义BeanPostProcessor实现bean的代理Java动态代理知识

上文&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145241149 中大致了解了spring aop的代理的实现&#xff0c;其实就是有个BeanPostProcessor代理了bean对象。顺便复习下java代理相关知识 目录 自定义BeanPostProcessor实现aopJava动态代理知识动态代理的几…...

三篇物联网漏洞挖掘综述

由于物联网设备存在硬件资源受限、硬件复杂异构&#xff0c; 代码、文档未公开的问题&#xff0c; 物联网设备的漏洞挖掘存在较大的挑战&#xff1a; 硬件资源受限性: 通用动态二进分析技术需要在运行程序外围实施监控分析。由于物联网设备存储资源(存储)的受限性&#xff0c;…...

Pytorch深度学习指南 卷I --编程基础(A Beginner‘s Guide) 第1章 一个简单的回归

本章正式开始使用pytorch的接口来实现对应的numpy的学习的过程&#xff0c;来学习模型的实现&#xff0c;我们会介绍numpy是如何学习的&#xff0c;以及我们如何一步步的通过torch的接口来实现简单化的过程&#xff0c;优雅的展示我们的代码&#xff0c;已经我们的代码完成的事…...

【EXCEL_VBA_实战】多工作薄合并深入理解

工作背景&#xff1a;多个工作薄存在冲突的名称&#xff0c;需快速合并 困难点&#xff1a;工作表移动复制时&#xff0c;若有冲突的名称&#xff0c;会不断弹出对话框待人工确认 思路&#xff1a;利用代码确认弹出的对话框 关键代码&#xff1a;Application.DisplayAlerts …...

mysql之表的外键约束

MySQL表的外键约束详细介绍及代码示例 外键约束是数据库中用于维护数据完整性和一致性的重要机制。它确保一个表中的数据与另一个表中的数据相关联&#xff0c;防止无效的数据引用。本文将详细介绍了外键约束的各个方面&#xff0c;并通过具体的代码示例进行演示。 1. 外键约束…...

Tuning the Go HTTP Client Settings

记录一次Go HTTP Client TIME_WAIT的优化 业务流程 分析 通过容器监控发现服务到事件总线的负载均衡之间有大量的短链接&#xff0c;回看一下代码 发送请求的代码 func SendToKEvent(ev *KEvent) error {data, err : json.Marshal(ev.Data)if err ! nil {return err}log.Pri…...

第二十四课 Vue中子组件调用父组件数据

Vue中子组件调用父组件数据 Vue是不建议在不同的组件直接传递值的&#xff0c;我们需要使用props方法来进行组件间的值传递 子组件调用父组件数据 父模板的数据&#xff0c;子组件是无法直接调用的 无法直接调用 1&#xff09;组件调用顶级对象中的data <div class&quo…...

Jenkins-pipeline语法说明

一. 简述&#xff1a; Jenkins Pipeline 是一种持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;它允许用户通过代码定义构建、测试和部署流程。 二. 关于jenkinsfile&#xff1a; 1. Sections部分&#xff1a; Pipeline里的Sections通常包含一个或多个Direc…...

小米Vela操作系统开源:AIoT时代的全新引擎

小米近日正式开源了其物联网嵌入式软件平台——Vela操作系统&#xff0c;并将其命名为OpenVela。这一举动在AIoT&#xff08;人工智能物联网&#xff09;领域掀起了不小的波澜&#xff0c;也为开发者们提供了一个强大的AI代码生成器和开发平台。OpenVela项目源代码已托管至GitH…...

NodeJs如何做API接口单元测试? --【elpis全栈项目】

NodeJs API接口单元测试 api单元测试需要用到的 assert&#xff1a;断言库 (还要一些断言库比如:Chai)supertest&#xff1a; 模拟http请求 简单的例子&#xff1a; const express require(express); const supertest require(supertest); const assert require(assert);…...

bundletool来特定设备规范的json安装aab包

1、获取自己设备的设备规范json java -jar ./bundletool.jar get-device-spec --outputj:/device-spec.json 2、根据设备规范生成apks包 java -jar ./bundletool.jar build-apks --device-specj:/device-spec.json --bundleapp-dev-release.aab --output随便的文件名.apks -…...

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往&#xff1a; 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找&#xff0c;题…...

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…...

chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确

问题描述 chrome游览器又一款JSON插件叫JSON Formatter&#xff0c;游览器GET请求调用接口时&#xff0c;如果返回的数据是json格式&#xff0c;则会自动格式化展示&#xff0c;类似这样&#xff1a; 但是今天突然发现怎么也格式化不了&#xff0c;打开一个json文件倒是可以格…...

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议

目录 前言 一、UDP网络编程 1.Qt项目文件 2.UDP类 QUdpSocket QNetworkDatagram 3.UDP回显服务器案例 细节 服务器设计 客户端设计 二、TCP网络编程 1.TCP类 QTcpServer QTcpSocket 2.TCP回显服务器案例 细节 服务器设计 客户端设计 三、HTTP客户端 1.HTTP…...

docker 安装 nginx 详解

在平常的开发工作中&#xff0c;我们经常会用到 nginx&#xff0c;那么在 docker 中 如何安装 nginx呢&#xff1f;又有哪些需要注意的事项呢&#xff1f;简单来说&#xff0c;第一步&#xff1a;拉取 nginx 镜像&#xff1b;第二步&#xff1a;创建 挂载目录并设置 nginx.conf…...

2025年大模型气象预测架构与商业化影响

随着人工智能技术,尤其是大模型(如深度学习、大规模神经网络)的飞速发展,气象预测的传统方法正在经历深刻变革。2025年,气象预测将借助大模型技术进入一个新的阶段。本文将从架构角度详细探讨2025年大模型在气象预测中的应用,并分析其对商业化的潜在影响。 一、2025年大模…...

基于51单片机和ESP8266(01S)、八位数码管、独立按键的WiFi定时器时钟

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、延时函数2、定时器03、串口4、数码管扫描5、独立按键扫描 四、主函数总结 系列文章目录 前言 有三个版本&#xff1a; ①普中开发板版本1&#xff1a;28800bps11.0592MHz&#xff0c;12T ②普中开发板版本2&am…...

Androidstudio 中,project下的.gitignore和module下的.gitignore有什么区别,生效优先级是什么

在 Android Studio 项目中&#xff0c;project 根目录下的 .gitignore 文件和 module 目录下的 .gitignore 文件作用和生效优先级是不同的&#xff0c;理解它们之间的区别非常重要&#xff0c;可以避免不必要的提交和冲突。 1. project 根目录下的 .gitignore&#xff1a; 作…...

python学习笔记3-字符串常用的方法

一、判断&#xff08;9个&#xff09;&#xff1a; 二、查找和替换&#xff08;8个&#xff09; 三、⼤⼩写转换&#xff08;5个&#xff09; 四、⽂本对⻬&#xff08;3个&#xff09; 五、去除空⽩字符&#xff08;3个&#xff09; 六、拆分和连接 &#xff08;6个&#xff0…...

提示词工程(Prompt Engineering)

1. Prompt 是什么&#xff1f; Prompt&#xff1a;提示词&#xff0c;是描述 AI 需要执行的任务的自然语言文本。 如上图所示&#xff0c;Prompt就是用户的提问。其实我们大家都用过Prompt&#xff0c;比如我们使用的ChatGPT、文心一言、豆包等AI产品时的提问就是Prompt&…...

后端开发Web

Maven Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具 Maven的作用 依赖管理 方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09;&#xff0c;避免版本冲突问题 统一项目结构 提供标准、统一的项目结构 项目构建 标准跨平台(…...

set和map(二)详解

文章目录 mapoperator[ ]的底层operator[ ]使用的实例 multimapequal_range 两道题目题目解析算法原理代码题目解析算法原理代码 map map和set大部分都相似&#xff0c;只有insert插入键值对不同&#xff0c;insert要插入pair,pair中有key和value。erase和find只与key有关&…...

第4章:Python TDD消除重复与降低依赖实践

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…...

vue3+uniapp开发鸿蒙初体验

去年7月20号&#xff0c;uniapp官网就已经开始支持鸿蒙应用开发了&#xff0c;话不多说&#xff0c;按照现有规则进行配置实现一下鸿蒙开发效果&#xff1b; 本文基于macOS Monterey 版本 12.6.5实现 开发鸿蒙的前置准备 这里就直接说我的版本&#xff1a; DevEco Studio 5.…...