数据结构与算法lab1-哈工大

news2024/12/23 1:15:53

title: 数据结构lab1-一元多项式的代数运算
date: 2023-05-16 11:42:26
tags: 数据结构与算法


git地址:https://github.com/944613709/HIT-Data-Structures-and-Algorithms

哈尔滨工业大学计算机科学与技术学院

实验报告

课程名称:数据结构与算法

课程类型:必修

实验项目:线性表的链式存储结构与应用

实验题目:一元多项式的代数运算

实验日期:2021.10.13

班级:2003001

学号:120L021011

姓名:石卓凡

一、实验目的

1. 掌握线性表顺序存储结构的特点及线性表在顺序存储结构中各种基本操作的实现。

2. 掌握线性表链式存储结构的特点及线性表在链式存储结构中各种基本操作的实现。

3.重点巩固和体会线性表在链式存储结构上的各种操作和应用。

二、实验要求及实验环境

实验要求:

设计线性表的(动态或静态)链式存储结构,并实现一元多项式的代数运算。

以链表存储一元多项式,在此基础上完成对多项式的代数操作。

1.能够输入多项式(可以按各项的任意输入顺序,建立按指数降幂排列的多项式)和输出多项式(按指数降幂排列),以文件形式输入和输出,并显示。

2.能够计算多项式在某一点x=x0的值,其中x0是一个浮点型常量,返回结果为浮点数。

3.能够给出计算两个多项式加法、减法、乘法和除法运算的结果多项式,除法运算的结果包括商多项式和余数多项式。

4.要求尽量减少乘法和除法运算中间结果的空间占用和结点频繁的分配与回收操作。(提示:利用循环链表结构或可用空间表的思想,把循环链表表示的多项式返还给系统或可用空间表,从而解决上述问题)。

实验环境:

操作系统:Win7/Win10

集成开发环境:devcpp++

外部库:暂无

三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

1. 函数功能和外部接口设计

本系统总计设计了9个函数,每个函数的功能和接口设计如下表所示:

序号函数名函数功能函数参数函数返回值
1Main根据order执行各函数
2ReadPoly读入In1.txt或者In2.txt里的多项式,并以降幂顺序存储进链表FILE *ffPolynomial
3Attach将链表尾插一个新节点,赋值coef和exponfloat c, int e, Polynomial* pRearNULL
4Add加法,将结果存储至链表,返回表头Polynomial P1, Polynomial P2Polynomial
5Sub减法,将结果存储至链表,返回表头Polynomial P1, Polynomial P2Polynomial
6Mult乘法,将结果存储至链表,返回表头Polynomial P1, Polynomial P2Polynomial
7Divide除法,直接打印和输出结果Polynomial P1, Polynomial P2NULL
8PrintPoly根据链表表头将数据打印屏幕和输出到文件Out.txtPolynomial PNULL
9Calulate计算Xo的结果,直接打印和输出结果Polynomial P,float xNULL

2. 主程序的流程图及各程序模块之间的调用关系

*流程图及程序模块的调用关系*img

img

*各函数详细调用关系*

img

img

imgimg

img

3. 数据类型的定义

typedef struct PolyNode *Polynomial;

struct PolyNode

{

**float coef; //**系数

**int expon; //**指数

Polynomial link;

}PolyNode;

**(一)**逻辑设计

(1) Attach插入项进入当前链表

\1. 新建结点t,将各个数值赋值

\2. 尾插法进入链表

(2) 从文件读入多项式

\1. 打开文件

\2. 创建链表的头结点

\3. 循环依次创建新节点,读入每一项的系数和指数,并且为尾插法Attach插入链表

\4. 删除空白头节点

(3) 加法

\1. 新建立链表头节点,和尾指针

\2. While循环,直到P1或者P2某个为空

2.1对于二者之间,拥有系数大的P,将P结点利用Attach(P1->coef,P1->expon,&Rear);插入链表

2.2对于二者之间,相同系数时候

2.2.1如果P1与P2当前系数和为0,则不用插入链表

2.2.2如果P1与P2当前系数和不为0,则插入链表Attach(P1->coef + P2->coef,P2->expon,&Rear);

3.while直到P1为空,不断Attach(P1->coef,P1->expon,&Rear);

4.While直到P2为空不断Attach(P2->coef,P2->expon,&Rear);

5.删除空白头节点

(4) 减法

\1. 新建链表头节点,和尾指针

\2. While循环直到P1或者P2某个为空

2.1对于二者之间,拥有系数大的P,将P结点利用Attach(P1->coef,P1->expon,&Rear);插入链表

2.2对于二者之间,相同系数时候

2.2.1如果P1与P2当前系数差为0,则不用插入链表

2.2.2如果P1与P2当前系数差不为0,则进行插入,Attach((P1->coef)-(P2->coef),P1->expon,&Rear);

\3. While直到P1为空Attach(P1->coef,P1->expon,&Rear)

\4. While直到P2为空Attach(-(P2->coef),P2->expon,&Rear);

\5. 删除空白头节点

(5) 乘法

\1. 如果P1或者P2为空则返回NULL,t1=P1,t2=P2

\2. 新建链表头节点=P

\3. While直到t1为空

(1) 赋值t2=P2,Rear=P

(2) While直到t2为空

① 计算当前t1和t2项乘法之后的系数和指数

② While循环去找到需要当前乘法结果需要插入的位置

③ 情况1在链表尾部插入,情况2在链表中间插入(Rear->link==NULL||Rear->link->expon < e)

④ 情况3(Rear->link->expon == e)当前可以进行合并

\1) 如果合并后是0则不需要插入,并且进行删除对应位置的节点

\2) 如果合并后不是0则进行插入

(6) 除法

a. 判断除数P2是否为0,如果是0则无法进行除法

b. 新建链表头节点,t1=P1,t2=P2

c. While一直循环

a) 计算当前商的项的指数newe和系数newc

b) 如果(P2->expon==0)当除数是常数(x是0次方)只需要出一次就能够得到,且余数多项式一定为0 。直接将Attach(newc,newe,&RearS);将商项插如商多项式。根据短除法,将Ptemp1 = Mult(RearS,P2),Ptemp1 = Sub(t1,Ptemp1);t1=Ptemp1;并且结束循环break

c) 如果t1->expon < P2->expon已经达到了结束循环条件进行break

d) 否则,直接计算将Attach(newc,newe,&RearS);将商项插如商多项式。根据短除法,将Ptemp1 = Mult(RearS,P2),Ptemp1 = Sub(t1,Ptemp1);t1=Ptemp1

(7) 计算x0

a. While循环

a) sum+=(P->coef)*pow(x,P->expon);

b) P=P->link;

**(二)**物理设计

表达式用链表存储,链表的结点就是表达式中的每一项用PolyNode表示,coef为系数,expon为指数,link指向下一项

struct PolyNode

{

float coef;

int expon;

Polynomial link;

}PolyNode;

**四、**测试结果

测试用例1:

F1 = 1x2-3x1+1x^0

F2 = 3x3-5x1+6x^0

img

img

img

img

测试样例2

F1=9x2+0x5-2x^2

F2=0x0+1x1

imgimgimgimg

**五、**经验体会与不足

不足:

1. 对于加减乘除后出现的系数为0的数据(比如0x^4),前期没有考虑到究竟选择删除该节点还是保留,导致后期混乱没有统一

解决方法:统一为系数为0的数据删除节点,在ReadPoly中再进行补充条件防止输出为空

2. 对于最初尝试除法的函数时候,空间的占用和结点的删除过于频繁

解决方法:将原本定义了多个的Polynomial可以合并通用的都合并了,减少了相当一部分的多余使用

经验体会:

a. 对于一个程序需要多个测试样例来找出程序所存在的BUG和当前没有考虑到的情况,比如此程序中的极端情况,除数多项式为0时候不存在,比如最后输出0x^0时候的符号判定是个特殊情况

b. 链表中空间的占用和结点的释放需要多加注意,有很多重复使用的可以删掉,系数为0的也可以不用浪费结点

c. 对于尾插法和在中间插入一个节点,所使用到的代码都是通用的,可以将两块情况合并在一起。

六、附录:源代码(带注释)

\#include<stdio.h>

\#include<stdlib.h>

\#include<math.h>

typedef struct PolyNode *Polynomial;

struct PolyNode

{

  float coef;

  int expon;

  Polynomial link;

}PolyNode;

Polynomial ReadPoly(FILE *ff);

void Attach(float c, int e, Polynomial* pRear);

Polynomial Add(Polynomial P1, Polynomial P2);

Polynomial Sub(Polynomial P1, Polynomial P2);

Polynomial Mult(Polynomial P1, Polynomial P2);

void PrintPoly(Polynomial P);

void Calulate(Polynomial P,float x);

void Divide(Polynomial P1, Polynomial P2);

void Sort(Polynomial P);

int main()

{

​    Polynomial P1,P2,P;

​    FILE *fp1=NULL;

​    FILE *fp2=NULL;

​    fp1= fopen("In1.txt","r");

​    fp2= fopen("In2.txt","r");

​    printf("            -------------------------------------------------------------------\n");

  printf("            |==================    一元多项式的运算    =================|\n");

  printf("            -------------------------------------------------------------------\n\n");

  printf("            |==================     1.相加(+)     =================|\n");

  printf("            |==================     2.相减(-)     =================|\n");

  printf("            |==================     3.相乘(*)     =================|\n");

  printf("            |==================     4.相除(/)     =================|\n");

  printf("            |==================     5.计算Xo(=)     =================|\n");

  int n;

  printf("请输入选择:");

  scanf("%d",&n);

  switch (n)

  {

  case 3:

​          P1 = ReadPoly(fp1);

​            P2 = ReadPoly(fp2);

​            P=Mult(P1,P2);

​          printf("f1*f2="); 

​            PrintPoly(P);

​            break;

​    case 1:

​          P1 = ReadPoly(fp1);

​            P2 = ReadPoly(fp2);

​            P=Add(P1,P2);

​            printf("f1+f2="); 

​            PrintPoly(P);

​            break;

​    case 4:

​          P1 = ReadPoly(fp1);

​            P2 = ReadPoly(fp2);

​            Divide(P1,P2);//除法 

​            break;

​    case 2:

​          P1 = ReadPoly(fp1);

​            P2 = ReadPoly(fp2);

​            P=Sub(P1,P2);

​            printf("f1-f2="); 

​            PrintPoly(P);

​            break;

​    case 5:

​            float x;

​            printf("请输入xo:");

​            scanf("%f",&x);

​            P1 = ReadPoly(fp1);

​            P2 = ReadPoly(fp2);

​            printf("f1(xo)=");

​            Calulate(P1,x);

​            printf("f2(xo)=");

​            Calulate(P2,x);

​    }

​    fclose(fp1);

​    fclose(fp2);

}

void PrintPoly(Polynomial P)

{

​    FILE *p;

​    if((p=fopen("Out.txt","a"))==NULL)

​    {

​        printf("文件打开失败");

​        exit(0);

​    }

​    fprintf(p,"当前结果为:"); 

  int flag = 0;  // 判断是否是开头

  int Emptyflag = 1 ;//标记是否最终结果是否一个没输出,如果是1->Empty则输出0x^0 

  if (!P)

  {

​    printf("NULL");//当结果是NULL,P就是NULL,用以观测是否会出现P==NULL

​    fprintf(p,"NULL");

​    return;

  }

  while (P)

  {

​      if(P->coef==0) //对于0x^2直接跳过不输出 

​      {

​          P = P->link;

​          continue;

​        }

​        if(P->coef>0&&flag==1)//flag==1 不是开头则就要考虑+符号 

​            {

​            printf("+");

​            fprintf(p,"+"); 

​            }

​    printf("%.2fx^%d ", (P->coef), P->expon);

​    fprintf(p,"%.2fx^%d ", (P->coef), P->expon);

​    Emptyflag=0;//输出有非0数据

​    P = P->link;

​    if(flag==0)

​        flag=1;

  }

  if(Emptyflag==1)//如果P结果全是 0x^2+0x^1则只输出为0x^0 

  {

​      printf("0.00x^0");//结果为0总得输出一个

​    fprintf(p,"0.00x^0");

​    }

  printf("\n");

  fprintf(p,"\n");

  fclose(p);

}

Polynomial Mult(Polynomial P1, Polynomial P2)

{

​    Polynomial P,t1,t2,t,Rear;

​    if(!P1||!P2)

​        return NULL;//防止P1或P2万一为NULL,报错提示 

​    t1=P1;

​    t2=P2;

​    float c;

​    int e;

​    P=(Polynomial)malloc(sizeof(PolyNode));

​    P->link=NULL;

​    while(t1)//固定P1中的某个,依次遍历P2每一个 

​    {

​        t2=P2;

​        Rear=P;

​        while(t2)//t2==NULL 停下 

​        {

​            c=t1->coef * t2->coef;

​            e=t1->expon + t2->expon;

​            while(Rear->link!=NULL&&Rear->link->expon > e)//利用降幂顺序 来while循环找到插入的对应位置 

​                Rear=Rear->link;

​            if(Rear->link==NULL||Rear->link->expon < e)//在结尾插入(Rear->link==NULL) 和 在中间插入,都可以归为插入 

​            {                      //(Rear->link->expon)在中间插入

​                t=(Polynomial)malloc(sizeof(PolyNode));

​                t->coef=c;

​                t->expon=e;

​                t->link=Rear->link;

​                Rear->link=t;

​            }

​            else if(Rear->link->expon == e)//发现插入的可以合并同类项 

​            {

​                if(c + Rear->link->coef !=0)//合并之后不是0 

​                {

​                    Rear->link->coef += c;

​                }

​                else if (c + Rear->link->coef ==0)//合并之后为0直接删除结点 

​                {

​                    Polynomial temp;

​                    temp=Rear->link;

​                    Rear->link=Rear->link->link;

​                    free(temp);

​                }

​            }

​            t2=t2->link;

​        }

​        t1=t1->link;

​    }

​    t=P;

​    P=P->link;

​    free(t);

​    return P;

}

Polynomial Add(Polynomial P1, Polynomial P2)

{

​    Polynomial P,Rear,t;

​    P=(Polynomial)malloc(sizeof(PolyNode));

​    P->link=NULL;

​    Rear=P;

​    

​    while(P1&&P2)//从两个多项式依照降幂顺序,找指数高的开始 

​    {

​        if((P1->expon) > (P2->expon) )

​        {

​            Attach(P1->coef,P1->expon,&Rear);

​            P1=P1->link;

​        }

​        else if ((P1->expon) < (P2->expon))

​        {

​            Attach(P2->coef,P2->expon,&Rear);

​            P2=P2->link;

​        }

​        else

​        {   

​            if(P1->coef + P2->coef!=0)

​            {

​            Attach(P1->coef + P2->coef,P2->expon,&Rear);

​            P1=P1->link;

​            P2=P2->link;

​            }

​            else//coef = = 0

​            {

​            P1=P1->link;

​            P2=P2->link;

​            }//一旦系数为0都不存入结点 

​        }

​    }

​    while(P1)

​        {Attach(P1->coef,P1->expon,&Rear);

​            P1=P1->link;

​        }

​    while(P2)

​        {Attach(P2->coef,P2->expon,&Rear);

​            P2=P2->link;

​        }

​    t=P;

​    P=P->link;

​    free(t);

​    if(!P)

​    {

​        P=(Polynomial)malloc(sizeof(PolyNode));

​        P->link=NULL;

​        P->coef =0;

​        P->expon =0;

​    }//当结果为0时候防止P==NULL,不妨将新建结点,数据为0x^0

​    return P;

}

Polynomial Sub(Polynomial P1, Polynomial P2) //P1-P2  

{

​    Polynomial P,Rear,t;

​    P=(Polynomial)malloc(sizeof(PolyNode));

​    P->link=NULL;

​    Rear=P;

​    while(P1&&P2)

​    {

​        if((P1->expon) > (P2->expon) )//按照降幂这么放入P 

​        {

​            Attach(P1->coef,P1->expon,&Rear);

​            P1=P1->link;

​        }

​        else if ((P1->expon) < (P2->expon))

​        {

​            Attach(-(P2->coef),P2->expon,&Rear);

​            P2=P2->link;

​        }

​        else if ((P1->expon) == (P2->expon))

​        {   

​            if((P1->coef) -(P2->coef) == 0)

​            {

​                P1=P1->link;

​                P2=P2->link;

​            }

​            else

​            {

​                Attach((P1->coef)-(P2->coef),P1->expon,&Rear);

​                P1=P1->link;

​                P2=P2->link;

​            }

​        }

​    }

​    while(P1)

​        {Attach(P1->coef,P1->expon,&Rear);

​            P1=P1->link;

​        }

​    while(P2)

​        {Attach(-(P2->coef),P2->expon,&Rear);

​            P2=P2->link;

​        }

​    t=P;

​    P=P->link;

​    free(t);

​    if(!P)

​    {

​        P=(Polynomial)malloc(sizeof(PolyNode));

​        P->link=NULL;

​        P->coef =0;

​        P->expon =0;

​    }//当结果为0时候防止P==NULL,不妨将新建结点,数据为0

​    return P;

}

 

void Attach(float c, int e, Polynomial* pRear)

{

​    Polynomial t;

​    t=(Polynomial)malloc(sizeof(PolyNode));

​    t->coef=c;

​    t->expon=e;

​    t->link=NULL;

​    (*pRear)->link=t;//利用尾插法,当然要将尾结点指向更新,*pRear才能修改尾结点自己地址 

​    *pRear=t;

}

Polynomial ReadPoly(FILE *ff)

{

​    int exp;

​    float coe;

​    char ch;

​    Polynomial P,Rear,t,Head;

​    P=(Polynomial)malloc(sizeof(PolyNode));

​    P->link=NULL;

​    Rear=P;

  ch = fgetc(ff);

  if(ch==EOF)//看txt文本是否为空 

  {

​      printf("ERROR: In.txt输入为空");

​        exit(0);

​    }

  if(ch!='-')//3x^2+3x^1这种首项第一个不会带有+,特殊情况 

  {

​      rewind(ff);

​      fscanf(ff,"%fx^%d",&coe,&exp);

​      Attach(coe,exp,&Rear);

​    }

​    else//ch='-'

​    {

​        fscanf(ff,"%fx^%d",&coe,&exp);

​        Attach((-coe),exp,&Rear);

​    }

​    while(fscanf(ff,"%c%fx^%d",&ch,&coe,&exp)!=EOF)//开始按照降幂插入 

​    {

​        if(ch=='-')//如果是符号要调整coe 

​            coe=-coe;

​            

​        Head=P;

​        while(Head->link!=NULL&&Head->link->expon > exp ) //

​            Head=Head->link;

​        if(Head->link==NULL||Head->link->expon < exp)

​            {

​                t=(Polynomial)malloc(sizeof(PolyNode));

​                t->coef=coe;

​                t->expon=exp;

​                t->link=Head->link;

​                Head->link=t;

​            }

​        else if(Head->link->expon == exp)

​            {

​                if(coe + Head->link->coef !=0)

​                {

​                    Head->link->coef += coe;

​                }

​                else if (coe + Head->link->coef ==0)

​                {

​                    t=Head->link;

​                    Head->link=Head->link->link;

​                    free(t);

​                }//对于0x^2这种数据直接删掉结点 

​            }

​    }

​    t=P;

​    P=P->link;

​    free(t);

​    printf("f(x)=");

​    PrintPoly(P);

​    return P;//若In.txt为空则输出0x^0 

}

void Calulate(Polynomial P,float x)

{

​    FILE *p;

​    if((p=fopen("Out.txt","a"))==NULL)

​    {

​        printf("文件打开失败");

​        exit(0);

​    }

​    float sum;

​    sum=0;

​    while(P)

​    {

​        sum+=(P->coef)*pow(x,P->expon);

​        P=P->link;

​    }

​    printf("%f",sum);

​    fprintf(p,"代入Xo之后等于:%f",sum);

​    fclose(p);

​    printf("\n");

}

void Divide(Polynomial P1, Polynomial P2)//p1 / p2 

{

​    Polynomial PS,t1,t2,RearS,Ptemp1,t;

​    PS=(Polynomial)malloc(sizeof(PolyNode));//商多项式 

​    PS->link=NULL;

​    RearS=PS;//用来存储

​    t1=P1;

​    t2=P2;

​    if(P2->coef==0&&P2->expon==0)//当除数时0,数学公式不成立

​        {

​            printf("ERROR:P2不能为0");

​            exit(0);

​        }

​    float newc; 

​    int newe;

​    while(1)//进入循环

​    {

​        if(P2->expon==0)//特殊情况,当除数是常数(x是0次方)只需要出一次就能够得到,且余数多项式一定为0 

​            {

​            newe=t1->expon - P2->expon;//本次依次得到的商的一个项的指数 

​            newc=t1->coef / P2->coef;//本次依次得到的商的一个项的系数

​            Attach(newc, newe, &RearS);//将当前项,加入到商多项式

​            Ptemp1 = Mult(RearS,P2);//PP1*P2 = Ptemp,除法公式用到的 

​        Ptemp1 = Sub(t1,Ptemp1);//除法公式用到的 

​        t1=Ptemp1;//再次进行,当前短除法之后得到的余数多项式(不一定是最终的余数),成为新的t1,继续试探 

​        break;

​            }

​      if(t1->expon < P2->expon)

​        {

​            //已经完成商多项式 余数多项式

​            //t1就是最终余数多项式

​            break;//终止循环唯一条件

​        }

​        else//需要继续除 

​        {

​            newe=t1->expon - P2->expon;//本次依次得到的商的一个项的指数 

​            newc=t1->coef / P2->coef;//本次依次得到的商的一个项的系数

​            Attach(newc, newe, &RearS);//将当前项,加入到商多项式

​            Ptemp1 = Mult(RearS,P2);//PP1*P2 = Ptemp

​        Ptemp1 = Sub(t1,Ptemp1);

​        t1=Ptemp1;//再次进行,当前短除法之后得到的余数多项式(不一定是最终的余数),成为新的t1,继续试探 

​        }

​    }

​    t=PS;

​    PS=PS->link;

​    free(t);//删掉PS空白头结点 

​    if(!PS)//对于0/9x = 0 ..9x  此时防止商为空 

​    {

​    PS=(Polynomial)malloc(sizeof(PolyNode));//商多项式 

​    PS->link=NULL;

​    PS->coef = 0;

​    PS->expon = 0;

​    }

​    printf("余数多项式:");

​    PrintPoly(t1);//开始输出余数多项式 

​    printf("商多项式:");

​    PrintPoly(PS);//已经完成输出商多项式 

}

 

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

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

相关文章

探索iOS之AudioUnit音效框架

iOS的AVAudioUnit提供的音效包括&#xff1a;混响、延迟、均衡器、失真、变速、变调等。按照类型划分为Audio Effect和Time Effect&#xff0c;其中Audio Effect包括混响、延迟、均衡器和失真&#xff0c;而Time Effect主要是变速、变调。 一、音效应用层框架 音效的应用层框…

Kali-linux使用Metasploit基础

Metasploit是一款开源的安全漏洞检测工具。它可以帮助用户识别安全问题&#xff0c;验证漏洞的缓解措施&#xff0c;并对某些软件进行安全性评估&#xff0c;提供真正的安全风险情报。当用户第一次接触Metasploit渗透测试框架软件&#xff08;MSF&#xff09;时&#xff0c;可能…

限速神器RateLimiter源码解析 | 京东云技术团队

作者&#xff1a;京东科技 李玉亮 目录指引 限流场景 软件系统中一般有两种场景会用到限流&#xff1a; •场景一、高并发的用户端场景。 尤其是C端系统&#xff0c;经常面对海量用户请求&#xff0c;如不做限流&#xff0c;遇到瞬间高并发的场景&#xff0c;则可能压垮系统…

优秀的产品经理需要具备的能力和素质

1. 适应性强。市场不断发展&#xff0c;用户的需求也在不断变化。如果产品不能满足需求&#xff0c;那就改变路线&#xff1b;如果会议不再有效&#xff0c;取消它&#xff1b;如果你需要更多的帮助&#xff0c;尽管开口。了解沉没成本&#xff0c;并采取措施使产品朝着正确的方…

Nature Neuroscience:焦虑为何导致“社恐”?李晓明团队揭示相关脑机制

焦虑是一种常见的负面情绪&#xff0c;也是当今社会的一个热词。在刚刚落幕的《脱口秀大会第五季》中&#xff0c;鸟鸟以一句“躺的时候想卷&#xff0c;卷的时候想躺&#xff0c;永远年轻&#xff0c;永远左右为难&#xff0c;一切都是最不好的安排。”戳中了无数观众的“焦”…

服务器架构-架构图(三)

前言 项目不同&#xff0c;架构自然也不同&#xff0c;所以没有唯一的架构&#xff0c;只有合适项目的架构。 这章以休闲类手游为例。 1&#xff1a;架构图 2张差别&#xff0c;就是中间件 用中间件 主要 异步化提升性能、降低耦合度、流量削峰 根据需求选择一种服务器间的消息…

Sui NFT应用实例:将NFT变成咖啡!

近期在台北智慧城市峰会和博览会中&#xff0c;展示了使用NFT购买咖啡的系统。 在2023年3月28–31日举行的台北智慧城市峰会和博览会中&#xff0c;参与者向大家演示了如何使用NFT兑换一杯香醇的咖啡。此系统由Sui基金会、MomentX以及Suia共同创建&#xff0c;演示了如何使用在…

【牛客网面试必刷TOP101】链表篇(一)

【牛客网面试必刷TOP101】链表篇&#xff08;一&#xff09; 前言刷题网站刷题&#xff01;BM1 反转链表思路一&#xff1a;用栈解决思路二&#xff1a;双链表求解思路三&#xff1a;递归解决 总结 BM2 链表内指定区间反转思路一&#xff1a;头插法迭代思路二&#xff1a;递归 …

几乎涵盖微服务所有操作,阿里2023最新SpringCloudAlibaba实战进阶笔记太强了

近两年&#xff0c;“大厂裁员”总是凭实力冲上各大媒体头条&#xff0c;身在局中的我们早已习以为常。国内的京东&#xff0c;阿里&#xff0c;腾讯&#xff0c;字节&#xff0c;快手&#xff0c;小米等互联网公司都以不同程度的裁员比例向社会输送人才。大量有大厂经验的卷王…

常用性能指标、性能指标评估及性能测试通过标准

一、常用性能指标 1、并发用户数&#xff1a; 指同一时间点对系统进行操作的用户数。准确说为"同时向服务器发送服务请求,给服务器产生压力的用户数量" 并发用户数和注册用户数、在线用户数的概念不同&#xff1a; 并发用户数一定会对服务器产生压力的&#xff0…

Mac FortiClient VPN一直连接不上?正确的安装步骤来了!

Mac FortiClient完整版安装 1、下载FortiClient 这里使用FortiClient 7.0.7的版本。登录fortiClient 7.x 网站下载FortiClient_7.0.7.0245_macosx.dmg。 2、当然要是不想注册&#xff0c;也可以点击这里&#xff01; 3、或者安装我这里的固定版本【百度网盘】提取码&#xff…

极狐GitLab as Code,全面升级你的 GitOps 体验

&#x1f4a1; 近日&#xff0c;由微软和英特尔联合发起的第二届开源云原生开发者日&#xff08;Open Source Cloud Native Developer Day&#xff09;上海站顺利落幕。极狐(GitLab) 资深云原生架构师郭旭东在会上进行了《深度探索 GitOps 平台的更多可能》主题演讲&#xff0c…

关于wxapkg路径的一些问题

1 下载安装夜神模拟器。 官网地址&#xff1a;https://www.yeshen.com在模拟器中安装微信&#xff0c;可以下载apk后拖进去&#xff0c;也可在里面下载。不需要RE文件管理器&#xff0c;目前夜神自带Amaze文件管理器&#xff0c;一样的。路径地址为&#xff1a; /data/data/c…

Ubuntu16.04布置CenterFusion记录

安装细节 CenterFusion/src/tools/convert_nuScenes.py内容修改 如果你用的是nuscenes数据集中的Mini部分&#xff0c;那就把convert_nuScenes.py第27行内容中的其他部分注释掉 convert_nuScenes.py在56行处&#xff0c;将数量修改为3 nuscenes-devkit下载 将nuscenes-dev…

计算机网络实验(ensp)-实验1:初识eNSP仿真软件

目录 实验报告&#xff1a; 实验操作 1.建立网络拓扑图并开启设备 2.配置路由器 1.输入命名&#xff1a;sys 从用户视图切换到系统视图 2.输入命名&#xff1a;sysname 姓名 修改路由器名字 3.输入命名&#xff1a;interface g0/0/0 进入端口视图g0…

开源同城跑腿系统(PHP版)

同城跑腿系统的优点在于&#xff0c;它可以为用户提供方便快捷的服务&#xff0c;避免了用户自己跑腿的麻烦和时间成本&#xff0c;同时也为跑腿人员提供了一种灵活的兼职方式 此系统是一款基于likeadmin-php开发的跑腿小程序系统&#xff0c;提供全部前后台无加密源代码&…

知乎高赞回答|只需5分钟,一文教你理解结构化和非结构化数据!

什么是结构化数据&#xff1f; 结构化数据&#xff1a;指关系模型数据&#xff0c;即以关系数据库表形式管理的数据&#xff0c;结合到典型场景中更容易理解&#xff0c;比如企业ERP、OA、HR里的数据。 什么是非结构化数据&#xff1f; 非结构化数据&#xff1a;指数据结构不…

el-tree饿了么elementUI tree树结构插件设置全部展开折叠

效果如上图↑ // 折叠所有节点 foldAllNodes(type) {let treeNodes this.$refs[type _tree].store._getAllNodes()for (var i 0; i < treeNodes.length; i) {treeNodes[i].expanded false;} }, // 展开所有节点 expandAllNodes(type) {let treeNodes this.$refs[type …

Centos7使用for循环语句批量修改文件名

O、前言 虽然单个文件更名&#xff0c;我们可以使用mv命令进行更名。那几百个文件更改&#xff0c;这个工程量比较大&#xff0c;下面介绍一下如何使用for循环语句来批量修改文件名。 一、环境介绍 1.Centos版本:Centos7-X86_64-Eeverything2009 二、命令介绍 这里主要用到ba…

企业电子商务系统 b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家…