算法设计与分析实验报告c++实现(生命游戏、带锁的门、三壶谜题、串匹配问题、交替放置的碟子)
一、实验目的
1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;
2.提高学生利用课堂所学知识解决实际问题的能力;
3.提高学生综合应用所学知识解决实际问题的能力。
二、实验任务
1、 编写一个生命游戏:
规则如下:(或者网上找到更详细的规则)
一个人可以有8个邻居;
一个人若只有一个邻居,在下一代会孤独的死去;
若有2或3个邻居,在下一代依然活着;
若有4个或以上邻居,在下一代会因拥挤而死;
死去的人若有3个邻居,在下一代会复活;
所有的死去或复活都在下一代变化时同时发生。
2、 带锁的门:
在走廊上有n个带锁的门,从1到n依次编号。最初所有的门都是关着的。我们从门前经过n次,每次都从1号门开始。在第i次经过时(i = 1,2,…, n)我们改变i的整数倍号锁的状态;如果门是关的,就打开它;如果门是打开的,就关上它。在最后一次经过后,哪些门是打开的,哪些门是关上的?有多少打开的门?
3、三壶谜题:
有一个充满水的8品脱的水壶和两个空水壶(容积分别是5品脱和3品脱)。通过将水壶完全倒满水和将水壶的水完全倒空这两种方式,在其中的一个水壶中得到4品脱的水。
4、串匹配问题
给定一段文本,在该文本中查找并定位任意给定字符串。
要求:
(1)实现BF算法;(必做)
(2) 实现BF算法的改进算法:KMP算法和BM算法;(选做)
5、交替放置的碟子
我们有数量为2n的一排碟子,n黑n白交替放置:黑,白,黑,白…
现在要把黑碟子都放在右边,白碟子都放在左边,但只允许通过互换相邻碟子的位置来实现。为该谜题写个算法,并确定该算法需要执行的换位次数。
三、实验设备及编程开发工具
实验设备:win10电脑
编程开发工具:Microsoft Visual c++
四、实验过程设计(算法设计过程)
(一)、生命游戏
1、算法分析
规则如下:(或者网上找到更详细的规则)
一个人可以有8个邻居;一个人若只有一个邻居,在下一代会孤独的死去;
若有2或3个邻居,在下一代依然活着;若有4个或以上邻居,在下一代会因拥挤而死;
死去的人若有3个邻居,在下一代会复活;所有的死去或复活都在下一代变化时同时发生。
可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后, 可以得到第一代细胞图。继续让规处理当前的细胞图,可以得到下一代的细胞图,周而复始。在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。
2、源代码
// 生命游戏.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
#define NUM_CELL_CUBE_MODEL 5
//定义细胞结构
struct Cell
{bool live; //标志是否存活int others; //标志周围的存活细胞数
};int _tmain(int argc, _TCHAR* argv[])
{//定义细胞数组Cell cell[NUM_CELL_CUBE_MODEL][NUM_CELL_CUBE_MODEL];//步骤1:初始化,把所有格子的细胞初始化成活的,周围没有其他细胞for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){cell[i][j].live = true;cell[i][j].others = 0;}}//初始化值可以自己设定for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){cell[i][j].live = false;cell[i][j].others = 0;}}cell[0][2].live = true;cell[1][2].live = true;cell[2][2].live = true;cell[3][2].live = true;cell[4][2].live = true;//步骤2:细胞不断变化while (1){//步骤2.1:遍历所有细胞,进行显示,并统计周围数量for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){//步骤2.1.1:每次变化前,先把每个细胞周围死亡数量设为0cell[i][j].others = 0;//步骤2.1.2:每个细胞如果是活的标记★,死的标记☆if (cell[i][j].live){cout << "★ ";}else{cout << "☆ ";}//步骤2.1.3:检测八个方向是否有存活细胞,计算每一个细胞的周围存活数if ((i - 1) >= 0 && (j - 1) >= 0 && cell[i - 1][j - 1].live)cell[i][j].others++;if ((i - 1) >= 0 && cell[i - 1][j].live)cell[i][j].others++;if ((i - 1) >= 0 && (j + 1) < NUM_CELL_CUBE_MODEL && cell[i - 1][j + 1].live)cell[i][j].others++;if ((j - 1) >= 0 && cell[i][j - 1].live)cell[i][j].others++;if ((j + 1) < NUM_CELL_CUBE_MODEL && cell[i][j + 1].live)cell[i][j].others++;if ((i + 1) < NUM_CELL_CUBE_MODEL && (j - 1) >= 0 && cell[i + 1][j - 1].live)cell[i][j].others++;if ((i + 1) < NUM_CELL_CUBE_MODEL && cell[i + 1][j].live)cell[i][j].others++;if ((i + 1) < NUM_CELL_CUBE_MODEL && (j + 1) < NUM_CELL_CUBE_MODEL && cell[i + 1][j + 1].live)cell[i][j].others++;}cout << endl << endl;}//步骤2.2:根据统计数量,重新计算下一刻的存活情况for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){//步骤2.2.1:活着的可能死if (cell[i][j].live){switch (cell[i][j].others){case 2:case 3:cell[i][j].live = true; break;default:cell[i][j].live = false; break;}}//步骤2.2.2:死了的可能活else{if (cell[i][j].others == 3){cell[i][j].live = true;}}}}//每1秒刷新一次Sleep(1000);//清楚屏幕函数system("cls");}return 0;
}
(二)、带锁的门
1、门的状态只有两 种,每经过一次,状态就会发生变化。如果一道门经过奇数次,那么结果状态和原始状态就会不一样,而经过偶数次则不会发生变化。因此问题的关键就是找出那些 经过奇数次的门有多少道。很幸运,那些门的编号正好是整数i的完全平方数即1,4,9,16,…,因此只需要找出这样的数字有多少个即可。
如:假设n = 5
0表示门是关着的,1表示门打开的
一 二 三 四 五
一 1 1 1 1 1
二 1 0 1 0 1
三 1 0 0 0 1
四 1 0 0 1 1
五 1 0 0 0 0
可以发现对角线上的数字就是最后门打开的情况,正好是i的平方数
2、源代码
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX 10000;
int remainder(int n,int i)
{int remainder = 1;remainder = n%i;if(remainder == 0)return 1;
}
int main(int argc, char **argv)
{int n;int remaind = 0;printf("please input a num:\n");scanf("%d",&n);if (n > 10000){printf("your num is too large!please try it again:");scanf("%d",&n);}int door[10000];for(int i = 0;i < 10000;i++){door[i] = -1;}for ( i = 1;i < n+1;i++){for(int j = 1;j < n;j++){remaind = remainder(j,i);if(remaind ==1)door[j] = door[j] * (-1);}}printf("which door is open:\n");for(int k = 1;k < n;k++){if(door[k] > 0)printf("%d ",k);}printf("\n");printf("which door is close:\n");for( k = 1;k < n;k++){if(door[k] < 0)printf("%d ",k);}printf("\n");system("pause");return 0;
}
(三)、三壶谜题
1、算法分析
可以把每次三个水壶中水的量组成一个状态,比如初始状态为008,对应第一个水壶0品脱水,第二个水壶0品脱水,第三个水壶8品脱水。对题目的状态空间图进行广度优先遍历。当表示状态的数字中出现4时,即求出答案。
为了打印出倒水的过程,需要声明一个前置状态保存当前状态由哪个状态转换而来,然后就可以回溯到初始状态,打印出倒水过程。相当于树中的父结点。
可以声明一个map表,保存已有的状态,对已有的状态,就不再向下继续遍历,这样可以节省求解时间。
因为是广度优先遍历,所以第一次解得的答案所需的倒水的次数最少,解为最优解。
2、源代码
#include <iostream>
#include <vector>
#include <map>
#define MaxFirst 3
#define MaxSecond 5
#define MaxThird 8
using namespace std;
class State
{
public:int second;int num[3];State* preState;static map<int,int> mapping;
public:State(int first,int second,int third){num[0]=first;num[1]=second;num[2]=third; }void init(){ mapping[0]=MaxFirst;mapping[1]=MaxSecond;mapping[2]=MaxThird;}bool canPour(int from,int to)//判断是否可以从from水壶中倒水到to水壶中{if(num[from]==0){return false;}if(num[to]==mapping[to]){return false;}else {return true;}}void pour(int from,int to)//倒水过程{if(num[from]+num[to]>mapping[to]){num[from]=num[from]-(mapping[to]-num[to]);num[to]=mapping[to];}else{num[to]=num[to]+num[from];num[from]=0;}}
};
map<int,int> State::mapping;int main()
{map<int,int> states;State *start=new State(0,0,8);start->init();State *state=start;State *endState=new State(8,8,8);//只有获得解endState才会改变,赋值全为8为了方便判断是否获得最终解vector<State> action;//保存所有状态对象action.push_back(*start);//把初始状态先加入队列中int n=0;do{for(int i=0;i<3;i++)//双层循环为从i水壶中倒水入j水壶中{for(int j=0;j<3;j++){if(i!=j){if(state->canPour(i,j)){state->pour(i,j);if(states[state->num[0]*100+state->num[1]*10+state->num[2]]==0)//如果该状态不在hash表中,即为第一次出现该状态{states[state->num[0]*100+state->num[1]*10+state->num[2]]++;(state->preState)=new State(action[n]);action.push_back(*state);if(state->num[0]==4||state->num[1]==4||state->num[2]==4)//获得解{endState=state;i=4;break; }}}}*state=action[n];} }n++;}while(endState->num[0]==8&&endState->num[1]==8&& n<action.size());cout<<endState->num[0]<<" "<<endState->num[1]<<" "<<endState->num[2]<<endl;state=endState;do{state=state->preState;cout<<state->num[0]<<" "<<state->num[1]<<" "<<state->num[2]<<endl; }while(state->num[2]!=8);return 0;
}
(四)、串匹配问题
1、 算法分析
蛮力法(brute force method,也称为穷举法或枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法。但是,用蛮力法设计的算法时间特性往往也是最低的,典型的指数时间算法一般都是通过蛮力搜索而得到的。
BF算法:
暴力检索法是最好想到的算法,也最好实现,在情况简单的情况下可以直接使用:
首先将原字符串和子串左端对齐,逐一比较;如果第一个字符不能匹配,则子串向后移动一位继续比较;如果第一个字符匹配,则继续比较后续字符,直至全部匹配。
2、 源代码
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;
// 蛮力算法
int BF(string ts, string ps)
{int i = 0; // 主串的位置int j = 0; // 模式串的位置while (i < ts.length() && j < ps.length()){if (ts[i] == ps[j]) { // 当两个字符相同,就比较下一个i++;j++;}else {i = i - j + 1; // 一旦不匹配,i后退j = 0; // j归0}}if (j == ps.length()) {return i - j;}else {return -1;}
}
// KMP算法计算KMP值(Next值)
//当T[i] != P[j]时
//有T[i - j ~i - 1] == P[0 ~j - 1]
//由P[0 ~k - 1] == P[j - k ~j - 1]
//必然:T[i - k ~i - 1] == P[0 ~k - 1]
vector<int> getNext(string ps)
{vector<int> next;next.push_back(-1);int j = 0;int k = -1;while (j < ps.length() - 1) {if (k == -1 || ps[j] == ps[k]) {++j;next.push_back(++k);}else{k = next[k];}}return next;
}
// KMP算法
int KMP(string ts, string ps)
{int i = 0; // 主串的位置int j = 0; // 模式串的位置vector<int> next = getNext(ps);while (i < ts.length() && j < ps.length()) {if (j == -1 || ts[i] == ps[j]){// 当j为-1时,要移动的是i,当然j也要归0i++;j++;}else{// i不需要回溯了j = next[j]; // j回到指定位置}}if (j == ps.length()){return i - j;}else {return -1;}
}
int _tmain(int argc, _TCHAR* argv[])
{string A, B;cout << "请输入主串:";cin >> A;cout << "请输入要查找的字符串:";cin >> B;//使用蛮力算法求解int nPosition = BF(A, B);//使用KMP算法求解//int nPosition = KMP(A, B);if (nPosition != -1){cout << "在第" << nPosition + 1 << "个位置,找到了子串!\n";}else{cout << "没有找到子串!\n";}system("pause");return 0;
}
(五)、交替放置的碟子
1、 算法分析
2、
首先把问题转化一下,用1表示黑碟子,0表示白碟子,那么目前的顺序是:
1010…1010
结果要求1都放在右边,0都放在左边。这个题目看起来很眼熟。看关键字:交换相邻的碟子,排好顺序。嗯,就是经常出现在面试中的冒泡排序了。
为便于观察,假设目前有6个碟子:101010。使用冒泡排序,第一次迭代,碟子序列变为:010101,交换3次。在进行第二次迭代之前,观察一下。
现在,不仅第一个碟子就位,最后一个也是了,因此第二次迭代只需要对第2到第5个进行排序,巧合的是,碟子[2->5]仍然是10交替出现,不过比上一次少了两个,这样就简单了,可以得到结论:对于2n个碟子,可以使用n次迭代完成,交换的次数分别是:n+(n-1)+…+2+1,即n(n+1)/2。
2、源代码
#include "stdafx.h"
#include <string>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define PROBLEM_LARGE 10
#define ALL_CATE_NUM PROBLEM_LARGE*2
static string arrAllCate[ALL_CATE_NUM];
//交替算法:方法1
void WayChange1()
{int nChangePosition = 0;int nCirCle = 0;for (int i = 0; i < PROBLEM_LARGE; ++i){int nNow = i + 1;do{if (arrAllCate[nNow - 1] != arrAllCate[nNow]){//交换两个相邻元素值string strRange = arrAllCate[nNow - 1];arrAllCate[nNow - 1] = arrAllCate[nNow];arrAllCate[nNow] = strRange;//交换次数加1++nChangePosition;}++nNow;//循环次数加1++nCirCle;} while (nNow < ALL_CATE_NUM);//每一趟的结果都输出出来cout << "第" << i + 1 << "趟结果:";for (int j = 0; j < ALL_CATE_NUM; ++j){cout << arrAllCate[j] << " ";}cout << endl << endl;}cout << "交换次数:" << nChangePosition << endl;cout << "循环次数:" << nCirCle << endl;
}
//交替算法:方法2
void WayChange2()
{int nChangePosition = 0;int nCirCle = 0;for (int i = 0; i < PROBLEM_LARGE;++i){int head = i;int tail = ALL_CATE_NUM - i - 1;do{if (tail - head == 1){string strMid = arrAllCate[head];arrAllCate[head] = arrAllCate[tail];arrAllCate[tail] = strMid;//交换次数加1++nChangePosition;}else{string strRangehead = arrAllCate[head];arrAllCate[head] = arrAllCate[head + 1];arrAllCate[head + 1] = strRangehead;string strRangetail = arrAllCate[tail];arrAllCate[tail] = arrAllCate[tail - 1];arrAllCate[tail - 1] = strRangetail;//交换次数加2nChangePosition +=2;}head += 2;tail -= 2;//循环次数加1++nCirCle;} while (head < tail);//每一趟的结果都输出出来cout << "第" << i + 1 << "趟结果:";for (int j = 0; j < ALL_CATE_NUM; ++j){cout << arrAllCate[j] << " ";}cout << endl << endl;}cout << "交换次数:" << nChangePosition << endl;cout << "循环次数:" << nCirCle << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{// 初始化棋子cout << "初始化棋子如下:";for (int i = 0; i < ALL_CATE_NUM; ++i){int nCount = i + 1;if (nCount % 2 == 0){arrAllCate[i] = "☆";}else{arrAllCate[i] = "★";}cout << arrAllCate[i] << " ";}cout << endl << endl;WayChange1();//WayChange2();system("pause");return 0;
}
五、实验结果及算法复杂度分析
(一)、生命游戏
1、实验结果
2 算法复杂度分析
时间复杂度: O ( 4 n 2 ) O(4n^2) O(4n2)
(二)、带锁的门
1、实验结果
2 算法复杂度分析
时间复杂度: O ( n 2 + 2 n ) O(n^2+2n) O(n2+2n)
(三)、三壶谜题
1、实验结果
2 算法复杂度分析
时间复杂度: O ( n 2 ) O(n^2) O(n2)
(四)、串匹配问题
1、实验结果
2 算法复杂度分析
最坏时间复杂度: O ( m ∗ n ) O(m*n) O(m∗n)
(五)、交替放置的碟子
1、实验结果
2 算法复杂度分析
时间复杂度:O(n(n+1)/2)
实验小结(包括问题和解决方法、心得体会等)
通过本次实验我对分治算法有了不错的掌握和更深的的了解,对其求解原理也有了实际解决的经验。分治算法就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。同时也对蛮力算法有了进一步的认识,它是一种简单直接地解决问题的方法,在有些情况下处理问题效率更高。
相关文章:

算法设计与分析实验报告c++实现(生命游戏、带锁的门、三壶谜题、串匹配问题、交替放置的碟子)
一、实验目的 1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 编…...

【电子通识】热风枪的结构与使用方法
热风枪的结构 热风枪是专门用来拆焊、焊接贴片元器件和贴片集成电路的焊接工具,它主要由主机和热风焊枪两大部分构成。 热风枪主要有电源开关、风速设置、温度设置、热风连接等部件组成。根据不同品牌和价位的热风枪,有一些功能齐全的也集成了烙铁功能。…...

mysql知识点
MySQL 中有哪几种锁 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小&…...

css Animation 动画-右进左出
transform: rotate(旋转) | scale(缩放) | skew(倾斜) | translate(移动) ;<style> .jinggao {width: 60vw;display: inline-block;text-align: center;overflow: hidden;box-…...

第十三届蓝桥杯省赛大学B组填空题(c++)
A.扫雷 暴力模拟AC: #include<iostream> using namespace std; const int N105; int n,m,map[N][N],ans[N][N]; int dx[8]{-1,-1,0,1,1,1,0,-1}; int dy[8]{0,1,1,1,0,-1,-1,-1}; int count(int x,int y){int cnt0;for(int i0;i<8;i){int xxxdx[i];int yyydy[i];if(…...

天星金融(原小米金融)深耕金融知识领域,助力消费者提升金融素养
近年来,依托生活和消费品质不断提升的时代契机,信用卡持卡人的数量以及信用卡消费的频率不断增加,信用卡还款问题也日益凸显。部分不法分子打着“智能还款”、“精养提额”的口号“踏浪”入场,实则行诱导、诈骗之实。天星金融&…...

中国手机频段介绍
中国目前有三大运营商,分别是中国移动、中国联通、中国电信,还有一个潜在的运营商中国广电,各家使用的2/3/4G的制式略有不同 中国移动的GSM包括900M和1800M两个频段。 中国移动的4G的TD-LTE包括B34、B38、B39、B40、B41几个频段,…...

企业如何使用SNP Glue将SAP与Snowflake集成?
SNP Glue是SNP的集成技术,适用于任何云平台。它最初是围绕SAP和Hadoop构建的,现在已经发展为一个集成平台,虽然它仍然非常专注SAP,但可以将几乎任何数据源与任何数据目标集成。 我们客户非常感兴趣的数据目标之一是Snowflake。Sno…...

算法设计与分析实验报告c++实现(最近点对问题、循环赛日程安排问题、排序问题、棋盘覆盖问题)
一、实验目的 1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、最…...

Vue - 你知道Vue中computed和watch的区别吗
难度级别:中高级及以上 提问概率:70% 二者都是用来监听数据变化的,而且在日常工作中大部分时候都只是局限于简单实用,所以到了面试中很难全面说出二者的区别。接下来我们看一下,二者究竟有哪些区别呢? 先说computed,它的主要用途是监听…...
POJ2976 Dropping tests——P4377 [USACO18OPEN] Talent Show G 【分数规划二分法+贪心/背包】
POJ2976 Dropping tests 【分数规划二分法+贪心】 有 n 个物品,每个物品有两个权值 a 和b。你可以放弃 k 个物品,选 n-k 个物品,使得最大。 输入多个样例,第一行输入n 和 k,第二行输入n 个 ai ,第三行输入 n 个 bi,输入 0 0 结束。 输出答案乘100 后四舍五入到整数…...

【生产实习-毕设】pyspark学生成绩分析与预测(上)
注意:数据由实习单位老师提供(需要自行搜索下载),页面美化为下载模板。 项目介绍:前端页面输入影响成绩的属性,预测出成绩,并作可视化展示——属性对成绩的影响。使用python pyspark 进行数据预…...

【华为笔试题汇总】2024-04-10-华为春招笔试题(第二套)-三语言题解(CPP/Python/Java)
🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢…...

Windows 文件夹被占用无法删除
按下键盘上的“Ctrl Alt Delete”键打开任务管理器...

PHP+MySQL组合开发 易企秀H5场景源码系统 带完整的安装代码包以及搭建教程
在数字化时代,企业对于宣传与推广的需求日益增长,而H5页面作为一种轻量级、跨平台的宣传方式,深受企业青睐。为了满足企业对于H5页面制作的需求,我们基于PHPMySQL组合开发了一套易企秀H5场景源码系统,并提供了完整的安…...

抖音小店入驻有什么条件?资金少,没经验的普通人做得起吗?
大家好,我是电商花花。 在直播电商的推动下,抖音小店独特的电商模式下吸引着众多的商家,吸引着一波又一波的创业者入驻,想要在抖音小店上开垦出属于自己的电商净土。 想要入驻抖音小店还需要一些条件,然后才能入驻成…...

游戏行业科普 (二)游戏是怎么做出来,怎么卖出去的?
游戏行业科普系列文章,大家可以关注起来,等我慢慢芬分享~~ 《蛋仔派对》 一、研运流程--游戏是怎么做出来的 一款游戏的开发和运营大体上可以分为预研立项、设计开发、测试调优、发行上线和成熟运营几个阶段。 1)预研立项: 初始研…...

Java研学-RBAC权限控制(二)
三 PageHelper 1 分页所需 // 原分页所需 1. 定义QueryObject类,传递分页参数,currentPage,pageSize,get start();方法 2. selectForCount()方法,总条数小于等于0说明不需要分页,大于0说明可以分页 3. se…...

20. 【Android教程】拖动条 SeekBar
这一节要学的控件是 ProgressBar 的升级版,对于 ProgressBar 而言只能展示进度,而不能与用户互动,也就是没有接收用户输入的能力。而本节要学习的 SeekBar 是一种可以“Seek”的 ProgressBar,用户不但可以通过 SeekBar 观察到进度…...

工业物联网网关在机械设备制造企业数转过程的应用-天拓四方
随着科技的飞速发展,物联网技术已经渗透到工业领域的每一个角落。作为连接物理世界和数字世界的桥梁,工业物联网网关在推动企业数字化转型中发挥着至关重要的作用。数字化转型已经成为企业提升竞争力的必由之路,然而,在转型过程中…...

《一》Qt的概述
1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。 1.2 Qt的发展史 1991年 Qt最早由芬兰奇趣科技开发 1996年 进入商业领域&#x…...

局域网共享文件夹怎么加密?局域网共享文件夹加密方法介绍
在企业局域网中,共享文件夹扮演着重要的角色。为了保护数据安全,我们需要加密保护局域网共享文件夹。那么,局域网共享文件夹怎么加密?下面我们来了解一下吧。 局域网共享文件夹加密方法 局域网共享文件夹加密推荐使用共享文件夹加…...

计算机网络——网络地址转换(NAT)技术
目录 前言 前篇 引言 SNAT(Source Network Address Translation)源网络地址转换 SNAT流程 确定性标记 DNAT(Destination Network Address Translation,目标网络地址转换) NAT技术重要性 前言 本博客是博主用于…...

【感谢】心怀感恩,共赴知识之旅——致每一位陪伴我突破百万总访问量的您
小伙伴朋友们: 此刻,我怀着无比激动与深深感激的心情,写下这篇特别的博文。今天,我的CSDN总访问量成功突破了百万大关,这不仅是一个数字的跨越,更是你们对我的支持、信任与鼓励的有力见证。在此࿰…...

Android Studio导入第三方so库和jar包——Android Studio
导入so库 方式一(libs文件夹) 将项目以【Project】的结构显示,将目标架构对应的so文件夹(如下图中 的arm64-v8a)复制粘贴到app文件下的lib文件夹中(如下图的步骤1 2 3) 在build.gradle&…...

jeecg-boot 3.6使用微服务启动详细配置
1:运行sql文件 2:配置host 路径如下 127.0.0.1 jeecg-boot-redis 127.0.0.1 jeecg-boot-mysql 127.0.0.1 jeecg-boot-nacos 127.0.0.1 jeecg-boot-gateway 127.0.0.1 jeecg-boot-system 127.0.0.1 jeecg-boot-xxljob 127.0.0.1 jeecg-boot-rabbitmq 3…...

【Android】【root remount】【2】如何判断设备是否remount
前言 高版本的android设备,在remount之后,如果再进行ota升级,会产生异常,从而无法升级成功。 如何判断设备是否remount 当前已android 10 平台为例 当我们执行 adb remount 时,系统调用会调用到system/core/adb/dae…...

html中的“居中”问题详解(超全)
html中的“居中”问题详解(超全) 图片居中文本居中定位居中元素居中响应式设计中的居中技巧 引言: 在网页设计和开发中,实现元素的居中是一个常见但也常被低估的挑战。无论是在传统的网页布局中还是在响应式设计中,居中…...

【嵌入式学习】ARM day04.11
一、思维导图 二、练习 实现三个灯闪烁 汇编代码 .text .global _start _start: 使能GPIOE和F时钟LDR r0,0x50000A28LDR r1,[R0]ORR R1,R1,#(0X3<<4)STR R1,[R0]配置GPIOE和F的MODER寄存器LDR r0,0x50006000 GPIOELDR R1,0X50007000 G…...

关于部署ELK和EFLKD的相关知识
文章目录 一、ELK日志分析系统1、ELK简介1.2 ElasticSearch1.3 Logstash1.4 Kibana(展示数据可视化界面)1.5 Filebeat 2、使用ELK的原因3、完整日志系统的基本特征4、ELK的工作原理 二、部署ELK日志分析系统1、服务器配置2、关闭防火墙3、ELK ElasticSea…...