C++
第一课
iostream
iostream是C++的标准库,类似于C的stdio
using namespace std
using namespace std
;中的using namespace代表使用命名空间,后面的std表示空间的名字叫std,而下面的cout就在命名空间std中被定义,下面的cout可以改成std:cout来使用
cout<<
cout
为C++中的标准输出函数,类似与C的printf,使用语法为 cout<<"字符串"<<变量名<<表达式<<endl
其中的endl与"\n"的意思相同
第二课 变量与变量类型
定义变量的方法
变量类型 变量名1,变量名2,...,变量名n;
如int a;
int a = 0,b;
等
变量的作用
储存数据
变量的命名规则
- 只能有字母,数字,下划线组成
- 第一个字符不能是数字
- 不能是C++已有的关键字
- 区分大小写
变量类型
- 整型 (整数)
- 短整型short 16bit 2byte -2^15~2^15-1
- 长整型long 32bit 4byte -2^31~2^31-1
- 超长整型long 64bit 8byte -2^63~2^63-1
- 无符号整型unsigned int 16bit 2byte 0~2^16-1
- 无符号短整型unsigned short 16bit 2byte 0~2^16-1
- 无符号长整形unsigned long 32bit 4byte 0~2^32-1
- 无符号超长整形unsigned long long 64bit 8byte 0~2^64-1
- 整型int 32bit 4byte -2^31~2^31-1
- 实型 (小数)
- float 6~7位
- double 15~16位
- long double 18~19位
- 布尔
- bool ture或false
类型转换
- 自动类型转换
- 由精度低向精度高
- 由右边的类型转换为左边的类型
- 隐性
- 强制类型转换
- 格式
- (类型名)(表达式)
- (类型名)变量
- 显性
cin>>
C++标准输入函数,类似C的scanf,使用语法:cin>>变量1>>变量2>>...>>变量n
; 相邻的值用空格或换行隔开
第三课 选择判断结构
基本结构
if(表达式) 语句
if(表达式)
语句1
else
语句二
if结构需要注意
- 后面的语句没有{},就认为后面的第一条语句是if带的语句
- 后面用{}括了语句,整个{}的语句算作一条语句为if带的语句
关系运算符
- '==' 等于
- '!=' 不等于
- '>' 大于
- '<' 小于
- '>=' 大于等于
- '<=' 小于等于
关系表达式的值
是一个逻辑值,是真或假,为真则成立,为假则不成立
真为1,假为0
C++中 !0为真,0为假(即不是0就是真)
逻辑运算符
- &&逻辑与 两者同时为真才为真
- ||逻辑或 两者有一个为真就为真
- !逻辑非 真假值与原式相反
逻辑变量
bool
- 0 ==> false
- 1 ==> ture
switch case语句
switch(表达式)
{
case 常量表达式1:[语句组1][...][语句组n]break;
...
case 常量表达式n:[语句组1][...][语句组n]break;
default:[语句组1]
}
第四课Scanf和printf标准输入输出
区别
scanf和printf可在C和C++中共用
scanf和printf的速度快,效率高
使用
包含cstdio库
printf
格式控制字符不是格式字符则原样输出
如果是格式字符则将其取代为后方输出列表表达式的值并输出
格式符
- %d 以十进制形式输出带符号整数 (正数不输出符号)
- %o 以八进制形式输出无符号整数 (不输出前缀O)
- %x或%X 以十六进制形式输出无符号整数 (不输出前缀0x)
- %u 以十进制形式输出无符号整数
- %f或%lf 以小数形式输出单、双精度实数
- %e或%E 以指数形式输出单、双精度实数
- %g或%G 以%f或%e中较短的输出宽度输出单、双精度实数
- %c 输出单个字符
- %s 输出字符串
数据类型和对应的格式控制符
- int %d
- long %ld
- long long %lld
- float %f
- double %lf
- long double %llf
- char %c
- 字符串 %s
附加格式说明符控制输出的小数位数
%n.mf
输出一个保留m位小数,输出宽度为n的float类型的数据
输出宽度(n):输出数据的小数位+1(小数点)+整数位数
如果输出结果不足n,全面补充0;如果输出超过n,n失效
可以省略n,直接用%.mf
也可以用于%lf %llf
没.m时,也可用于%d,%ld,%lld
第五课 赋值语句和数学表达式
格式
变量 赋值运算符 表达式
a += b
比a = a + b
快
c++支持连等,即a=b=3
自增和自减
只适用于整型或浮点型
自增:++
分为变量名++
和++变量名
区别:变量名++
为先参与运算在自增
++变量名
为先自增在参与运算
自减同理(--)
cmath
C语言的数学函数库
位运算
- '&' 按位与 同为1,结果为1
- '|' 按位或 有一个为1,结果就为1
- '^' 按位异或 不同时为1,相同时为0
- '~' 取反 按位取反,1为0,0为1
- '<<' 左移 m << n 为把m按二进制左移n位,高位丢弃,低位补0
- '>>' 右移 m >> n 为把m按二进制右移n位,低位丢弃,高位补0
第六课 for循环
基本结构
for(循环变量初始化;循环条件;循环条件增量)
语句
功能
对于使循环条件成立的每一个循环变量的取值都执行一次循环体,直到条件不成立
第七课 while
基本格式
while(表达式)
语句;
作用
当表达式非0时执行语句
死循环
当表达式永远非0时就陷入了死循环
第八课 do-while
基本格式
do
{
语句;
}
while(表达式);
功能
先执行循环体在判断表达式,表达式为0时结束循环
第九课 循环中的break和continue语句
break
中断所在循环体,跳出循环
终止一个case分支,强制跳转到switch的结尾
continue
在循环中遇到continue,立马结束本次循环,进入下一次判断/循环
第十课 多重循环嵌套
即一层循环中有另一层循环(或多层)
不能出现内外循环交叉的情况
第十一课 一维数组
定义
类型名 数组名[元素个数]
元素个数必须是常量表达式或常数
数组下标
从0开始,不能越界
可以是任何值为整数的表达式,可以包含变量和函数调用
储存方式
占用连续一片内存单元
初始化
类型名 数组名[常量表达式]={值1,值2,...}
第十二课 字符数组(字符串)
定义格式
char 数组名[元素个数]
字符串中的每一个元素都可以当字符用
初始化
定义时对元素逐个赋值,也可以直接用字符串赋值
char 数组名[常量表达式] = {字符1,字符1,...};
char 数组名[常量表达式] = {"string"};
char 数组名[] = "string";
strlen计算字符串长度
strlen(*str)
第十三课 数值排序和查找
选择排序
第一次,从列表中选择一个最小的数放到第一个位置。
第二次,从第二个开始的列表中选择一个最小的数放到第二个位置。
不断从n个人的队列排序简化为n-1个人的队列排序。
冒泡排序
依次比较前后两个值的大小,如果后面打,那么交换。反之不变。
不断重复以上的过程,直到队列成为有序队列。
插入排序
在排序好的序列中,找到这个值正确的位置,然后插入。
并将其后的值后移一位
第十四课 数值查找和多维数组
二分查找算法
先对数据进行排序
设置low,high,mid三个指针
low <= high时,二分查找
求mid = (high + low) / 2
如果目标大于mid,low = mid + 1,继续二分
如果目标小于mid,high = mid + 1,继续二分
如果目标等于mid,返回查找结果
二维数组
数据类型 数组名[常量表达式1][常量表达式2];
第十五课 函数的定义与变量作用域
函数定义结构
返回类型 函数名(参数)
{
函数体
...
返回
}
函数的调用
函数名[参数列表]
变量的作用域
分为全局变量和局部变量
全局变量为定义后,到文件结束
局部变量为被定义的部分内有效,如函数体,循环体等
冒泡排序
定义
冒泡排序(Bubble Sort)是最简单和最通用的排序方法,其基本思想是:在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序 。由此可得,在排序过程中,大的数据往下沉,小的数据往上浮,就像气泡一样,于是将这种排序算法形象地称为冒泡排序。
大致过程
如数组5 4 3 2 1
第一轮
(5 4 3 2 1)
4 5 3 2 1
4 3 5 2 1
4 3 2 5 1
4 3 2 1 5
第二轮
(4 3 2 1 5)
3 4 2 1
3 2 4 1
3 2 1 4
第三轮
(3 2 1 4)
2 3 1
2 1 3
第四轮
(2 1 3)
12
小结
设总的元素个数为n,那么由上边的排序过程可以看出:
(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环
(2)每轮排序比较的次数逐轮减少
(3)如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。(优化)
实现
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}