文章目录
稀碎的各种小点
1. 各种快捷键
1.1 window 相关
win + r ===> 打开控制面板
===> 输入 cmd ===> 命令符界面
ctrl + z ===> 电脑撤回
CTRL + w ===> 关闭当前页面
shift + win(电脑徽标键) + s ===>电脑截图
ctrl + s ===> 文件另存/保存
1.2 linux 相关
- 在 Ubuntu 里的 linux 系统
ctrl + space ===> linux 切换输入法 shift + zz ===> 退出当前 Vim 操作 ctrl + c ===> 跳出运行
1.3 VS 相关
Alt + Shift + F ===> 自动对齐代码 ctrl + L ===> 终端清屏命令 ctrl + J ===> 打开下方终端 ctrl + S ===> 自动保存 ctrl + B ===> 打开侧边目录 ctrl + F ===> 打开搜索 ctrl + 鼠标左键放在对应函数名 ===> 跳转到函数实现 光标所在行 + ctrl + c ===> 复制光标所在行 光标所在行 + ctrl + v ===> 粘贴在光标所在行上一行 光标所在行 + ctrl + x ===> 剪切光标所在行
1.4 Qt 相关
ctrl + shift + "+" ===> 放大 Qt 界面 ctrl + "-" ===> 缩小 Qt 界面 .exec ===> 执行的意思 Push Button ===> 按钮 Alt + enter(回车键) ===> 在 .cpp 文件添加定义 ===> enter // 直接在 .cpp 文件里补齐函数结构 Debug ===> 打印头文件:实现控制台展示功能所使用的头文件名称
1.5 Mark Down 相关
ctrl + / ===> 打开文件源代码模式
2. 算法相关
2.1 函数小注意
int 最多支持阶乘数据到 12!
long — 20!
float — 34!
double — 170!
选择分支相关英文
switch - case / default - break;
- 用 exit(EXIT_FALURE); 时,头文件要加上 #include <stdlib.h>
- 函数倒叙输出主要函数
int num = 12345; while (num > 0) { printf("%d", num % 10); num /= 10; }
return EXIT_FAILURE ;
返回函数,表示运行失败return EXTI_SUCCESS;
表示运行成功这俩个可用于 int 数组返回,可以来表示函数运行是否成功
- #define X 10 ===> 定义了一个常量 X , 赋值为 10
- 打印常用
%c : 用于打印字符 char %d : 用于打印整数 int shrot %ld : 用于打印长整数 long %f : 用于打印浮点数 float %lf : 用于打印双精度浮点数 double %x 或 % X : 用于打印十六进制整数 %o : 用于打印八进制整数 %s : 用于打印字符串 string %p : 用于打印指针地址
- 内存设置/擦除函数
/* 内存设置/擦除函数格式 memset(void * ptr, char ch, int n); */ memset(arr, 0,sizeof(int) * (10)); // 或者可以写为 memset(&arr[0], 0, sizeof(int) * 10); /* arr / &arr[0] : 找到数组首地址 0 : 这里的 0 是 ASCLL码里的编号 0 ,对应 nul 内存擦除操作,对应内存所有二进制为都是 0,会根据不同的数据类型对外的数据情况不同 如果是指针类型 ==> NULL 如果是整数类型 ==> 0 如果是 float 类型 ==> 0.0F 如果是 double 类型 ==> 0.0 如果是 char 类型 ==> '\0' 编码中编号为 0 的字符 sizeof(int) * 10 : sizeof 的作用: 1. 动态内存分配中,确保你分配的内存大小足够来容纳你的数据。 2. 在 C 和 C++ 中常用的运算符,用于计算数据类型或者对象的大小(以字节为单位)。它返回其操作数的字节大小。 这里 sizeof(int) * 10 计算出整型数组需要的总字节数,以确保分配足够的内存, 10 表示有 10 个 int 类型的元素。这是因为 sizeof(int) 给出了一个 int 类型的大小(通常是 4 字节或 8 字节,具体取决于编译器和系统),然后乘以 10 表示有 10 个这样的元素。 */
- 计算机最小存储单位:是字节(byte),不是比特(bit)
10.
switch-case
不支持浮点型,因为浮点型稳定性不好
2.2 函数和变量常用定义名称
temp ===> 临时变量(常用于交换数据时使用)
count ===> 计数
score ===> 成绩
num ===> 数字
select_sort ===> 选择排序函数
reverse 逆向反向 ===> 用来逆序函数出函数命名
capacity ===> 定义数组容量命名
print_int_array ===> 打印数组函数
checkCapacity ===> 检查数组容量(check:检查)
grow ===> 常用于扩容数组命名(grow:增长,增加)
copy_array ===> 复制数组
sub_array ===> 截取数组
dst[]/ dest[] ===> 目标数组 // 通常可以用于复制数组来用,将源数组中的数据复制到目标数组中
src[] ===> 源数组
arr[] ===> 普通数组
head ===> 链表头结点结构体名
node ===> 链表结点结构体名
prev ===> 上一个
2.3 无符号整型和整型有什么区别
无符号整型(unsigned integers)和有符号整型(signed integers)是两种基本的整数数据类型,它们之间的主要区别在于可以表示的数值范围和表示方式。
- 有符号整型:
- 使用一个比特位(bit)表示正负号。例如,对于一个 8 位的有符号整数,其中 7 位用于表示数值,而最高位用于表示正负号(0 代表正数,1 代表负数)。
- 因为要表示正负号,所以有符号整型的取值范围是不对称的。例如,一个有符号 8 位整数的取值范围为 -128 到 127(包含零)。
- 无符号整型:
- 所有的比特位都用于表示数值本身,没有一位用于表示正负号。因此,无符号整型仅表示非负数。
- 无符号整型的取值范围是对称的,全部用于表示数值。例如,一个无符号 8 位整数的取值范围是从 0 到 255。
在使用这两种类型时,需要【注意】以下几点:
- 有符号整型可以表示正数、负数和零,而无符号整型仅能表示非负数(即正数和零)。
- 无符号整型提供了更大的正数范围,但不支持负数。
- 在某些情况下,无符号整型可能会导致意外的行为,例如在涉及算术运算、类型转换和比较时,需要特别小心,以避免溢出和未定义行为。
在选择使用有符号整型还是无符号整型时,要考虑到具体的需求和所需表示的数据范围。
2.4 字符串等值判断
"ABC" == "ABC"
字符串常量等值判断判断结果为1
因为在此处比较的不是字符串内容,比较的是地址,同一个字符串常量在内存中的地址一致。而此时两个字符串内容一致,地址也是一样的。首先
arr[4] = {'A', 'B', 'C', '\0'}
,当"ABC" == arr[4]
时 判断结果为?
判断结果为 0
因为字符数组的地址存储区域和字符串常量存储不一致,所以他们的地址不相同,结果为 0。
2.5 两个同数组中元素取地址相减操作
int arr[5] = {1, 2, 3, 4, 5};
printf("&arr[4] - &arr[1] : %ld\n", &arr[4] - &arr[1]);
最终结果为 3
两个同数组中元素取地址相减操作
CPU 首先计算两个地址直接的字节差,根据数据类型相除,最终结果时两个地址的【下标差/坐标差】
3. CPU 分区【超超超重点,背会的】
4. 随机数
4.1 随机函数种子
随机函数种子:srand 函数
srand((unsigned int)time(NULL)); 1. srand 函数 srand(100); // 随机数最小值是 100 ~ UINT_MAX(无符号整型最大值),这样写的随机数范围是固定的,随机数数值还是没有变化 2. (unsigned int)time(NULL) time(NULL) // 获取时间戳,代表当前时间离 1971 年 1 月 1 日有多少秒,这样随机数范围就是一个不断变化的值,这时随机数也会发生变化。 (unsigned int) // 强制类型转换语法 // 例如:int a = (int)1.1;
4.2 随机数
rand() 函数:
实际上是一个伪随机数,他直接用会产生一个固定的数字。因为如果在调用
rand()
之前没有设置随机数种子(即没有调用srand()
),则rand()
函数将使用默认的种子,通常是1。这样会导致每次运行程序时都得到相同的伪随机数。这是因为在相同的种子下,伪随机数生成器产生的序列是确定性的。int num = rand(); prindf("num = %d\n", num); // num = 1804289383(结果固定) // rand(); 产生一个随机数,不可控,一般不会直接使用 // 需要固定范围
一般使用形态有以下几种:
rand( ) % x
得到范围 [0, x - 1]
rand( ) % x + a
得到范围 [a, x - 1 + a]
rand( ) % x * 10
得到随机数是 10 的整数倍
描述概率问题
- 用生成数字的百分比
#include <stdio.h> #include <time.h> // 时间头文件 #include <stdlib.h> int main(int argc, char const *argv[]) { srand((unsigned int) time(NULL)); int num = 0; // 记录抽奖次数 int count = 1; printf("输入 1 开始抽奖, 输入 0 拒绝抽奖: \n"); scanf("%d", &num); while(num) { printf("第 %d 次抽奖结果:\n", count); int result = rand() % 100;// [0, 99] if (result >= 0 && result < 4) { printf("抽到 SSS 卡 \n"); num = 1; break; } else if (result >= 5 && result < 14) { printf("抽到 SS 卡 \n"); } else if (result >= 15 && result < 29) { printf("抽到 S 卡 \n"); } else if (result >= 30 && result < 49) { printf("抽到 A 卡 \n"); } else { printf("抽到 F 卡 \n"); } /* 如果想要有保底:抽 n 次必中,加上以下函数 if (count == n) { printf("保底:抽到 SSS 卡 \n"); break; } 如果是最少抽 n 次才能中 SSS 卡,则把函数改为 if (result >= 0 && result < 4 && count > n) { printf("抽到 SSS 卡 \n"); num = 1; break; } */ printf("请问你还要继续抽奖吗?输入 1 继续抽奖, 输入 0 拒绝抽奖\n"); scanf("%d", &num); if (num == 0) { printf("很遗憾,你距离 SSS 卡仅有一步之遥\n"); } count++; } if (num == 1) { printf("恭喜你抽了 %d 次,获得 SSS 卡!!!!\n", count); if (count == 1) { printf("一发入魂!!!\n"); } else if (1 < count && count <= 10) { printf("你运气真好,欧皇实锤了!!!\n"); } else if (80 < count && count <= 100) { printf("老倒霉蛋就是你\n"); } } return 0;