C程序设计语言
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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;
            }