当前位置: 首页 > news >正文

【新书推荐】7.3 for语句

本节必须掌握的知识点:

    示例二十四

        代码分析

        汇编解析

        for循环嵌套语句

        示例二十五

7.3.1 示例二十四

for语句语法形式:

for(表达式1;表达式2;表达式3)

{

语句块;

}

●语法解析:

第一步:执行表达式1,表达式1初始化循环变量;

第二步:执行表达式2,表达式2条件判断语句,如果表达式条件为真,则执行循环体内的语句块,否则退出for语句;

第三步:执行循环体内的语句块;

第四步:执行表达式3后置表达式;

第五步:继续执行下一轮循环,直到表达式2的条件为假,跳出for循环语句。

执行顺序:表达式1->表达式2->循环语句块->表达式3->表达式2->循环语句块->表达式3->表达式2->循环语句块……一直循环下去,直到到表达式2为假时,停止循环。接下来我们示例二十四来理解for语句的执行流程。

示例代码二十四

●第一步:分析需求,设计程序结构框架。

分析需求:构建一个for循环语句,当i<= 5时,重复执行for语句内的重复块。

设计程序结构框架:循环结构for语句。

       ●第二步:数据定义,定义恰当的数据结构;

       int i;//定义一个int类型的整型局部变量i,并将其初始化为0,作为循环变量。

       ●第三步:分析算法。

       利用for语句,当i<= 5时,重复执行for语句内的重复块。先判断后执行。

       ●第四步:编写伪代码,即用我们自己的语言来编写程序。

       int main(void) {

    定义一个int类型整型循环变量i;

表达式1:将循环变量i初始化为0;

表达式2:当i <= 5时执行大括号内的循环语句块

表达式3:执行完printf语句后,循环变量i加1

    for (i = 0; i <= 5; i++){

        调用printf函数打印信息"i = %d\n"                                     

}

调用printf函数打印信息"i = %d\n" 

system("pause");

    return 0;                                                                                                    

}

       ●第五步:画流程图,使用Visio、Excel或者其他绘图工具绘制算法流程和逻辑关系图; 如图7-3所示。

图7-3 示例二十四for循环语句

●第六步:编写源程序,其实就是将我们的伪代码翻译成计算机语言;

/*

   for语句

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    int i;

    for (i = 0; i <= 5; i++)

    {

        printf("i = %d\n", i);

    }

printf("i = %d\n", i);

    system("pause");                                        

    return 0;                          

}    

●输出结果:

i = 0

i = 1

i = 2

i = 3

i = 4

i = 5

i = 6

●第七步:调试程序,修复程序中可能出现的BUG;

参见反汇编代码。

●第八步:优化代码,尝试更好的设计方案,效率更高的算法,逻辑更为清晰简洁明了。

(无)

7.3.2 代码分析

分析for语句执行流程:

第一步:执行 int i = 0;

第二步:执行 i<=5;0<5条件为真,继续往下执行 ;

第三步:执行printf(“i = %d”,i);输出 i = 0;

第四步:执行i++; i=0+1,i=1;

第五步:执行i<=5;1<5条件为真,继续往下执行;

第六步:执行printf(“i = %d”,i);输出 i =1;

第七步:执行i++;i=1+1,i=2;

第八步:执行i<=5;2<5条件为真,继续往下执行;

第九步:执行printf(“i = %d”,i);输出 i =2;

第十步:执行i++;i=2+1,i=3;

第十一步:执行i<=5;3<5条件为真,继续往下执行;

第十二步:执行printf(“i = %d”,i);输出 i =3;

第十三步:执行i++;i=1+3,i=4;

第十四步:执行i<=5;4<5条件为真,继续往下执行;

第十五步:执行printf(“i = %d”,i);输出 i =4;

第十六步:执行i++;i=1+4,i=5;

第十七步:执行i<=5;5=5条件为真,继续往下执行;

第十八步:执行printf(“i = %d”,i);输出 i =5;

第十九步:执行i++;i=1+5,i=6;

第二十步:执行i<=5;6>5条件为假,退出循环;

退出for循环后,再次输出i的值为6。

这是这个程序的正向分析流程,我们看下它的反汇编是怎么体现的。

7.3.3 汇编解析

汇编代码

;C标准库头文件和导入库

include vcIO.inc

.data

i sdword  ?

.const    

szMsg db "i = %d",0dh,0ah,0

.code     

start:

       mov i,0

NEXT:           

       .while i <= 5

              invoke printf,offset szMsg,i 

              inc sdword ptr i;

              jmp NEXT           

       .endw           

       ;

       invoke printf,offset szMsg,i

       ;     

       invoke _getch

       ret                       

end start

●输出结果:

i = 0

i = 1

i = 2

i = 3

i = 4

i = 5

i = 6

       上述汇编代码使用了.while高级汇编伪指令(没有.for高级汇编伪指令),实现了C语言中的for循环语句。

 

结论

从本质上看,C语言中的for语句就是while语句的简化形式。“mov i,0”语句对应表达式1;条件表达式“i <= 5”对应表达式2;“inc sdword ptr i”语句对应表达式3。

反汇编代码

    int i;

    for (i = 0; i <= 5; i++)

00391838  mov         dword ptr [i],0  ;表达式1:初始化循环变量i=0

0039183F  jmp         main+3Ah (039184Ah);无条件跳转到表达式2语句

00391841  mov         eax,dword ptr [i] 

00391844  add         eax,1              ;表达式3:变量i加一

00391847  mov         dword ptr [i],eax 

0039184A  cmp         dword ptr [i],5  ;表达式2:比较变量i和5的大小

    int i;

    for (i = 0; i <= 5; i++)

0039184E  jg          main+53h (0391863h) ;如果i>5,则跳出for循环,否则执行循环语句

    {

        printf("i = %d\n", i)

00391850  mov         eax,dword ptr [i] 

00391853  push        eax                              

00391854  push        offset string "i = %d\n" (0397B30h) ;循环语句

00391859  call        _printf (039104Bh) 

0039185E  add         esp,8 

    }

00391861  jmp         main+31h (0391841h) ;无条件跳转到表达式3

    printf("i = %d\n", i);

00391863  mov         eax,dword ptr [i]  ;for循环外的下一条语句

00391866  push        eax 

00391867  push        offset string "i = %d\n" (0397B30h) 

0039186C  call        _printf (039104Bh) 

00391871  add         esp,8 

    system("pause");

00391874  mov         esi,esp 

00391876  push        offset string "pause" (0397B38h) 

0039187B  call        dword ptr [__imp__system (039B168h)] 

00391881  add         esp,4 

 

总结

在for语句中:

表达式1基本上是用来定义循环控制变量或者说对循环语句的开始进行控制;

表达式2一般是用来判断条件是否满足的语句,满足条件则继续执行,不满足则退出for语句;

表达式3称为步长,一般是用来控制循环次数的,;

语句块:可以做任何事情。

实验四十八: for语句表现形式1

在VS中新建项目7-3-2.c:

/*

   for语句的表现形式1:省略第一个表达式

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    int i = 0;         // 在for循环之前初始化

    for (; i < 10; i++)// for语句中省去第一个表达式。但是分号不能少

    {

        printf("■");

    }

    printf("\n");

    system("pause");

    return 0;

}

●输出结果:

■■■■■■■■■■

请按任意键继续. . .

       上述代码中的表达式1放置在for语句之前,for语句内只保留了一个’;’,其他保持不变。接下来我们通过反汇编代码观察一下这种形式的for语句的执行流程。                     

反汇编代码:

    int i = 0;         //  在for循环之前初始化

009B1838  mov         dword ptr [i],0  ;表达式1前置

    for (; i < 10; i++)// for语句中省去第一个表达式。但是分号不能少

009B183F  jmp         main+3Ah (09B184Ah

009B1841  mov         eax,dword ptr [i] 

009B1844  add         eax,1                ;表达式3

009B1847  mov         dword ptr [i],eax 

009B184A  cmp         dword ptr [i],0Ah  ;表达式2

    for (; i < 10; i++)// for语句中省去第一个表达式。但是分号不能少

009B184E  jge         main+4Fh (09B185Fh;当i>=10,退出循环

    {

        printf("■");

009B1850  push        offset string "\xa1\xf6" (09B7B30h) 

009B1855  call        _printf (09B104Bh) 

009B185A  add         esp,4 

    }

009B185D  jmp         main+31h (09B1841h;跳转到表达式3

    printf("\n");

009B185F  push        offset string "\n" (09B80D8h) 

009B1864  call        _printf (09B104Bh) 

009B1869  add         esp,4   

 

结论

由上述反汇编代码可知,表达式1前置,对应for语句的执行流程没有任何改变。

练习

  1. 请读者书写程序7-3-2.c伪代码,并绘制流程图。
  2. 请读者将7-3-2.c翻译成汇编语言实现。
  3. 请读者分析7-3-2.c的反汇编代码。

实验四十九: for语句表现形式2

在VS中新建项目7-3-3.c:

/*

   for语句的表现形式2:省略第二个表达式

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    for (int i = 0;; i++)//变量i的作用域仅限for语句块内

    {

        if (i > 10)

        {

            break;//如果i>10则跳出循环,break是跳出for循环

        }

        printf("■");

    }

    //printf("i = %d\n",i);

    system("pause");

    return 0;

}

       ●输出结果:

■■■■■■■■■■■请按任意键继续. . .

       实验四十九的代码需要注意两点:

       1.变量i的定义放在了for语句内,那么变量i的作用域仅限for语句块。如果将下面的语句“printf("i = %d\n",i);”屏蔽去掉,编译时会提示错误信息“error C2065: “i”: 未声明的标识符”。在C语言中,变量是区分作用域的,也就是有效范围。如果是全局变量,则保存在全局区,在整个程序范围内都是有效的。如果局部变量定义在函数内,则保存在函数堆栈中,仅在函数内有效,函数运行结束后释放堆栈空间,局部变量也就消失了。此外还有两种类型的变量static静态变量和STL线程存储变量,这里暂不做介绍。

       在C语言中,不同作用域的变量名可以相同,因为作用域不同,编译器编译时也会自动区分。

       2.for语句的表达式2是一个条件表达式,其作用是控制循环结束条件。实验四十九中的代码将表达式2放置在循环语句块内,使用if语句判断条件,当i>10时,执行break语句,退出循环。break语句的作用就是退出循环,我们将在本章7.5节继续介绍break语句的使用方法。

【注】for语句中的表达式2分号不可以缺省。

       接下来我们再看一下反汇编代码:

    for (int i = 0;; i++)//变量i的作用域仅限for语句块内

00B01838  mov         dword ptr [ebp-8],0  ;表达式1,[ebp-8]为局部变量i

    for (int i = 0;; i++)//变量i的作用域仅限for语句块内

00B0183F  jmp         main+3Ah (0B0184Ah

00B01841  mov         eax,dword ptr [ebp-8]  ;表达式3

00B01844  add         eax,1 

00B01847  mov         dword ptr [ebp-8],eax 

    {

        if (i > 10);表达式2

00B0184A  cmp         dword ptr [ebp-8],0Ah 

00B0184E  jle         main+42h (0B01852h) 

        {

            break;//如果i>10则跳出循环,break是跳出for循环

00B01850  jmp         main+51h (0B01861h)  ;退出循环

        }

        printf("■");循环语句

00B01852  push        offset string "\xa1\xf6" (0B07B30h) 

00B01857  call        _printf (0B0104Bh) 

00B0185C  add         esp,4 

    }

00B0185F  jmp         main+31h (0B01841h)  ;跳转到表达式3

    //printf("i = %d\n",i);

    system("pause");

00B01861  mov         esi,esp 

       上述反汇编代码中一个明显的变化就是变量i使用[ebp-8]来代替。为了进一步验证变量i的作用域,我们再做一个实验。

实验五十: for语句循环变量作用域

在VS中新建项目7-3-4.c:

/*

   for语句循环变量作用域

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    int i = 20;//作用域main函数内有效

    for (int i = 0;; i++)//变量i的作用域仅限for语句块内

    {

        printf("\ni = %d", i);

        if (i > 10)

        {

            break;//如果i>10则跳出循环,break是跳出for循环

        }

        printf("■");

    }

    printf("\ni = %d\n",i);//i=20

    system("pause");

    return 0;

}

       ●输出结果:

i = 0■

i = 1■

i = 2■

i = 3■

i = 4■

i = 5■

i = 6■

i = 7■

i = 8■

i = 9■

i = 10■

i = 11

i = 20

请按任意键继续. . .

上述代码中存在两个变量i,编译时并没有报错,说明变量名符号没有冲突。再看打印信息,for语句内打印的变量i从0~11。最后一个打印输出的变量i的值为20,显然是第一个变量i的值。

请读者查看一下反汇编代码,第一个变量i使用“[i]”表示,而第二个变量i使用“[ebp-14h]表示”。其余内容和使用四十九相同,不再赘述。

实验五十一: for语句形式3

在VS中新建项目7-3-5.c:

/*

   for语句形式3:缺省表达式3

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    for (int i = 0; i < 10;)

    {

        printf("■");

        i++;

    }

    system("pause");

    return 0;

}

●输出结果:

■■■■■■■■■■请按任意键继续. . .

上述代码将表达式3放置在循环语句块的结尾处,这应该和我们预想的一样,之前for语句的反汇编代码的执行流程就是如此。接下来我们再看一下反汇编代码的执行流程。

●反汇编代码:

    for (int i = 0; i < 10;)

002D1838  mov         dword ptr [ebp-8],0  ;表达式1

    for (int i = 0; i < 10;)

002D183F  cmp         dword ptr [ebp-8],0Ah  ;表达式2

002D1843  jge         main+4Dh (02D185Dh)  ;i>=10跳出循环

    {

        printf("■");循环语句

002D1845  push        offset string "\xa1\xf6" (02D7B30h) 

002D184A  call        _printf (02D104Bh) 

002D184F  add         esp,4 

        i++;表达式3

002D1852  mov         eax,dword ptr [ebp-8] 

002D1855  add         eax,1 

002D1858  mov         dword ptr [ebp-8],eax 

    }

002D185B  jmp         main+2Fh (02D183Fh;继续循环

    system("pause");

002D185D  mov         esi,esp

上述反汇编代码和之前示例中的反汇编代码执行流程稍有不同,表达式3按照正常的代码编写顺序放置在printf语句之后。其实之前的反汇编代码也是按照代码的编写顺序进行编译的。

【注意】for (int i = 0; i < 10;)语句内的最后一个表达式;可以缺省。

实验五十二: for语句形式4

在VS中新建项目7-3-6.c:

/*

   for语句形式4:缺省全部3个表达式

*/

#include <stdio.h>

#include <stdlib.h>

int main(void) {

    for (;;)

    {

        printf("■");

    }

    system("pause");

    return 0;

}

●输出结果:

不停的打印■,陷入死循环。

为什么会是这样呢?因为当表达式全部置空时,相当于没有初始值,没有控制语句,没有后置表达式,那么它将永远的循环下去,直到内存溢出,这就是所谓的死循环。

   ●反汇编代码:

    for (;;)

    {

        printf("■");

011E1838  push        offset string "\xa1\xf6" (011E7B30h) 

    for (;;)

    {

        printf("■");

011E183D  call        _printf (011E104Bh) 

011E1842  add         esp,4 

    }

011E1845  jmp         main+28h (011E1838h;跳到for语句块起始位置

    system("pause");

011E1847  mov         esi,esp 

       上述反汇编代码可以看到,程序中没有循环控制变量,没有循环结束条件,因此陷入了无限循环。我们应绝对避免此类情况的发生。

练习

1、递增显示从0到输入的正整数为止的各个整数(for语句)。

2、输入一个整数,连续显示出该整数个*(for语句)。

3、输入规定数量个整数并显示出它们的合计值和平均值。

4、编写一个程序,求1到n的和。n的值从键盘输入。

5、根据输入的整数,循环显示1234567890,显示的位数和输入的整数值相同。

请输入一个整数:25

1234567890123456789012345

6、显示输入的整数值的所有约数。

7、编写一段程序,输入一个整数值,显示该数值以下的所有奇数。

整数值:15

1 3 5 7 9 11 13 15

8、编写一段程序,输入一个整数值,显示该整数值个‘*'。每显示5个就进行换行。

显示多少个*:12

*****

*****

** 

*

本文摘自编程达人系列教材《汇编的角度——C语言》。

相关文章:

【新书推荐】7.3 for语句

本节必须掌握的知识点&#xff1a; 示例二十四 代码分析 汇编解析 for循环嵌套语句 示例二十五 7.3.1 示例二十四 ■for语句语法形式&#xff1a; for(表达式1;表达式2;表达式3) { 语句块; } ●语法解析&#xff1a; 第一步&#xff1a;执行表达式1&#xff0c;表达式1…...

爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测

目录 背影 极限学习机 爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测(代码完整,数据)资源-CSDN文库 https://d…...

挑战杯 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…...

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(2)

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…...

PHP、Python、Java 和 Go语言对比

PHP、Python、Java 和 Go 都是流行的编程语言&#xff0c;每种语言都有其独特的优势和适用场景。下面是对这些语言的一些基本对比&#xff1a; 一&#xff1a;PHP 适用场景&#xff1a;主要用于Web开发&#xff0c;特别是服务器端脚本。 特点&#xff1a;语法简单易懂&#…...

算法题目题单+题解——图论

简介 本文为自己做的一部分图论题目&#xff0c;作为题单列出&#xff0c;持续更新。 题单由题目链接和题解两部分组成&#xff0c;题解部分提供简洁题意&#xff0c;代码仓库&#xff1a;Kaiser-Yang/OJProblems。 对于同一个一级标题下的题目&#xff0c;题目难度尽可能做…...

车载测试中:如何处理 bug

一&#xff1a;Jira 提交 bug 包含那些内容 二&#xff1a;如何处理现上 bug 三&#xff1a;车载相关的 bug 如何定位 四&#xff1a;遇到 bug &#xff0c;复现不出来怎么办 五&#xff1a;bug 的处理流程 一&#xff1a;Jira 提交 bug 包含那些内容二&#xff1a;如何处理现上…...

亲测解决vscode的debug用不了、点了没反应

这个问题在小虎登录vscode同步了设置后出现,原因是launch文件被修改或删除。解决方法是重新添加launch。 坏境配置 win11 + vscode 解决方法 Ctrl + shift + P,搜索debug添加配置: 选择python debugger。 结果生成了一个文件在当前路径: launch内容: {// Use Int…...

立足智能存取解决方案|HEGERLS智能托盘四向车储存制动能量 实现能源回收

对于商业配送和工业生产的企业而言&#xff0c;如何能高效率、低成本进行低分拣、运输、码垛、入库&#xff0c;用以提升仓库空间的利用效率&#xff0c;是现在大多企业急需要解决的行业痛点。对此&#xff0c;为了解决上述痛点&#xff0c;近年来&#xff0c;物流仓储集成商、…...

2024.2.8日总结(小程序开发5)

对上拉触底事件进行节流处理 在data中定义isloading节流阀 false表示当前没有进行任何数据请求true表示当前正在进行数据请求 在getColors()方法中修改isloading节流阀的值 在刚调用getColors时将节流阀设置true在网络请求的complete回调函数中&#xff0c;将节流阀重置为f…...

Spring Boot配置文件优先级

1、bat文件启动java程序 java -Dmmmqqq -Dfile.encodingUTF-8 -jar ruoyi-admin.jar --mmmiii --llllll 2、配置类型 程序参数Program arguments : --mmmiii 单个属性值&#xff0c;可以从String[] args读取到&#xff0c;放在jar包命令后面 VM参数VM options :一般以-D …...

Rust 初体验1

Rust 初体验 安装 打开官网&#xff0c;下载 rustup-init.exe&#xff0c; 选择缺省模式&#xff08;1&#xff09;安装。 国内源设置 在 .Cargo 目录下新建 config 文件&#xff0c;添加如下内容&#xff1a; [source.crates-io] registry "https://github.com/rus…...

【深度学习】实验7布置,图像超分辨

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c; 实验答案链接http://t.csdnimg.cn/P1yJF 如果需要更详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 深度学习训练营 案例 7 &#xff1…...

【八大排序】归并排序 | 计数排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、归并排序1.1 基本思想 动图演示2.2 递归版本代码实现 算法步骤2.3 非递归版本代…...

Netty应用(三) 之 NIO开发使用 网络编程 多路复用

目录 重要&#xff1a;logback日志的引入以及整合步骤 5.NIO的开发使用 5.1 文件操作 5.1.1 读取文件内容 5.1.2 写入文件内容 5.1.3 文件的复制 5.2 网络编程 5.2.1 accept&#xff0c;read阻塞的NIO编程 5.2.2 把accept&#xff0c;read设置成非阻塞的NIO编程 5.2.3…...

融资项目——配置redis

一、 在maven中导入相关依赖。在springboot框架中&#xff0c;我们使用spring data redis <!-- spring boot redis缓存引入 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifa…...

npm修改镜像源

背景&#xff1a;切换npm镜像源是经常遇到的事&#xff0c;下面记录下具体操作命令 1. 打开终端运行"npm config get registry"命令来查看当前配置的镜像源 npm config get registry2. 修改成淘宝镜像源"https://registry.npmjs.org/" npm config set re…...

K8S系列文章之 [基于 Alpine 使用 kubeadm 搭建 k8s]

先部署基础环境&#xff0c;然后根据官方文档 K8s - Alpine Linux&#xff0c;进行操作。 将官方文档整理为脚本 整理脚本时&#xff0c;有部分调整 #!/bin/shset -x # 添加源&#xff0c;安装时已经配置 #cat >> /etc/apk/repositories <<"EOF" #htt…...

JVM相关-JVM模型、垃圾回收、JVM调优

一、JVM模型 JVM内部体型划分 JVM的内部体系结构分为三部分&#xff0c;分别是&#xff1a;类加载器&#xff08;ClassLoader&#xff09;子系统、运行时数据区&#xff08;内存&#xff09;和执行引擎 1、类加载器 概念 每个JVM都有一个类加载器子系统&#xff08;class l…...

提升图像分割精度:学习UNet++算法

文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构4.1 UNet 的网络结构4.2 UNet 各层的作用 五、训练…...

排序算法---冒泡排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 冒泡排序是一种简单的排序算法&#xff0c;其原理是重复地比较相邻的两个元素&#xff0c;并将顺序不正确的元素进行交换&#xff0c;使得每次遍历都能将一个最大&#xff08;或最小&#xff09;的元素放到末尾。通过多次遍…...

基于数据挖掘的微博事件分析与可视化大屏分析系统

设计原理&#xff0c;是指一个系统的设计由来&#xff0c;其将需求合理拆解成功能&#xff0c;抽象的描述系统的模块&#xff0c;以模块下的功能。功能模块化后&#xff0c;变成可组合、可拆解的单元&#xff0c;在设计时&#xff0c;会将所有信息分解存储在各个表中&#xff0…...

数学建模-灰色预测最强讲义 GM(1,1)原理及Python实现

目录 一、GM&#xff08;1&#xff0c;1&#xff09;模型预测原理 二、GM&#xff08;1&#xff0c;1&#xff09;模型预测步骤 2.1 数据的检验与处理 2.2 建立模型 2.3 检验预测值 三、案例 灰色预测应用场景&#xff1a;时间序列预测 灰色预测的主要特点是模型使用的…...

智慧自助餐饮系统(SpringBoot+MP+Vue+微信小程序+JNI+ncnn+YOLOX-Nano)

一、项目简介 本项目是配合智慧自助餐厅下的一套综合系统&#xff0c;该系统分为安卓端、微信小程序用户端以及后台管理系统。安卓端利用图像识别技术进行识别多种不同菜品&#xff0c;识别成功后安卓端显示该订单菜品以及价格并且生成进入小程序的二维码&#xff0c;用户扫描…...

零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法

一、前言 零基础学编程从入门到精通&#xff0c;系统化的编程视频教程上线&#xff0c;中文编程开发语言工具构件之缩放控制面板构件用法 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载—…...

【MySQL进阶之路】MySQL 中表空间和数据区的概念以及预读机制

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…...

JVM 性能调优 - 常用的垃圾回收器(6)

垃圾收集器 在 JVM(Java虚拟机)中,垃圾收集器(Garbage Collector)是负责自动管理内存的组件。它的主要任务是在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以便为新的对象提供足够的内存。 JVM中的垃圾收集器使用不同的算法和策略来实现垃圾收集过程,以…...

【java】Hibernate访问数据库

一、Hibernate访问数据库案例 Hibernate 是一个在 Java 社区广泛使用的对象关系映射&#xff08;ORM&#xff09;工具。它简化了 Java 应用程序中数据库操作的复杂性&#xff0c;并提供了一个框架&#xff0c;用于将对象模型数据映射到传统的关系型数据库。下面是一个简单的使…...

从零开始手写mmo游戏从框架到爆炸(八)— byte数组传输

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 Netty帧解码器 Netty中&#xff0c;提供了几个重要的可以直接使用的帧解码器。 LineBasedFrameDecoder 行分割帧解码器。适用场景&#xff1a;每个上层数据包&#xff0c;使…...

Elasticsearch:BM25 及 使用 Elasticsearch 和 LangChain 的自查询检索器

本工作簿演示了 Elasticsearch 的自查询检索器将非结构化查询转换为结构化查询的示例&#xff0c;我们将其用于 BM25 示例。 在这个例子中&#xff1a; 我们将摄取 LangChain 之外的电影样本数据集自定义 ElasticsearchStore 中的检索策略以仅使用 BM25使用自查询检索将问题转…...

uniapp的api用法大全

页面生命周期API uniApp中的页面生命周期API可以帮助开发者在页面的不同生命周期中执行相应的操作。常用的页面生命周期API包括&#xff1a;onLoad、onShow、onReady、onHide、onUnload等。其中&#xff0c;onLoad在页面加载时触发&#xff0c;onShow在页面显示时触发&#xf…...

笔记——asp.net core 中的 REST

REST&#xff08;reprentational state transfer&#xff0c;表层状态转移&#xff09; REST原则&#xff1a;提倡按照HTTP的语义使用HTTP。 如果一个系统符合REST原则&#xff0c;我们就说这个系统是Restful风格的。 在RPC风格的Web API系统中&#xff0c;我们把服务端的代码…...

排序算法---堆排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 堆排序&#xff08;Heap Sort&#xff09;是一种基于二叉堆数据结构的排序算法。它将待排序的元素构建成一个最大堆&#xff08;或最小堆&#xff09;&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换位置&#xff0c…...

Java字符串(包含字母和数字)通用排序

说明&#xff1a;本文章是之前查到的一篇安卓版的&#xff0c;具体原文路径忘记了。稍微改了一点&#xff0c;挺符合业务使用的&#xff01; 一、看代码 /*** 包含数字的字符串进行比较&#xff08;按照从小到大排序&#xff09;*/private static Integer compareString(Stri…...

【Spring】springmvc如何处理接受http请求

目录 ​编辑 1. 背景 2. web项目和非web项目 3. 环境准备 4. 分析链路 5. 总结 1. 背景 今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的&#xff1f;”&#xff1b;看完之后突然想到&#xff0c;在请求走到mvc 之前服务是怎么知道有请求进来…...

2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;安全员-B证证模拟考试题库是根据安全员-B证最新版教材&#xff0c;安全员-B证大纲整理而成&#xff08;含2024年…...

redis过期淘汰策略、数据过期策略与持久化方式

redis的过期淘汰策略 redis过期淘汰策略有很多,默认是no-eviction 不删除任何数据,内存不足存入会直接报错,可以在redis配置文件中进行设置,其中有两个非常重要的概念,LRU与LFU LRU表示最近最少使用,LFU为最少频率使用 又按照volatile已设置过期时间的数据集和allkeys所有数…...

Oracle Vagrant Box 扩展根文件系统

需求 默认的Oracle Database 19c Vagrant Box的磁盘为34GB。 最近在做数据库升级实验&#xff0c;加之导入AWR dump数据&#xff0c;导致空间不够。 因此需要对磁盘进行扩容。 扩容方法1&#xff1a;预先扩容 此方法参考文档Vagrant, how to specify the disk size?。 指…...

TDengine用户权限管理

Background 官方文档关于用户管理没有很详细的介绍&#xff0c;只有零碎的几条&#xff0c;这里记录下方便后面使用。官方文档&#xff1a;https://docs.taosdata.com/taos-sql/show/#show-users 1、查看用户 show users;super 1&#xff0c;表示超级用户权限 0&#xff0c;表…...

推荐一款开源的跨平台划词翻译和OCR翻译软件:Pot

Pot简介 一款开源的跨平台划词翻译和OCR翻译软件 下载安装指南 根据你的机器型号下载对应版本&#xff0c;下载完成后双击安装即可。 使用教程 Pot具体功能如下&#xff1a; 划词翻译输入翻译外部调用鼠标选中需要翻译的文本&#xff0c;按下设置的划词翻译快捷键即可按下输…...

spring boot学习第十一篇:发邮件

1、pom.xml文件内容如下&#xff08;是我所有学习内容需要的&#xff0c;不再单独分出来&#xff0c;包不会冲突&#xff09;&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...

Linux中ps/kill/execl的使用

ps命令&#xff1a; ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令&#xff1a; kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…...

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…...

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多&#xff0c;操作方式各有不同&#xff0c;于是JAVA提供了一套规则 ——JMS&#xff0c;用于操作消息中间件。JMS即Java消息服务 &#xff08;JavaMessage Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面 向消息中间件的…...

【工作学习 day04】 9. uniapp 页面和组件的生命周期

问题描述 uniapp常用的有&#xff1a;页面和组件&#xff0c;并且页面和组件各自有各自的生命周期函数&#xff0c;那么在页面/组件请求数据时&#xff0c;是用created呢&#xff0c;还是用onLoad呢&#xff1f; 先说结论: 组件使用组件的生命周期&#xff0c;页面使用页面的…...

Mysql-数据库优化-客户端连接参数

客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数&#xff0c;一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数&#xff0c;一个数据库能够支撑最大的连接数是多少呢&#xff1f; …...

【十二】【C++】vector用法的探究

vector类创建对象 /*vector类创建对象*/ #if 1 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std; #include <vector> #include <algorithm> #include <crtdbg.h>class Date {public:Date(int year 1900, int month 1, int …...

Docker 基本介绍

Docker 基本介绍 镜像 Docker镜像就是一个只读的模板。 例如&#xff1a;一个镜像可以包含一个完整的ubuntu操作系统环境&#xff0c;里面仅安装了Apache或用户需要的其它应用 程序。 镜像可以用来创建Docker容器。Docker提供了一个很简单的机制来创建镜像或者更新现有的镜…...

CentOS 7 安装 install abiword

安装 1.下载noarch安装包 wget http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm 2.安装noarch rpm -Uvh lux-release-7-1.noarch.rpm 3.安装abiword yum -y install abiword...

开源的直播平台

​​​​​​直播平台系统界面介绍 开源一套直播平台 私信可获取源码...