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

Linux C编程一站式学习笔记6

Linux C编程一站式学习笔记 chap6 循环结构

文章目录

  • Linux C编程一站式学习笔记 chap6 循环结构
  • 一.while语句
    • 递归 VS 循环
        • 函数式编程(Functional Programming) & 命令式编程(Imperative Programming)
        • 无限递归 & 无限循环
    • 习题
    • 欧几里得算法可视化
  • 二.do/while语句
  • 三.for语句
  • 四.break和continue语句
    • 习题
  • 五.嵌套循环
    • 练习
  • 六.goto语句和标号
  • 相关资源、参考资料

一.while语句

  • 我们回顾一下用递归求n!的方法,其实每次递归调用都在重复做同样一件事,就是把n乘到(n-1)!上然后把结果返回。虽说是重复,但每次做都稍微有一点区别(n的值不一样),这种每次都有一点区别的重复工作称为迭代(Iteration)。虽然迭代用递归来做就够了,但C语言提供了循环语句使迭代程序写起来更方便。

  • 之前的factorialwhile语句可以写成

    int factorial(int n)
    {int result = 1;while (n > 0) {result = result * n;n = n - 1;}return result;
    }
    
  • while语句由一个控制表达式和一个子语句组成,子语句可以是若干条语句组成的语句块

    语句→while(控制表达式)语句

    • 若控制表达式的值为真,子语句就被执行,然后再次测试控制表达式的值,如果还是真,就把子语句再执行一遍,再测试控制表达式的值…这种控制流程称为循环(Loop),子语句称为循环体
    • 若某次测试控制表达式的值为假,就跳出循环执行后面的return语句
    • 如果第一次测试控制表达式的值就是假,那么直接跳到return语句,循环体一次都不执行
  • 变量result在这个循环中的作用是累加器**(Accumulator),把每次循环的中间结果累积起来,循环结束后得到的累积值就是最终结果,由于这个例子是用乘法来累积的,所以result的初值是1,如果用加法累积则result的初值应该是0。变量n循环变量(Loop Variable)**,每次循环要改变它的值,在控制表达式中要测试它的值,这两点合起来起到控制循环次数的作用,在这个例子中n的值是递减的,也有些循环采用递增的循环变量。这个例子具有一定的典型性,累加器和循环变量这两种模式在循环中都很常见

递归 VS 循环

  • 递归能解决的问题用循环也能解决,但解决思路不同
    • 用递归解决这个问题靠的是递推关系n!=n·(n-1)!
    • 用循环解决这个问题则更像是把这个公式展开了:n!=n·(n-1)·(n-2)·…·3·2·1
  • 把公式展开了理解会更直观一些,所以有些时候循环程序比递归程序更容易理解。但也有一些公式要展开是非常复杂的甚至是不可能的,反倒是递推关系更直观一些,这种情况下递归程序比循环程序更容易理解

函数式编程(Functional Programming) & 命令式编程(Imperative Programming)

  • 之前的factorial递归的例子中,在整个递归调用过程中,虽然分配和释放了很多变量,但所有变量都只在初始化时赋值,没有任何变量的值发生过改变,这种思路称为函数式编程(Functional Programming)
  • 而上面的循环程序则通过对nresult这两个变量多次赋值来达到同样的目的。这种思路称为命令式编程(Imperative Programming)
  • 函数式编程的“函数”类似于数学函数的概念,C语言的函数可以有Side Effect,比如在一个函数中修改某个全局变量的值就是一种Side Effect。全局变量被多次赋值会给调试带来麻烦,如果一个函数体很长,控制流程很复杂,那么局部变量被多次赋值也会有同样的问题。
  • 因此,不要以为“变量可以多次赋值”是天经地义的,有很多编程语言可以完全采用函数式编程的模式,避免Side Effect,例如LISP、Haskell、Erlang等。用C语言编程主要还是采用Imperative的模式,但要记住,给变量多次赋值时要格外小心,在代码中多次读写同一变量应该以一种一致的方式进行。所谓“一致的方式”是说应该有一套统一的规则,规定在一段代码中哪里会对某个变量赋值、哪里会读取它的值。

无限递归 & 无限循环

  • 递归函数如果没写 base case,容易变成无穷递归,循环不注意的话也容易变成无限循环(Infinite Loop)或叫死循环。

  • 例如前面这个例子

    int factorial(int n)
    {int result = 1;while (n > 0) {result = result * n;n = n - 1;}return result;
    }
    
    • 若写成while(1) {...} ,或者漏了n = n - 1,就变成了死循环
  • 但有时候 是否为死循环 不是一目了然的

    while (n != 1) {if (n % 2 == 0) {n = n / 2;} else {n = n * 3 + 1;}
    }
    

    如果n为正整数,这个循环能跳出来吗?这个是著名的3x+1猜想

    能找出不少例子,比如n一开始为7,最后得到1,但无论试多少个数也不能代替证明,这个循环有没有可能对某些正整数n是死循环呢?

习题

1、用循环解决第 3 节 “递归”的所有习题,体会递归和循环这两种不同的思路。

  • 求两个正整数ab的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法

    • 如果a除以b能整除,则最大公约数是b
    • 否则,最大公约数等于ba%b的最大公约数

    这个算是大一学的时候的经典问题了…

    一开始想到的是这个最原始的,但是忘了审题hhh,Euclid算法

    #include <stdio.h>
    #include <math.h>int GCD(int a, int b)
    {int gcd = 1;int i;for (i = 1; i <= a && i <= b; i++){if (a % i == 0 && b % i == 0){gcd = i;}}return gcd;
    }// Driver program to test above function
    int main()
    {int a = 98, b = 56;printf("GCD of %d and %d is %d ", a, b, GCD(a, b));return 0;
    }
    

    记得大一的时候总是不确定控制表达式里面写什么,现在再来看看算法的描述:如果a除以b能整除,则最大公约数是b,否则,最大公约数等于ba%b的最大公约数

    要找到最大公约数,那就是余数为0啊,那么肯定是把余数作为控制条件

    令 r = a % b,则 a = m * b + r

    我们就引入三个变量,但是要迭代表示这个算法,所以注意变量身份的变化

    a 除以 b , b 除以 (a%b)

    也就是 迭代的时候 b 取代了 a的位置, 而 a%b 取代了 b的位置

    所以是 r = a % b, a = b, b = r

    如果a能整除b,那么r一开始就是0,a和b的最大公约数为b,b=r之后b也为0, 于是退出循环,而要return 最大公约数,本该return b,但是b赋值给了a,所以return a

    如果a不能整除b,那么就要经历数次迭代了,在最后一次的时候,r = a(是上一轮的b)% b(是上一轮的a%b) 为0 ,赋值给b,b为0退出循环, 而这一次,最大公约数就是b(上一轮的a%b),但是赋值给了a,所以return a

    #include <stdio.h>
    #include <math.h>int GCD(int a, int b)
    {//using euclid algorithm and for loopsint r;while (b != 0){r = a % b;a = b;b = r;}return a;
    }// Driver program to test above function
    int main()
    {int a = 98, b = 56;printf("GCD of %d and %d is %d ", a, b, GCD(a, b));return 0;
    }
    
    image-20230126121649152
  • 求Fibonacci数列的第n项,这个数列是这样定义的

    • fib(0)=1
      fib(1)=1
      fib(n)=fib(n-1)+fib(n-2)

    一开始想到的是这个代码,是正确的,但是感觉写的一般般

    需要注意的是for (i = 2; i <= n; i++)这里的循环次数, 设置成2和n挺好理解的,从第二项要算到第n项

    #include <stdio.h>
    #include <math.h>int Fibonacci(int n)
    {if (n == 0 || n == 1){return 1;}else{int i;int f1 = 1;int f2 = 1;int f3;for (i = 2; i <= n; i++){f3 = f1 + f2;f2 = f1;f1 = f3;}return f3;}
    }int main()
    {printf("%d ", Fibonacci(0));printf("%d ", Fibonacci(1));printf("%d ", Fibonacci(2));printf("%d ", Fibonacci(3));printf("%d ", Fibonacci(4));printf("%d ", Fibonacci(5));printf("%d ", Fibonacci(6));printf("%d ", Fibonacci(7));printf("%d ", Fibonacci(8));printf("%d ", Fibonacci(9));
    }
    

2、编写程序数一下1到100的所有整数中出现多少次数字9。在写程序之前先把这些问题考虑清楚:

  1. 这个问题中的循环变量是什么?
  2. 这个问题中的累加器是什么?用加法还是用乘法累积?
  3. 在第 2 节 “if/else语句”的习题1写过取一个整数的个位和十位的表达式,这两个表达式怎样用到程序中?
  • 循环变量就是用一个遍历1~100的变量

  • 累加器就是次数,用加法

  • my code

    #include <stdio.h>
    #include <math.h>int CountNine()
    {int num = 0;int i;for(i=1; i<=100; i++){int s = i % 10; //个位int t = i / 10; //十位if(s == 9)num += 1;if(t == 9)num += 1;}return num;
    }// Driver program to test above function
    int main()
    {printf("%d", CountNine());
    }
    

    答案20

    要是把这题改一下,改成出现过9的数字的个数,答案是19,因为99里面重复统计一次,那就得稍微改改了

    #include <stdio.h>int main()
    {int count = 0;int i;for (i = 1; i <= 100; i++){if (i % 10 == 9 || i / 10 == 9){count++;}}printf("%d", count);return 0;
    }

欧几里得算法可视化

做上面练习的时候,感觉还是不直观,于是去搜谷歌:visualize euclid,果真搜到了!

  • 有大佬在geogebra做了:https://www.geogebra.org/m/vwwezney

二.do/while语句

  • syntax:

    语句 → do 语句 while (控制表达式);

  • while语句先测试控制表达式的值再执行循环体,而do/while语句先执行循环体再测试控制表达式的值。如果控制表达式的值一开始就是假,while语句的循环体一次都不执行,而do/while语句的循环体仍然要执行一次再跳出循环。

三.for语句

  • syntax:

    for (控制表达式1; 控制表达式2; 控制表达式3) 语句

    如果不考虑循环体中包含continue语句的情况,这个for循环等价于下面的while循环:

    控制表达式1;
    while (控制表达式2) {语句控制表达式3;
    }
    

    从这种等价形式来看,控制表达式1和3都可以为空,但控制表达式2是必不可少的,例如for (;1;) {...}等价于while (1) {...}死循环。C语言规定,如果控制表达式2为空,则认为控制表达式2的值为真,因此死循环也可以写成for (;;) {...}

  • ++i,--i ,i++,i--

    • ++称为前缀自增运算符(Prefix Increment Operator),类似地,--称为前缀自减运算符(Prefix Decrement Operator)[10],--i相当于i = i - 1如果把++i这个表达式看作一个函数调用,除了传入一个参数返回一个值(等于参数值加1)之外,还产生一个Side Effect,就是把变量i的值增加了1。

    • i++i--,为了和前缀运算符区别,这两个运算符称为后缀自增运算符(Postfix Increment Operator)后缀自减运算符(Postfix Decrement Operator)如果把i++这个表达式看作一个函数调用,传入一个参数返回一个值,返回值就等于参数值(而不是参数值加1),此外也产生一个Side Effect,就是把变量i的值增加了1,它和++i的区别就在于返回值不同。同理,--i返回减1之后的值,而i--返回减1之前的值,但这两个表达式都产生同样的Side Effect,就是把变量i的值减了1。

    • 使用++、–运算符会使程序更加简洁,但也会影响程序的可读性

  • C99 的一种for循环写法

    C99规定了一种新的for循环语法,在控制表达式1的位置可以有变量定义。例如上例的循环变量i可以只在for循环中定义:

    int factorial(int n)
    {int result = 1;for(int i = 1; i <= n; i++)result = result * i;return result;
    }
    

    如果这样定义,那么变量i只是for循环中的局部变量而不是整个函数的局部变量,相当于语句块中的局部变量,在循环结束后就不能再使用i这个变量了。这个程序用gcc编译要加上选项-std=c99。这种语法也是从C++借鉴的,考虑到兼容性不建议使用这种写法。

四.break和continue语句

  • 前面学switch的时候第一次见到了break,用来跳出switch语句块,这个语句也可以用来跳出循环体。

  • continue语句也会终止当前循环,和break语句不同的是,continue语句终止当前循环后又回到循环体的开头准备执行下一次循环。

    • 对于while循环和do/while循环,执行continue语句之后测试控制表达式,如果值为真则继续执行下一次循环;
    • 对于for循环,执行continue语句之后首先计算控制表达式3,然后测试控制表达式2,如果值为真则继续执行下一次循环。例如下面的代码打印1到100之间的素数:

    例 6.1. 求1-100的素数

    #include <stdio.h>int is_prime(int n)
    {int i;for (i = 2; i < n; i++)if (n % i == 0)break;if (i == n)return 1;elsereturn 0;
    }int main(void)
    {int i;for (i = 1; i <= 100; i++) {if (!is_prime(i))continue;printf("%d\n", i);}return 0;
    }
    

    is_prime函数从2到n-1依次检查有没有能被n整除的数,如果有就说明n不是素数,立刻跳出循环而不执行i++。因此,如果n不是素数,则循环结束后i一定小于n,如果n是素数,则循环结束后i一定等于n。注意检查临界条件:2应该是素数,如果n是2,则循环体一次也不执行,但i的初值就是2,也等于n,在程序中也判定为素数。其实没有必要从2一直检查到n-1,只要从2检查到⌊sqrt(n)⌋,如果全都不能整除就足以证明n是素数了,请读者想一想为什么。

    因为对称性:

    Why do we check up to the square root of a number to determine if the number is prime?

    • Sqrt:square root

    在主程序中,从1到100依次检查每个数是不是素数,如果不是素数,并不直接跳出循环,而是i++后继续执行下一次循环,因此用continue语句。注意主程序的局部变量iis_prime中的局部变量i是不同的两个变量,其实在调用is_prime函数时主程序的局部变量i和参数n的值相等。

习题

1、求素数这个程序只是为了说明breakcontinue的用法才这么写的,其实完全可以不用breakcontinue,请读者修改一下控制流程,去掉breakcontinue而保持功能不变。

  • my solution

    #include <stdio.h>int is_prime(int n)
    {int i;int flag = 1; //1表示是素数for (i = 2; i < n; i++){if(n%i == 0){flag = 0; //0表示不是素数}}return flag;
    }int main(void)
    {int i;for (i = 2; i <= 100; i++){if (is_prime(i))printf("%d\n", i);}return 0;
    }
    

其实可以再简化,不需要flag,要记得return这个东西,比break还terminate得更彻底

#include <stdio.h>int is_prime(int n)
{int i;for (i = 2; i < n; i++){if(n%i == 0){return 0;}}return 1;
}int main(void)
{int i;for (i = 2; i <= 100; i++){if (is_prime(i))printf("%d\n", i);}return 0;
}

2、上一节讲过怎样把for循环改写成等价的while循环,但也提到如果循环体中有continue语句这两种形式就不等价了,想一想为什么不等价了?

for (控制表达式1; 控制表达式2; 控制表达式3) 语句

continue执行完后 会执行for循环中的 控制表达式3

控制表达式1;
while (控制表达式2) {语句控制表达式3;
}

而while中遇到continue 会跳过控制表达式3


不过我寻思…while循环里,把continue写在控制表达式3的后面不就又等价了吗😝

五.嵌套循环

  • 上一节求素数的例子中,在一个循环中调用is_prime函数,而那个函数里面又有个循环,其实这就是嵌套循环,如果全写在main函数里面就是这样👇

    #include <stdio.h>int main(void)
    {int i, j;for (i = 1; i <= 100; i++) {for (j = 2; j < i; j++)if (i % j == 0)break;if (j == i)printf("%d\n", i);}return 0;
    }
    

练习

  • 打印乘法口诀表

    1	
    2	4	
    3	6	9	
    4	8	12	16	
    5	10	15	20	25	
    6	12	18	24	30	36	
    7	14	21	28	35	42	49	
    8	16	24	32	40	48	56	64	
    9	18	27	36	45	54	63	72	81
    
    • my code

      #include <stdio.h>void PrintProduct()
      {int i, j;for ( i = 1; i <= 9; i++){for (j= 1; j <= i; j++){printf("%d ", i * j);}printf("\n");}
      }int main(void)
      {PrintProduct();
      }
      
  • 编写函数diamond打印一个菱形。如果调用diamond(3, '*')则打印:

    	*
    *	*	**
    

    如果调用diamond(5, '+')则打印:

    		++	+	+
    +	+	+	+	++	+	++
    

    如果用偶数做参数则打印错误提示。

    • my code

      #include <stdio.h>/*
      编写函数diamond打印一个菱形。如果调用diamond(3, '*')则打印:*
      *	*	**
      如果调用diamond(5, '+')则打印:++	+	+
      +	+	+	+	++	+	++
      如果用偶数做参数则打印错误提示。
      using C language
      */// 用于打印菱形
      void diamond(int n, char c)
      {int i, j, k;if (n % 2 == 0){printf("Error: n must be odd number");return;}for (i = 0; i < n; i++){if (i < n / 2){for (j = 0; j < n / 2 - i; j++)printf("  ");for (k = 0; k < 2 * i + 1; k++)printf("%c ", c);}else{for (j = 0; j < i - n / 2; j++)printf("  ");for (k = 0; k < 2 * (n - i) - 1; k++)printf("%c ", c);}printf("\n");}
      }
      // 主函数
      int main()
      {int n;char c;// printf("Please input n and c:");// scanf("%d %c", &n, &c);// diamond(n, c);diamond(5, '+');return 0;
      }
      

六.goto语句和标号

  • goto语句,能实现无条件跳转。我们知道break只能跳出最内层的循环,如果在一个嵌套循环中遇到某个错误条件需要立即跳出最外层循环做出错处理,就可以用goto语句,例如:

    for (...)for (...) {...if (出现错误条件)goto error;}
    error:出错处理;
    

    这里的error:叫做标号(Label),任何语句前面都可以加若干个标号,每个标号的命名也要遵循标识符的命名规则。

  • goto语句唯一的限制是goto只能跳转到同一个函数中的某个标号处,而不能跳到别的函数中

    C标准库函数setjmplongjmp配合起来可以实现函数间的跳转,但只能从被调用的函数跳回到它的直接或间接调用者(同时从栈空间弹出一个或多个栈帧),而不能从一个函数跳转到另一个和它毫不相干的函数中。setjmp/longjmp函数主要也是用于出错处理,比如函数A调用函数B,函数B调用函数C,如果在C中出现某个错误条件,使得函数BC继续执行下去都没有意义了,可以利用setjmp/longjmp机制快速返回到函数A做出错处理

  • goto语句不是必须存在的,显然可以用别的办法替代,比如上面的代码段可以改写为

    
    int cond = 0; /* bool variable indicating error condition */
    for (...) {for (...) {...if (出现错误条件) {cond = 1;break;}}if (cond)break;
    }
    if (cond)出错处理;
    
  • 滥用 goto语句会使程序的控制流程非常复杂,可读性很差


从这个角度来讲case和default我没有想到,orz

  • 事实上case 常量表达式:default:,它们是两种特殊的标号。和标号有关的语法规则如下:

    语句 → 标识符: 语句
    语句 → case 常量表达式: 语句
    语句 → default: 语句
    

    反复应用这些语法规则进行组合可以在一条语句前面添加多个标号,比如之前学的这个

    orz,现在从语法规则的角度来看,更加能理解这种了

    img

相关资源、参考资料

  • 豆瓣评价

  • 开源电子书

  • 《Linux C编程一站式学习》这书写得很不错,为什么都买不到了呢? - echo1937的回答 - 知乎 https://www.zhihu.com/question/34069391/answer/544825938

  • [大佬们的学习笔记]

    • 习题答案整理

相关文章:

k8s calico vxlan式详解

之前的文章讲了k8s ipip模式的使用以及流量路径&#xff0c;本篇文章主要是来讲解一下vxlan 模式下pod 流量是如何通信的。 一、ipip模式转vxlan 修改calico backend参数 将calico_backend参数由bird设置为vxlan,因为vxlan部署不使用bgp 修改calico controllers的configmap…...

Chartist.js折线图(四)

线插值/平滑代码如下<!DOCTYPE html> <html><head><link rel="stylesheet" href="./chartist.min.css"><script src="./chartist.min.js"></script></head><body><div class="ct-chart…...

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums = [0] 输出: [0] // 很有意思的一题 我这个也算…...

buuctf-pwn-1.test_your_nc

简单题,知道nc怎么用就好 基本用法 nc 地址 端口号 地址可以是一个域名,也可以是ip地址,地址和端口中间不是:,而是一个空格 连接上之后直接ls就看到flag文件了,cat flag查看flag文件的内容获取flag 注意windows上的nc需要下载,linux上一般会自带flag{c41a6f35-bb45-4c01…...

Pyinstaller打包 openvino,但未带上 openvino的依赖,找不到CPU,GPU

命令: pyinstaller --onefile --collect-submodules openvino --collect-binaries openvino --collect-data openvino server.pyserver.spec (自动生成) # -*- mode: python ; coding: utf-8 -*- from PyInstaller.utils.hooks import collect_data_files from PyInstaller.uti…...

Java ---- 阻塞队列 Blocking Queue

阻塞队列(Blocking Queue)是一种特殊类型的队列,用于多线程环境中,实现进程通信; 常见的Java阻塞队列包括: (1)ArrayBlockingQueue(有界队列)内部是采用数组存储元素的,初始化需要指定容器大小,ArrayBlockingQueue可以用于实现数据缓存、限流、生产者 - 消费者模式等…...

Linux C编程一站式学习笔记6

Linux C编程一站式学习笔记 chap6 循环结构 文章目录Linux C编程一站式学习笔记 chap6 循环结构一.while语句递归 VS 循环函数式编程&#xff08;Functional Programming&#xff09; & 命令式编程&#xff08;Imperative Programming&#xff09;无限递归 & 无限循环习…...

每日学术速递1.26

CV - 计算机视觉 今天带来的是北航IRIP实验室被国际人工智能联合会议IJCAI-ECAI 2022接收的3篇论文。 IJCAI 是人工智能领域中最主要的学术会议之一&#xff0c;原为单数年召开&#xff0c;自2015年起改为每年召开&#xff0c;本次IJCAI与ECAI一起召开。IJCAI官网显示&#xf…...

【教程】Python实时检测CPU和GPU的功耗

目录 前言 GPU功耗检测方法 CPU功耗检测方法 sudo的困扰与解决 完整功耗分析示例代码 转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 前言 相关一些检测工具挺多的&#xff0c;比如powertop、powerstat、s-tui等。但如何通过代码的方式来实时检测&#xf…...

ESP32设备驱动-MCP4725数模转换器驱动

MCP4725数模转换器驱动 1、MCP4725介绍 MCP4725 是一款单通道、12 位、电压输出数模转换器,具有集成 EEPROM 和 I2C 兼容串行接口。MCP4725有如下特性: 12 位分辨率板载非易失性存储器 (EEPROM)0.2 LSB DNL(典型值)外部 A0 地址引脚正常或掉电模式6s(典型值)的快速建立…...

电商项目之同一笔单多次收款成功

1 问题背景 有个收单系统&#xff08;简称S系统&#xff09;&#xff0c;作用是收单&#xff0c;相当于支付渠道&#xff0c;能够作为第三方服务对接其他支付平台。电商系统&#xff08;简称A系统&#xff09;与S系统是隔离的。A系统发起支付请求给S系统&#xff0c;S系统包装一…...

Dubbo 源码分析 – SPI 机制

1.简介 SPI 全称为 Service Provider Interface&#xff0c;是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中&#xff0c;并由服务加载器读取配置文件&#xff0c;加载实现类。这样可以在运行时&#xff0c;动态为接口 加载实现类。正因此特性&#xff0…...

spring笔记下(AOP、事务管理)

一、AOP概述 1. AOP介绍 AOP(Aspect Oriented Programming)&#xff1a;面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构&#xff0c;是oop的延续。&#xff08;OOP面向对象编程&#xff09; AOP作用&#xff1a;在不惊动原始设计的基础上为其进…...

Java基础语法——方法

目录 方法概述 方法定义及格式 方法重载 •方法重载概述 •方法重载特点 方法中基本数据类型和引用数据类型的传递 方法概述 ——假设有一个游戏程序&#xff0c;程序在运行过程中&#xff0c;要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码&…...

逆序遍历List集合

1 问题手写一个程序&#xff0c;完成List集合对象的逆序遍历2 方法创建List接口的多态对象向创建好list集合添加元素使用hasPrevious方法。import java.util.ArrayList;import java.util.List;import java.util.ListIterator;public class TestList { public static void ma…...

RISC-V Directives

原始内容如下&#xff1a; RISC-V Directives The following table lists all available RISC-V specific directives. .align size-log-2 Align to the given boundary, with the size given as log2 the number of bytes to align to. .half value .word value .dword valu…...

Day870.全局锁和表锁 -MySQL实战

全局锁和表锁 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于全局锁和表锁的内容。 数据库锁设计的初衷是处理并发问题。 作为多用户共享的资源&#xff0c;当出现并发访问的时候&#xff0c;数据库需要合理地控制资源的访问规则。锁就是用来实现这些访问规则的重…...

python语法 dot函数

dot是numpy里的函数&#xff0c;主要用于求向量相乘&#xff0c;矩阵乘法&#xff0c;矩阵与向量乘法一、一维向量相乘要求元素个数相同&#xff0c;相当于求内积&#xff0c;对应元素相乘再相加&#xff0c;“1*3 2*4 11”二、矩阵和矩阵相乘遵循矩阵乘法法则“左行 * 右列”…...

Java多线程与并发之线程同步[91]

Java多线程与并发之线程同步[91] 文章目录Java多线程与并发之线程同步[91]一、线程同步概念二、代码演示三.小结一、线程同步概念 线程同步:同步会牺牲性能,加强安全 1.多线程共享数据时,会发生数据不安全情况; 2.多线程共享数据时,必须使用同步; 线程同步三种操作: 1.同步代码…...

C语言基础知识(42)

数组作为函数参数数组可以由整个数组当作函数的参数&#xff0c;也可以由数组中的某个元素当作函数的参数&#xff1a;整个数组当作函数参数&#xff0c;即把数组名称传入函数中数组中的元素当作函数参数&#xff0c;即把数组中的参数传入函数中数组作为函数参数时注意以下事项…...

嵌入式复习题(三)判断题

1.Contex-M3系列处理器内核采用了冯诺依曼结构的三级流水线。&#xff08; &#xff09; 2.STM32系列MCU在使用电池供电时&#xff0c;提供3.3~5V的低电压工作能力。&#xff08; &#xff09; 3.stm3210xx的固件库中&#xff0c;RCC_DeInit函数是将RCC寄存器重新设置为…...

Qt基础之二十三:反射(Reflection)

反射是指程序在运行时动态获取对象属性与方法的一种机制,即编译器需要将类型信息(属性类型与偏移地址以及成员函数的地址等信息)编译到程序文件中,当程序运行时将这些信息加载到内存中去,做到运行时只根据对象的地址或引用就可以获取到对象的类型信息,从而利用这些信息达到…...

AD采集之离散化概念(Quantizer模型使用介绍)

模拟量采集的PLC程序和功能块算法,可以参看下面的文章链接: PLC模拟量采集算法数学基础(线性传感器)_RXXW_Dor的博客-CSDN博客_模拟量采集线性校准模拟量采集库如何设计,具体算法代码请参看我的另一篇博文:PLC模拟量输入 模拟量转换FC:S_ITR_RXXW_BOSS的博客-CSDN博客_…...

【学习笔记】线性递推数列

1.11.11.1 定义&#xff1a;对于无限数列{a0,a1,a2,...}\{a_0,a_1,a_2,...\}{a0​,a1​,a2​,...}和有限非空数列{r0,r1,r2,...,rm−1}\{r_0,r_1,r_2,...,r_{m-1}\}{r0​,r1​,r2​,...,rm−1​}&#xff0c;若对于任意p≥m−1p\ge m-1p≥m−1&#xff0c;有∑k0m−1ap−krk0\s…...

第一次找工作/实习前需要准备的东西(互联网行业)

文章目录一、简历二、笔试三、面试四、offer选择五、投递途径一、简历 详细模板之类的网上一搜都很多&#xff0c;各种网站&#xff0c;在线的&#xff0c;word的&#xff0c;latex的都可以。 主要讲几个个人感觉写的时候需要关注一下的点。 1、个人信息 让hr联系到你&#x…...

【二叉树】java实现代码,详解二叉树,带大家更深刻的掌握二叉树递归思想

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1fa90;&#x1fa90;&#x1fa90;&#xff0c;在探索数据结构的旅程中&#xff0c;二叉树可以说是数据结构中的重点&#xff0c;笔试面试经常出现的问题&#xff0c;同时也是难点。&#x1f425;&#x1f425;&#x1f4…...

【论文翻译】Jointformer :一种基于误差预测和改进的三维人体姿态估计的单帧提升变压器

摘要 单目三维人体姿态估计技术有望极大地提高人体运动数据的可用性。表现最好的单幅图像2D3D提升模型使用图卷积网络(GCNs)&#xff0c;通常需要一些手动输入来定义不同身体关节之间的关系。我们提出了一种新的基于变压器的方法&#xff0c;该方法使用更广泛的自我注意机制来…...

Linux用户管理

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…...

第四十六章 动态规划——状态机模型

第四十六章 动态规划——状态机模型一、通俗理解状态机DP1、什么是状态机2、什么是状态机DP二、例题1、AcWing 1049. 大盗阿福&#xff08;1&#xff09;问题&#xff08;2&#xff09;分析a.状态定义b.状态转移c.循环设计d.初末状态&#xff08;3&#xff09;代码2、AcWing 10…...

Idea中指定xml文件失效

目录一、&#x1f407; 项目场景&#xff1a;二、&#x1f407; 问题描述三、&#x1f407; 原因分析&#xff1a;四、&#x1f407; 解决方案&#xff1a;一、&#x1f407; 项目场景&#xff1a; 最近狮子在搞一个项目&#xff0c;需要用到数据库多表查询&#xff0c;所以在…...

【华为上机真题】工号不够用咋办

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…...

【蓝桥云课】大整数相加与相乘——字符串模拟

一、大整数相加 思路分析&#xff1a; 输入两个整数a1456、b789&#xff0c;输出两个整数相加的结果。 ①将两个整数翻转 个位十位百位千位a6541b9870 ②相加计算&#xff0c;逢十进一 a0b06915a_0b_06915a0​b0​6915&#xff08;进1留5&#xff09; a1b158114a_1b_158114a…...

泊松过程与排队论

全国同理:随机过程随机会过 ......唉 你说热统,他为什么要搭配着随机过程一起学 ......唉 你说数模比赛 为什么不能白送一个奖牌小摘要泊松过程泊松过程来到间隔与等待时间的分布来到时刻的条件分布M/G/1 忙期非齐次泊松过程复合泊松过程条件泊松过程排队系统输入常见的输入分布…...

告别3D-DNA试试chromap和yahs做Hi-C辅助组装吧

之前使用的是3D-DNA流程做Hi-C的辅助组装&#xff0c;它的最大优势就是输出结果可以对接下游的JBAT(juicerbox with Assembly Tools)进行手动矫正。然而它点缺陷也很明显&#xff0c;处理速度不够快&#xff0c;且对植物的优化不行&#xff0c;同时目前许久不更新了。 最近我发…...

Kettle(9):排序记录组件

1 组件介绍 排序组件可以将Kettle数据流中的数据进行排序,可以指定升序、还是降序排列 2 需求 使用Kettle将t_user表中的用户数据,按照年龄升序排序,并将排序后的数据装载到Excel 3 构建Kettle数据流图 效果图...

LVS+keepalived(双主)+Nginx实现高可用负载均衡

#为什么采用双主架构&#xff1a; 单主架构只有一个keepalived对外提供服务&#xff0c;该主机长期处于繁忙状态&#xff0c;而另一台主机却很空闲&#xff0c;利用率低下 #双主架构的优点&#xff1a; 即将两个或以上VIP分别运行在不同的keepalived服务器&#xff0c;以实现…...

力扣 2299. 强密码检验器 II

题目 如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a; 它有至少 8 个字符。 至少包含 一个小写英文 字母。 至少包含 一个大写英文 字母。 至少包含 一个数字 。 至少包含 一个特殊字符 。特殊字符为&#xff1a;“!#$%^&*()-” 中的一个。…...

[GWCTF 2019]枯燥的抽奖

目录 信息收集 知识回顾 解题思路 信息收集 查看源码&#xff0c;发现check.php <?php #这不是抽奖程序的源代码&#xff01;不许看&#xff01; header("Content-Type: text/html;charsetutf-8"); session_start(); if(!isset($_SESSION[seed])){ $_SESSIO…...

初入职场的我认识到linux的重要性

先自我介绍下&#xff0c;我是一名普通的软件工程专业的本科毕业生&#xff0c;今年刚毕业&#xff0c;软件工程的课程超级多&#xff0c;有程序设计基础、面向对象程序设计、软件工程导论、离散结构、数据结构与算法、计算机系统基础、操作系统、数据库概论、网络及其计算等等…...

数据库系统概述

文章目录一、数据、数据库、数据库管理系统、数据库系统1.数据2.数据库&#xff08;DB&#xff09;3.数据库管理系统&#xff08;DBMS&#xff09;1&#xff09;数据定义2&#xff09;数据组织、存储和管理3&#xff09;数据操纵4&#xff09;事务管理和运行管理5&#xff09;数…...

【算法基础】快速排序(分治思想)

一、快速排序原理 1. 算法介绍 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(记左端为L,最右端为R) 分界点的选取有如下四种方法:(1)q[L];(2)q[(L+R)/2];(3)q[R];(4)随机选取 (2)…...

JavaEE-初识网络

目录一、局域网二、广域网三、网络通信基础3.1 IP地址3.2 端口号3.3 协议四、协议分层五、封装和分用一、局域网 局域网&#xff0c;网络种类&#xff0c;覆盖范围一般是方圆几千米之内&#xff0c;其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局…...

【23】C语言 | 初阶结构体

目录 1、结构的基础知识 2、结构成员的类型 3、结构体初始化 4、结构体的访问 5、结构体传参 1、结构的基础知识 结构是这些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 数组&#xff1a;一组相同类型的元素的集合 结构体&#xff1a;也是…...

【笔记】SemGCN

一. 论文总结 1.1 核心贡献 提出了一种改进的图卷积操作&#xff0c;称为语义图卷积(SemGConv)&#xff0c;它源自cnn。其关键思想是学习图中暗示的边的信道权值&#xff0c;然后将它们与核矩阵结合起来。这大大提高了图卷积的能力。其次&#xff0c;我们引入了SemGCN&#x…...

Python机器学习:一元回归

→\rightarrow→回归效果评价 &#x1f315; 一元回归 一元回归主要研究一个自变量和一个因变量之间的关系&#xff0c;而这个自变量和因变量之间的关系又可分为线性回归和非线性回归。 ⭐️ 一元线性回归分析两个变量之间的线性关系&#xff0c;如ykxbykxbykxb中xxx和yyy就是…...

四轮两驱小车(三):STM32驱动MPU6050进行转弯

前言&#xff1a; 寒假已经过了一半了&#xff0c;前段时间跟学弟一起从零开始搞了一下深度学习&#xff0c;现在才想起来这个系列还没有更完。本篇博客主要介绍一下这个小车转直角弯的神器----MPU6050 MPU6050介绍&#xff1a; 我所采用的MPU6050是某宝上十几块钱的这种&…...

C++:类的static成员,友元和构造函数初始化列表

目录 一.类的构造函数的初始化列表 1.类的构造函数初始化列表的引入和介绍 2.初始化列表用于类的类对象成员的拷贝构造函数的调用 3.初始化列表的使用细则 4.使用初始化列表的一个注意事项 二.explicit关键字 三.C类的static成员 1.类中static修饰的成员变量 2.类中st…...

用友U8和旺店通企业版淘宝奇门单据接口集成

用友U8和旺店通企业奇门单据接口集成对接系统&#xff1a;旺店通企业奇门慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xff0c;先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策的产品线从旺店通E…...

Java-黑马Java学习作业-day11集合学生管理系统

学习视频链接&#xff1a;https://www.bilibili.com/video/BV17F411T7Ao 文章目录题目1-将数组存放在集合中题目2-教师信息查看题目3-员工信息删改查操作题目4&#xff08;综合&#xff09;-图书管理系统题目1-将数组存放在集合中 现有如下字符串元素&#xff1a;[“aaa”, “…...

【Linux】冯诺依曼体系结构与操作系统概念理解

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、冯诺依曼体系结构1、体系简述2、内存的重要性3、硬件方案解释软件行为4、体系结构中的数据流动5、拓展三、操作系统简述…...

protegeproject/mapping-masterPublic

protegeproject/mapping-masterPublicWatch 10 Fork 7Fork your own copy of protegeproject/mapping-masterStar 44CodeIssues15Pull requests3ActionsProjectsWikiSecurityInsightsMappingMasterDSL编辑新页面马丁奥康纳编辑了此页面 on Oct 29, 2020 85 修订页面4家Mapping…...

大数据分析案例-基于随机森林算法构建人口普查分析模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

【数据结构和算法】认识线性表中的链表,并实现单向链表

本文接着上文&#xff0c;上文我们认识了线性表的概念&#xff0c;并实现了静态、动态顺序表。接下来我们认识一个新概念链表。并实现单向链表的各种操作。顺序表还有不明白的看这一篇文章 (13条消息) 【数据结构和算法】实现线性表中的静态、动态顺序表_小王学代码的博客-CSDN…...

2023-1-28

具有给定数值的最小字符串 题目描述 小写字符 的 数值 是它在字母表中的位置&#xff08;从 1 开始&#xff09;&#xff0c;因此 a 的数值为 1 &#xff0c;b 的数值为 2 &#xff0c;c 的数值为 3 &#xff0c;以此类推。 字符串由若干小写字符组成&#xff0c;字符串的数…...

Linux_常见命令

1.ls ls -l 列出隐藏文件&#xff0c;并显示10项权限,类似如同下图 在部分发行版本的linux下&#xff0c;ll等同于ls -l 首先&#xff0c;第一列为-则代表着这一列是文件&#xff0c; 第一列为d则代表这一列为目录 除了第一位&#xff0c;那么其他还有9位&#xff0c;分为3组…...

【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…

能一个人走的路别抱有任何期待&#xff0c;死不了 文章目录一、关于文件的重新认识二、语言和系统级的文件操作&#xff08;语言和系统的联系&#xff09;1.C语言文件操作接口&#xff08;语言级别&#xff09;1.1 文件的打开方式1.2 文件操作的相关函数1.3 细节问题2.系统级文…...

Hadoop3:大数据生态体系

一、技术层面 通过下面这张图&#xff0c;我们可以大概确定&#xff0c;在大数据行业里&#xff0c;自己的学习路线。 个人认为&#xff0c;Hadoop集群一旦搭建完工&#xff0c;基本就是个把人运维的事情 主要岗位应该是集中在数据计算层&#xff0c;尤其是实时计算&#xff…...

鸿蒙原生应用元服务-访问控制(权限)开发应用权限列表二

ohos.permission.ACCELEROMETER 允许应用读取加速度传感器的数据。 权限级别 &#xff1a;normal 授权方式 &#xff1a;system_grant ACL使能 &#xff1a;TRUE ohos.permission.GYROSCOPE 允许应用读取陀螺仪传感器的数据。 权限级别 &#xff1a;normal 授权方式 &a…...

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

输入法重大漏洞曝光,仅华为幸免,近10亿用户受影响

近日&#xff0c;Citizenlab研究人员调查了多家厂商的输入法应用安全漏洞并报告称&#xff1a;除华为以外&#xff0c;百度、荣耀、科大讯飞、OPPO、三星、腾讯、Vivo和小米等供应商的九款应用程序中有八款均存在安全漏洞。 随着用户规模的不断增长&#xff0c;云输入法应用的…...

谷歌收录工具有什么好用的?

如果是想促进谷歌的收录&#xff0c;其实能用的手段无非就两个&#xff0c;谷歌GSC以及爬虫池 谷歌gsc就不用说了&#xff0c;作为谷歌官方提供的工具&#xff0c;他能提供最准确的数据&#xff0c;并且可以提交每天更新的链接&#xff0c;进而促进收录&#xff0c;只要你的页面…...

【CVPR2024】文本到图像的行人再识别中的噪声对应学习

这篇论文的标题是《Noisy-Correspondence Learning for Text-to-Image Person Re-identification》,作者是来自中国四川大学、英国诺森比亚大学、新加坡A*STAR前沿人工智能研究中心和高性能计算研究所的研究人员。论文主要研究了文本到图像的行人再识别(Text-to-Image Person…...