03_Selection_Loop

本章主要讲解关系运算与逻辑运算、选择结构与循环结构的对比。 关系运算(比较大小,结论是 真 则返回 true ,否则返回 false ,C++ 中用 1 表示 true,0 表示 false, bool 型变量,赋值 0 时表示 false,其他它值都表示 true) 逻辑运算((表达式1) && (表达式2)与(表达式1) || (表达式2)的区别) 选择与循环语句用法
展开查看详情

1.第三讲 选择与循环 —— 关系运算与逻辑运算 —— 选择结构 —— 循环结构

2.2 关系运算与逻辑运算

3.3 关系运算 :比较大小 > 大于 >= 大于等于 == 等于 < 小于 <= 小于等于 != 不等于 比较大小,结论是 真 则返回 true ,否则返回 false C++ 中用 1 表示 true , 0 表示 false bool 型变量,赋值 0 时表示 false ,其他它值都表示 true 注意 == 与 = 的区别 对浮点数进行比较运算时尽量不要使用 等于 bool x1=1.5; // x1=true bool x2=0; // x2=false bool x3=-11; // x3=true pow( sqrt (2.0),2)==2; // true or false? ex03_bool.cpp

4.4 逻辑运算 逻辑运算 && 逻辑与 || 逻辑或 ! 逻辑非 运算对象 与 或 非 A B A&&B A||B !A 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 运算法则

5.5 逻辑运算 : 两点注意 ( 表达式 1) && ( 表达式 2) 先计算 表达式 1 的值,若是 true ,则计算 表达式 2 的值; 若 表达式 1 的值是 false ,则 不再 计算 表达式 2 的值 ( 表达式 1) || ( 表达式 2) 先计算 表达式 1 的值,若是 false ,则计算 表达式 2 的值; 若 表达式 1 的值是 true ,则 不再 计算 表达式 2 的值 i=3; (i>3) && (i++); i =3 i=3; (i>3) || (i++); i =4

6.6 条件运算符 条件表达式 ? 表达式 1 : 表达式 2 先计算 条件表达式 的值, 若是 true ,则用 表达式 1 作为整个表达式的值, 否则就用 表达式 2 的值作为整个表达式的值 y = x>0 ? 1 : -1; 条件运算符是 C++ 中惟一的三目运算符 z = x>y ? x : y;

7.7 举例 // 关系运算与逻辑运算 #include <iostream> using namespace std ; int main() { int x1=1, x2=2, x3=3; bool b1, b2, b3; b1 = (x1 < x2) && (x2 < x3) ; // 正确写法 cout << "b1=" << b1 << "

8.8 选择 / 分支 / 条件结构 if 语句 switch 语句

9.9 if 语句 用法一:单分支 if ( 表达式 ) 语句 例: if (x>y) cout << x; 这里的语句可以是复合语句 (即 多个语句 用 大括号 括起来) if (x>y) t = x; x = y; y = t; 例: if (x>y) { t = x; x = y; y = t; } ex03_if_1.cpp

10.10 if 语句 if ( 表达式 ) 语句 else 语句 例: if (x>y) cout << x; else cout << y; 用法二:双分支 ex03_if_2.cpp 注:条件判断表达式 两边的小括号 不能省略!

11.11 if 语句 if ( 表达式 ) 语句 else if ( 表达式 ) 语句 else if ( 表达式 ) 语句 … … else if ( 表达式 ) 语句 else 语句 // else 语句可以省略 例: if (x>0) f=1; else if (x<0) f=-1; else if (x==0) f=0; ex03_if_3.cpp 用法三:多分支

12.12 if 语句的嵌套 if ( 表达式 ) if ( 表达式 ) 语句 else 语句 else if ( 表达式 ) 语句 else 语句 几点注意: 这里的语句可以是复合语句 每一层的 if 要与 else 配套,如果没有 else , 必须将该层的 if 语句用 { } 括起来 ex03_if_4.cpp

13.13 选择结构: switch 语句 switch ( 表达式 ) { case 常量表达式 1 :语句 case 常量表达式 2 :语句 … … case 常量表达式 n :语句 default : 语句 } 以 case 中的 常量表达式值 为入口标号,由此开始顺序执行 每个 case 分支最后 一般需要 加 break 语句 每个 case 后面的 常量表达式 的值不能相同 每个 case 后面可以有多个语句(复合语句), 但可以不用 { } 可以是整型、字符型、枚举型 ex03_switch.cpp

14.14 循环结构 while 循环语句 do while 循环语句 for 循环语句 循环的终止

15.15 while 循环 while ( 条件表达式 ) 循环体语句 执行过程 表达式 循环体语句 真 假 (1) 判断 条件表达式 的值 (2) 如果是 “真”,则执行循环体语句 ; 否则退出循环。 (3) 返回第一步 i=1; s=0; while (i<=10) s=s+i; i++; 例: 如果循环体语句是 复合语句 ,别忘了 大括号 ! ex03_while.cpp

16.16 do while 循环 do 循环体语句 while ( 条件表达式 ); 与 while 循环的区别: 无论条件是否成立,循环体语句至少执行一次 ex03_do_while.cpp 表达式 循环体语句 真 假 执行过程 (1) 执行循环体语句 (2) 判断 条件表达式 的值 (3) 如果是 “真”,返回第一步 ; 否则退出循环。

17.17 for 循环 for ( 初始化语句 ; 表达式 1 ; 表达式 2 ) 循环体语句 表达式 1 初始化语句 真 表达式 2 循环体语句 假 执行过程 (1) 执行 初始化语句 (2) 计算 表达式 1 的值, 如果是“真”,则执行循环体语句, 否则退出循环 (3) 执行 表达式 2 ,返回第二步 ;

18.18 for 循环 初始化语句 , 表达式 1 , 表达式 2 均可省略,但分号不能省 表达式 1 是循环控制语句,如果省略的话就构成 死循环 循环体可以是单个语句,也可以是 复合语句(大括号!) 初始化语句 与 表达式 2 可以是逗号语句 s=0; for (i=1; i<=10; i++) s=s+i; 上面程序中的变量 i 有时也称为 循环变量 例: for ( 循环变量赋初值 ; 循环条件 ; 循环变量增量 ) 循环体语句

19.19 for 循环 若省略 初始化语句 和 表达式 2 ,只有 表达式 1 ,则等同于 while 循环,故 while 语句可以用 for 循环替代 i=1; s=0; while (i<=10) { s=s+i; i++; } 例: i=1; s=0; for ( ; i<=10; ) { s=s+i; i++; } 例: 求一个整数的所有因子 ex03_for_factor.cpp

20.20 for 循环 循环变量可以在初始化语句中声明,这样,循环变量只在该循环内有效,即循环结束后,循环变量即被释放 例: s=0; for ( int i=1 ; i<=10; i++) s=s+i; 关于变量的作用域和生存期,详见后面的讲义

21.21 循环的终止 break 语句 跳出循环体,只用在循环语句和 switch 语句中 break 只能跳出一层循环 continue 语句 结束本轮 循环 , 执行下一 轮 循环 ,一般只用在循环语句中 goto 语句 跳转到由 语句标号 所指定的语句 语句标号为 标记符后面跟冒号,即 标记符:语句 ; goto 语句破坏程序的结构性,尽量少用 如果需要跳出多重循环,可使用 goto 语句 goto 语句标号 ; break; continue; ex03_goto.cpp break , continue 和 goto 通常是与 if 语句配合使用

22.22 break 和 continue 表达式 1 初始语句 真 表达式 2 假 循环体 continue 表达式 1 初始语句 真 表达式 2 假 循环体 break

23.23 循环的嵌套 循环可以嵌套使用 例: 打印右边的图案 ex03_for_for1.cpp ex03_for_for2.cpp * *** ***** ******* ***** *** * 例: 输出九九乘法表 ex03_for_99.cpp

24.24 举例 例: 判断一个数是否为素数 ex03_for_prime .cpp 例: 找出 100 到 200 之间所有不能被 3 整除,但能被 7 整除的数 ex03_for_if1.cpp ex03_for_if2.cpp 例: 计算最大公约数 ex03_for_ gcd1.cpp ex03_for_ gcd2.cpp

25.25 举例 例: 猜生日 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 请回答你的生日出现在下面五组数的哪几组中? 这几组数的第一个数之和就是你的生日 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 ex03_ birthday.cpp

26.26 课后练习 课后练习(见课程主页,自己练习)

27.27 上机作业 学生的成绩有两种表示方法:等级制和百分制。对应关系如下: (a) 要求从键盘输入一个分数,然后输出其对应的等级。试分别用 if 语句和 switch 语句实现,程序名分别为: hw03_if_1.cpp, hw03_switch_1.cpp 等级 A B C D E 分数 90--100 80--89 70--79 60--69 0--59 请编写程序,实现它们之间的互换,即 (b) 从键盘输入一个等级,然后输出其对应的分数区间。试分别用 if 语句和 switch 语句实现,程序名分别为: hw03_if_2.cpp, hw03_switch_2.cpp 注:输入用 cin ,要有提示,如 “请输入成绩(百分制):” (1) 按下面的要求编写四个程序

28.28 上机作业 (3) 素数问题:从键盘输入一个大于 1 的整数(需要判断输入的合法性,即是否大于 1 ),然后求出不超过这个整数的最大素数。 (要求使用 for 循环和 if 语句) 程序取名: hw03_03.cpp (2) (如何跳出多重循环) 修改程序 ex03_goto.cpp ,避免使用 goto 语句 程序取名: hw03_02.cpp (4) (演示消去误差,即大数吃小数)当一个很大的数与一个很小的数进行加减运算时,由于计算机的舍入误差,小数可能被大数 “吃掉”,如 10000000000+0.0000000001 的结果是 10000000000 。因此在做计算时应尽可能避免这种情况的发生。例如,在计算下面的级数时,由右至左计算会比由左至右计算获得更精确的结果: 程序取名: hw03_04.cpp 编写程序,分别由右至左和由左至右计算上面级数的和,取 n=5000000 ,(输出小数点后 15 位)。

29.29 上机作业 (5) 计算常数 e :用下面的级数部分和来近似常数 e 程序取名: hw03_05.cpp (提示,用 long double ) 编写程序,输出当 n =30 时的结果(输出小数点后 18 位) 。 (6) (闰年)编写程序,输出 21 世纪( 2001 至 2100 年)中所有的闰年,即满足下面条件之一的年份: (1) 能被 400 整除; (2) 能被 4 整除但不能被 100 整除。要求每行输出 6 个,闰年之间用两个空格隔开。 程序取名为: hw03_06.cpp