《C语言深度解剖》(2):详解C语言分支语句和循环

🤡博客主页:醉竺

🥰本文专栏:《C语言深度解剖》

😻欢迎关注:感谢大家的点赞评论+关注,祝您学有所成!


✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看💛💜✨✨ 


本篇文章来学习C语言中的分支语句循环语句

1.分支语句

  • if
  • switch

2.循环语句

  • while
  • for
  • do while

3.goto语句

1. 什么是语句? 

C语句可分为以下五类:

  1. 表达式语句
  2.  函数调用语句
  3.  控制语句
  4. 复合语句
  5. 空语句

本章后面介绍的是控制语句。

控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。 

可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句;
  2. 循环执行语句:do while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。 

 2. 分支语句(选择结构)

如果你好好学习,校招时拿一个好offer,走上人生巅峰。

如果你不学习,毕业等于失业,回家卖红薯。

这就是选择!

2.1 if语句

那if语句的语法结构是怎么样的呢?

语法结构:
if (表达式)    
    语句;

if (表达式)    
    语句1;
else  
    语句2;

//多分支    
if (表达式1)    
    语句1;
else if (表达式2)  
     语句2;
else
    语句3;

例如下面有几个例子:

#include <stdio.h>
//代码1
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
}
//代码2
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
    else
   {
        printf("成年\n");
   }
}
//代码3
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("少年\n");
   }
    else if(age>=18 && age<30)
   {
        printf("青年\n");
   }
    else if(age>=30 && age<50)
   {
      printf("中年\n");
   }
    else if(age>=50 && age<80)
   {
        printf("老年\n");
   }
    else
   {
        printf("老寿星\n");
   }
    
}

解释一下: 如果表达式的结果为真,则语句执行

在C语言中如何表示真假?

0表示假,非0表示真。

如果条件成立,要执行多条语句,怎应该使用代码块。

#include <stdio.h>
int main()
{
   if(表达式)
   {
        语句列表1;
   }
   else
   {
        语句列表2;
   }
    return 0;
}

这里的一对 { } 就是一个代码块。

2.1.1 悬空else

当你写了这个代码:

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

改正:

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
   {
        if(b == 2)
       {
            printf("hehe\n");
       }
   }
    else
   {
         printf("haha\n");
   }       
    return 0;
}

else的匹配:else是和它离的最近的if匹配的。 

2.1.2 if书写形式的对比 

对比下面四个if程序的写法,选择出来你认为最好的写法? 

//代码1
if (condition) {
    return x;
}
return y;
//代码2
if(condition)
{
    return x;
}
else
{
  return y;
}
//代码3
int num = 1;
if(num == 5)
{
    printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
    printf("hehe\n");
}

上述代码都没有问题,不过代码2和代码4更好,逻辑更加清晰,不容易出错。 代码4与代码3相比,比较一个变量和一个常量是否相等的时候,建议把常量放在等号的左边,这样不容易把==写成复制运算符=,避免出错。

2.1.3 练习  

  1. 判断一个数是否为奇数
  2. 输出1-100之间的奇数

题1:

#include <stdio.h>

int main() {
    int num;
    printf("Enter an integer: ");
    scanf("%d", &num);

    // If num modulo 2 is not equal to 0 then it's an odd number
    if(num % 2 != 0) {
        printf("%d is an odd number.\n", num);
    } else {
        printf("%d is not an odd number.\n", num);
    }

    return 0;
}

题2:

#include <stdio.h>

int main() {
    int i;
    printf("Odd numbers between 1 and 100:\n");
    for(i = 1; i <= 100; i++) {
        // Check if the number is odd
        if(i % 2 != 0) {
            printf("%d\n", i);
        }
    }
    return 0;
}

2.2 switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。

比如:

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期日

那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。 

这就是switch 语句。

switch(整型表达式)
{
    语句项;
}

注意:switch后面的括号里面只能是整形表达式 

而语句项是什么呢?

//是一些case语句:
//如下:
case 整形常量表达式:
    语句;

2.2.1 在switch语句中的 break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。 

比如:

#include <stdio.h>
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0;
}

switch决定了入口,break决定了出口 

有时候我们的需求变了:

  1. 输入1-5,输出的是“weekday”;
  2. 输入6-7,输出“weekend” 

所以我们的代码就应该这样实现了:

#include <stdio.h>
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

break语句 的实际效果是把语句列表划分为不同的分支部分。 

编程好习惯:

在最后一个 case 语句的后面加上一条 break语句。

2.2.2 default子句

如果表达的值与所有的case标签的值都不匹配怎么办?

其实也没什么,结构就是所有的语句都被跳过而已。

程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。

但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?

你可以在语句列表中增加一条default子句,把下面的标签 

default:

写在任何一个 case 标签可以出现的位置。

当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。

但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

编程好习惯

在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。 

2.2.3 练习 

#include <stdio.h>
int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);  // m = 5, n = 3
	return 0;
}

3. 循环语句 

  • while
  • for
  • do while

3.1 while循环

我们已经掌握了,if语句:

if(条件)
     语句;

当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 

由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢?

C语言中给我们引入了: while 语句,可以实现循环。 

//while 语法结构
while(表达式)
{
    循环语句;
}

while循环基本流程: 

1. 开始

2. 初始化循环变量

3. 判断循环条件

4. 如果循环条件为真,执行循环体内的语句

5. 更新循环变量

6. 返回步骤3

7. 如果循环条件为假,跳出循环

8. 结束  

其中break表示跳出完全整个while循环,continue跳出本次循环,开始下一次循环,后面有详细讲解。

比如我们实现:

在屏幕上打印1-10的数字。 

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下: 

3.1.1 while语句中的break和continue 

break介绍

//break 代码实例
#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

这里代码输出的结果是什么?

输出结果是:1 2 3 4

总结: 

break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

所以:while中的break是用于永久终止循环的。

continue介绍 

//continue 代码实例1
#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

这里代码输出的结果是什么?

输出结果是:1 2 3 4

//continue 代码实例2
#include <stdio.h>
int main()
{
    int i = 1;
    while (i < 10)
    {
        i = i + 1;
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}

这里代码输出的结果是什么?

输出结果是:2 3 4 6 7 8 9 10

总结: 

continue在while循环中的作用就是:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

🌟🌟🌟再看几个重要的代码:

//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF)
        putchar(ch);
    return 0;
}

这段代码是一个简单的字符输入输出程序。它会从标准输入读取字符,并将其逐个输出到标准输出,直到读取到文件结束符(EOF)。在大多数系统中,文件结束符通常是按下 Ctrl + D(在 Windows 系统中是 Ctrl + Z)。代码中的getchar()函数用于读取字符,putchar()函数用于输出字符。while循环会一直执行,直到读取到文件结束符为止。然后程序返回0,表示正常结束。

//代码2
#include <stdio.h>
int main()
{
    char ch = '\0';
    while ((ch = getchar()) != EOF)
    {
        if (ch < '0' || ch > '9')
            continue;
        putchar(ch);
    }
    return 0;
}
 //这个代码的作用是:只打印数字字符,跳过其他字符的

消除缓冲区示例: 

#include <stdio.h>
int main()
{
    char password[20] = {0};
    int ch = 0;

    printf("请输入密码:>");
    scanf("%s", password); 

    // 消除'\n' ——清理缓冲区,防止输入密码时遗留回车符。
    // '\n'也可以换成其他字符对应消除
    while ((ch = getchar()) != '\n' && ch != EOF) {
        continue;
    }

    printf("请确认密码(Y/N):>");
    ch = getchar();

    if(ch == 'Y')
        printf("确认成功\n");
    else
        printf("确认失败\n");

    return 0;
}

可以测试一下,如果没有下面这段代码运行会出现什么结果。

    while ((ch = getchar()) != '\n' && ch != EOF) {
        continue;
    }

3.2 for循环 

我们已经知道了while循环,但是我们为什么还要一个for循环呢?

首先来看看for循环的语法:

3.2.1 语法

for(表达式1; 表达式2; 表达式3)
    循环语句;

表达式1

表达式1为初始化部分,用于初始化循环变量的。

表达式2

表达式2为条件判断部分,用于判断循环时候终止。

表达式3

表达式3为调整部分,用于循环条件的调整。 

实际的问题:

  • 使用for循环 在屏幕上打印1-10的数字。 
#include <stdio.h>
int main()
{
	int i = 0;
	//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

for循环的执行基本流程:

  1. 初始化循环变量 i。
  2. 判断循环条件,如果条件为真,继续执行循环;如果条件为假,跳出循环。
  3. 执行循环体中的代码。
  4. 更新循环变量 i。
  5. 重复步骤2-4,直到循环条件为假。
  6. 循环结束。

现在我们对比一下for循环和while循环。

int i = 0;
//实现相同的功能,使用while
i = 1;//初始化部分
while (i <= 10)//判断部分
{
	printf("hehe\n");
	i = i + 1;//调整部分
}
//实现相同的功能,使用while
for (i = 1; i <= 10; i++)
{
	printf("hehe\n");
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。 

3.2.2 break和continue在for循环中

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。 但是还是有些差异:

//代码1
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i); // 1 2 3 4
	}
	return 0;
}
//代码2
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i); // 1 2 3 4 6 7 8 9 10
	}
	return 0;
}

总结:

  1. 当有多层嵌套循环时,break语句和continue只能跳出最近一层循环 。
  2. continue语句用于结束本次循环,继续下一次;break语句用来彻底退出本层循环。
  3. while循环和do while循环中continue语句被执行时会跳到循环条件进 行下一次迭代判断,for循环中continue语句被执行时,会跳到执行递增表达式处,然后再检查循环条件。 

3.2.3 for语句的循环控制变量 

建议:

  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for (i = 0; i < 10; i++)
{
}

//两边都是闭区间
for (i = 0; i <= 9; i++)
{
}

3.2.4 一些for循环的变种 

for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题 

for循环的初始化,判断和调整三个部分都可以省略 但是省略调整判断部分,判断就恒为真,循环就死循环 

#include <stdio.h>
int main()
{
    //代码1
    for (;;)
    {
        printf("hehe\n");
    }
    return 0;
}
#include <stdio.h>
int main()
{
    //代码2
    int i = 0;
    int j = 0;
    //这里打印多少个hehe?
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            printf("hehe\n");
        }
    }
    return 0;
}
#include <stdio.h>
int main()
{
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?
    for (; i < 10; i++)
    {
        for (; j < 10; j++)
        {
            printf("hehe\n"); // 10次hehe
        }
    }
    return 0;
}

代码3分析:

j=10后,i=1,进入内循环的判断,但内循环中 j 并未重新初始化,数值依然是从10开始,10<10不成立,内层循环不符合判断条件,所以不会再进入内循环。

#include <stdio.h>
int main()
{
    //代码4-使用多余一个变量控制循环
    int x, y;
    for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
    {
        printf("hehe\n"); // 两次hehe
    }
    return 0;
}

3.2.5 一道笔试题

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
    int i = 0;
    int k = 0;
    for (i = 0, k = 0; k = 0; i++, k++)
        k++;
    return 0;
}

这是赋值表达式,赋值为0,则判断条件表达式“k=0”的整体结 果为0,则表达式的结果为假不成立,不会进入循环。 注意⚠️ ,在进行条件表达式时要注意不要把相等==写成赋值= 。

3.3 do...while()循环 

3.3.1 do语句的语法:

do
循环语句;
while (表达式);

3.3.2 执行流程

do...while循环的特点:

  1. 先执行循环体中的代码,然后再判断循环条件。
  2. 如果循环条件为真,则继续执行循环体;如果循环条件为假,则跳出循环。
  3. 所以,do...while循环至少会执行一次循环体中的代码,即使循环条件一开始就为假。
  4. 之后重复执行循环体和判断循环条件的步骤,直到循环条件为假,循环结束。

3.3.3 do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用。 

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d ", i);
        i = i + 1;
    } while (i <= 10);
    return 0;
}

3.3.4 do while循环中的break和continue 

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if (5 == i)
            break;
        printf("%d ", i);
        i = i + 1;
    } while (i <= 10); // 1 2 3 4

    return 0;
}
#include <stdio.h>
int main()
{
    int i = 1;

    do
    {
        if (5 == i)
            continue;
        printf("%d ", i); // 1 2 3 4
        i = i + 1;
    } while (i <= 10);

    return 0;
}

4. goto语句 

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。

从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。

例如:一次跳出两层或多层循环。

多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

goto语言真正适合的场景如下:

for (...)
for (...)
{
    for (...)
    {
        if (disaster)
            goto error;
    }
}
…
error :
if (disaster)
// 处理错误情况

下面是使用goto语句的一个例子,然后使用循环的实现方式替换goto语句:

一个关机程序:

#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
    char input[10] = { 0 };
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if (0 == strcmp(input, "我是猪"))
    {
        system("shutdown -a");
    }
    else
    {
        goto again;
    }
    return 0;
}

而如果不适用goto语句,则可以使用循环:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char input[10] = { 0 };
    system("shutdown -s -t 60");
    while (1)
    {
        printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
        scanf("%s", input);
        if (0 == strcmp(input, "我是猪"))
        {
            system("shutdown -a");
            break;
        }
    }
    return 0;
}

5.练习 

  1. 计算 n的阶乘。 
  2. 计算 1!+2!+3!+……+10!
  3. 编写代码,演示多个字符从两端移动,向中间汇聚。
  4. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
  5. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
// 1.数字num的阶乘
int main()
{
	int i = 0;
	int num = 0;
	scanf("%d", &num);
	//求num的阶乘
	int ret = 1;
	for (i = 1; i <= num; i++)
	{
		ret *= i;
	}
	printf("%d的阶乘为:%d\n", num,ret);

	return 0;
}
// 2.计算 1!+2!+3!+……+10!
int main()
{
	int i = 0;
	int n = 0;
	scanf("%d", &n);
	int sum = 0; // n个数的阶乘之和
	
	for (i = 1; i <= n; i++)
	{
		//计算每个数的阶乘
		int ret = 1; 
		for (int j = 1; j <= i; j++)
		{
			ret *= j; // 每个数的阶乘
		}
		sum += ret; // n个数的阶乘之和
	}
	printf("%d", sum);
	return 0;
}
// 3.编写代码,演示多个字符从两端移动,向中间汇聚。
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
    char arr1[] = "welcome to China!";
    char arr2[] = "#################";
    int left = 0;
    int right = strlen(arr1) - 1;
    printf("%s\n", arr2);
    //while循环实现
    while (left <= right)
    {
        Sleep(1000);
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left++;
        right--;
        printf("%s\n", arr2);
    }

    for循环实现
    //for (left = 0, right = strlen(src) - 1;
    //    left <= right;
    //    left++, right--)
    //{
    //    Sleep(1000);
    //    arr2[left] = arr1[left];
    //    arr2[right] = arr1[right];
    //    printf("%s\n", target);
    //}
    return 0;
}
/4.*编写代码实现,模拟用户登录情景,并且只能登录三次。
(只允许输入三次密码,如果密码正确则提示登登录成功,
如果三次均输入错误,则退出程序。*/

#include <stdio.h>
#include <string.h>
int main()
{
    char psw[10] = "qwerty";
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; ++i)
    {
        printf("please input:");
        scanf("%s", psw);
        if (strcmp(psw, "password") == 0)
            break;
    }
    if (i == 3)
        printf("exit\n");
    else
        printf("log in\n");
}

二分查找算法(折半查找) 

比如我买了一双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让 你猜,你会怎么猜? 答案:你每次猜中间数。

代码实现: 

int main()
{
	int arr[10] = { 1,3,5,6,8,9,11,15,16,66 };
	int left = 0;
	int right = sizeof(arr) / sizeof(int) - 1;
	int key = 66;
	int flag = 0;
	while (left <= right)
	{
		//int mid = (left + right) / 2; //此方式可能会超出int类型最大范围(若left和right都是很大的数值时)
		int mid = left + (right - left) / 2;

		if (key > arr[mid])
		{
			left = mid + 1;
		}
		else if (key < arr[mid])
		{
			right = mid - 1;
		}
		else
		{
			printf("找到目标值key:%d,下标为:%d", key, mid);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("未找到目标值key:%d", key);
	}

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node操作mysql

配置 安装mysql模块 npm i mysql建立连接 const mysql require(mysql);const db mysql.createPool({host: 127.0.0.1,user: root,password: admin123,database: my_db_01 });测试 // select 1没有任何实质性作用 只是检查mysql模块是否正常 db.query(select 1, (err, results…

修电机所需要的基本工具

等距式 模具 同心式模具 电机划线刀 压脚 千分尺 -----测量线径 钳形电流表------- 测量 空载 满载下的电流值 摇表&#xff0c; 测量线圈是否碰到外壳 指针式万用表 胶锤 整理线圈 绝缘纸和青稞纸&#xf…

RuoYi-Vue若依框架-vue前端给对象添加字段

处理两个字段的时候有需求都要显示在下拉框的同一行&#xff0c;这里有两种解决方案&#xff0c;一是后端在实体类添加一个对象&#xff0c;加注解数据库忽略处理&#xff0c;在接口处拼接并传给前端&#xff0c;二是在前端获取的数据数组内为每个对象都添加一个字段&#xff0…

Ethernet 汇总

Ethernet系统 硬件最小系统 CPU:可以是复杂的芯片,也可以是小的单片机DMA:用于减轻CPU负担,搬运数据系统Memory<->FIFOMAC:可以集成在芯片里面,用于CPU和PHY之间的通信MII:接口用于MAC和PHY的通信,包括控制MDIO和数据DataPHY:模拟器件,最底层,数据收发源头软件…

Vue3【进阶】

简介 https://cn.vuejs.org/guide/introduction.html 创建vue3工程 【基于 vue-cli创建】 基本和vue-cli的过程类似&#xff0c;只是选择的时候用vue3创建 【基于vite创建】【推荐】 【官网】https://vitejs.cn/ 【可以先去学一下webpack】 步骤 【https://cn.vitejs.…

PostgreSQL入门到实战-第三弹

PostgreSQL入门到实战 PostgreSQL安装之linux官网地址PostgreSQL概述linux安装PostgreSQL更新计划 PostgreSQL安装之linux 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.postgresql.org/PostgreSQL概述 Postg…

【全套源码教程】基于SpringBoot+MyBatis+Vue的流浪动物救助网站的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台界面功能介绍 动物领养及捐赠 宠物论坛 公告信息 商品页面 寻宠服务 个人中心 购…

AI视觉入门:卷积和池化

从2012年以AlexNet为代表的模型问世以来&#xff0c;人工智能尤其是视觉cv部分飞速发展&#xff0c;在刚开始效果不如人类&#xff0c;到2015年在ImageNet1000数据集的表现就超过了人类。在Transformer模型出现之前&#xff0c;视觉模型的主要组成部分就是卷积和池化&#xff0…

在家也能赚钱!长期副业兼职,充分利用你的零碎时间!

2024年已然匆匆走过了三分之一&#xff0c;许多人或许都感受到了这一年大环境带来的压力。然而&#xff0c;对我而言&#xff0c;每个月的副业收入尚算可观&#xff0c;稳定在3000元以上&#xff0c;这让我深感庆幸&#xff0c;因为我找到了那份适合自己的副业。 打工的日子&a…

【40分钟速成智能风控1】互联网金融风险管理简介

目录 瓦联网金融的发展和现状 风险管理类型划分 欺诈风险 第一方和第三方 账户级和交易级 个人和团伙 互联网金融是传统金融业务与新兴互联网技术结合的一个交叉领域&#xff0c;例如互联网公司开展的金融业务&#xff0c;或者金融机构的线上化服务&#xff0c;都属于互联…

python 如何生成uuid

UUID&#xff08;Universally Unique Identifier&#xff09;是通用唯一识别码&#xff0c;在许多领域用作标识&#xff0c;比如我们常用的数据库也可以用它来作为主键&#xff0c;原理上它是可以对任何东西进行唯一的编码的。作为新手一看到类似varchar(40)这样的主键就觉得有…

从零到一:如何使用亮数据代理快速收集训练数据打造自己的AIGC大模型

这里写自定义目录标题 前言项目内容项目进展 1、本章节事项1.1、确定2个分类1.2、寻找来源网站1.2.1、京东搜索1.2.2、淘宝搜索1.2.3、唯品会搜索 1.3、编写代码&#xff0c;收集数据&#xff0c;并按照分类存放图片1.3.1、在Java项目里加载SeleniumChromeDriverJsoup的jar包1.…

【计算机毕业设计】医院电子病历管理系统

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

蓝桥杯刷题-05-子串简写-暴力

#include <iostream>using namespace std; string s; int main() {// 请在此输入您的代码int k0;int num0;char c1,c2;cin>>k;cin>>s;cin>>c1>>c2;int lens.size();for(int i0;i<len-k1;i){for(int ji1;j<len;j){if(s[i]c1&&s[j]c…

基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程

原文链接&#xff1a;基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600473&idx6&sn431e9408a42862d29fe4f4ef7703595b&chksmfa8208becdf581a820d9479d2aa61b88e96612c4ab72b0…

用苹果CMS一小时搭建自己的私人影院(仅供学习与参考,请勿用于商业用途)

用苹果CMS一小时搭建自己的私人影院&#xff08;仅供学习与参考&#xff0c;请勿用于商业用途&#xff09; 一、购买域名和服务器空间或虚拟主机空间。 二、下载苹果CMS影视安装程序到本地。 三、上传苹果CMS安装程序至你的空间并安装。 四、后台设置完善你的电影网站。 五、…

亚马逊店铺引流:海外云手机的利用方法

在电商业务蓬勃发展的当下&#xff0c;亚马逊已经成为全球最大的电商平台之一&#xff0c;拥有庞大的用户群和交易量。在激烈的市场竞争中&#xff0c;如何有效地吸引流量成为亚马逊店铺经营者所关注的重点。海外云手机作为一项新兴技术工具&#xff0c;为亚马逊店铺的流量引导…

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议&#xff0c;即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的&#xff0c;旨在解决传统HTTP协议在实…

“Java泛型” 得所憩,落日美酒聊共挥

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

Leetcode 64. 最小路径和

心路历程&#xff1a; 第一反应像是一个回溯问题&#xff0c;但是看到题目中要求最值&#xff0c;大概率是一道DP问题。并且这里面的递推关系也很明显。 这里面边界条件可以有多种处理方法。 解法&#xff1a;动态规划 class Solution:def minPathSum(self, grid: List[List…