学习网址:https://www.bilibili.com/video/BV1et411b73Z/?spm_id_from=333.337.search-card.all.click&vd_source=ecd5b371306b936a64b998d46eb11126
2022/11/23 Day1
- 定义不变的常量有两种方式
#define day 7
和const int month = 12;
- 注意:define的形式不用写数据类型,而const类型就是在正常的定义前面加一个关键字const
- 定义float型,要在数据后面加一个小f:
float f1 = 3.14f;
- 字符型变量只能用单引号’',如果用双引号""则会报错
- 转义字符\t的作用:可以让输出的后排内容对齐,因为\t会以8个字符为一个“阶段”,具体空多长是跟该“阶段”输入了几个字符决定的
- 输出也不一定非得加endl,可以说endl的作用是换行。例如:
cout << "test";
这样也是没问题的 - bool类型true是1,false是0
- bool类型数据输入的时候注意:所有非0的数字都代表真,只有0代表假,也就是说cin的话要写1和0,不能写true或false
- 只有整数之间才能做做取模运算
- 在进行数之间的比较时要加上()来保证优先级,否则可能会报错。
2022/11/25 Day2
- 在c++中,定义一个局部变量要么就初始化要么就要参与运算,如果只是定义一下然后就直接输出的话会报错
- 输入的cin不需要endl,只有输出的cout才用endl
- VS的多行注释快捷键是
ctrl+shift+/
2022/11/26 Day3
- 三目运算符格式
表达式1 ? 表达式2 :表达式3
- 作用:如果表达式1的值为真,执行表达式2,并返回表达式2的结果;如果表达式1的值为假,执行表达式3,并返回表达式3的结果。
- 注意一点:C++中三目运算符返回的是变量,可以继续赋值,比如我们可以执行这样的代码:
(a > b ? a : b) = 100;
,意为把a和b中比较大的变量赋值为100。 - C++如果想输出\n要加个单引号,如:
cout << a << '\n' << b << endl;
,当然也可以用endl换行,但是还是\n好一点 - C++如果想cin多个变量不能直接在变量之间加‘,’,要写成几个>>的格式
cin >> a >> b;
- switch语句的用法注意事项
- case条件要记得
break;
,否则它会一直往下执行 - 如果有其它所有类别的输出可以用default关键字来表示。
- switch语句中表达式类型只能是整型或者字符型!!
switch Demo:
- case条件要记得
switch (score){
case 8:
cout << "非常好" << endl;
break;
default:
cout << "烂片" << endl;
break;
}
C++生成随机数
#include <cstdlib>
#include <time.h>
srand((unsigned)time(NULL)); // time(NULL)会返回当前日历的秒数(从1970年到现在的秒数)
int a = rand() % (b - a + 1) + a; //生成[a,b]之间的随机数
int b = rand() % (b - a ) + a; //生成[a,b)之间的随机数
产生[a,b]的随机数,可以使用 (rand() % (b-a+1))+a;
;产生[a,b)的随机数,可以使用 (rand() % (b-a))+a;
- do…while语句是先执行循环再判断循环条件,不论循环条件满不满足必然会至少执行一次循环内容
- C++里没有^的运算,要想实现幂运算的话要
#include <math.h>
然后pow(m,n)
表示计算m的n次方 - continue关键字的作用是跳过本次循环接下来的语句直接到下一次循环
- goto语句的作用:无条件跳转到标记位置,注意标记的用法。例如:
- 要跳转的位置写
goto FLAG;
,目标位置写FLAG:
,注意那个:别漏了,并且这个地方是:而不是;
- 要跳转的位置写
- 一维动态数组求长度(有几个元素):
int len = sizeof(arr) / sizeof(arr[1])
- 在定义二维数组时,如果初始化了数据,可以省略行数,例如:
int arr4[][3] = { 1,2,3,4,5,6 };
,既然已经定义了列数,再定义具体的数据量,那我不写行数系统也能知道有几行。
2022/11/29 Day 4
- 注意:函数的形参改变并不能影响到实参,类似于什么,类似于在函数中做的操作就相当于把实参的两个数字传进去就和实参没关系了。(这叫值传递)
- 如果函数想要返回多个返回值有如下几种方式,在C++中默认只能返回一个返回值
- 1.通过使用数组,因为数组是传具体的地址的,所以如果形参中有数组,返回/不返回数组,数组中的元素都会被修改。
- 2.使用引用方式传入形参,如:
int test(int &a,int &b)
,但注意,这里只是形参而已,命名不用和实参一样。 - 以上两种方式都不用真正return,即可完成对原始数据的修改,但如果想要return的形式修改就要像下面一样
//pair是包含在iostream头文件里的,作用是拼装任意类型的两个数据作为返回,如果是三个数据则要使用tuple,但这个是要引入一个如下的头文件
#include <tuple>
pair<int,int> swap(int num1, int num2) {
cout << "交换前:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "交换后:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
pair<int, int> res;
res = make_pair(num1, num2);
return res;
}
int main() {
int a = 10;
int b = 20;
pair<int,int> res = swap(a, b);
cout << "mian中的 a = " << res.first << endl;
cout << "mian中的 b = " << res.second << endl;
return 0;
}
- 函数声明可以声明多次,但是函数的定义只能定义一次。声明的作用是可以把真正的定义放在别处,例如可以把所有的函数定义都写在一个C++文件里,声明写在头文件里。
- 函数分文件编写的步骤如下:
- 创建后缀名为.h的头文件
- 创建后缀名为.cpp的源文件
- 在头文件中写命名空间、引一些头文件、函数的声明
- 在源文件中写函数的具体定义
- 在main文件中引头问件即可调用相关函数
- C++数组中的数字表示个数,例如int test[3]表示这个数组有3个数,为test[0]、test[1]、test[2]
指针专题
- 说白了,指针本身存的就是某个数的地址
- *p的操作叫解引用,意为在指针真实存的地址中解析出真实数值。
- 指针的定义:
int *p
,赋值:p = &a
- 如果
cout << p
则为a的地址,如果cout << *p
则为a的值,同理,想要通过指针修改某个数的值也要通过*p进行赋值 - 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用(其实就是通过*p来改具体的值)
- 空指针指向的内存是不可以访问的
- 常量指针和指针常量区别
- 常量指针:
const int * p
,const修饰int ,叫常量指针,既然修饰*
了,那么所有p的操作都不能进行了,所以常量指针只能修改指向,不能通过*p修改指向位置的具体数值。 - 指针常量:
int * const p
,const修饰p,相当于p真实的内容(内存地址)不能被改变,所以指针的指向不能改变了,但是可以通过*p来修改指向内存的具体数值。 - 数组指针:
int* p = arr
即可完成定义,此时p指向数组第一个元素的地址,因为是int型指针,所以下一个数组元素的地址直接就用p++即可。 - 如果想要实现地址的传递可以写成这种指针形式
void swap(int * p1, int *p2)
,当然也可以写成函数形式void swap2(int &a, int &b)
- 引用和指针的区别:指针可以后期再改,但是引用在初始化的时候确定下来就不能再动了。
- 写排序函数的时候,不只要传入待排序数组本身,也要传入数组长度
- 排序函数的定义中可以写
(int * arr)
也可以写(int arr[])
,后期的用法都是一模一样的,因为当数组名传入到函数作为参数时,会退化为指向首元素的指针
- 常量指针:
结构体专题
- 结构体创建的时候可以省略struct关键字直接写结构体名,但在结构体定义的时候不能省略关键字
- C++的静态数组一定要指定大小,如果想要可变数组要用vector
- 注意:一个结构体只能保存一个具体的信息,例如一个学生结构体只能保存某个学生的信息,要想保存多个要用到结构体数组,结构体指针也是相对于某个专门的结构体创建的。
- 可以对某个具体的结构体创建指针,也可以对结构体数组创建指针,是一样的概念。
- 结构体也可以嵌套结构体,也可以嵌套结构体数组
- 结构体是可以定义在main函数外边的,为了防止写函数的时候无法找到定义,建议还是把结构体定义在最开始的地方。
- 结构体指针由于有多个属性,所以修改的时候要写成
stu->name = "test"
形式。 void printStudent(const student *stu)
此处加const的目的是防止函数体中的误操作