北航第五次数据结构与程序设计编程题复习

news2024/11/15 17:18:55

北航第五次数据结构与程序设计编程题复习

  • 树叶节点遍历(树-基础题)
  • 计算器(表达式计算-表达式树实现)
  • 服务优化
  • 词频统计(树实现)

树叶节点遍历(树-基础题)

【问题描述】

从标准输入中输入一组整数,在输入过程中按照左子结点值小于根结点值、右子结点值大于等于根结点值的方式构造一棵二叉查找树,然后从左至右输出所有树中叶结点的值及高度(根结点的高度为1)。例如,若按照以下顺序输入一组整数:50、38、30、64、58、40、10、73、70、50、60、100、35,则生成下面的二叉查找树:
在这里插入图片描述从左到右的叶子结点包括:10、35、40、50、60、70、100,叶结点40的高度为3,其它叶结点的高度都为4。

【输入形式】

先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。
【输出形式】

按照从左到右的顺序分行输出叶结点的值及高度,值和高度之间以一个空格分隔。
【样例输入】

13

50 38 30 64 58 40 10 73 70 50 60 100 35
【样例输出】

10 4

35 4

40 3

50 4

60 4

70 4

100 4
【样例说明】

按照从左到右的顺序输出叶结点(即没有子树的结点)的值和高度,每行输出一个。
【评分标准】

该题要求输出所有叶结点的值和高度,提交程序名为:bst.c


这个题的大体框架就是逐点插入法,但是要多做一步:结点结构体中多加一项元素deep,用于存放节点的深度。结点插入时,每和已有树中结点比较一次,deep加一。
题目要求从左往右打印叶子结点,其实就是中序遍历的思想。但实际上,中间的根结点不可能是需要访问的叶子结点(你都是根了肯定有子节点啊),因此只需要先遍历左子树再右子树就可以了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
    int val;
    int deep;
    struct node*left;
    struct node*right;
}BTNode;
BTNode* root=NULL;
void insert(int);
void leaf(BTNode*);
int main()
{
    int n,item;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&item);
        insert(item);
    }

    leaf(root);
}
void insert(int item)
{
    BTNode* new=(BTNode*)malloc(sizeof(BTNode));
    new->deep=1;
    new->left=new->right=NULL;
    new->val=item;

    if(root==NULL)
    {
        root=new;
        return;
    }
    BTNode* cur=root;
    while(1)
    {
        if(item<cur->val)
        {
            new->deep++;
            if(cur->left==NULL)
            {
                cur->left=new;   
                break;          
            }
            else
                cur=cur->left;
        }
        else if(item>=cur->val)
        {
            new->deep++;
            if(cur->right==NULL)
            {
                cur->right=new;
                break;
            }  
            else
                cur=cur->right;
        }
    }
}
void leaf(BTNode* root)
{
    if(root==NULL)
        return;
    if(root->left==NULL&&root->right==NULL)
        printf("%d %d\n",root->val,root->deep);
    
    leaf(root->left);
    leaf(root->right);
}

计算器(表达式计算-表达式树实现)

【问题描述】

从标准输入中读入一个整数算术运算表达式,如24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 )= ,计算表达式结果,并输出。

要求:
1、表达式运算符只有+、-、*、/,表达式末尾的=字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中会出现圆括号,括号可能嵌套,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。

4、要求采用表达式树来实现表达式计算。

表达式树(expression tree):

我们已经知道了在计算机中用后缀表达式和栈来计算中缀表达式的值。在计算机中还有一种方式是利用表达式树来计算表达式的值。表达式树是这样一种树,其根节点为操作符,非根节点为操作数,对其进行后序遍历将计算表达式的值。由后缀表达式生成表达式树的方法如下:

l 读入一个符号:

l 如果是操作数,则建立一个单节点树并将指向他的指针推入栈中;

l 如果是运算符,就从栈中弹出指向两棵树T1和T2的指针(T1先弹出)并形成一棵新树,树根为该运算符,它的左、右子树分别指向T2和T1,然后将新树的指针压入栈中。

例如输入的后缀表达为:

ab+cde+**

则生成的表达式树为:
在这里插入图片描述

【输入形式】

从键盘输入一个以=结尾的整数算术运算表达式。操作符和操作数之间可以有空格分隔。

【输出形式】

首先在屏幕上输出表达式树根、左子节点及右子节点上的运算符或操作数,中间由一个空格分隔,最后有一个回车(如果无某节点,则该项不输出)。然后输出表达式计算结果。
【样例输入】

24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 ) =

【样例输出】

  • / /

18

【样例说明】

按照运算符及括号优先级依次计算表达式的值。在生成的表达树中,*是根节点的运算符,/ 是根节点的左子节点上运算符,/是根节点的右子节点上运算符,按题目要求要输出。

【评分标准】

通过所有测试点得满分。


我们之前用栈做过这个题,先把表达式转为逆波兰表达式,然后再计算,这次我们又多了一种办法:表达式树。
表达式树的特点是:叶结点是操作数,其他结点为操作符。
在这里插入图片描述
要构造表达式树,首先需要将表达式转化为后缀表达式。然后:
从左往右依次读入符号:
如果是操作数,则建立一个单节点树并将指向该节点的指针推入栈中
如果是运算符,则从栈中弹出两个树节点的指针并形成一棵新树,树根为运算符。然后将新树压入栈中。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
enum set {OP,NUM};
typedef struct item
{
    enum set type;
    union
    {
        char ope;
        int num;
    }uni;
}ITEM;
typedef struct node
{
    ITEM item;
    int calnum;
    struct node*left;
    struct node*right;
}BTnode;
void remove_zero(char*);
void toReversePoland(char*);
int Priority(char);
void cal(ITEM*,int);
int main()
{
    char arr[100];
    gets(arr);
    
    remove_zero(arr);
    toReversePoland(arr);
    return 0;
}
void remove_zero(char* a)
{
    int i=0,j=0;
    while(a[j]!='\0')
    {
        if(a[j]!=' ')
        {
            a[i]=a[j];
            j++;
            i++;
        }
        else
            j++;
    }
    a[i]='\0';
}
void toReversePoland(char* a)
{
    ITEM arr[100];
    int index=0;
    char operation[100];
    int Top=-1;

    for(int i=0;i<strlen(a);i++)
    {
        if(a[i]>='0'&&a[i]<='9')
        {
            int num=a[i]-'0';
            for(int j=i+1;j<strlen(a);j++)
            {
                if(a[j]>='0'&&a[j]<='9')
                {
                    num=num*10+(a[j]-'0');
                }
                else
                {
                    arr[index].type=NUM;
                    arr[index].uni.num=num;
                    i=j-1;
                    index++;
                    break;
                }
            }
        }
        else if(a[i]=='=')
            break;
        else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')
        {
            if(Top==-1)
                operation[++Top]=a[i];
            else
            {
                while(Top>-1&&operation[Top]!='('&&(Priority(operation[Top])>=Priority(a[i])))
                {
                    arr[index].type=OP;
                    arr[index].uni.ope=operation[Top];
                    index++;
                    Top--;
                }
                operation[++Top]=a[i];
            }
        }
        else if(a[i]=='(')
        {
            operation[++Top]='(';
        }
        else if(a[i]==')')
        {
            char top=operation[Top];
            while(top!='(')
            {
                arr[index].type=OP;
                arr[index].uni.ope=top;
                index++;
                Top--;
                top=operation[Top];
            }
            Top--;
        }
    }
    while(Top!=-1)
    {
        arr[index].type=OP;
        arr[index].uni.ope=operation[Top];
        index++;
        Top--;
    }
    // for(int i=0;i<index;i++)
    // {
    //     if(arr[i].type==OP)
    //         printf("%c ",arr[i].uni.ope);
    //     else
    //         printf("%.2f ",arr[i].uni.num);
    // }
    cal(arr,index);
}
int Priority(char a)
{
    if(a=='+'||a=='-')
        return 1;
    if(a=='*'||a=='/')
        return 2;
}
void cal(ITEM* arr,int n)
{
    BTnode* stack[100];
    int top=0;

    for(int i=0;i<n;i++)
    {
        if(arr[i].type==NUM)
        {
            BTnode* new=(BTnode*)malloc(sizeof(BTnode));
            new->item=arr[i];
            new->calnum=arr[i].uni.num;
            new->left=new->right=NULL;

            stack[top++]=new;
        }
        else
        {
            BTnode*new=(BTnode*)malloc(sizeof(BTnode));
            top--;
            BTnode* x1=stack[top];
            top--;
            BTnode* x2=stack[top];
            new->left=x2;
            new->right=x1;
            if(arr[i].uni.ope=='+')
            {
                new->item=arr[i];
                new->calnum=x1->calnum+x2->calnum;
            }
            else if(arr[i].uni.ope=='-')
            {
                new->item=arr[i];
                new->calnum=x2->calnum-x1->calnum;
            }
            else if(arr[i].uni.ope=='*')
            {
                new->item=arr[i];
                new->calnum=x2->calnum*x1->calnum;
            }
            else if(arr[i].uni.ope=='/')
            {
                new->item=arr[i];
                new->calnum=x2->calnum/x1->calnum;
            }
            stack[top++]=new;
        }
    }
    if(stack[0]->item.type==OP)
    {
        printf("%c ",stack[0]->item.uni.ope);
    }
    else if(stack[0]->item.type==NUM)
    {
        printf("%d ",stack[0]->calnum);
    }

    if(stack[0]->left)
    {
        if(stack[0]->left->item.type==OP)
        {
            printf("%c ",stack[0]->left->item.uni.ope);
        }
        else if(stack[0]->left->item.type==NUM)
        {
            printf("%d ",stack[0]->left->item.uni.num);
        }
    }
    
    if(stack[0]->right)
    {
        if(stack[0]->right->item.type==OP)
        {
            printf("%c\n",stack[0]->right->item.uni.ope);

        }
        else if(stack[0]->right->item.type==NUM)
        {
            printf("%d\n",stack[0]->right->item.uni.num);
        }
    }
    else
    {
        printf("\n");
    }
    printf("%d",stack[0]->calnum);
}

我在树结构体中加入了一项calnum,这一项是用于存储弹出的两个运算数运算后的值。如果遍历逆波兰表达式时,访问到运算数,那么calnum就等于运算数的值,如果是运算符,就存储弹栈出的两个数的值。

逆波兰表达式的转换我是直接copy上一次作业中写好的代码的,大家考试前也可以这么搞,就是把一些常用的算法结构写好,考试时候直接粘贴,考试浪费的时间 - -。

服务优化

【问题描述】

假设某机场所有**登机口(Gate)**呈树形排列(树的度为3),安检处为树的根,如下图所示。图中的分叉结点(编号大于等于100)表示分叉路口,登机口用小于100的编号表示(其一定是一个叶结点)。通过对机场所有出发航班的日志分析,得知每个登机口每天的平均发送旅客流量。作为提升机场服务水平的一个措施,在不改变所有航班相对关系的情况下(即:出发时间不变,原在同一登机口的航班不变),仅改变登机口(例如:将3号登机口改到5号登机口的位置),使得整体旅客到登机口的时间有所减少(即:从安检口到登机口所经过的分叉路口最少)。
在这里插入图片描述
编写程序模拟上述登机口的调整,登机口调整规则如下:

1)首先按照由大到小的顺序对输入的登机口流量进行排序,流量相同的按照登机口编号由小到大排序;

2)从上述登机口树的树根开始,将登机口按照从上到下(安检口在最上方)、从左到右的顺序,依次对应上面排序后将要调整的登机口。

例如上图的树中,若只考虑登机口,则从上到下有三层,第一层从左到右的顺序为:5、6、14、13,第二层从左到右的顺序为:7、8、9、10、1、2、18、17、16、15,第三层从左到右的顺序为:11、12、3、4、20、19。若按规则1排序后流量由大至小的前五个登机口为3、12、16、20、15,则将流量最大的3号登机口调整到最上层且最左边的位置(即:5号登机口的位置),12号调整到6号,16号调整到14号,20号调整到13号,15号调整到第二层最左边的位置(即7号登机口的位置)。

【输入形式】

1)首先按层次从根开始依次输入树结点之间的关系。其中分叉结点编号从数字100开始(树根结点编号为100,其它分叉结点编号没有规律但不会重复),登机口为编号小于100的数字(编号没有规律但不会重复,其一定是一个叶结点)。树中结点间关系用下面方式描述:

R S1 S2 S3 -1

其中R为分叉结点,从左至右S1,S2,S3分别为树叉R的子结点,其可为树叉或登机口,由于树的度为3,S1,S2,S3中至多可以2个为空,最后该行以-1和换行符结束。各项间以一个空格分隔。如:

100 101 102 103 -1

表明编号100的树根有三个子叉,编号分别为101、102和103,又如:

104 7 8 -1

表明树叉104上有2个编号分别为7和8的登机口。

假设分叉结点数不超过100个。分叉结点输入的顺序不确定,但可以确定:输入某个分叉结点信息时,其父结点的信息已经输入。

输入完所有树结点关系后,在新的一行上输入-1表示树结点关系输入完毕。

2)接下来输入登机口的流量信息,每个登机口流量信息分占一行,分别包括登机口编号(1~99之间的整数)和流量(大于0的整数),两整数间以一个空格分隔。登机口数目与前面构造树时的登机机口数目一致。

【输出形式】

按照上述调整规则中排序后的顺序(即按旅客流量由大到小,流量相同的按照登机口编号由小到大)依次分行输出每个登机口的调整结果:先输出调整前的登机口编号,然后输出字符串"->"(由英文减号字符与英文大于字符组成),再输出要调整到的登机口编号。

【样例输入】

100 101 102 103 -1

103 14 108 13 -1

101 5 104 6 -1

104 7 8 -1

102 105 106 107 -1

106 1 110 2 -1

108 16 15 -1

107 18 111 17 -1

110 3 4 -1

105 9 109 10 -1

111 20 19 -1

109 11 12 -1

-1

17 865

5 668

20 3000

13 1020

11 980

8 2202

15 1897

6 1001

14 922

7 2178

19 2189

1 1267

12 3281

2 980

18 1020

10 980

3 1876

9 1197

16 980

4 576

【样例输出】

12->5

20->6

8->14

19->13

7->7

15->8

3->9

1->10

9->1

13->2

18->18

6->17

2->16

10->15

11->11

16->12

14->3

17->4

5->20

4->19

【样例说明】

样例输入了12条树结点关系,形成了如上图的树。然后输入了20个登机口的流量,将这20个登机口按照上述调整规则1排序后形成的顺序为:12、20、8、19、7、15、3、1、9、13、18、6、2、10、11、16、14、17、5、4。最后按该顺序将所有登机口按照上述调整规则2进行调整,输出调整结果。
【评分标准】

该题要求计算并输出登机口的调整方法,提交程序名为adjust.c。


咳咳来北航当程序员阅读能力一定要好……审题占写完整道题的50%……
首先,我们看看这个题的结构体怎么定义:树的度为三,那就是三叉树,我们应该在结构体里定义left mid right三个指针。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
typedef struct node
{
    int id;
    int passenger;
    struct node* left;
    struct node* mid;
    struct node* right;
}BTNode;

BTNode* root;
int GateCount=0;
void Insert(int,BTNode*);
BTNode* findroot(int);
BTNode* find(int,BTNode*);
void Adjust(BTNode*);
int cmp1(const void* p1,const void* p2){
    return (*(BTNode**)p2)->passenger-(*(BTNode**)p1)->passenger;
}
int cmp2(const void* p1,const void* p2){
    return (*(BTNode**)p1)->id-(*(BTNode**)p2)->id;
}
int main()
{
    int R,S;
    scanf("%d",&R);
    while(R!=-1)
    { 
        BTNode* r=findroot(R);
        scanf("%d",&S);     
        while(S!=-1)
        {
            if(S<100)
                GateCount++;
            Insert(S,r);
            scanf("%d",&S);
        }
        scanf("%d",&R);
    }
    
    int gate,num;
    for(int i=0;i<GateCount;i++)
    {
        scanf("%d %d",&gate,&num);
        BTNode* Gate=find(gate,root);
        Gate->passenger=num;
    }
    Adjust(root);
}
BTNode* find(int n,BTNode* p)
{
    if(p==NULL)
        return NULL;
    if(p->id==n)
        return p;
    BTNode* tar=NULL;
    tar=find(n,p->left);
    if(tar==NULL)
        tar=find(n,p->mid);
    if(tar==NULL)
        tar=find(n,p->right);
    
    return tar;
}
BTNode* findroot(int r)
{
    if(root==NULL)
    {
        root=(BTNode*)malloc(sizeof(BTNode));
        root->id=r;
        root->passenger=0;
        root->left=root->right=root->mid=NULL;
        return root;
    }
    return find(r,root);   
}
void Insert(int s,BTNode* r)
{
    BTNode* new=(BTNode*)malloc(sizeof(BTNode));
    new->id=s;
    new->passenger=0;
    new->left=new->mid=new->right=NULL;

    if(r->left==NULL)
    {
        r->left=new;
        return;
    }
    if(r->left!=NULL&&r->mid==NULL)
    {
        r->mid=new;
        return;
    }    
    if(r->left!=NULL&r->mid!=NULL&&r->right==NULL)
    {
        r->right=new;
        return;
    }
}
void Adjust(BTNode* root)
{
    BTNode* queue[MAX];
    BTNode* Gates[GateCount];
    int index=0;
    int Front=0,Rear=MAX-1,Count=0;

    Rear=(Rear+1)%MAX;
    queue[Rear]=root;
    Count++;
    while(Count!=0)
    {
        BTNode* R=queue[Front];
        Front=(Front+1)%MAX;
        Count--;
        
        if(R->left==NULL&&R->mid==NULL&&R->right==NULL)
            Gates[index++]=R;
        else
        {
            if(R->left)
            {
                Rear=(Rear+1)%MAX;
                queue[Rear]=R->left;
                Count++;
            }
            if(R->mid)
            {
                Rear=(Rear+1)%MAX;
                queue[Rear]=R->mid;
                Count++;
            }
            if(R->right)
            {
                Rear=(Rear+1)%MAX;
                queue[Rear]=R->right;
                Count++;
            }
        }
    }
    BTNode* Gates_1[GateCount];
    memcpy(Gates_1,Gates,sizeof(BTNode*)*GateCount);

    qsort(Gates_1,GateCount,sizeof(BTNode*),cmp1);
    for(int i=0;i<GateCount;i++)
    {
        int num=1;
        int start=i;
        while(i+1<GateCount&&Gates_1[i]->passenger==Gates_1[i+1]->passenger)
        {
            i++;
            num++;
        }
        if(num>1)
        {
            qsort(Gates_1+start,num,sizeof(BTNode*),cmp2);
        }
    }
    for(int i=0;i<GateCount;i++)
    {
        printf("%d->%d\n",Gates_1[i]->id,Gates[i]->id);
    }
}

这个题我觉得非常好,考点非常全面,考到了树的构造,树的遍历,查找指定节点,层序遍历,还有在快排中怎样以两个关键词排序。
最后还有一个小小的点需要注意一下:每个分支节点有三个指针,这三个指针可能都指向分支节点,也可能都指向登机口节点(图上没有表示,图上最多只有两个)。因此在插入树节点

词频统计(树实现)

【问题描述】

编写程序统计一个英文文本文件中每个单词的出现次数(词频统计),并将统计结果按单词字典序输出到屏幕上。

要求:程序应用二叉排序树(BST)来存储和统计读入的单词。

注:在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。在生成二叉排序树不做平衡处理。

【输入形式】

打开当前目录下文件article.txt,从中读取英文单词进行词频统计。

【输出形式】

程序应首先输出二叉排序树中根节点、根节点的右节点及根节点的右节点的右节点上的单词(即root、root->right、root->right->right节点上的单词),单词中间有一个空格分隔,最后一个单词后没有空格,直接为回车(若单词个数不足三个,则按实际数目输出)。

程序将单词统计结果按单词字典序输出到屏幕上,每行输出一个单词及其出现次数,单词和其出现次数间由一个空格分隔,出现次数后无空格,直接为回车。

【样例输入】

当前目录下文件article.txt内容如下:

"Do not take to heart every thing you hear."she says.(这个she says是我自己加的

“Do not spend all that you have.”

"Do not sleep as long as you want;"who(也是我加的

【样例输出】

do not take

all 1

as 2

do 3

every 1

have 1

hear 1

heart 1

long 1

not 3

sleep 1

spend 1

take 1

that 1

thing 1

to 1

want 1

you 3

【样例说明】

程序首先在屏幕上输出程序中二叉排序树上根节点、根节点的右子节点及根节点的右子节点的右子节点上的单词,分别为do not take,然后按单词字典序依次输出单词及其出现次数。

【评分标准】

通过全部测试点得满分


为什么我要加一个she says呢?因为hear."she这一串中没有空格,如果你要用fscanf读的话,这个就被识别为一个单词了,但是很明显,这是两个独立的单词,hear和she,因此需要巧妙地处理一下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
typedef struct node
{
    char word[50];
    int num;
    struct node* left;
    struct node* right;
}BTNode;
BTNode* root;
void Insert(char*);
void Inorder(BTNode*);
int main()
{
    FILE* fp=fopen("article.txt","r");
    //------------------------------------------------
    //这部分用于单词的正确读写
    int ch;
    char str[50];
    int index=0;
    while((ch=fgetc(fp))!=EOF)
    {
        ch=tolower(ch);
        if(ch>='a'&&ch<='z')
            str[index++]=ch;
        else
        {
            if(index>0)
            {
                str[index]='\0';
                Insert(str);
                index=0;
            }
           
        } 
    }
    //这个判断很重要,
    //因为如果最后一个单词后面没有标点,直接是EOF,
    //那么最后一个单词就不正确插入树中,
    //这也是为什么我在最后加了一个who的原因,用于测试这一部分。
    if(index>0)
    {
        str[index]='\0';
        Insert(str);
    }
    //-------------------------------------------------
    if(root!=NULL)
    {
        printf("%s ",root->word);
    }
    if(root->right!=NULL)
    {
        printf("%s ",root->right->word);
    }
    if(root->right->right!=NULL)
    {
        printf("%s",root->right->right->word);
    }
    printf("\n");

    Inorder(root);
    return 0;
}
void Insert(char* s)
{
    if(root==NULL)
    {
        root=(BTNode*)malloc(sizeof(BTNode));
        strcpy(root->word,s);
        root->num=1;
        root->left=root->right=NULL;
        return;
    }
    
    BTNode* cur=root;
    while(1)
    {
        int cmp=strcmp(s,cur->word);
        if(cmp==0)
        {
            cur->num++;
            break;
        }
        else if(cmp>0)
        {
            if(cur->right==NULL)
            {
                BTNode* new=(BTNode*)malloc(sizeof(BTNode));
                strcpy(new->word,s);
                new->num=1;
                new->left=new->right=NULL;
                cur->right=new;
                break;
            }
            else
                cur=cur->right;
        }
        else
        {
            if(cur->left==NULL)
            {
                BTNode* new=(BTNode*)malloc(sizeof(BTNode));
                strcpy(new->word,s);
                new->num=1;
                new->left=new->right=NULL;
                cur->left=new;
                break;
            }
            else
                cur=cur->left;
        }
    }
}
void Inorder(BTNode* p)
{
    if(p==NULL)
        return;
    Inorder(p->left);
    printf("%s %d\n",p->word,p->num);
    Inorder(p->right);
}

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

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

相关文章

OpenCV学习(4.9) OpenCV中的轮廓

1.目标 了解轮廓是什么。学习寻找轮廓&#xff0c;绘制轮廓等您将看到以下功能&#xff1a;**cv.findContours()** &#xff0c;**cv.drawContours()* 2.什么是轮廓 轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测…

嵌入式学习——Linux高级编程复习(互斥锁、信号量、管道、信号)——day41

1. 同步和异步 1.1 同步 多个任务在某一时刻,先后执行顺序可以被确定 同步操作要求一系列操作严格按照顺序执行&#xff0c;一个操作只有在前一个操作完成之后才能开始。在计算机编程中&#xff0c;这意味着当一个程序或线程发出一个请求或调用后&#xff0c;它会暂停执行&…

java自动化之java基础03-09java基础之数组

数组 1、定义 数组是一种用于存储固定大小的同类型数据的数据结构 1&#xff09;固定大小 2&#xff09;同类型数据的存储 2、声明数组 1&#xff09;数据类型[] 变量名称&#xff1b; 例如&#xff1a;int[] numsArry; 2&#xff09;数据类型 变量名称[]; 例如&#xf…

27.机会成本

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/677 题目描述 明天有 𝑛n 门考试,今晚只…

【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载

目录 一、 日期类的实现 Date.h 1.1 GetMonthDay函数&#xff08;获取某年某月的天数&#xff09; 问&#xff1a;这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢&#xff1f; 1.2 CheckDate函数&#xff08;检查日期有效性&#xff09;、Print函数&#xff08;…

计算机毕业设计 | SpringBoot宠物医院管理 宠物商城购物系统(附源码)

写在前面 Le Dao宠物医院管理系统是一个超大型的&#xff0c;完成度很高的&#xff0c;集宠物医疗、宠物美容、宠物交易、宠物周边等各种功能于一身的&#xff0c;权限涵盖普通用户、医生、化验师、美容师、仓库主管、采购员等多种角色于一体的大型宠物医疗&#xff0c;购物系…

Java 数据类型 -- Java 语言的 8 种基本数据类型、字符串与数组

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 004 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

1035 插入与归并(测试点6)

solution 类型判断&#xff1a;插入排序中已排序的部分有序&#xff0c;未排序的和原数组元素相同&#xff1b;否则为归并排序测试点6&#xff1a;对于归并排序的子序列长度&#xff0c;不能简单视为前k个有序则子序列长度就是k 例如该测试用例的归并排序的子序列长度应该为2&…

重新认识Word —— 制作简历

重新认识Word —— 制作简历 PPT的图形减除功能word中的设置调整页边距进行排版表格使用 我们之前把word长排版文本梳理了一遍&#xff0c;其实word还有另外的功能&#xff0c;比如说——制作简历。 在这之前&#xff0c;我们先讲一个小技巧&#xff1a; PPT的图形减除功能 …

记录一次被谷歌封号后又解封的过程

先提前恭祝2024年所有参加高考的学子们都能金榜题名&#xff0c;会的全对&#xff0c;不会的蒙的全对&#xff01; 一、背景 众所周知&#xff0c;谷歌、ios应用市场对app的审查都是极其严格的&#xff0c;开发者稍有不慎就会被谷歌下架应用&#xff0c;乃至封号。我们公司是做…

目标检测应用场景—数据集【NO.36】甘蔗叶片病害识别数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

error while loading shared libraries 找不到动态库问题如何解决

在使用 c 或 c 开发应用时&#xff0c;在启动程序时&#xff0c;有时会遇到这个错误&#xff0c;找不到动态库。这个时候&#xff0c;我们使用 ldd 来查看&#xff0c;发现可执行文件依赖的动态库显示为 not found。 1 实验代码 使用如下 3 个文件做实验。 hello.h 中声明了函…

Mysql使用中的性能优化——搭建Mysql的监测服务

大纲 环境安装配置Mysql安装设置root密码新增远程访问账户修改绑定地址重启 新增 MySQL Server Exporter 用户 安装启动mysqld_exporter安装启动新增配置启动直接启动以Service形式启动 安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动 测试参考资料…

地图商家数据怎么查看?揭秘采集软件工作原理!

地图商家数据怎么查看&#xff1f;其实主要就是两种方法&#xff1a; 1. 直接使用地图服务提供的API&#xff1a;大多数地图提供商&#xff08;如Google地图&#xff0c;百度地图等&#xff09;都会提供一些API&#xff0c;通过这些API&#xff0c;可以获取到它们所拥有的商家…

速卖通如何放关联?

大家都知道&#xff0c;想要进行多账号操作必须一再小心&#xff0c;否则会有很大的关联风险&#xff0c;而账号关联所带来的后果是卖家绝对不能轻视的&#xff0c;严重的话会导致封号&#xff0c;这样一来自己前期的辛苦运营就全都打水漂了&#xff0c;因此防关联很重要&#…

vue处理json数据

背景&#xff1a;后端返回的数据不是我想要的&#xff0c;现在需要把 name 替换为title&#xff08;小声蛐蛐&#xff1a;又让我处理数据&#xff09; 后端返回数据格式 修改字段操作&#xff1a;&#xff08;使用递归遍历的方式将title属性赋了name的值&#xff09; renderT…

转让北京劳务分包地基基础施工资质条件和流程

地基基础资质转让流程是怎样的?对于企业来说&#xff0c;资质证书不仅是实力的证明&#xff0c;更是获得工程承包的前提。而在有了资质证书后&#xff0c;企业才可以安心的准备工程投标&#xff0c;进而在工程竣工后获得收益。而对于从事地基基础工程施工的企业&#xff0c;需…

gpt、llama大模型模型结构细节探索

参考&#xff1a; https://github.com/naklecha/llama3-from-scratch&#xff08;一定要看看&#xff09; https://github.com/karpathy/build-nanogpt/blob/master/play.ipynb 视频&#xff1a; https://www.youtube.com/watch?vl8pRSuU81PU https://tiktokenizer.vercel…

基于python-CNN深度学习的水瓶是否装满水识别-含数据集+pyqt界面

代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89374853 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文…

花键轴类零件加工方法有哪些?

花键轴零件的加工方法 一辆普通中型卡车上约含 30 个花键轴零件, 通常用在离合器、变速器、传动轴总成、差速器、转向总成等位置。 花键轴零件的加工工艺是传统的切削加工和塑形成形加工两种。传统工艺如下的8个主要工序&#xff1a; 下料→锻造毛坯→毛坯加工→外花键加工…