第四章 分支结构的C程序设计 4.1 if语句 4.2 switch语句 4.3 程序举例
4.1 if 语 句 4.1.1 if语句的简单形式 if(表达式)语句 图 4.1 if语句执行过程
例 4.1 打印出不及格的成绩。
4.1.2 if~else结构 1. if~else结构 if(表达式) 语句1 else 语句2 图 4.2 if~else语句执行过程
例 4.2 打印成绩≥60分为“Pass”, 否则为“Fail”。 解 我们可以使用两种方法编程: 解 我们可以使用两种方法编程: 方法一: 用两个简单的if语句实现: main( ) { float score; scanf(″%f″, &score); if(score<60.0) printf(″score=%5.1f---Fail\n″, score); if(score>=60.0) printf(″score=%5.1f---Pass\n″, score); }
运行: 50 score=50.0---Fail 再次运行: 80 score= 80.0---Pass 在第二个if语句中,if(score>=60.0)是不能缺少的,否则不管score是否小于60,都将打印出第二行的结果。
方法二: 用if~else语句实现: 运行: 50 score=50.0---Fail 再次运行: 80 main( ) { float score; scanf(″%f″, &score); if(score<60.0) printf(″score=%5.1f---Fail\n″, score); else printf(″score=%5.1f---Pass\n″, score); } 运行: 50 score=50.0---Fail 再次运行: 80 score=80.0---Pass
2. 条件运算符的使用 当if~else结构中的语句是表达式语句时, 就可以使用条件运算符“? :”了,即下列if~else语句: if(表达式1) 表达式2; else 表达式3; 用条件运算符写成通用形式即为 表达式1? 表达式2: 表达式3 这是一个条件表达式,其功能是:当表达式1的值为真(非零)时,整个条件表达式的值就取表达式2的值;当表达式1的值为假(零)时, 整个条件表达式的值就取表达式3的值。
如下列语句段: x=10; if(x>9) y=100; else y=200; 可以写成: y=x>9? 100: 200;
例 4.3 输入x的值, 当x>0时调用sqrt(x),否则调用fabs(x)。 #include <math.h> main( ) { float x, y; scanf(″%f″, &x); #= y=x>0? sqrt(x): fabs(x); printf(″x=%f, y=%f\n″, x, y); } 运行: 9.0 x=9.000000, y=3.000000 再次运行: -9.0 x=-9.000000, y=9.000000
例 4.4 打印a, b两个数中大者。 方法一: 用if~else结构实现: 方法二: 用条件运算符实现: main( ) { int a, b; scanf(″%d, %d″, &a, &b); if (a>b) printf(″max=%d\n″, a); else printf(″max=%d\n″, b); } 方法二: 用条件运算符实现: main( ) { int a, b; scanf(″%d, %d″, &a, &b); printf(″max=%d\n″, a>b? a:b); }
3. if语句的嵌套 例 4.5 输入一个学生成绩,当成绩≥90时,打印“Very Good”;当80≤成绩<90时,打印“Good”; 当60≤成绩<80时,打印“Pass”;当成绩<60分,打印“Fail”。 main( ) { float score; scanf(″%f″, &score); if(score >= 80) if(score>=90) printf(″Very Good\n″); else printf(″Good\n″); else if(score>=60) printf(″Pass\n″); else printf(″Fail\n″); }
运行: 85 Good 例如语句段: if(x) if(y) printf(″A″); else printf(″B″); 其中else语句是与if(y)相匹配。 如果与if(x)相匹配, 则if(y)子句必须加花括号写成: if(x) { if(y) printf(″A″); } else printf(″B″);
4.1.3 else if结构 else if结构的形式如下: if(表达式1) 语句1 else if(表达式2) 语句2 … else if(表达式n) 语句n else 语句 n+1
图 else if结构执行过程 4.3
例 4.6 将例4.5用else if结构来实现。 运行: 58 Fail main( ) { float score; scanf(″%f″, &score); if(score>=90) printf(″Very Good\n″); else if (score>=80) printf(″Good\n″); else if(score>=60) printf(″Pass\n″); else printf(″Fail\n″); } 运行: 58 Fail
说明: (1) 在else if结构中,if语句…else if 语句…else语句属于同一程序模块。程序每运行一次,仅有一个分支的语句能得到执行。 (2) 各个表达式所表示的条件必须是互相排除的,也就是说, 只有条件1(表达式1)不满足时才会判断条件2,只有条件2也不满足时才会判断条件3,其余依次类推,只有所有条件都不满足时才执行最后的else语句。
例4.6的程序也可写成: main( ) { float score; scanf(″%f″, &score); if (score<60) printf(″Fail\n″); else if(score<80) printf(″Pass\n″); else if(score<90) printf(″Good\n″); else printf(″Very Good\n″); }
如写成以下形式就错了: main( ) { float score; scanf(″%f″, &score); if (score<60) printf(″Fail\n″); else if(score>=60) printf(″Pass\n″); else if(score>=80) printf(″Good\n″); else printf(″Very Good\n″); }
4.2 switch 语 句 switch语句的形式: switch(表达式) { case 常量1: 语句段1 … default: 语句段n }
switch语句的执行过程: switch语句先计算表达式的值,然后同多个case语句后的常量比较,找到相等的case常量则执行该常量冒号后的语句段, 并从这个入口一直执行下面所有冒号后的语句,直到switch语句结束。如果执行一个或几个冒号后的语句就要跳出switch语句,则可以在跳出处使用break语句。如果switch语句后表达式的值找不到匹配的case常量,就执行default后面的语句段直到结束。default是任选项,如果没有该语句, 则在所有配对都失败时,什么也不执行。
例 4.7 在显示器上显示一个菜单程序的模型。 #include <conio.h> main( ) 例 4.7 在显示器上显示一个菜单程序的模型。 #include <conio.h> main( ) { void dummy( ); char ch; printf(″1. 输入记录\n″); printf(″2. 记录列表\n″); printf(″3. 删除记录\n″); printf(″4. 修改记录\n″); printf(″请输入选择: \n″); ch=getche( ); switch(ch)
{ case ′1′: printf(″输入记录\n″); dummy( ); break; case ′2′: printf(″记录列表\n″); dummy( ); break; case ′3′: printf(″删除记录\n″); case ′4′: printf(″修改记录\n″); default: printf(″选择错!\n″); } void dummy() { }
运行: 1. 输入记录 2. 记录列表 3. 删除记录 4. 修改记录 请输入选择: 程序运行后, 屏幕停留在此, 执行ch=getche( )时, ch接受用户键入字符的ASCII码。我们从键盘键入1后显示: 1 输入记录
4.3 程序举例 例 4.8 编写一个可由用户键入简单表达式的程序,形式如下: number operator number 4.3 程序举例 例 4.8 编写一个可由用户键入简单表达式的程序,形式如下: number operator number 该程序要计算该表达式并以两位小数显示结果。 我们要识别的运算符operator为加、 减、 乘、 除。
main( ) { float value1, value2; char operator; printf(″Input your expression: \n″); scanf(″%f%c%f″, &value1, &operator, &value2); if (operator==′+′) printf(″%.2f\n″, value1+value2); else if (operator==′-′) printf(″%.2f\n″, value1-value2); else if (operator==′*′) printf(″%.2f\n″, value1*value2); else if (operator==′/′) if(value2==0.0) printf(″Division by zero.\n″);
esle printf(″%.2f\n″, value1/value2); else printf(″Unknown operator.\n″); } 运行: Input your expression: 123.5+59.3 182.80 再次运行: 198.7/0 Division by zero. 125$28 Unknown operator.
例 4.9 用switch语句改写例4.8。 main( ) { float value1, value2; char operator; printf(″Input your expression: \n″); scanf(″%f%c%f″, &value1, &operator, &value2); switch(operator) { case ′+′: printf(″%.2f\n″, value1+value2); break; case ′-′: printf(″%.2f\n″, value1-value2); break;
case ′*′: printf(″%.2f\n″, value1*value2); break; case ′/′: if(value2==0.0) printf(″Division by zero.\n″); else printf(″%.2f\n″, value1/value2); default: printf(″Unknown operator.\n″); } }
例 4.10 输入一个字符, 请判断是字母、 数字还是特殊字符? 例 4.10 输入一个字符, 请判断是字母、 数字还是特殊字符? #include <conio.h> main( ) { char ch; printf(″请输入一个字符: ″); /*在双引号内的字符串中, 可以出现汉字, 不影响程序运行*/ ch=getche( ); if((ch>=′a′ && ch<=′z′)||(ch>=′A′ && ch<=′Z′)) printf(″\n它是一个字母!\n″); /* 注意前后的\n, 养成良好的编辑习惯 */ else if(ch>=′0′ && ch<=′9′) printf(″\n它是一个数字!\n″); esle printf(″\n它是一个特殊字符!\n″); }
运行: 请输入一个字符: A 它是一个字母! 再次运行: 请输入一个字符: + 它是一个特殊字符!