第一讲:
递归:
递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。
如n!=n*(n-1)!
递归终止条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。
1!=1
1)分析问题、寻找递归:找出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小。
2)设置边界、控制递归:找出停止条件。
3)设计函数、确定参数:设计函数体中的操作及相关参数。
第二讲:复合数据类型
string的简单使用:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1, s2; //创建两个空字符串对象
string s3 = "Hello, World!"; //创建s3,并初始化
string s4("I am ");
s2 = "Today"; //赋值
s1 = s3 + " " + s4; //字符串连接
s1 += " 5 "; //末尾追加
cout << s1 + s2 + "!" <<endl; //输出字符串内容
![](https://i-blog.csdnimg.cn/blog_migrate/de5f0805459a809132cef6f4ff0d2a68.png)
n
size()
函数返回
string
对象的长度,即对象中字符的个数
n
返回的长度是
string::size_type
类型
n
empty()
函数判断
string
对象是否为空,返回一个布尔值
n
stringObj.empty
()
n
getline()
函数
n
两个参数:输入流对象和存放读入字符串的
string
对象
n
从指定输入流中读取内容,遇到换行符为止;将所读内容存入指定的
string
对象中,流中的换行符被读取并丢弃
n
返回参数输入流对象
定义结构体变量格式如下:
struct 结构体类型名 变量名列表;
也可以把结构体类型声明和变量定义合在一起,格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
…
} 变量名;
指针和引用:
n
内存地址
n
程序运行时,代码和需要的数据都被存储在内存中
n
内存是有序的字节序列,每个字节都有唯一的地址,使用该地址可以确定字节的位置,用以存储和获取数据
n
直接访问和间接访问
n
通过变量的名字直接访问为程序中定义的变量分配的内存单元,存取变量的值
n
使用变量的内存地址找到存放数据的单元,间接访问其中的内容
n
指针的特点
n
指针持有一个对象的地址,称为指针“指向”该对象
n
通过指针可以间接操纵它指向的对象
n
定义指针变量的语法
n
每个指针都有相关的类型,要在定义指针时指出
类型 *指针变量;
取址符:
int ival = 120;
int *pi = &ival;
// pi存放int变量ival的地址
// 或者说pi指向ival
char ch = 'a', *pc = &ch;
// pc指向字符型变量ch
![](https://i-blog.csdnimg.cn/blog_migrate/81afe9a81ad1f455c05ef0c9bf32159a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/72d1db8ae4084ed0f160b2cfd47e683b.png)
n
void*
指针
n
可以持有任何类型的地址值,即通用指针
n
相关的值是个地址,但是该地址保存的对象类型不知道
n
不能操纵
void
指针指向的对象,只能传送该地址值或者和其他地址值进行比较
n
不允许
void
指针到其他类型指针的直接赋值
n
new
表达式的三种形式
n
分配单个对象:
new
类型
或者
new
类型
(
初始值
)
n
分配多个连续存储的对象:
new
类型
[
数组大小
]
n
定位
new
,在指定位置分配空间:
new
(
指针
)
类型
;
n
new
运算符分配的空间用
delete
运算符释放
n
释放
new
分配的单个对象的
delete
形式
delete 指针;
n
释放
new
分配的数组的
delete
形式
delete[] 指针;
n
引用一旦初始化,就不能再指向其他的对象,对引用的所有操作都会被应用在它所指向的对象上
n
引用的初始化和赋值不同
n
初始化时引用被
“绑定到”
一个对象;
n
赋值时,引用被作为所绑定对象的别名
n
库函数
begin()
和
end()
n
让指针在数组上的使用更简单更安全
n
在头文件
<iterator>
中定义
n
用法
n
begin(
数组名
)
n
返回指向数组第一个元素的指针
n
end(
数组名
)
n
返回指向数组最后一个元素的下一个位置的指针