选择控制结构
数据结构 + 算法 = 程序
数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合
算法是对操作或行为(即操作步骤)的描述
衡量算法的正确性:有穷性、确定性、有效性、允许没有输入或多个输入、必须有一个或多个输出;
算法的描述方法:自然语言、流程图、NS 结构化流程图、伪码,养成先画流程图、然后再编写代码的习惯;
C 语言中,非 0 值表示“真”,0 值表示“假”;
条件运算符
exp1 ? exp2 : exp3
是 C 语言中唯一一个三元运算符;条件语句只允许每个条件分支中带一条语句,将一组逻辑相关的语句用
{}
括起来所构成的语句叫复合语句。建议无论 if 语句的分支中是一条还是多条语句,都将其用{}
括起来;exit()
的作用是终止整个程序的执行,强制返回操作系统,并将int
型参数code
的值传给调用进程(一般为操作系统)。当code
的值为 0 或宏常量EXIT_SUCCESS
时,表示程序正常退出;当code
值为非 0 值或为宏常量EXIT_FAILURE
时,表示程序出现某种错误后退出。调用exit()
需要包含头文件<stdlib.h>
;为什么不直接将实数与 0 比较:浮点数并非真正意义上的实数,只是其在某种范围内的近似。因此也就只能用近似的方法将实数与 0 进行比较,如:
if (fabs(disc-0) <= EPS) /*其中 EPS 被赋值为 1e-6*/
switch
后面的的表达式只能是int
或char
型,case
后面的常量类型与switch
后一致;case
如果没有break
语句,程序将以此执行下面的case
后语句,直到switch
的}
为止,也即说明case
本身没有条件判断的功能;若
case
后面的语句省略不写,则表示它与后续case
执行相同语句;if (a = b)
表示:如果 b 赋给 a 的值为非 0;在 C 语言中,若 a、b、c 分别为 3、2、1,关系表达式
a > b > c
的计算过程为:a > b > c = (a > b) > c = 1 > c = 0
;解决运算符优先级问题的最好办法就是把需要先计算的表达式用
()
括起来;若含有逻辑运算符
&&
和||
的表达式的值可由先计算的左操作数的值单独推导出来,则不再执行右侧表达式;程序测试只能证明程序有错,而不能证明程序无错;
白盒测试也称结构测试;黑盒测试也称功能测试;
选择有限数量的重要路径进行白盒测试,对重要的功能需求进行黑盒测试;
测试中选用合理的输入数据,还应选用不合理的以及某些特殊的输入数据或者临界的点,对程序进行边界测试;
scanf()
的返回值为遇到非法字符之前成功读入的数据项数;fflush()
可以用来清除输入缓冲区中的内容,但会带来移植性问题;位运算的操作对象只能是
char
和int
类型;按位与:两个操作数中的任一位为 0 时,运算结果的对应位被置 0;
按位或:两个操作数中的任一位为 1 时,运算结果的对应位被置 1;
按位异或:两个操作数的某对应位不一样,则按位异或结果为对应位为 1;
按位取反:按位取反是对操作数的各位取反;
左移位:
x << n
表示把 x 的每一位向左平移 n 位,右边空位补 0;右移位:
x >> n
表示把 x 的每一位向右平移 n 位。当 x 为有符号数时,左边空位补符号位上的值,称为算数移位;当 x 为无符号数时,左边空位补 0,称为逻辑移位。
循环控制结构
do - while
循环体内的语句将至少被执行一次;相对于用嵌套循环实现的程序而言,用单重循环实现的程序执行效率更高,因为程序所需的总的循环次数大大减少了;
rand()
生成的是一个在 0 ~ 32767 (双字节整数最大值)之间的整数- 利用求余运算
rand()%b
将函数rand()
生成的随机数变化到 [0, b-1] 之间 - 利用
rand()%b+a
将随机数的取值范围平移到 [a, a+b-1] 之间
- 利用求余运算
rand()
所产生的随机数其实是一个伪随机数,反复调用函数rand()
所产生的一些列数看似是随机的,但每次执行程序时所产生的随机数序列确是一样的,都是相同的一个数列,而程序又每次只用到了数列中的第一个随机数;srand(time(NULL))
通过time()
读取计算机的时钟值,并把该值设置为随机数种子;检验
scanf()
返回值可以确认是否输入非法字符:while (ret != 1) /*若存在输入错误,则重新输入*/ { while (getchar() != '\n'); /*清除输入缓冲区中的非法字符*/ printf("Please guess a magic number:"); ret = scanf("%d", &guess); }
适合于使用
goto
语句:- 快速跳出多重循环
- 跳向共同的出口位置,进行退出前的错误处理工作(其实也可以直接调用错误处理函数)