c++复习笔记2
(编程基础)
1. 函数(程序自身)、字符串常量常放在只读内存区域。
string *s = "abc"; //字符串常量定义了之后不能修改
s[1] = 't'; // 错误
而char数组可以修改。
char s[3] = "abc";
s[1] = 't'; // 正确
2. 指向函数的指针
int fun (int a);
int (*func_p)(int a);
func_p = func;
可以直接通过func_p调用函数,例如func_p(1);
3. 写递归函数时养成递归信任,注意以下问题
1)是否检查了最简单情况
将问题分解成子问题前,先检查是否足够简单;大多数情况以if 开头。
2)是否解决了最简单情况
最简单情形不能调用自身递归,递归错误首先需要检查最简单最简单情形的正确性。
3)递归分解是否使问题更简单
只有分解得子问题更简单,递归才能有效,否则将无线递归下去
4)问题简化过程是否能够回答最简单情况,或者遗漏了某些情况
例如汉诺塔问题需要调用两次递归,遗漏会导致递归错误。
5)子问题是否与原问题完全一致
如果递归过程改变了问题实质,则整个过程会得到错误结果。
6)使用递归信任时,子问题的解是否正确组装为原始问题的解
例如汉诺塔问题中将n-1个盘先放到临时塔保存,然后将第n个盘从起点塔移到目标塔,再递归地将n-1个盘子从临时塔移到目标塔。
汉诺塔问题伪代码:
4. 生成随机数用cstdlib库中的rand()函数,但是随机数发生器生成的随机序列是相同的,实际上不是随机。因此使用srand((int)time(0))函数(程序运行过程中只能调用一次,在调用rand()函数之前调用),设定随机数发生器的种子,调用time()函数得到CPU时间,传递的时间不同,则随机数种子不同。
5. 声明与定义
定义在程序产生一个新实体,声明在程序中引入一个新实体。
函数的声明是给出函数原型,函数的定义是给出函数实现代码。
头文件中不能定义全局变量,只有声明才可以出现在头文件中,可以使用extern关键字在头文件中声明变量,则包含了该头文件的文件可以使用该变量。
6. 软件开发流程
(螺旋式开发流程)
需求分析:明确输入输出;
方案设计:设计程序框架,包括概要设计(总体方案和模块划分)和详细实现(各模块的输入输出和算法);
编程实现:实际编程;
系统测试:测试程序的正确性和稳定性;
经验总结(技术分享)。
系统测试时:对于需要测试的代码,为了防止删减发生错误,可以使用宏的方式进行测试:
#ifndef NBUG
func();
#endif
如果没有定义NBUG这个宏,则会执行func(),否则不执行。
7. 字符可以当做小数字进行运算;标准字符特征库常用函数:
8. 对于数组来说,num_of_elements = sizeof(a)/size0f(a[0])。数组作为参数传递时,传递的是数组的基地址,形参和实参使用相同的内存,对数组形参值得改变会影响到实参。
9.指针可以作为函数返回值,函数内部返回数据对象的地址,调用函数将返回值复制给某个指针,但是不能返回函数内部定义的局部变量地址,而只能是全局变量的。
10. 标准c字符串库cstring常用函数
11.读取整行: getline(cin,str,'\n') ,读取包含空格和制表符在内的整行。
s1.compare(s2,0),从第0位开始比较s1和s2的大小。
s1.find(s2),从s1开头开始查找,结果为s2在s1中首次出现的位置。
12. void * 指针