2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室1
4 第四章选择结构程序设计
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室2
第四章 选择结构程序设计
4.1语句的分类
C语言将语句( statement)分成以下几类:
控制语句
函数调用语句
空语句
表达式语句
复合语句
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室3
if ( ) … else … (条件语句)
switch (多分支选择语句)
for ( ) … (循环语句)
while ( ) … (循环语句)
do … while ( ) … (循环语句)
continue (结束本次循环语句)
break (中止执行 switch或循环语句)
goto (转向语句)
return (从函数返回语句)
1.控制语句
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室4
2.函数调用语句函数调用语句由一个函数调用加上一个分号(;)构成。
例如:
printf(“Hello!”);
3.空语句只有一个分号(;)的语句。空语句不执行任何操作。
例如:;
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室5
4.表达式语句由 C语言的任意合法表达式加上一个分号(;)构成。例如:
i++ ; (使变量的值加 1)
x + y ; (完成 x + y 操作,但不将其结果赋给某一变量,所以该语句无实际意义); (空语句)
printf (“Hello!”); (函数调用语句 )
函数调用属于表达式的一种,而空语句则是没有任何表达式的语句
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室6
5.复合语句包含在由左花括号{开始,右花括号}结束的一组语句,在逻辑上构成一个整体,称为复合语句。例如:
{
x = k + t ;
y = x %5 ;
printf (“y is % d”,y);
}
任何可以放置语句的地方,都可以放置复合语句
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室7
4.2关系运算符、逻辑运算符、条件运算符本章将着重讨论利用选择控制实现选择结构程序设计。选择控制是指根据指定的条件是否满足,选择下一步要执行的语句。满足为真,不满足为假。
对于条件的描述,最为常见的就是关系表达式。其一般形式,
4.2.1 关系运算符和关系表达式操作数 关系运算符 操作数每个操作数可以是变量、常量或者是任意有效的 C语言表达式。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室8
大于 a > b 大于等于 a >= b
小于 a < b 小于等于 a <= b
等于 a == b 不等于 a != b
6种关系运算符:
关系表达式 只能产生两个数值之一,0 或 1。
一个判定为真的关系表达式的值为 1;
一个判定为假的关系表达式的值为 0。
C语言中,逻辑值真为 1;逻辑值假为 0。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室9
关系运算符的优先级低于算术运算符的优先级,但高于赋值运算符的优先级。其结合性是左结合性。
例如:
a=20,b=70,c=50,d=90,有下列表达式:
a<b>d 相当于 (a<b)>d,a<b的值为 1,1>d 为假,
整个表达式的值为 0
k=a+b<c+d 相当于 k=((a+b)< (c+d)),即 k = (90
< 140),即 k=1,为变量 k赋值 1,整个表达式的值为 1。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室10
字符数据同样可以用关系运算符比较,比较的依据是其所用代码的数值。
例如比较 ASCII码的字符:
表达式 ‘ a? ==?A? 的值为 0
表达式 ‘ A? >?C? 的值为 0
表达式 ‘ C? <?a? 的值为 1
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室11
逻辑运算符将其操作数视为逻辑值,即,真,或
,假,。而 C语言对于操作数真假的判定采取了如下原则:
4.2.2 逻辑运算符和逻辑表达式三种逻辑运算符,
逻辑非 ! a
逻辑与 a && b
逻辑或 a || b
高低
C语言中,任意非零值为逻辑值真;
零为逻辑值假。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室12
逻辑表达式 !( 5 < 10)的值为 0
逻辑表达式( 5 > 10) &&( 8 < 10)的值为 0;
逻辑表达式( 5 > 10) ||( 8 < 10)的值为 1。
逻辑表达式( 5 < 10) &&( —10)的值为 1
逻辑表达式 ! ’ a? 的值为 0
例如:
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室13
条件运算符(? )是 C语言中惟一的一个三目运算符,
其表达式的一般形式,
4.2.2 条件运算符和条件表达式操作数 1? 操作数 2,操作数 3
条件表达式的执行过程为:先求解操作数 1的逻辑值,如果为非零值 ——“真,,则求解操作数 2,并将操作数 2的值作为该条件表达式的值;如果为零值 ——“假,,则求解操作数 3,
并将操作数 3的值作为该条件表达式的值。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室14
条件运算符的优先级高于赋值运算符,但低于算术运算符、关系运算符及逻辑运算符。我们来看一个例子:
y = x >=60P?,?F?
如果 x大于或等于 60,则 y被赋值 ‘ P?,该表达式的值为
‘ P?;如果 x小于 60,则 y被赋值 ‘ F?,该表达式的值为
‘ F?。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室15
C语言提供两种选择控制语句:
– if 语句
– switch 语句。
4.3 选择结构的程序设计所有程序的正常执行次序通常都是顺序的。然而,在许多问题的解决方案中,常会根据情况的不同,采取不同的处理方式。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室16
if( 表达式 )
语句 A
else
语句 B
4.3.1 if语句
if语句的一般形式:
表达式?
语句 A 语句 B
真 (非 0) 假 (0)
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室17
else子句,是可选的。当无 else子句时的 if语句形式为,
if( 表达式 )
语句表达式?
语句真 (非 0)
假 (0)
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室18
当 if语句的目标块中又出现 if语句时,C语言有如下规定,else子句总与距它最近的 if配套。例如:
if (k)
{
if (h) do1();
if (i) do2(); /* 这个 if */
else do3(); /* 和这个 else 组合 */
if (t) do4();
}
else do5(); /* 这个 else 和 if(k) 组合 */
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室19
基于上述规则,一个常用的嵌套 if语言构成多分支选择结构,也称为 if-else-if阶梯,其一般形式如下:
if( 表达式 1)
语句 1
else if( 表达式 2)
语句 2
else if( 表达式 3)
语句 3
......
else 语句 n
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室20
C语言中,switch语句同样可以实现多分支选择。
switch语句的一般形式是:
4.3.1 switch 语句
switch( 表达式 ) {
case 常量 1,语句序列 1
break;
case 常量 2,语句序列 2
break;
case 常量 3,语句序列 3
break;
......
default,语句序列 n
}
可选可选
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室21
switch语句可以作为另一个 switch语句中语句序列的一部份,形成嵌套 switch语句。这时,即使内外层的常量相同,也不会引起冲突。例如:
switch (x) {
case 1,printf(“process(x,y)\n”);
switch (y) {
case 0,printf(“Divided by 0 error!\n”);
break;
case 1,process (x,y );
}
break;
case 2,
……
}
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室22
例 4.1从键盘读入两个整数,然后显示这两个数的商。
4.3 选择结构的程序设计举例
#include <stdio.h>
void main()
{
int a,b;
printf("Enter two numbers(separate by,):");
scanf("%d,%d",&a,&b);
if (b)
printf("a/b=%d\n",a/b);
else
printf("Can not divide by zero.\n");
}
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室23
例 4.2从键盘读入年份,然后判断该年是否为闰年。符合下列条件之一的年份都是闰年:
– 能被 400 整除的年份;
– 不能被 100整除,但可以被 4整除的年份。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室24
#include <stdio.h>
void main()
{
int year,leap;
printf("Enter year:");
scanf("%d",&year);
if (year%400==0 || (year%4==0 && year%100!=0)) /*判断是不是闰年 */
leap=1; /* 是闰年 */
else
leap=0;
if (leap)
printf("%d is a leap year.\n",year);
else
printf("%d is not a leap year.\n",year);
}
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室25
例 4.3企业发放的奖金根据利润提成。
– 利润 (I)不超过 10万元时,奖金可提 10%;
– 利润不超过 20万元时,其中的 10万元按 10%提成,
高于 10万元的部分提成 7.5%;
– 20万到 40万元,其中的 20万元按前述 b方法提成,
高于 20万元的部分提成 5%;
– 40万到 60万元,其中的 40万元按前述 c方法提成,
高于 40万元的部分提成 3%;
– 60万到 100万元,其中的 60万元按前述 d方法提成,
高于 60万元的部分提成 1.5%;
– 高于 100万元时,其中的 100万元按前述 e方法提成,
超过 100万元的部分提成 1%。
从键盘输入当月利润 I,求应发放奖金总数?
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室26
#include <stdio.h>
void main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
printf("Enter profit earned:");
scanf("%ld",&i);
bonus1=100000*0.1;
bonus2=bonus1+100000*0.075;
bonus4=bonus2+200000*0.05;
bonus6=bonus4+200000*0.03;
bonus10=bonus6+400000*0.015;
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室27
if (i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
printf("bonus=%d\n",bonus);
}
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室28
例 4.4输入某年某月某日,判断这一天是这一年的第几天?
– 解析:以 2000年 4月 8日为例,应该先把前三个月的天数加起来,然后再加上 8天即本年的第几天。遇闰年情况,且输入月份大于 3时需要多加一天。
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室29
#include <stdio.h>
void main()
{ int day,month,year,sum,leap;
printf("\nplease input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month) /*先计算某月以前月份的总天数 */
{ case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break; /*二月按 28天计 */
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("month data error");
}
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室30
sum=sum+day; /*再加上某天的天数 */
if(year%400==0||(year%4==0 && year%100!=0)) /*判断是不是闰年 */
leap=1;
else
leap=0;
if(leap==1 && month>2)/*如果是闰年且月份大于 2,总天数应该再加一天 */
sum++;
printf("It is the %dth day of the year.\n",sum);
}
2009年 7月 27日星期一重庆工学院计算机科学与工程学院 基础教研室31
第四章小结
1,C语句可分为控制语句、表达式语句及复合语句。
2,C语言中,逻辑真值为 1;逻辑假值为 0。
3,C语言中,将非零值判定为逻辑真;将零值判断为逻辑假。
4,关系、逻辑、条件运算符的优先级及结合性,其表达式的意义及应用。
5,if 语句用于实现单路、两路和多路分支。
6,switch也是多选一的分支语句,它是 if 语句的一个补充( else if
结构),当用它编制程序时会增加可读性。
7,使用 if语句及 switch语句进行选择结构程序设计。