数据结构(C语言)代码实现(十一)——离散事件模拟

目录

参考资料

 代码实现

有序链表头文件LinkList.h

 链队列LinkQueue.h

银行业务模拟程序头文件 Bank_Simulation.h

具体函数实现以及主函数

实验中遇到的问题


参考资料

1、数据结构严蔚敏版

2、大佬已有的成套的作业。基本思路照搬大佬和课本,不过自己这些代码绝不是复制粘贴,是自己一个个敲下来,并经过测试的。Data-Structure/VisualC++/CourseBook/0309_BankQueuing/BankQueuing.c at master · Stronger-Git/Data-Structure · GitHub

 代码实现

有序链表头文件LinkList.h

有序链表,首次出现在一元多项式相加一节,是单链表的扩展,多了按顺序插入的函数。

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码//-----线性链表的存储结构---------
//-----实现单向非循环有序链表-----
//-----头结点与首元结点不一致-----
//-----从2.4节改编而来------------typedef struct {int OccurTime;//事件发生时刻int NType;    //事件类型,0表示到达事件,1至4表示4个窗口的离开事件
}Event,ElemType;//事件类型,有序链表LinkList的数据元素类型typedef struct LNode {//结点类型ElemType data;struct LNode* next;
}LNode, * Link, * Position;typedef struct LinkNode {      //链表类型Link head, tail;  //分别指向线性链表中的头结点和最后一个结点int len;          //指示线性链表中数据元素的个数
}LinkNode, * LinkList;typedef LinkList EvenList;//事件链表类型,定义为有序链表Status MakeNode(Link& p, ElemType e) {//分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERRORp = (Link)malloc(sizeof(LNode));if (!p)return ERROR;p->data = e;return OK;
}
void FreeNode(Link& p) {//相当于free函数重命名//释放p所指结点free(p);p = NULL;
}Status InitList(LinkList& L) {//构造一个空的线性链表LL = (LinkList)malloc(sizeof(LinkNode));if (!L)return ERROR;L->head = L->tail = (Link)malloc(sizeof(LNode));if (!L->head)return ERROR;L->head->next = NULL;L->len = 0;return OK;
}Status DestroyList(LinkList& L) {//销毁线性链表L,L不再存在Link p;while (L->head) {//删除所有结点p = L->head;L->head = L->head->next;free(p);}free(L);L = NULL;return OK;
}Status ClearList(LinkList& L) {//将线性链表L重置为空表,并释放原链表的结点空间Link p = L->head;while (L->head->next) {//保留一个结点,让其作为头结点p = L->head->next;L->head->next = p->next;free(p);}L->tail = L->head;L->len = 0;return OK;
}Status InsFirst(Link h, Link s) {//已知h指向线性链表的头结点,将s所指结点插入到首元结点之前s->next = h->next;h->next = s;//这个函数没修改L->len的值,课本算法2.20需要补充L->len++。return OK;
}Status DelFirst(Link h, Link& q) {//已知h指向线性链表的头结点,删除链表中的首元结点并以q返回q = h->next;if (q == NULL)return ERROR;h->next = q->next;q->next = NULL;return OK;
}Status Append_add(LinkList& L, Link s) {//将指针s所指(彼此以指针相链)的一串结点链接在线性链表L的最后一个结点(用L->tail寻找)//之后,并改变链表L的尾指针指向新的尾结点while (s) {L->tail->next = s;L->tail = s;L->len++;s = s->next;}return OK;
}Status Append_sub(LinkList& L, Link s) {//将指针s所指(彼此以指针相链)的一串结点链接在线性链表L的最后一个结点(用L->tail寻找)//之后,并改变链表L的尾指针指向新的尾结点while (s) {s->data = s->data;L->tail->next = s;L->tail = s;L->len++;s = s->next;}return OK;
}Status Remove(LinkList& L, Link& q) {//删除线性链表L中的尾节点并以q返回,改变链表L的尾指针指向新的尾结点if (!L->tail)return ERROR;Link p = L->head;while (p->next != L->tail)p = p->next;//寻找尾结点的上一个结点q = L->tail;L->tail = p;//改变尾结点L->tail->next = NULL;L->len--;return OK;
}Status InsBefore(LinkList& L, Link& p, Link s) {//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前//并修改指针p指向新插入的结点Link q = L->head;while (q->next != p)q = q->next;//寻找结点q的上一个结点q->next = s;s->next = p;//插入sp = s;//修改指针pL->len++;return OK;
}Status InsAfter(LinkList& L, Link& p, Link s) {//已知p指向线性链表L中的一个结点,将s所指的结点插入在p所指结点之后//并修改指针p指向新插入的结点s->next = p->next;p->next = s;p = s;L->len++;return OK;
}Status SetCurElem(Link& p, ElemType e) {//已知p指向线性链表L中的一个结点,用e更新p所指结点中数据元素的值p->data = e;return OK;
}ElemType GetCurElem(Link p) {//已知p指向线性链表L中的一个结点,返回p所指结点中数据元素的值return p->data;
}Status ListEmpty(LinkList L) {//若线性链表L为空表,则返回TRUE,否则返回FALSEif (!L->len)return TRUE;elsereturn FALSE;
}int ListLength(LinkList L) {//返回线性链表L中元素个数return L->len;
}Position GetHead(LinkList L) {//返回线性链表L中头结点的位置return L->head;
}Position GetLast(LinkList L) {//返回线性链表L中尾结点的位置return L->tail;
}Position PriorPos(LinkList L, Link p) {//已知p指向线性链表L中的一个结点,返回p所指结点中的直接前驱的位置//若无前驱,则返回NULLLink q = L->head;if (p == L->head)return NULL;while (q->next != p)q = q->next;return q;
}Position NextPos(LinkList L, Link p) {//已知p指向线性链表L中的一个结点,返回p所指结点中的直接后继的位置//若无后继,则返回NULLreturn p->next;
}Status LocatePos(LinkList L, int i, Link& p) {//返回p指示线性链表L中第i个结点的位置并返回OK,i值不合法时返回ERROR//头结点当作第0结点,首元结点第1个,尾结点第(L->len)个if (i<0 || i>L->len)return ERROR;int j = 0;Link q = L->head;while (j < i) {q = q->next;++j;//j++也一样}p = q;return OK;
}Status LocateElem(LinkList L, ElemType e, Position& q, int(*compare)(ElemType, ElemType))
{   // 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中// 第一个值为e的结点的位置,并返回TRUE;否则q指示第一个与e满足判定函数// compare()取值>0的元素的前驱的位置。并返回FALSEPosition p = L->head;Position pp = NULL;while (p != NULL && compare(p->data, e) < 0){//没到表尾且没有比当前指数大的指数pp = p;    //记录当前位置p = p->next;    //继续往后找}if (p == NULL || compare(p->data, e) > 0) // 到表尾或比当前指数大的指数{q = pp;return FALSE;}else // 找到{// 没到表尾且p->data.expn=e.expnq = p;return TRUE;}
}//有序插入
Status OrderInsert(LinkList& L, ElemType e, int(*compare)(ElemType, ElemType)) {//按有序判定函数compare()的约定,将值为e的结点插入到有序链表L的适当位置上Position s = L->head;Position p = L->head->next;while (p != NULL && compare(p->data, e) < 0) {p = p->next;s = s->next;}Link pp = (Link)malloc(sizeof(LNode));if (pp == NULL)return ERROR;//警告C6011pp->data = e;s->next = pp;pp->next = p;if (pp->next == NULL)//在3.5节发现该函数没有修改tail和len。L->tail = pp;L->len++;return OK;
}//遍历链表
Status ListTraverse(LinkList L, void (*visit)(Link)) {//依次对L的每个元素调用函数visit()。一旦visit()失败,则操作失败。Link p = L->head;for (int i = 1;i <= L->len;i++) {p = p->next;visit(p);}printf("\n");return OK;
}

 链队列LinkQueue.h

#pragma once
//改编自3.4队列
#include <cstdio>
#include <cstdlib>
#include <cstring>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef struct {int ArrivalTime;//到达时刻int Duration;   //办理事务所需时间int Count;      //客户编号
}QElemType;//队列的数据元素类型//-----ADT Queue的表示与实现-----
//-----单链队列——队列的链式存储结构-----
typedef struct QNode {QElemType data;struct QNode* next;
}QNode, * QueuePtr;
typedef struct {QueuePtr front;//队头指针QueuePtr rear;//队尾指针
}LinkQueue;//-----基本操作的算法描述-----
Status InitQueue(LinkQueue& Q) {//-----构造一个空队列QQ.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if (!Q.front)exit(OVERFLOW);//存储分配失败Q.front->next = NULL;return OK;
}Status DestroyQueue(LinkQueue& Q) {//销毁队列Qwhile (Q.front) {Q.rear = Q.front->next;free(Q.front);Q.front = Q.rear;}return OK;
}Status ClearQueue(LinkQueue& Q) {//将Q清为空队列QueuePtr p1 = Q.front->next,p2 = Q.front->next;while (p1) {p1 = p1->next;free(p2);p2 = p1;}Q.rear = Q.front;return OK;
}Status QueueEmpty(LinkQueue Q) {//若队列Q为空队列,则返回TRUE,否则返回FALSEif (Q.front == Q.rear)return TRUE;elsereturn FALSE;
}int QueueLength(LinkQueue Q) {//返回队列长度int n = 0;QueuePtr p = Q.front;while (p != Q.rear) {p = p->next;n++;}return n;
}Status GetHead(LinkQueue Q, QElemType& e) {if (Q.front == Q.rear)return ERROR;e = Q.front->next->data;return OK;
}Status EnQueue(LinkQueue& Q, QElemType e) {//插入元素e为Q的新的队尾元素QueuePtr p = (QueuePtr)malloc(sizeof(QNode));if (!p)exit(OVERFLOW);p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return OK;
}Status DeQueue(LinkQueue& Q, QElemType& e) {//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;//否则返回ERRORif (Q.front == Q.rear)return ERROR;//Q.front->next==NULL;也行QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front;//队列为空时将尾指针重置free(p);return OK;
}Status QueueTraverse(LinkQueue Q, Status visit(QElemType)) {if (Q.front == Q.rear) {printf("队列为空\n");return OK;}QueuePtr p = Q.front->next;while (p) {visit(p->data);p = p->next;}printf("\n");return OK;
}

银行业务模拟程序头文件 Bank_Simulation.h

#pragma once
#include <ctime>EvenList ev;   //事件表
Event    en;   //事件
LinkQueue q[5];//4个客户队列
QElemType customer;//客户记录
int TotalTime;//累计客户逗留时间
int CustomerNum;//客户数
int CloseTime;//银行开门时间//函数太多,开个头文件梳理一下
//算法3.6 银行业务模拟,统计一天内客户在银行逗留的平均时间
void Bank_Simulation_1();//算法3.7 同上
void Bank_Simulation_2();//初始化操作
void OpenForDay();//释放资源,打印统计信息
void CloseForDay();//判断事件表是否为空。
Status MoreEvent();//将待处理事件从事件表中移除,并将该事件存储到全局变量gEn中。
//event用来存储该事件的类型
Status EventDrived(char& event);//处理客户到达事件
void CustomerArrived();//处理客户离开事件
void CustomerDeparture();//代表遇到了无效的事件
void Invalid();//从这里往上是解决算法3.6的//比较两事件发生次序
int cmp(Event a, Event b);//生成随机数
//durtime: 当前客服办理业务所需时间
//intertime: 下一客户到达间隔的时间
void Random(int& durtime, int& intertime);//返回长度最短的队列的序号
int Minimum();//显示所有客户队列的排队情况
void Show();

具体函数实现以及主函数

#include "LinkList.h"
#include "LinkQueue.h"
#include "Bank_Simulation.h"int cmp(Event a, Event b) {//依事件a的发生时刻<或=或>事件b的发生时刻分别返回-1或0或1if (a.OccurTime < b.OccurTime)return -1;else if (a.OccurTime = b.OccurTime)return 0;elsereturn 1;
}void OpenForDay() {//初始化操作CloseTime = 480;                    //开门时间为480分钟TotalTime = 0;CustomerNum = 0;      //初始化累计时间和客户数为0InitList(ev);                       //初始化事件链表为空表en.OccurTime = 0;en.NType = 0;      //设定第一个客户到达事件OrderInsert(ev, en, cmp);           //插入事件表for (int i = 1;i <= 4;i++)InitQueue(q[i]);                //置空队列Show();
}void CustomerArrived() {//处理客户到达事件,en.NType=0。//QElemType customer;//客户记录//Event e;           //事件int durtime;  //当前客户办理业务需要的时间int intertime;//下一个客户达到时间间隔int t;        //下一个客户到达时间int i;        //队列编号++CustomerNum;Random(durtime, intertime);    //生成随机数t = en.OccurTime + intertime;    //下一客户到达时刻if (t < CloseTime) {           //银行尚未关门,插入事件表en.OccurTime = t;//下一客户的到达时间en.NType = 0;OrderInsert(ev, en, cmp);}i = Minimum();//课本中加了参数。这里可不加,因为已定义队列变量为全局变量//上面一行代码在求长度最短队列//记录当前客户信息customer.ArrivalTime = en.OccurTime;//到达时间customer.Duration = durtime;        //办理业务所需时间customer.Count = CustomerNum;       //客户编号//当前客户进入最短队列排队EnQueue(q[i], customer);printf("第 %3d 个客户到柜台 %d 中排队...\n", customer.Count, i);Show();//如果当前队列只有这一个客户排队,则需要计算其离开时间,//并构造一个“离开”事件插入事件表中if (QueueLength(q[i]) == 1) {en.OccurTime = en.OccurTime + durtime;//当前客户的离开时间en.NType = i;                         //“离开”事件类型,值为1-4,指示从第几个队列离开OrderInsert(ev, en, cmp);             //“离开”事件插入事件表}
}void CustomerDeparture() {ElemType e;int i = en.NType;DeQueue(q[i], customer);//删除第i队列的排头用户printf("第 %3d 个客户离开柜台 %d ...\n", customer.Count, i);Show();TotalTime += en.OccurTime - customer.ArrivalTime;//累计客户逗留时间if (!QueueEmpty(q[i])) {//设定第i队列的一个离开事件并插入事件表GetHead(q[i], customer);e.OccurTime = en.OccurTime + customer.Duration;e.NType = i;OrderInsert(ev, e, cmp);}
}void Bank_Simulation_2() {Link p;OpenForDay();        //初始化while (!ListEmpty(ev)) {DelFirst(GetHead(ev), p);if (p == NULL)break;//防止出现表内只有头结点无首元结点的局面en = GetCurElem(p);if (en.NType == 0)CustomerArrived();      //处理客户到达事件elseCustomerDeparture();    //处理客户离开事件}CloseForDay();
}void CloseForDay() {printf("当天共有%d个客户,平均逗留时间为%.2f分钟。\n",CustomerNum,(double)TotalTime/CustomerNum);
}void Random(int& durtime, int& intertime) {srand((unsigned)time(NULL));durtime = rand() % 20 + 1;intertime = rand() % 5 + 1;
}int Minimum() {int i1 = QueueLength(q[1]);int i2 = QueueLength(q[2]);int i3 = QueueLength(q[3]);int i4 = QueueLength(q[4]);if (i1 <= i2 && i1 <= i3 && i1 <= i4)return 1;if (i2 <= i1 && i2 <= i3 && i2 <= i4)return 2;if (i3 <= i1 && i3 <= i2 && i3 <= i4)return 3;if (i4 <= i1 && i4 <= i2 && i4 <= i3)return 4;return 0;
}void Show() {int i;QueuePtr p;//记录到来的客户是第几个//遍历所有客户队列for (i = 1;i <= 4;i++) {for (p = q[i].front;p;p = p->next) {if (p == q[i].front) {if (i == 1)printf("柜台(1)●");if (i == 2)printf("柜台(2)●");if (i == 3)printf("柜台(3)●");if (i == 4)printf("柜台(4)●");}elseprintf("(%03d)", p->data.Count);if (p == q[i].rear)printf("\n");}}printf("\n");
}//-----上面的是算法3.7所需要的函数-----
//-----下面的是算法3.6特有的部分-------
void Bank_Simulation_1() {char eventType;OpenForDay();               //初始化//如果事件表非空while (!MoreEvent()) {if (EventDrived(eventType) == ERROR)break;switch (eventType) {case 'A':CustomerArrived();//处理客户到达事件break;case 'D':CustomerDeparture();//处理客户离开事件break;default:Invalid();}}CloseForDay();
}Status MoreEvent() {return ListEmpty(ev);
}Status EventDrived(char& eventType) {Link p;DelFirst(GetHead(ev), p);if (p == NULL)return ERROR;//防止出现表内只有头结点无首元结点的局面en = GetCurElem(p);if (en.NType == 0)eventType = 'A';elseeventType = 'D';return OK;
}void Invalid() {printf("运行错误!");exit(OVERFLOW);
}int main()
{Bank_Simulation_1();//Bank_Simulation_2();return 0;
}

实验中遇到的问题

1、初始化操作未达到预期标准,经检查是OrderInsert函数插入最后的位置未修改对应链表的长度和尾指针所致。

若不修改L->len,在Bank_simulation_2函数中将跳出while循环;若不修改L->tail,呃,似乎没有影响。

2、当事件全部结束时,事件表内依然有一个结点,就是头结点,此时虽然表内元素全空,但表没空。在Bank_simulation_2函数中p结点为头结点的下一个结点,此时p==NULL,p->data无意义,所以在GetCurElem函数上会报错。

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

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

相关文章

Spring MVC面试简答题

简答题 简述Spring MVC的设计原理和主要组成部分。解答: Spring MVC的设计原理基于MVC(Model-View-Controller)设计模式,它将应用程序划分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。 Model:代表应用程序的数据和业务逻辑。View:负责渲染用户界…

批量高效剪辑视频,轻松调整视频时长,轻松打造完美节奏

在数字化时代&#xff0c;视频内容已成为我们生活中不可或缺的一部分。无论是社交媒体上的短视频&#xff0c;还是专业影视制作中的长片&#xff0c;视频剪辑都扮演着至关重要的角色。然而&#xff0c;面对大量视频素材&#xff0c;如何高效地进行剪辑调整&#xff0c;让每一帧…

Express:快速搭建Node.js应用的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

华为OD机试 - 打印任务排序 - 队列(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

Rust 的 Vec 排序方法汇总

在 Rust 中&#xff0c;Vec 类型的排序可以通过使用 sort 方法来实现。sort 方法是 Vec 的一个成员方法&#xff0c;它会对向量中的元素进行就地排序&#xff08;即不返回新的排序后的向量&#xff0c;而是直接修改原始向量&#xff09;。此外&#xff0c;sort_by 和 sort_by_k…

机器人|逆运动学问题解决方法总结

如是我闻&#xff1a; 解决逆运动学&#xff08;Inverse Kinematics, IK&#xff09;问题的方法多样&#xff0c;各有特点。以下是一个综合概述&#xff1a; 1. 解析法&#xff08;Analytical Solutions&#xff09; 特点&#xff1a;直接使用数学公式计算关节角度&#xff0…

0基础 三个月掌握C语言(14)-上

自定义类型 其实C语言有内置类型 也有自定义的类型 内置类型&#xff08;C语言本身支持的现成的类型&#xff09; 如&#xff1a;char short int long float double.... 但仅仅有这些类型是不够的 比如说 我们想表示一个人&#xff08;复杂对象&#xff09; 对于人的描述那…

我们是如何测试人工智能的(八)包含大模型的企业级智能客服系统拆解与测试方法 -- 大模型 RAG

大模型的缺陷 -- 幻觉 接触过 GPT 这样的大模型产品的同学应该都知道大模型的强大之处&#xff0c; 很多人都应该调戏过 GPT&#xff0c;跟 GPT 聊很多的天。 作为一个面向大众的对话机器人&#xff0c;GPT 明显是鹤立鸡群&#xff0c;在世界范围内还没有看到有能跟 GPT 扳手腕…

探索AI大模型学习:理论基础、技术突破与未来挑战

在当今技术飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型学习无疑是推动科技进步和创新的关键力量。AI大模型学习的核心在于通过训练大规模的数据集来提升模型的性能&#xff0c;使之能够更准确、更高效地完成各种任务&#xff0c;从而在多个领域中实现…

开启Safari手势支持

在使用Safari 的时候&#xff0c;大家有没有觉得不支持手势使用起来不是很方便&#xff0c; 触摸板只支持少量简单的手势&#xff0c;如缩放&#xff0c;滚动等。如果使用鼠标的用户&#xff0c;则完全无法使用手势。经过折腾研究&#xff0c;使用CirMenu应用可以完美解决这个要…

C++第十一弹---类与对象(八)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、友元 1.1、友元函数 1.2、友元类 2、内部类 3、匿名对象 4、拷贝对象时的一些编译器优化 总结 1、友元 友元提供了一种突破封装的方式&a…

深度解析:Elasticsearch写入请求处理流程

版本 Elasticsearch 8.x 原文链接&#xff1a;https://mp.weixin.qq.com/s/hZ_ZOLFUoRuWyqp47hqCgQ 今天来看下 Elasticsearch 中的写入流程。 不想看过程可以直接跳转文章末尾查看总结部分。最后附上个人理解的一个图。 从我们发出写入请求&#xff0c;到 Elasticsearch 接收请…

QT 常用模块介绍以及使用说明

当学习 QT 编程时&#xff0c;掌握以下几个关键模块是非常重要的。下面是每个模块的简要说明及示例程序&#xff1a; Qt Widgets 模块&#xff1a; 说明&#xff1a;Qt Widgets 模块包含用于创建传统桌面应用程序的 UI 控件。示例程序&#xff1a;#include <QApplication>…

单目深度估计基础理论和论文学习总结

单目深度估计基础理论和论文学习总结 一、背景知识&#xff1a; 三维刚体运动的数学表示&#xff1a;旋转平移矩阵、旋转向量、欧拉角、四元数、轴角模型、齐次坐标、各种变换等 照相机模型&#xff1a;单目/双目模型&#xff0c;单目中的世界坐标系/相机坐标系/图像坐标系的…

从零开始的 dbt 入门教程 (dbt cloud 自动化篇)

一、引 在前面的几篇文章中&#xff0c;我们从 dbt core 聊到了 dbt 项目工程化&#xff0c;我相信前几篇文章足够各位数据开发师从零快速入门 dbt 开发&#xff0c;那么到现在我们更迫切需要解决的是如何让数据更新做到定时化&#xff0c;毕竟作为开发我们肯定没有经历每天定…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题&#xff0c;ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

GA遗传算法和ALNS算法的区别(我的APS项目七)

博主用最简单的方式告诉你遗传算法是什么&#xff0c;估计这是网上最简单的遗传算法入门教程了。首先我们先带入一个问题&#xff0c;我们要去9大城市旅游&#xff0c;想知道每个城市走一遍&#xff0c;总路程最短的出行顺序是什么&#xff1f; OK&#xff0c;题目我们已经明确…

Chrome 插件打包发布

插件打包发布 一、打包成 zip 包 最简单方便的一种其实就是打包成 zip 包&#xff0c;通过下载链接进行下载&#xff0c;在包里面通过设置版本号和数据库的版本号对比来提醒用户进行新包的下载。 二、发布到 Chrome 应用商店 1. 注册成为开发者 在发布到 chrome 应用商店之…

git 提交空目录

git 提交空目录 1. git 无法感应空目录2. git 提交空目录References 1. git 无法感应空目录 Git FAQ https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html Currently the design of the Git index (staging area) only permits files to be liste…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一&#xff0c;在第七节中讲解了如何简洁的进行web程序部署和运行&#xff0c;这只是它的功能之一。在本节中&#xff0c;我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…