C语言-分支和循环语句、函数、数组、操作符、指针、结构体

目录

  • 一、scanf和getchar
  • 二、产生随机数函数
  • 三、辗转相除法求最大公约数
  • 四、函数的参数
    • 4.1 实际参数(实参)
    • 4.2 形式参数(形参)
    • 4.3 内存分配
  • 五、函数的调用
    • 5.1 传值调用
    • 5.1 传址调用
  • 六、函数的声明和定义
    • 6.1 函数的声明
    • 6.2 函数的定义
    • 6.2 静态库的导出
  • 七、函数的递归
    • 7.1 递归的两个必要条件
    • 7.2 练习
  • 八、数组
  • 九、操作符
    • 9.1 操作符的属性
    • 9.2 隐式类型转换
      • 9.2.1 整型提升
      • 9.2.2 算术转换
  • 十、指针
    • 10.1 野指针成因
    • 10.2 规避野指针
    • 10.3 指针运算
    • 10.4 指针数组
  • 十一、结构体
  • 十二、寄存器

一、scanf和getchar

  getchar()读取一个字符,读取成功返回字符的ASCII码值,返回类型为int。如果读取失败会返回EOF(EOF end of file 文件结束标志,#define EOF -1) (ctrl+z——会让scanf或者getchar返回EOF)
  putchar()打印字符
在这里插入图片描述
  此时scanf默认读取\n之前的所有字符。所以第一次scanf直接读取到了123456,而第二次scanf则读取到了\n

在这里插入图片描述
  此时scanf默认读取的是空格前面的,所以第一次读取123456。所以为了让scanf能读到\n后面自己输入的数据就可以用循环getchar的方式进行读取
在这里插入图片描述
  fflush(stdin)这个函数的功能是清理输入缓冲区中的数据,但是不一定有用,因为在新版本的VS上这个函数的功能被取消了。

sleep(1000)单位是毫秒,1000毫秒等于1秒
system(“cls”) //system函数可以执行系统命令,cls是清理屏幕
两个字符串比较相等是不能使用==的,应该使用strcmp库函数
strcmp返回0表示2个字符串相等(strcmp(‘a’,‘a’))
strcmp返回>0的数字,表示一个字符串大于第二个字符串
strcmp返回<0的数字,表示一个字符串小于第二个字符串
scanf函数读字符串的时候会自己在后面加上\0,即当定义字符串为xxxxxx,当输入为123回车时,则输出就为123。在内存中可以看出,字符串123后面是\0

二、产生随机数函数

rand() 可以生成随机数,随机数的范围是:0-32767,返回的是整数
time函数可以返回一个时间戳(中间传个空指针就行了)
srand(unsigned int)time(NULL) 要给srand传递一个变化的值,计算机上的时间是时刻发生变化的
生成0-99的数为:rand()%100+1

shutdown -s -t 60 是系统中关机的命令,表示60秒后进行关机 (在程序中则使用system(“shut down -s -t 60”))
shutdown -a 则表示取消关机(在程序中则使用system(“shut down -a”))

三、辗转相除法求最大公约数

在这里插入图片描述

m n k
24 18 6
18 6 0
所以输出公约数n为6

四、函数的参数

4.1 实际参数(实参)

  真实传给函数的参数,叫实参。
  实参可以是:常量、变量、表达式、函数等。
  无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

4.2 形式参数(形参)

  形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

4.3 内存分配

栈区:局部变量,形式参数
堆区:动态内存管理,malloc,realloc,calloc,free
静态区:静态变量,全局变量

在这里插入图片描述
  C语言中,内存主要分为5个区,分别为栈区、堆区、全局/静态存储区、常量存储区、代码区。其中代码区存放源程序的二进制代码,其余四个区都存储进程运行过程中需要的存储的变量。
在这里插入图片描述
(1)栈
  存局部变量、函数,调用函数时会开辟栈区,函数结束时就自动回收,遵循后进先出的原则,从高地址向低地址增长。
(2)堆
  malloc、realloc、calloc等开辟的内存就在堆,从低地址向高地址增长,由程序员分配和释放,系统步自动回收,所以一定要记得申请了就要释放,以免溢出。
系统提供了四个库函数来实现内存的动态分配:
①malloc(size) 在内存的动态存储区中分配一个长度为size的连续空间。
②calloc(n,size) 在内存的动态存储区中分配n个长度为size的连续空间。
③free§ 释放指针变量p做指向的动态空间。
④realloc(p,size) 将指针变量p指向的动态空间大小改变为size。
(3)全局(静态)区
  通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在真个程序运行期间都可见的全局变量静态变量
(4)常量区
  字符串、数字等常量存放在常量区。const修饰的全局变量存放在常量区。程序运行期间,常量区的内容不可以被修改。
(5)代码区
  程序执行代码存放在代码区,其值不能修改(若修改则会出现错误)。字符串常量和define定义的常量也有可能存放在代码区。

五、函数的调用

5.1 传值调用

  函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

5.1 传址调用

  传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
  这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

六、函数的声明和定义

6.1 函数的声明

  1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
  2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
  3. 函数的声明一般要放在头文件中的。

6.2 函数的定义

  函数的定义是指函数的具体实现,交待函数的功能实现。

6.2 静态库的导出

在这里插入图片描述
  首先右键项目名称,选择最后一个属性,然后在配置属性的常规中找到配置类型,将原来你的应用程序(.exe)改成静态库(.lib)就行了。
  当我们拿到.lib和.h文件时就可以对静态库进行导入执行了。

//以简单的加法程序为例
//其中Add函数的实现为
//int Add(int x , int y)
{
	return x+y;
}

#include "add.h"    //首先头文件还是需要包含声明

//.lib - 静态库
//导入静态库
#pragma comment(lib,“add.lib”)     //对静态库进行导入

int main()    //此时就可以在程序中进行调用了
{
  int a=0;
  int b=0;
  //输入
  scanf("%d %d",&a,&b);
  //加法
  int c=Add(a,b);   //函数调用
  //打印
  printf("%d\n",c);
  return 0;
}

七、函数的递归

7.1 递归的两个必要条件

  存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  每次递归调用之后越来越接近这个限制条件。

7.2 练习

1.接收一个整型值(无符号),按照顺序打印它的每一位
例如:
输入:1234,输出 1 2 3 4

void print(unsigned int n)//1234
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}


int main()
{
	unsigned int num = 0;
	//输入
	scanf("%d,num");

	print(num);

	return 0;
}

2.编写函数不允许创建临时变量,求字符串的长度

int my_strlen(char* s)
{
	if (*s == '\0')
		return 0;
	else
		return 1 + my_strlen(s + 1);
}

int main()
{
	char arr[] = "abc";
	//a b c \0
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

3.求n的阶乘。

int Fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * Fac(n - 1);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fac(n);
	printf("%d\n", ret);
	return 0;
}

4.求第n个斐波那契数

//递归的方式
//int Fib(int n)
//{
//	if (n <= 2)
//		return 1;
//	else
//		return Fib(n - 1) + Fib(n - 2);
//}

//迭代的方式
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	return 0;
}

八、数组

数组名该怎么理解?
数组名通常情况下就是数组首元素的地址
但是有两个例外:
1.sizeof(数组名),数组名单独放在sizeof()内部,这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名也表示整个数组,这里取出的是整个数组的地址
除此之外所有遇到的数组名都表示数组首元素的地址

数组传参,形参可以是指针,也可以是数组的形式
但是形参写成数组是为了方便理解,本质上还是指针
那形参的地方,会不会创建新的数组呢? 不会的!

以递归的形式实现字符串的逆序
在这里插入图片描述

void reverse_string(char* s)
{
	int len=strlen(s);
	char tmp=s[0];
	s[0]=s[len-1];
	s[len-1]='\0';
	if(strlen(s+1)>=2)
		reverse_string(s+1);
	s[len-1]=tmp;
}

int main()
{
	char arr[]="abcdefg";
	reverse_string(arr);
	printf("%s\n",arr);
	return 0;
}

九、操作符

右移:
算数右移(右边丢弃,左边补原来的符号位)
逻辑右移(右边丢弃,左边直接补0)
C语言没有明确规定到底是算术右移还是逻辑右移,一般编译器上采用的是算术右移

9.1 操作符的属性

复杂表达式的求值有三个影响的因素:
1、操作符的优先级
2、操作符的结合性
3、是否控制求值顺序

操作符描述用法示例结果类型结合性是否控制求值顺序
()聚组(表达式)与表达式同N/A
()函数调用rexp (rexp, …,rexp)rexpL-R
[]下标引用rexp[rexp]lexpL-R
.访问结构成员lexp.member_namelexpL-R
->访问结构指针成员rexp->member_namelexpL-R
++后缀自增rexp++lexpL-R
后缀自减lexp –rexpL-R
!逻辑反! rexprexpR-L
~按位取反~ rexprexpR-L
+单目,表示正值+ rexprexpR-L
-单目,表示负值- rexprexpR-L
++前缀自增++ lexprexpR-L
前缀自减– lexprexpR-L
*间接访问* rexplexpR-L
&取地址& lexprexpR-L
sizeof取其长度,以字节表示sizeof rexp sizeof(类型)rexpR-L
(类型)类型转换(类型) rexprexpR-L
*乘法rexp * rexprexpL-R
/除法rexp / rexprexpL-R
%整数取余rexp % rexprexpL-R
+加法rexp + rexprexpL-R
-减法rexp - rexprexpL-R
<<左移位rexp << rexprexpL-R
>>右移位rexp >> rexprexpL-R
>大于rexp > rexprexpL-R
>=大于等于rexp >= rexprexpL-R
<小于rexp < rexprexpL-R
<=小于等于rexp <= rexprexpL-R
==等于rexp == rexprexpL-R
!=不等于rexp != rexprexpL-R
&位与rexp & rexprexpL-R
^位异或rexp ^ rexprexpL-R
|位或rexprexprexpL-R
&&逻辑与rexp && rexprexpL-R
||逻辑或rexprexprexp
? :条件操作符rexp ? rexp : rexprexpN/A
=赋值lexp = rexprexpR-L
+=以…加lexp += rexprexpR-L
-=以…减lexp -= rexprexpR-L
*=以…乘lexp *= rexprexpR-Lv
/=以…除lexp /= rexprexpR-L
%=以…取模lexp %= rexprexpR-L
<<=以…左移lexp <<= rexprexpR-L
>>=以…右移lexp >>= rexprexpR-L
&=以…与lexp &= rexprexpR-L
^=以…异或exp ^= rexprexpR-L
=以…或lexp= rexprexpR-L
逗号rexp,rexprexpL-R

其中,lexp表示左值表达式,rexp表示右值表达式。L-R表示从左到右进行结合(从左到右进行计算),R-L表示从右到左进行结合(从右到左进行计算)

交换两个值,不允许创建临时变量

int main()
{
	int a = 3;
	int b = 5;
	printf("交换前:a=%d b=%d\n", a, b);
	a = a ^ b;
	b= a ^ b;
	a = a ^ b;
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

sizeof

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));//40-计算整个数组的大小,单位字节
	printf("%d\n", sizeof(int [10]));//40
	return 0;
}
#include <stdio.h>
void test1(int arr[])
{
	printf("%d\n", sizeof(arr));//(2)    int*类型 在32位下是4个字节,64位下是8个字节
}
void test2(char ch[])
{
	printf("%d\n", sizeof(ch));//(4)     char*类型 在32位下是4个字节,64位下是8个字节
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("%d\n", sizeof(arr));//(1)   10*4=40
	printf("%d\n", sizeof(ch));//(3)   10*1=10
	test1(arr);
	test2(ch);
	return 0;
}

统计一个二进制数中1的个数

int number_of_1(int m)
{
	int count = 0;
	while (m)
	{
		m = m & (m - 1);  //每执行一次就相当于去掉一个1
		count++;
	}
	return count;
}

int main()
{
	int n = 0;
	scanf("%d", &n);//15
	int ret = number_of_1(n);
	printf("%d\n", ret);//4
	return 0;
}

9.2 隐式类型转换

9.2.1 整型提升

  C的整型算术运算总是至少以缺省整型类型的精度来进行的。
  为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

整型提升的意义:
  表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
  一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
  因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
  通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值(主要针对char和short类型),都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

如何进行整体提升呢?
  整形提升是按照变量的数据类型的符号位来提升的

//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0

//计算到最后如果存储字节内存不够则会发生截断(即从最小位开始取相应的字节数)

9.2.2 算术转换

  如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

long double
double
float
unsigned long int
long int
unsigned int
int

  如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。(向上转换,即从int向long double进行转换)

十、指针

  指针类型可以决定指针解引用的时候访问多少个字节(指针的权限,short* -->2 float* --> 4)
  指针类型决定指针+1操作时的步长是多少(整型指针+1跳过4个字节,字符指针+1跳过1个字节)

10.1 野指针成因

1.指针未初始化
2.指针越界访问
3.指针指向的空间释放

10.2 规避野指针

1.指针初始化
2.小心指针越界
3.指针指向的空间释放及时置NULL
4.避免返回局部变量的地址
5.指针使用之前检查有效性

10.3 指针运算

(1)指针±整数:表示指针指向空间向前向后走多少步(整型指针+1跳过4个字节,字符指针+1跳过1个字节)
(2)指针-指针:得到的数值的绝对值,是指针和指针之间的元素个数
指针-指针运算的前提是:指针和指针指向了同一块空间。
(3)指针的关系运算:地址是有大小的,指针的关系运算就是比较指针的大小

数组与指针的联系
  数组中,数组名其实是数组首元素得到地址,数组名==地址==指针
  当我们直到数组首元素地址的时候,因为数组又是连续存放的,所以通过指针就可以遍历访问数组,数组是可以通过指针来访问的。(数组的类型随着个数的不同类型是不同的,比如 int [10]和int [8])

10.4 指针数组

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "hello world";
	char arr3[] = "cuihua";
	char* parr[] = { arr1,arr2,arr3 };
	char** p = parr;
	//字符类型的指针数组直接用%s就可以打印了, printf("%s ",parr[i])
	return 0;
}
int main()
{
	char arr1[] = {12345};
	char arr2[] = {23456};
	char arr3[] = {34567};
	char* parr[] = { arr1,arr2,arr3 };
	//整型类型的指针数组需要用[]进行访问,printf("%d ",parr[i][j])或printf("%d "*(parr[i]+j))
	return 0;
}

在这里插入图片描述
  指针数组->存放指针(地址)的数组。 parr是一个指针数组,有三个元素。每个元素是一个字符指针

十一、结构体

#include <string.h>

struct Stu
{
	char name[20];   //
	int age;
}s1 = {"zhangsan",20};

struct Stu s2 = { .name="zhangsan",.age=20 };

void set_stu(struct Stu* ps)
{
	ps->age = 20;//结构体指针->结构体成员
	//ps->name = "zhangsan";//err   数组名是地址,字符串无法放到地址上,而是要放到地址所指向的空间里面去
	//t.name=“zhangsan";//err  
	strcpy(ps->name, "张三");//字符串拷贝     //结构体指针访问变量的成员(->)
}

void print_stu(struct Stu t)
{
	printf("%s %d\n", t.name, t.age);     //结构体变量访问成员通过点操作符(.)访问
}

int main()
{
	struct Stu s = { 0 };
	set_stu(&s);
	print_stu(s);
	return 0;
}

  在C语言中,结构体(struct)中的成员不能直接使用字符串字面量进行赋值,特别是当成员是一个字符数组时,原因主要有以下几点:
1.赋值与初始化的区别
  在结构体变量声明的同时进行初始化(如 struct Stu s1 = { “zhangsan”, 20 };这个实际上是在声明一个字符数组s1并立即使用字符串字面量"zhangsan"来初始化)是合法的,因为这是在编译时确定的值,并且是整体对象(包括其所有成员)的初始化。但是,一旦结构体变量被声明并初始化后,其成员就不能像变量初始化那样直接赋值了。

2.字符数组的特性
  当结构体中的成员是字符数组时,你不能像赋值整数或浮点数那样直接赋值一个字符串字面量。因为字符数组在内存中是一个连续的字符序列,你不能将整个字符串字面量直接“放”到数组中,而是需要将字符串字面量中的每个字符复制到数组中的相应位置。
  字符数组:是一个可以在运行时被修改的内存区域。你可以通过索引来读写它的内容。
  字符串字面量:通常存储在只读的内存区域(如文本段或常量区)。在大多数情况下,你不能修改字符串字面量的内容。但是,你可以将字符串字面量的内容复制到字符数组中,然后修改字符数组的内容。

3.左值的要求
  在C语言中,赋值操作符(=)的左侧必须是一个左值(lvalue)。左值指的是可以位于赋值操作符左侧的表达式,它表示一个存储位置,你不能直接对整个数组进行赋值,因为数组名在大多数上下文中(除了作为&操作符的操作数时)会退化为指向其第一个元素的指针,而不是一个左值。
4.使用strcpy或类似函数
  要将一个字符串字面量复制到字符数组中,你需要使用strcpy函数(或类似的函数,如strncpy),这个函数会逐个字符地从源字符串复制到目标字符数组,直到遇到源字符串的终止符\0或达到目标数组的大小限制。

char s[10] = "zhang";
s[10] = "li";   //实际上这样的赋值是错误的,因为左边是访问数组的第11个元素,而右边是一个字符串字面量,类型为char [3]。
//因此,只能通过第一行来进行声明,然后再初始化
//如果已经声明了,就要使用strcpy函数来复制字符串
strcpy(s,"li");
//总结:正确的初始化方式是使用数组名和等号 = 在声明数组的同时进行初始化,或者使用 strcpy 函数在数组已经声明后进行赋值。你不能直接赋值给数组的一个元素(除非那个元素是字符类型,并且你正在赋值一个字符)。

十二、寄存器

eax:通用寄存器,保留临时数据,常用于返回值
ebx:通用寄存器,保留临时数据
ecx:扩展计数器寄存器
edx:扩展数据寄存器

edi:附加目标寄存器
esi:附加源寄存器

ebp:栈底寄存器
esp:栈顶寄存器
eip:指令寄存器,保存当前指令的下一条指令的地址

常见的汇编指令
mov:数据转移指令
push:数据入栈,同时esp栈顶寄存器也要发生改变
pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变
sub:减法命令
add:加法命令
call:函数调用,1.压入返回地址 2.转入目标函数
jump:通过修改eip,转入目标函数,进行调用
ret:恢复返回地址,将返回地址pop至eip寄存器

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

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

相关文章

Day62:单调栈 LeedCode503. 下一个更大元素 II 42. 接雨水

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

服务运维问题

2024-05-01&#xff08;docker 部署的 jar包自动关闭&#xff09; 查询运行情况&#xff1a;处于退出状态 docker ps -a 查询日志&#xff1a;看不出问题 docker logs -f --tail1000 demo-java 查询关于java服务日志&#xff1a;Out of memory: Kill process 16236 (java) …

智能BI产品设计

BI概念 目录 BI概念 一&#xff1a;与BI相关的几个重要概念 二&#xff1a;数据仓库 VS 数据库 BI架构 一&#xff1a;数据分析通用流程 二&#xff1a;BI平台基本架构 可视化图形 一&#xff1a;如何选择可视化图形 二&#xff1a;数据展示形式 三&#xff1a;数据…

ComfyUI 基础教程(十三):ComfyUI-Impact-Pack 面部修复

SD的WebUI 中的面部修复神器 ADetailer,无法在ComfyUI 中使用。那么如何在ComfyUI中进行面部处理呢?ComfyUI 中也有几个面部修复功能,比如ComfyUI Impact Pack(FaceDetailer),以及换脸插件Reactor和IPAdapter。 ComfyUI-Impact-Pack 是一个功能强大的插件,专为 ComfyUI …

GiantPandaCV | FasterTransformer Decoding 源码分析(三)-LayerNorm介绍

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;FasterTransformer Decoding 源码分析(三)-LayerNorm介绍 作者丨进击的Killua 来源丨https://zhuanlan.zhihu.com/p/669440844 编辑丨GiantPandaC…

LLVM的ThinLTO编译优化技术在Postgresql中的应用

部分内容引用&#xff1a;https://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html LTO是什么&#xff1f; 链接时优化&#xff08;Link-time optimization&#xff0c;简称LTO&#xff09;是编译器在链接时对程序进行的一种优化。它适用于以文件为单位编译…

考研数学|基础跟张宇,强化直接1000题还是先做660?

跟宇哥用1000题的&#xff0c;我愿称之为卷王之王&#xff01;660对基础阶段是绝佳的查漏补缺&#xff0c;必做&#xff01; 自我介绍一下&#xff1a;我21年一战数学83&#xff0c;总分没过线&#xff0c;22年二战143&#xff0c;逆袭上岸211&#xff01;660是我的心头好&…

奶爸预备 |《伯克毕生发展心理学.从0岁到青少年》 / (美) 劳拉·E. 伯克著——读书笔记

目录 引出第一篇 人的发展理论与研究第1章 历史、理论和研究方法 第二篇 发展的基础第2章 生物基础与环境基础第3章 孕期发育、分娩及新生儿 第三篇 婴儿期和学步期&#xff1a;0~2岁第4章 婴儿期和学步期的身体发育第5章 婴儿期和学步期的认知发展第6章 婴儿期和学步期的情绪与…

华为OD机试【垃圾信息拦截】(java)(100分)

1、题目描述 大众对垃圾短信深恶痛绝&#xff0c;希望能对垃圾短信发送者进行识别&#xff0c;为此&#xff0c;很多软件增加 了垃圾短信识别机制。经分析&#xff0c;发现正常用户的短信通常具备交互性&#xff0c;而垃圾短信往 往都是大量单向的短信&#xff0c;按照如下规则…

vue3中标签的ref属性

组合API-ref属性 在vue2.x中&#xff0c;可以通过给元素添加refxxx属性&#xff0c;然后在代码中通过this.$refs.xxx获取到对应的元素 然而在vue3中时没有$refs这个东西的&#xff0c;因此vue3中通过ref属性获取元素就不能按照vue2的方式来获取。 目标&#xff1a;掌握使用re…

Python项目实战,用Python实现2048游戏

目录 写在前言项目介绍项目思路环境搭建项目实现初始化Python类初始化游戏窗口定义游戏棋盘和方块移动和合并游戏主循环 进一步探索 写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎…

基于JSP的酒店客房管理系统(三)

目录 第四章 系统各模块的实现 4.1客房管理系统首页的实现 4.1.1 客房管理系统首页概述 4.2客房管理系统前台的实现 4.2.1 客房管理系统前台概述 4.2.2 客房管理系统前台实现过程 4.2.3 预定客房信息及客房信息的查询 4.3客房管理系统后台的实现 4.3.1 客房管理系统后…

搜索算法系列之四(斐波那契)

以下算法被验证过&#xff0c;如有什么问题或有补充的欢迎留言。 前言 斐波那契数列&#xff0c;又称黄金分割数列&#xff0c;是由意大利数学家&#xff08;Leonardo Fibonacci&#xff09;在1202年提出的。这个数列的递推关系是F(0)1&#xff0c;F(1)1&#xff0c;F(n)F(n-…

最近惊爆谷歌裁员

Python团队还没解散完&#xff0c;谷歌又对Flutter、Dart动手了。 什么原因呢&#xff0c;猜测啊。 谷歌裁员Python的具体原因可能是因为公司在进行技术栈的调整和优化。Python作为一种脚本语言&#xff0c;在某些情况下可能无法提供足够的性能或者扩展性&#xff0c;尤其是在…

【6D位姿估计】数据集汇总 BOP

前言 BOP是6D位姿估计基准&#xff0c;汇总整理了多个数据集&#xff0c;还举行挑战赛&#xff0c;相关报告被CVPR2024接受和认可。 它提供3D物体模型和RGB-D图像&#xff0c;其中标注信息包括6D位姿、2D边界框和2D蒙版等。 包含数据集&#xff1a;LM 、LM-O 、T-LESS 、IT…

android系统serviceManger源码解析

一&#xff0c;serviceManger时序图 本文涉及到的源码文件&#xff1a; /frameworks/native/cmds/servicemanager/main.cpp /frameworks/native/libs/binder/ProcessState.cpp /frameworks/native/cmds/servicemanager/ServiceManager.cpp /frameworks/native/libs/binder/IP…

练习题(2024/5/6)

1路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], target…

【数据结构】C++语言实现栈(详细解读)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

【携程笔试题汇总】[全网首发] 2024-05-06-携程春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新携程近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f49…

【网心云邀请码:KpyV3Dk7】轻松赚油费,新用户专享福利来袭!绑定设备连续在线7 天必得高额奖励

&#x1f4e2; 各位朋友们&#xff0c;好消息来啦&#xff01;现在注册网心云&#xff0c;通过我们的专属邀请码&#xff1a;KpyV3Dk7 &#xff0c;即可享受多重新手福利&#xff0c;让您的闲置设备为您赚钱&#xff01; &#x1f4b8; 立即加入&#xff0c;您将获得&#xff1…