C语言-4

排序算法简介

/*学习内容:冒泡排序(最基本的排序方法)选择排序(冒泡的优化)插入排序(在合适的位置插入合适的数据)
*//*排序分类:1.内部排序待需要进行排序的数据全部存放到内存中,再进行排序 2.外部排序在排序过程中,需要对外存进行访问待排序的数据数量很大,内存无法全部容纳所有的数据 
*/

冒泡排序

/*冒泡排序:---思路分析(以升序为例)在一排数据中,将第一个与第二个比较大小如果后面的数据比前面的小,就交换它们的位置(冒泡一次)然后比较第二个和第三个...直到比较第 n-1 个数据和第 n 个每一次比较都将较大的一个数据向后移动所以第 n 个是最大的所以就排好了一个数据(冒泡一趟)
*/# include <stdio.h>int main()
{// 定义一个无序一维数组int arr[] = { 5, 7, 9, 1, 6, 2, 4, 3, 0, 8 };// 遍历,打印数组printf("数组,排序前:\n");for (int i = 0; i < 10; i++){printf("%-3d", arr[i]);}// 冒泡排序(升序:由小到大)int temp;for (int i = 0; i < 9; i++){for (int j = 0; j < 9 - i; j++){if (arr[j] > arr[j + 1]){temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}// 展示排序后,数组当前的结果printf("数组,排序后:\n");for (int i = 0; i < 10; i++){printf("%-3d", arr[i]);}}

选择排序

/*选择排序:---思路分析(以升序为例)选择排序可以看作是冒泡排序的优化不再多次交换值,而是选择当前趟数的最大(或最小值),最后再交换在 n 个数里,先找到最大的数,并且记录下标,然后将这个数与第 n 个数交换如果第 n 个数是最大的,那就不需要交换,重复比较,直到所有的数据排好序
*/# include <stdio.h>int main()
{// 定义一个无序一维数组int arr[] = { 5, 7, 9, 1, 6, 2, 4, 3, 0, 8 };// 遍历,打印数组printf("\n 数组,排序前:\n");for (int i = 0; i < 10; i++){printf("%-3d", arr[i]);}// 选择排序(升序:由小到大)---> 选择排序:选择一个你认为最大的数int temp;int maxIndex;for (int i = 9; i > 0; i--){maxIndex = 0;    // 每次我都认为第一个最大,选择第一个,并记录下第一个的序号for (int j = 0; j <= i; j++){if (arr[maxIndex] < arr[j]){maxIndex = j;}}if (maxIndex != i){temp = arr[i];arr[i] = arr[maxIndex];arr[maxIndex] = temp;}}// 展示排序后,数组当前的结果printf("\n 数组,排序后:\n");for (int i = 0; i < 10; i++){printf("%-3d", arr[i]);}}

插入排序

/*插入排序:---思路分析(以升序为例)以第一个数为基准,后面的所有数都向着第一个数的方向,插队前进(这种插队不能跳着插队,只能插完一个继续接着插,前提是满足条件才能插队)其本质原理:依靠数与数之间的“相对关系”,从而将其整体排好序!1.轮到第一个数发挥            第一个数无法插队,它只能站着不动,停止插队2.轮到第二个数发挥            它和前面的数比较大小,若满足条件,则插一个队,然后停止插队(即:最多能够插队1次)3.轮到第三个数发挥            和前面的数比较大小,若满足条件,则插一个队,再继续和前面的数比较大小,若满足条件,则再插一个队,然后停止插队(即:最多能够插队2次)4.轮到第四个数发挥            比较大小,若可以,插一个队,再继续比较大小,若可以,再插一个队......(即:最多能够插队3次)5.轮到第五个数发挥            ......(即:最多能够插队4次)6.轮到第六个数发挥            ......(即:最多能够插队5次)*/# include <stdio.h>int main()
{// 定义一个无序一维数组int arr[] = { 7, 5, 9, 1, 6, 2, 4, 3, 0, 8 };// 遍历,打印数组printf("\n 数组,排序前:\n");for (int i = 0; i < 10; i++){printf("%-3d", arr[i]);}// 插入排序(升序:由小到大) int temp = 0;for (int i = 1; i < 10; i++)    // 轮到第 ?个数发挥{for (int j = i - 1; j >= 0; j--)    // 【比较、插队】,再【比较、插队】,再再【比较、插队】......{if (arr[j + 1] < arr[j])    // 满足插队条件{temp = arr[j + 1];arr[j + 1] = arr[j];arr[j] = temp;}else   // 不满足插队条件{break;        // 没有达到"最多能插队的次数",就停止插队了,请马上自我了断,不要再进行无意义的比较,从而提高效率}}}// 展示排序后,数组当前的结果printf("\n 数组,排序后:\n");for (int i = 0; i < 10; i++){printf("%-3d", arr[i]);}return 0;
}

线性表

/*1.线性表:---数据结构中最简单的一种存储结构,专门用于存储逻辑关系为"一对一"的数据 2.线性表存储结构,可细分为"顺序存储结构"和"链式存储结构",即如下所示线性表:1.顺序表(顺序存储结构)2.链表(链式存储结构)3.存储的类型要求使用线性表存储的数据,如同向数组中存储数据那样要求数据类型必须一致线性表存储的数据,要么全部都是整型,要么全部都是字符串一半整型,另一半是字符串的一组数据无法使用线性表存储4.前驱与后继:一组数据中的每个个体被称为“数据元素”(简称为“元素”)1.前驱某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”2.后继某一元素的后侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”
*/

在这里插入图片描述
在这里插入图片描述

顺序表

/*顺序表:---它对数据的物理存储结构有要求顺序表存储数据时,会提前申请一块足够大小的内存然后将数据依次存储起来存储时做到数据元素之间不留一丝缝隙(即:连续)*/

初始化顺序表

# include <stdio.h>
# include <malloc.h>// 定义表格类型
typedef struct
{int* head;        // 指针,存储申请的内存首地址int length;        // 当前数据个数int size;        // 元素个数(最大容量)}Table;// 生成表格的函数
Table tableFunc()
{Table t;        // 定义一个变量 t ,其类型为“表格类型”// t 表格的初始化t.size = 5;                                // 表格最大容量(元素个数) = 5t.length = 0;                            // 表格当前数据个数(元素个数)= 0t.head = (int*)calloc(t.size,sizeof(int));    // 为表格开辟内存,并把内存首地址赋值给 t.head// 注意!上面的申请内存操作可能会出现申请失败的情况,返回值为 NULLif (!NULL){printf("申请内存失败,程序终止!\n");exit(0);}return t;    // 返回 t 表格
}int main()
{Table myTab = tableFunc();printf("%d \n", myTab.size);printf("%d \n", myTab.length);printf("%X \n", myTab.head);    // 内存地址一般用 %X 十六进制展示return 0;
}

顺序表的增删查改

/*顺序表元素:1.查(可以使用查找算法:  1.顺序查找    2.二分法查找)2.改3.增(增加到前面、中间、后面)------知识点补充:扩容函数:realloc(需要扩容的指针"*p",扩容后总的大小)4.删
*/

链表

/*1.链表:1.链表是通过指针,将不连续的内存连接起来,实现链式存储的2.内存实际上是不同时机申请的,地址不一定连续,但是可以通过指针联系起来3.链表是数据结构中线性表的一种,其中的每个元素实际上是一个“单独的结构体变量”,所有变量都“通过”每个元素中的“指针”连接在一起。4.以结构体为节点,将一个结构体看成“数据域”和“指针域”两个部分,“数据域”用于“存储数据”,“指针域”用于“连接下一个节点”,链表中每个结构体对象叫做节点,其中,第一个数据节点,叫做链表的“首元结点”。5.如果第一个节点不用于存储数据,只用于代表链表的起始点,则这个结点称为链表的“头结点”。2.链表特点:1.没有固定长度2.可以快速的插入和删除链表中的节点3.链表分很多种,单链表是其中最简单的一种(如下图)*/

在这里插入图片描述

单链表

/*<单链表>1.链表节点一般是自定义的结构体类型2.结构体一般包含两部分:数据、指针数据:当前节点里面需要的数据指针:指向下一个节点(最后一个节点置空 为“尾节点”) */

在这里插入图片描述

创建单链表

  • 项目结构
    在这里插入图片描述

  • 源代码

// main.c# include <stdio.h>
# include "myList.h"int main()
{Node* pList=CreateList(5);    // 创建一个可以存储5个东西的链表,并将返回值“地址”赋值给变量 pListshowList(pList);    // 展示链表return 0;
}
// myList.c# include <stdio.h>
# include "myList.h"
# include <stdlib.h>    // 申请内存时候要用/*
创建链表
参    数:长度
返回值:头指针
*/
Node* CreateList(int length)
{// 判断长度if (length <= 0){printf("Length Error!\n");return NULL;}// 开始创建链表// 1.创建头指针和尾指针Node *phead, *ptail;phead = ptail = NULL;// 2.申请内存:头结点phead = (Node*)malloc(sizeof(Node));// 3.处理异常情况if (NULL == phead){perror("malloc failed!");exit(EXIT_FAILURE);}// 4.给头结点初值phead->pnext = NULL;    // 等价于 (*phead).pnext = NULL;phead->num = 0;// 5.尾指针ptail = phead;// 6.向头结点后面添加结点Node* p;DataType n;for (int i = 0; i < length; i++){// 6.1 申请一个结点,检测,给值p= (Node*)malloc(sizeof(Node));if (NULL == p){perror("malloc failed!");exit(EXIT_FAILURE);}p->pnext = NULL;printf("请输入数值>>>");scanf("%d", &n);p->num = n;// 6.2 将新申请的结点添加到链表中ptail->pnext = p;ptail = p;        // 更新尾结点}return phead;    // 9.返回头指针
}/*
遍历链表
参    数:头指针
返回值:空
*/
void showList(const Node* const p)
{// 从首元结点开始遍历,而不是头结点(因为我们不使用头结点去存储值)Node* temp = p->pnext;if (NULL == temp){printf("List is NULL!\n");return ;}printf("\n*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");printf("当前链表数据:\n");while (temp){printf("%-5d", temp->num);temp = temp->pnext;}printf("\n*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
}
// myList.h#ifndef _MYLIST_    // 防止重复定义
#define    _MYLIST_typedef int DataType;    // 可以灵活改变数据类型struct node
{struct node* pnext;        // 指针域DataType num;            // 数据域
};typedef struct node Node;    // 给结构体类型取别名/*创建链表参    数:长度返回值:头指针
*/
Node* CreateList(int length);/*遍历链表参    数:头指针返回值:空
*/
void showList(const Node* const p);#endif    // _MYLIST_ 定义结束

单链表的查改增删

/*单链表的查、改、增、删1.查:确定查找方式,查找之后一般会返回“结点首地址”或者返回 NULL2.改:找到目标元素,直接修改该元素的值3.增:一定注意不能丢失指针指向4.删:记得释放内存*/

/*栈的定义:---栈是一种只能从表的一端存储数据,且遵循“先进后出”原则的"线性存储结构"1.栈只能从一端(栈顶)取出,另一端(栈底)是封闭的2.在栈中,都必须从“栈顶”存储数据,且遵循“先进后出”原则入栈和出栈:1.入栈:将数据存到栈里面去 2.出栈:将数据从站里面取出来栈的实现方法:---栈:“特殊”的线性存储结构1.顺序表:顺序栈(顺序存储结构)2.链  表:链  栈(链式存储结构)*/

在这里插入图片描述

实现顺序栈

# include <stdio.h>/* 1.元素入栈 */
// 参  数:存储结构,栈顶 top,数据 value
// 返回值: top
int putEle(int* arr, int top, int value)
{arr[++top] = value;return top;
}/* 2.元素入栈 */
// 参  数:存储结构,栈顶 top
// 返回值: top
int takeEle(int* arr, int top)
{// 先判断if (top <= -1){printf("操作失败!空栈!\n");return -1;}printf("当前出栈元素的值:%d\n", arr[top]);top--;return top;
}int main()
{// 顺序表:为了理解简单化,我们使用列表int a[100];// top (记录栈顶)int top = -1;// 入栈(入5个)top = putEle(a, top, 1);top = putEle(a, top, 2);top = putEle(a, top, 3);top = putEle(a, top, 4);top = putEle(a, top, 5);// 出栈(出6个)top = takeEle(a, top);top = takeEle(a, top);top = takeEle(a, top);top = takeEle(a, top);top = takeEle(a, top);top = takeEle(a, top);return 0;
}

实现链栈

/*链栈:一般来说,我们将链表的“头结点”作为栈顶,“尾结点”作为栈底,这样的效率高一些(如图所示)注意事项:“头结点”是不断更新的,即“头结点”永远是“刚进来”的那个“尾结点”是不会更新的,即“尾结点”永远是“第一个进来”的那个---如果用另外一种方式:头结点”作为栈底,“尾结点”作为栈顶,这种方式,每次新的元素入栈,都要从栈底遍历一遍到栈顶,才能入栈成功将会遍历很多次,效率非常低下
*/

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>typedef struct Node
{int data;struct Node* pnext;}Node;// 入栈函数
Node* eleIn(Node* p, int num)
{Node* temp = (Node*)malloc(sizeof(Node));temp->data = num;temp->pnext = p;p=temp;printf("当前进栈元素的值:%d\n", num);return p;
}// 出栈函数
Node* eleOut(Node* p)
{if (p){Node* temp = p;printf("当前出栈元素的值:%d\n", temp->data);p = temp->pnext;free(temp);temp = NULL;}else{printf("栈是空的!\n");}return p;
}int main()
{Node* p = NULL;// 进栈(5次)p = eleIn(p, 1);p = eleIn(p, 2);p = eleIn(p, 3);p = eleIn(p, 4);p = eleIn(p, 5);printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");// 出栈(6次)p = eleOut(p);p = eleOut(p);p = eleOut(p);p = eleOut(p);p = eleOut(p);p = eleOut(p);return 0;
}

队列

/*<队列>1. 什么是队列队列:两端“开口”要求:只能从一端进入队列,另一端出队列2.队头和队尾队头:数据出队列的一端队尾:数据进队列的一端 3.实现队列1.顺序表:顺序队列2.链表:链式队列*/

在这里插入图片描述

顺序队列

在这里插入图片描述

#include <stdio.h>// 进队函数
int eleIn(int* arr,int tail,int num)
{arr[++tail] = num;printf("当前进入队列元素的值:%d\n", num);return tail;
}// 出队(全部出队)
void allOut(int* arr, int head, int tail)
{while (head != tail){printf("当前离开队列元素的值:%d\n", arr[head++]);}printf("当前离开队列元素的值:%d\n", arr[head++]);
}int main()
{int a[10];    // 定义数组,用于存储数据int head = 0;int tail = -1;// 入队(进入5)tail = eleIn(a, tail, 1);tail = eleIn(a, tail, 2);tail = eleIn(a, tail, 3);tail = eleIn(a, tail, 4);tail = eleIn(a, tail, 5);printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");// 出队(全出去)allOut(a, head, tail);return 0;
}

链式队列

#include <stdio.h>
#include <stdlib.h>// 创建结点类型
typedef struct QNode
{int data;struct QNode* pnext;
}QNode;// 生成“头结点”的函数
createQueue()
{QNode* temp = (QNode*)malloc(sizeof(QNode));temp->data = 0;temp->pnext = NULL;return temp;
}// 入队
eleIn(QNode* p, int num)    // 参数:(尾指针,要存储的数据)
{QNode* temp = (QNode*)malloc(sizeof(QNode));temp->data = num;printf("当前进入队列元素的值:%d\n", num);temp->pnext = NULL;p->pnext = temp;p = temp;return p ;
}// 出队
void eleOut(QNode* phead)
{if (phead->pnext)    // “头结点”存储的地址不为空{QNode* temp = phead->pnext;    // “头结点”后面的首元结点printf("当前离开队列元素的值:%d\n", temp->data);phead->pnext = temp->pnext;free(temp);temp = NULL;}else{printf("队列为空!\n");}// return ;
}int main()
{// 头指针和尾指针QNode* phead = NULL;QNode* ptail = NULL;// “上面的两针”都指向生成的“头结点”phead = ptail = createQueue();// 入队(进入5)ptail = eleIn(ptail, 1);ptail = eleIn(ptail, 2);ptail = eleIn(ptail, 3);ptail = eleIn(ptail, 4);ptail = eleIn(ptail, 5);printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");// 出队(出去6)eleOut(phead);eleOut(phead);eleOut(phead);eleOut(phead);eleOut(phead);eleOut(phead);return 0;
}

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

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

相关文章

[职场] C++开发工程师的岗位职责 #学习方法#笔记

C开发工程师的岗位职责 C开发工程师是利用C语言设计完成软件系统底层模块功能&#xff1b;测试软件模块和软集成产品&#xff0c;进行软件故障的诊断、定位、分析和调试&#xff0c;实施产品测试方案&#xff1b;向业务部门提供软件的后期技术支持。C开发工程师是负责使用C编程…

知识融合前沿技术:构建多模态、公平高效的大规模知识表示

目录 前言1 无监督对齐&#xff1a;构建智能实体关联2 多视角嵌入&#xff1a;提高数据利用效率3 嵌入表示增强&#xff1a;挑战节点相似性&#xff0c;对抗训练解决4 大规模实体对齐&#xff1a;克服模糊性和异构性结论 前言 在信息时代&#xff0c;知识融合成为推动人工智能…

全链游戏的未来趋势与Bridge Champ的创新之路

为了充分探索全链游戏的特点和趋势&#xff0c;以及Bridge Champ如何作为一个创新案例融入这一发展脉络&#xff0c;我们需要深入了解这两者之间的互动和相互影响。全链游戏&#xff0c;或完全基于区块链的游戏&#xff0c;代表了游戏行业的一个重要转型&#xff0c;它们利用区…

kafka-splunk数据通路实践

目的&#xff1a; 鉴于目前网络上没有完整的kafka数据投递至splunk教程&#xff0c;通过本文操作步骤&#xff0c;您将实现kafka数据投递至splunk日志系统 实现思路&#xff1a; 创建kafka集群部署splunk&#xff0c;设置HTTP事件收集器部署connector服务创建connector任务&a…

re:从0开始的CSS学习之路 1. CSS语法规则

0. 写在前面 现在大模型卷的飞起&#xff0c;感觉做页面的活可能以后就不需要人来做了&#xff0c;不知道现在还有没有学前端的必要。。。 1. HTML和CSS结合的三种方式 在HTML中&#xff0c;我们强调HTML并不关心显示样式&#xff0c;样式是CSS的工作&#xff0c;现在就轮到C…

6、基于机器学习的预测

应用机器学习的任何预测任务与这四个策略。 文章目录 1、简介1.1定义预测任务1.2准备预测数据1.3多步预测策略1.3.1多输出模型1.3.2直接策略1.3.3递归策略1.3.4DirRec 策略2、流感趋势示例2.1多输出模型2.2直接策略1、简介 在第二课和第三课中,我们将预测视为一个简单的回归问…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(上篇)——正会论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…

Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展

转自 极客时间 Redis主从架构 redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a; 1、复制一份redis.conf文件2、将相关配置修改为如下值&#xff1a; port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" …

FPGA解码MIPI视频:Xilinx Artix7-35T低端FPGA,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案本方案在Xilinx Artix7-100T上解码MIPI视频的应用本方案在Xilinx Kintex7上解码MIPI视频的应用本方案在Xilinx Zynq7000上解码MIPI视频的应用本方案在Xilinx Zynq UltraScale上解码MIPI视频的应用纯VHDL代码解…

验证码倒计时:用户界面的小细节,大智慧

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 验证码倒计时&#xff1a;用户界面的小细节&#xff0c;大智慧 前言为什么需要验证码倒计时防止滥用&#xff1a;用户心理&#xff1a; 设计考量可见性&#xff1a;友好性&#xff1a;适应性&#xff…

打开/关闭请求回显功能的echo命令

echo命令可用来显示或隐藏DOS状态屏幕显示的内容。在*.bat文件第一行加上echo off&#xff0c;以后的屏幕输出命令&#xff08;包括其他命令产生的提示&#xff09;都会消失&#xff0c;比如在echo off的下一行使用dir&#xff0c;结果是光标原地闪烁&#xff0c;屏幕无显示。使…

安装PyInstaller的保姆级教程

一、安装PyInstaller之前首先要安装Python&#xff0c;小编这里安装的是Python3.9&#xff0c;目前&#xff08;2024/2/6&#xff09;匹配到的最高版本的PyInstaller的版本为6.3.0。需要安装Python的小伙伴可以去这里安装python详细步骤&#xff08;超详细&#xff0c;保姆级&a…

JavaScript运行机制

在web前端开发中&#xff0c;JavaScript无疑是一种非常重要的编程语言。它能够为网页添加动态交互功能&#xff0c;提升用户体验。然而&#xff0c;要充分发挥JavaScript的威力&#xff0c;我们需要对它的运行机制有一定的了解。 JavaScript是一种解释执行的脚本语言&#xff…

SpringCloud-搭建Nacos服务中心

Nacos 是一个开源的动态服务发现、配置管理和服务管理平台。它支持多种服务发现协议&#xff0c;包括基于 DNS 和 HTTP 的服务发现。Nacos 提供了强大的配置管理和服务发现功能&#xff0c;使得在微服务架构中轻松实现服务注册、发现和配置管理成为可能。在本篇博客中&#xff…

【Web】小白也能看懂的BeginCTF个人wp(全)

纯萌新&#xff0c;贴出自己的wp&#xff0c;一起交流学习QWQ 目录 zupload zupload-pro zupload-pro-plus zupload-pro-plus-max zupload-pro-plus-max-ultra zupload-pro-plus-max-ultra-premium zupload-pro-revenge zupload-pro-plus-enhanced POPgadget sql教…

09_树莓派_树莓派外设板_GPIO_按键的中断与消抖

目录 1.树莓派外设集成板总体介绍 2.第一部分 按键矩阵 GPIO_按键与中断 3.实现效果 1.树莓派外设集成板总体介绍 1&#xff09;前言&#xff1a;这是一块为了验证树莓派【兼容树莓派多个型号】的40pins的外设接口的外接板&#xff0c;告别复杂的面包板外设搭建。【欢迎各位…

R语言绘图教程 | 双侧条形图绘制教程

写在前面 双侧条形图在我们的文章中也是比较常见的,那么这样的图形是如何绘制的呢? 以及它使用的数据类型是什么呢? 这些都是我们在绘制图形前需要掌握的,至少我们知道绘图的数据集如何准备,这样才踏出第一步。 今天的教程,我们会从数据的准备,以及数据如何整理,以及…

OpenCV+ moviepy + tkinter 视频车道线智能识别项目源码

项目完整源代码&#xff0c;使用 OpenCV 的Hough 直线检测算法&#xff0c;提取出道路车道线并绘制出来。通过tkinter 提供GUI界面展示效果。 1、导入相关模块 import matplotlib.pyplot as plt import numpy as np import cv2 import os import matplotlib.image as mpimg …

Halcon 缺陷检测

文章目录 开闭运算&#xff0c;腐蚀膨胀的亮点问题灰度图像的开闭运算&#xff0c;腐蚀膨胀的亮点问题算子二值化算子 Halcon blob特征处理的方法检测缺陷Halcon Blob特征差分的方法检测缺陷Halcon 极坐标变换&#xff08;环形先转换坐标&#xff09;blob特征Halcon Blob局部二…

系统分析师-22年-下午答案

系统分析师-22年-下午答案 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选其中两题作答 试题一 (25分) 说明 某软件公司拟开发一套博客系统&#xff0c;要求能够向用户提供一个便捷发布自已心得&#xff0c;及时有效的…