配色: 字号:
《C语言程序设计》第3章 分支结构程序设计写字字帖
2023-05-24 | 阅:  转:  |  分享 
  
第3章 分支结构程序设计第3章 分支结构程序设计学习目标 本章主要要求掌握关系表达式与逻辑表达式、分支结构的设计思想、实现分支结构判断条件的
构成、实现分支结构的语句、分支结构程序设计举例。第3章 分支结构程序设计3.1关系运算符和关系表达式 3.2 逻辑运算符和表达式
3.3 if语句 3.4 switch语句 3.1关系运算符和关系表达式3.1.1 关系运算符及其优先次序 3.1.2 关系表达式
3.1.1 关系运算符及其优先次序在C语言程序设计中,常常需要比较两个量的大小关系, 以决定程序下一步的工作。比较两个量的运算符
称为关系运算符。在C语言中有以下关系运算符:< 小于<= 小于或等于 > 大于>= 大于或等于== 等于!= 不等
于关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。在上述六个关系运算符中,<、<
=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。3.1.2 关系表达式用关系运算符将两个数值或数值表达式连接起来
的式子称为关系表达式。 一般格式:表达式 关系运算符 表达式3.1.2 关系表达式例如:a+b>c-dx<=5/35i=
=k+1由于表达式也可以又是关系表达式,因此在关系表达式中允许出现嵌套的情况。例如:a>(b>c),a!=(c==d)关系表达式的
值是真”和“假”,用“1”和“0”表示。例如:3>0的值为“真”,即为1。2>7不成立,故其值为假,即为0。例3.1 分析下面程序
的运行结果。#include void main(){? int a,b,c;?scanf("%d%d%d",&
a,&b,&c);a=b!=c;???????????????????????????//?将关系表达式的值赋给a????prin
tf("a=%d,b=%d,c=%d\n",a,b,c);????a==(b=c++3);???????????????????
??// a与b进行相等比较????printf("a=%d,b=%d,c=%d\n",a,b,c);????a=b>c>2;??
????????????????????????//?将关系表达式的值赋给a????printf("a=%d,b=%d,c=%d\
n",a,b,c);}运行结果:2 3 4↙a=1,b=3,c=4a=1,b=12,c=5a=0,b=12,c=53.2 逻辑运算
符和表达式 3.2.1 逻辑运算符及其优先次序 3.2.2 逻辑表达式 3.2.1 逻辑运算符及其优先次序3种逻辑运算符:&&(逻
辑与) ||(逻辑或) !(逻辑非)&&和||是双目(元)运算符!是一目(元)运算符逻辑表达式用逻辑运算符将关系表达式或其他逻
辑量连接起来的式子3.2.1 逻辑运算符及其优先次序与运算 && : 参与运算的两个量都为真时,结果才为真,否则为假。例如:1>0
&& 6>2由于1>0为真,6>2也为真,相与的结果也为真。或运算 || : 参与运算的两个量只要有一个为真,结果就为真。 两个
量都为假时,结果为假。例如:3>0||3>8由于3>0为真,相或的结果也就为真。非运算 ! : 参与运算量为真时,结果为假;参与运
算量为假时,结果为真。例如:!(3>0)由于3>0为真,非运算的结果为假。3.2.2 逻辑表达式由逻辑运算符将逻辑量连接起来构成的
式子称为逻辑表达式。一般格式:表达式 逻辑运算符 表达式其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。3.2.2 逻辑
表达式例如:(a&&b)&&c根据逻辑运算符的左结合性,上式也可写为: a&&b&&c 逻辑表达式的值是式中各种逻辑运算的最后值,
以“1”和“0”分别代表“真”和“假”。例3.2 分析下面程序的运行结果。#include void main(
){?int x,y,z,m;???x=y=z=0 ;?????????????????//?给变量x、y、z赋值0??m=++x
&&++y||++z;??printf("m=%d x=%d y=%d z=%d",??m,x,y,z);}运行结果:m=1??x
=1??y=1??z=0分析: 由于“++x&&++y”为1,表达式“++x&&++y||++z”值已完全确定,所以表达式中的“+
+z”被忽略。 例3.3若有定义语句:int k1=10,k2=20;,执行表达式(k1=k1>k2)&&(k2=k2>k1)后
,k1 和 k2 的值分别为( ) (2011年9月全国计算机等级考试二级C试题选择题第17题)A. 0 和 1 B.0 和
20 C.10 和 1 D. 10 和 20分析: 在执行表达式k1=k1>k2时,先进行关系比较,k1(10)是小于k
2(20)的,所以k1>k2的值为0,再将0赋值给k1,所以此时k1=0,表达式值为0。由于是逻辑与(&&)连接,有一个表达式为0
,逻辑表达式结果为0,此时,逻辑与后面的表达式不用参与运算,所以k2值不变,仍然是20。选B。3.3 if语句3.3.1 不含el
se子句的if语句 3.3.2 含else子句的if语句 3.3.3 嵌套的if语句 3.3.4 条件表达式构成的选择结构 3.
3.1 不含else子句的if语句一般形式:?if(表达式) 语句其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该
语句。其过程可表示为下图:图3.1 不含else子句的if语句流程图例3.4 输入两个整数,输出其中的大数。#include"st
dio.h"void main(){? int a,b,max;???printf("\n input two numbers:\
n");???scanf("%d%d",&a,&b);???max=a;???if (max ("max=%d",max);}运行结果:input two numbers:3 5↙max=5例3.5 有以下程序(2011年3
月全国计算机等级考试二级C试题填空题第7题)#include main(){ int x;scanf("%d",
&x);if(x>15) printf("%d",x-5);if(x>10) printf("%d",x);if(x>5) pri
ntf("%d\n",x+5);} 若程序运行时从键盘输入12<回车>,则输出结果为 。分析: 本题执行过程如下,输
入12后,首先判断第一个if条件,12>15为假,所以第一个if语句不执行。接着进行第二个if条件判断,12>10为真,执行后面语
句,所以输出12。然后继续执行第三个if条件判断,12>5为真,if语句继续被执行,就在输出12后继续输出x+5,即17。所以完整
输出结果为1217。3.3.2 含else子句的if语句一般形式: if(表达式) 语句1;else语句2;其语义是:如果表达式的
值为真,则执行语句1,否则执行语句2 。其过程可表示为下图:图3.2 含else子句的if语句流程图例3.6 输入两个整数,输出其
中的大数。#include"stdio.h"void main(){? int a,b,max;printf("\n input
two numbers:\n");scanf("%d%d",&a,&b);if(a>b) printf("m
ax=%d\n",a);elseprintf("max=%d\n",b); } 运行结果:input two numbers:
3 5↙max=53.3.3 嵌套的if语句当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。一般形式:?if
(表达式)???????? if语句;??? 或者: ? if(表达式)?????????
? if语句;??????? else?????????? if语句;例如:??????? i
f(表达式1)??????????? if(表达式2)??????????????? 语句1;??????????? else??
????????????? 语句2;其中的else究竟是与哪一个if配对呢?C语言规定,if语句嵌套时,else子句与if的匹配原
则:与在它上面、距它最近、且尚未匹配的if配对。例3.7 比较两个数的大小关系。#include"stdio.h"void mai
n(){????int a,b;printf("please input a,b:\n ");scanf("%d%d",&a,&b
);if(a!=b)if(a>b)printf("a>b\n");elseprintf("a a=b\n");?}运行结果:Please input a,b:3 5↙a lse-if结构。使用if-else-if形式,结构更加清晰易懂。一般形式:if(表达式1) 语句1
; else if(表达式2) 语句2; el
se if(表达式3) 语句3; …
else if(表达式m) 语句m; else
语句n;其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。
如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。 例3.8 判别键盘输入整数是正整数、负整数或者是零#include"
stdio.h"main(){ int c; printf("input a number:\n"); scanf("
%d",&c); if(c<0) printf("This is a negative number\n"); els
e if(c>0) printf("This is positive number\n"); else printf(
"This is zero\n");}运行结果:Please input a,b:30↙This is a positive nu
mber3.3.4 条件表达式构成的选择结构C语言另外还提供了一个特殊的运算符——条件运算符,由此构成的表达式也可以形成简单的选择
结构,这种选择结构能以表达式的形式内嵌在允许出现表达式的地方,使得可以根据不同的条件使用不同的数据参与运算。条件运算符为 ?和:,
它是一个三目运算符,即有三个参与运算的量。由条件运算符组成的式子称为条件表达式。一般形式:表达式1? 表达式2: 表达式3其求值
规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。条件表达式通常用于赋
值语句之中。例如条件语句:if(a>b) max=a; else max=b;可用条件表达式写
为max=(a>b)?a:b;执行该语句的语义是:如a>b为真,则把a赋予max,否则把b 赋予max。例3.9 用条件表达式重新
编程,输出两个数中的大数。 #include"stdio.h"void main(){??int a,b,max;printf("
\n input two numbers:\n");scanf("%d%d",&a,&b);printf("max=%d\n",a
>b?a:b);?}运行结果:input two numbers5 6↙max=63.4 switch语句一般形式:switch(
表达式){ case常量表达式1: 语句1; case常量表达式2: 语句2;
… case常量表达式n: 语句n; default : 语句n+1;
}3.4 switch语句其语义是:计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时
, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则
执行default后的语句。3.4 switch语句例3.10 成绩等级查询:在进行评定时通常会将成绩分为几个等级,0~59分为不
合格,60~79分为及格,80~89分为良好,90~100为优秀。输入一个成绩,给出对应的等级。#include "stdio.h
"void main(){ int num;float C; printf("\t成绩等级查询\n\n"); pr
intf("请输入成绩:"); scanf("%f",&C); num=(int)(C/10); swi
tch(num) { case 10: case 9:
printf("等级为优秀!\n"); break; case
8: printf("等级为良好!\n"); break;
case 7: case 6: printf
("等级为合格。\n"); break; default:
printf("等级为不合格。\n"); break;
}}运行结果:成绩等级查询请输入成绩:95↙ 等级为优秀!3.4 swit
ch语句选择结构应用程序举例:例3.11 输入一个字符, 请判断是字母、 数字还是特殊字符? #include
void main(){ char ch; printf("请输入一个字符:");  /在双引号内的字符串中,
可以出现汉字, 不影响程序运行/ch=getchar();if((ch>=’a’ && ch<=’z’)||(ch>=’A’&
&ch<=’Z’))printf("\n它是一个字母!\n"); / 注意前后的\n, 养成良好的编辑习惯 /
else if(ch>=’0’&& ch<=’9’)printf("\n它是一个数字!\n");elseprintf("\n
它是一个特殊字符!\n");} 运行结果:请输入一个字符:A↙ 它是一个字母!例3.12 闰年判断程序。#includ
e void main(){ int year;printf("Type in a year:\n");sca
nf("%d",&year);if(year%400==0||year%4==0&&year%100!=0)printf("%d
is a leap year.\n",year);elseprintf("%d is not a leap year.\n",ye
ar);}运行结果:Type in a year:2006<回车>2006 is a leap year分析:闰年有两种情况,设年
份为year,则:⑴ 当year是400的整倍数时为闰年,条件表示为:year%400= =0⑵ 当year是4的整倍数,但不是1
00的整倍数时为闰年,条件表示为: year%4= =0 && year%100 != 0综合上述两种情况,得到闰年条件的逻辑表达
式:year%400= =0 || year%4= =0 && year%100 != 0例3.13? 编写程序,根据输入的学生成
绩给出相应的等级,大于或等于90分以上的等级为A,6O分以下的等级为E,其余每10分为一个等级。#include
main(){ int g; printf("Enter g:"); scanf("%d",&g);  printf("g=
%d:",g);  if(g>=90) printf("A\n");  else if(g>=80)printf("B\n"); 
 else if(g>=70)printf("C\n");  else if(g>=60)printf("D\n");  else
printf("E\n");}运行结果:Enter g:92↙g=92:A 分析:当执行以
上程序时,首先输入学生的成绩,然后进入if语句。if语句中的表达式将依次对学生成绩进行判断,若能使某if后的表达式值为1,则执行与
其相应的子句,之后便退出整个if结构。例3.14 将上面的例子改成switch语句。#includemain()
{ int g;  printf("Enter g:"); scanf("%d",&g);  printf("g=%d:",g);
switch(g/10){ case10:  case 9: printf("A\n");break;  case 8:
printf("B\n");break;   case 7: printf("C\n");break;   case 6: pr
intf("D\n");break; default:printf("E\n");   }}运行结果:Enter g:56↙g=
56:E例3.15 求一元二次方程ax2+bx+c=0的解(a≠0)。#include "math.h"#include "s
tdio.h"main(){ float a,b,c,disc,x1,x2,p,q;scanf(“%f,%f,%f”, &a, &
b, &c); disc=bb-4ac;if (fabs(disc)<=1e-6) /fabs():求绝对值库函数/
printf(“x1=x2=%7.2f\n”, -b/(2a)); /输出两个相等的实根/else { if (d
isc>1e-6) { x1=(-b+sqrt(disc))/(2a); /求出两个不相等的实根/
x2=(-b-sqrt(disc))/(2a); printf("x1=%7.2f
,x2=%7.2f\n", x1, x2); }else { p=-b/(2a);
/求出两个共轭复根/ q=sqrt(fabs(disc))/(2a); prin
tf(“x1=%7.2f + %7.2f i\n“, p, q);/输出两个共轭复根/ printf(”
x2=%7.2f - %7.2f i\n“, p, q); } }} 运行结果:2,6.5,3↙x1
= -0.56,x2= -2.69例3.16 已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润
提成的关系如下(计量单位:元):profit≤1000 没有提成;1000<profit≤2000 提成10%;2000<pr
ofit≤5000 提成15%;5000<profit≤10000 提成20%;10000<profit 提成25%。算法
分析: 为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。分析本题可知,提成的变化点都是
1000的整数倍(1000、2000、5000、……),如果将利润profit整除1000,则当: profit≤1000
对应0、11000<profit≤2000 对应1、22000<profit≤5000 对应2、3、4、55000<prof
it≤10000 对应5、6、7、8、9、1010000<profit 对应10、11、12、……为解决相邻两个区间的重叠问
题,最简单的方法就是:利润profit先减1(最小增量),然后再整除1000即可:profit≤1000 对应01000<pro
fit≤2000 对应12000<profit≤5000 对应2、3、45000<profit≤10000 对应5、6、7、
8、910000<profit 对应10、11、12、……程序代码:#include main(){ long profit; int grade; float salary=500; printf("Input profit: "); scanf("%ld", &profit); grade= (profit – 1) / 1000; switch(grade){ case 0: break; /profit≤1000 / case 1: salary += profit0.1; break; /1000<profit≤2000 / case 2: case 3: case 4: salary += profit0.15; break; /2000<profit≤5000 / case 5: case 6: case 7: case 8: case 9: salary += profit0.2; break; /5000<profit≤10000 / default: salary += profit0.25; /10000<profit /}printf("salary=%.2f\n", salary);} 运行结果:Input profit:3456↙salary=1018.40
献花(0)
+1
(本文系小磊老师首藏)