4.3.1 if语句的基本形式
1.简单if语句
简单if语句也叫条件执行语句,一般格式为:
if(表达式)语句;
其中,“表达式”表示条件,一般为逻辑表达式,也可以是整型表达式或者字符型表达式等,只要其值为非0则表示“真”,为0表示“假”。“语句”部分可以是一条简单语句,也可以是一条复合语句。
例如:
① if(x>max)max=x; ② if(x<a && x>b) { x=(a+b)/2; y=a*x+b; }
简单if语句的执行过程为:先计算条件“表达式”的值,若结果为“真”则执行“语句”,然后执行if语句后面的语句。如果结果为假,则不执行“语句”,而直接执行if语句之后的语句。图4.1所示为其执行过程的N-S图。
【例4.1】 输入任意三个整数num1、num2、num3,求三个数中的最大数。
分析:首先取一个数预置为max(最大数),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大数。
N-S图如图4.2所示。
图4.1 简单if语句的执行过程
图4.2 求三个数中的最大数
程序如下:
1 #include<stdio.h> 2 void main() 3 { int a,b,c,max; 4 printf("Please input three numbers:"); 5 scanf("%d,%d,%d",&a,&b,&c); /* 输入3个整数,用逗号分隔 */ 6 max=a; /* 假设a最大 */ 7 if(b>max)max=b; /* 如果b较大则最大数为b */ 8 if(c>max)max=c; /* 如果c较大则最大数为c */ 9 printf("The three numbers are:%d,%d,%d\n",a,b,c); 10 printf("max=%d\n",max); 11 }
2.基本if-else语句
带有else分支的if语句是if语句的基本形式,一般格式为:
if(表达式)语句1; else语句2;
其中,“语句1”、“语句2”都可以是一条简单语句或复合语句。一般称“语句1”为then子句,称“语句2”为else子句,把if-else语句理解为英语中的“if … then …, else …”结构。
下面是if-else结构的几种书写形式:
① if(x<0)y=-1;else y=1; ② if(sum==m) printf("right!\n"); else printf("error!\n"); ③ if(x>1 || x<-1)y=1; else y=sqrt(100-x*x);
if-else语句的执行过程为:先计算条件“表达式”的值,如果结果为真则执行“语句1”,否则执行“语句2”,然后跳到整个if语句之外继续执行程序。图4.3 所示为其执行过程的N-S图。
【例4.2】 铁路部门规定,行李托运时重量不超过50千克,按0.95元/千克计价,超过50千克,超过部分按1.5元/千克计价。编程从键盘输入行李重量,计算并输出运费。
分析:设重量为w,运费为p,则p与w的关系为:
算法的N-S图如图4.4所示。
图4.3 if-else语句的执行过程
图4.4 例4.2的算法N-S图
程序如下:
1 #include<stdio.h> 2 void main() 3 { float w,p ; 4 printf("Please input weight:"); 5 scanf("%f",&w); 6 if(w<=50) 7 p=0.95*w; 8 else 9 p=0.95*50+(w-50)*1.5; 10 printf("price is%.2f\n",p); 11 }
【例4.3】 输入任意一个正整数n,如果n是7的倍数,则输出该倍数;反之,输出n除以7的商和余数。例如,若n为17,则输出商2和余数3。
分析:要判断整数n是不是整数m的倍数,可以计算n除以m的余数r,如果r为0,则n是m的倍数,即n能够被7整除。
算法的N-S图如图4.5所示。
图4.5 例4.3的算法N-S图
程序如下:
1 #include<stdio.h> 2 void main() 3 { int n,r,t; 4 printf("enter a number:"); 5 scanf("%d",&n); 6 if(n%7==0) 7 { t=n/7; 8 printf("quotient is%d\n",t); 9 } 10 else 11 { t=n/7; 12 r=n%7; 13 printf("quotient is%d,remainder is%d\n",t,r); 14 } 15 }
注意,程序中第6~14行构成一个完整的if语句,该if语句的then子句和else子句都是复合语句。编程时,如果错用复合语句的“{}”会导致程序出错。
3.多分支if-else if语句
基本if语句只有两个分支。要表示多分支选择,可以采用if-else if语句。多分支if语句的一般格式为:
if(表达式1) 语句1; else if(表达式2) 语句2; …… else if(表达式n) 语句n; else 语句n+1;
执行过程为:先计算“表达式1”,如果为“真”,则执行“语句1”,然后跳出if语句,转到if语句后的语句(位于“语句n+1”之后)继续执行程序;若“表达式1”为“假”,则跳过“语句1”,计算“表达式2”;若“表达式2”为“真”,则执行“语句2”,然后跳出if语句,否则再计算“表达式3”,……,以此类推。当“表达式n”为“假”(意味着,所有表达式的值都为“假”)时,执行“语句n+1”。图4.6所示为执行过程的N-S图。
【例4.4】 输入一个年份,判断它是否闰年。
分析:
① 闰年的条件是年份能被4整除,但不能被100整除;或者能被400整除。
② 如果X能被Y整除,则余数为0,即如果x%y的值等于0,则表示X能被Y整除。
图4.6 多分支if-else if语句的执行流程
③ 用标识符leap表示是否闰年,leap为1表示是闰年,为0则表示非闰年。
判断某一年份是否闰年的方法是:先输入年份year;再根据①进行判断,如果是闰年则将leap置为1,否则将leap置为0;最后根据leap的值输出判断结果,如图4.7所示。这种处理两种状态值的方法,对优化算法和提高程序可读性非常有效,请读者仔细体会,并注意在程序中使用。
图4.7 判断是否闰年
程序如下:
1 #include<stdio.h> 2 void main() 3 { 4 int year,leap; 5 printf("Please enter year:"); 6 scanf("%d",&year); 7 if(year%400==0)leap=1; 8 else if(year%4==0 && year%100 !=0)leap=1; 9 else leap=0; 10 if(leap)printf("%d is a leap year.\n",year); 11 else printf("%d is not a leap year.\n",year); 12 }
第7~9行是一个多分支if语句,有3个分支。第10~11行是if-else语句。在第10行中,条件表达式“leap”是对“leap!=0”的简化,这也是C语言程序设计中常见的一种简化策略。一般地,可以把“x!=0”简化为“x”,而把“x==0”简化为“!x”。
【例4.5】 根据输入的一个学生的成绩,输出成绩的等级(优秀、良好、中等、及格、不及格)。成绩等级划分办法如下。
优秀:90~100
良好:80~89
中等:70~79
及格:60~69
不及格:0~59
算法的N-S图如图4.8所示。
图4.8 例4.5的算法N-S图
程序如下:
1 #include<stdio.h> 2 void main() 3 { int score; 4 printf("输入分数:"); 5 scanf("%d",&score); 6 if(score)=90)printf("优秀\n"); 7 else if(score)=80)printf("良好\n"); 8 else if(score)=70)printf("中等\n"); 9 else if(score)=60)printf("及格\n"); 10 else printf("不及格\n"); 11 }
4.使用if语句应该注意的问题
① 在三种形式的if语句中,在if关键字之后的括号中均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其他表达式,如赋值表达式等,甚至也可以是一个变量或常量。例如,“if( a=5 )……;”和“if( b )……;”都是允许的。只要表达式的值为非0,即为“真”。因此,对于“if( a=5 )……;”,表达式的值恒为5,所以其后的语句总是要执行的。当然这种情况在程序中不一定会出现,但在语法上是合法的。
又如:
if(a=b) printf("%d",a); else printf("a is 0");
本语句的作用是,把b值赋予a,如为非0则输出该值,否则输出“a is 0”字符串。但如果要表达的真实意图并非如此,而是“如果a和b相等,则……”,那么该语句就是“错误”程序,错在把“==”写成了“=”。希望读者注意这种常犯的错误。
② 在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
③ 在if语句的三种形式中,所有的语句都应为单条语句,如果要想在满足条件时执行一组(即多条)语句,则必须把这一组语句用“{}”括起来组成一个复合语句。
④ 由于if语句与其子句(then子句或else子句)之间存在归属关系,因此编程时把子句缩进一格,以体现不同层次。
⑤ else子句部分不能独立存在,必须紧跟在then子句之后。所以,对于以下语句:
if(x>y)z=x;; else z=y;
由于第一行多了一个分号“;”(形成一个空语句),else部分与前面的if部分分开了,将导致出错。
因此,当then子句有可能是多条语句时,一个较好的习惯是把它们放在“{}”中,形成复合语句。下面的书写格式可以避免类似错误,希望读者认真体会。
if(x>y) { z=x; } else { z=y; }