C

3. C语言教程-条件

3. Conditionals

Posted by xuepro on October 30, 2017

“教小白精通编程”系列之“C语言教程” (版权所有,不得转载,擅自抄袭转载将承担法律责任)

3. 条件

我们知道C程序总是从main函数的第一条语句开始,顺序往下一条一条地执行,直到最后结束。但有时我们会希望某些语句只有在满足某种条件时才执行。

比如我们出门,如果天下雨了,我们就带一把雨伞,如果不下雨,就没必要带来。或者一个学生如果某门课不及格就要补考,等等。

为了根据不同条件是否满足而决定是否执行某一个语句(块),C语言提供了条件语句,主要有if 和 switch 两种:

if语句

#include <stdio.h>
int main(){
   double score;
   printf("请输入你的分数:\n");
   scanf("%lf",&score);
   if(score<60)
       printf("不及格,需要补考!\n");
   
   return 0;   
}

其中的if(如果)是关键字,用于判断圆括号里的表达式(即score<60)是否为真(成立),决定是否要执行printf语句.

if语句的格式如下:

if语句格式:

  if (表达式) 
     单个语句

如果if里面的表达式为真时,我们需要执行多条语句,则可以将这些语句用花括号包围起来,构成“复合语句”:

  if (表达式) 
  {
      ...程序块
  }

当if里面的表达式为真时,就依次执行这个复合语句的所有语句。

#include <stdio.h>
int main(){
   double score;
   printf("请输入你的分数:\n");
   scanf("%lf",&score);
   if(score<60){
       printf("你的成绩不及格!\n");
       printf("需要参加补考!\n");
   }
   
   return 0;   
}

上述过程可以用如下的流程图表示: 含义:   如果“表达式_1为真”,则执行其中的程序块。

也可以给if添加一个else语句,意思是:如果if里面的表达式为真,就执行if语句中的程序块1,否则,就执行else对应的程序块2。

  if (表达式) 
     语句块1
  else 
     语句块2

如果语句块1或语句块2中有多条语句,都需要用花括号包围起来。

可以用如下的流程图表示:

含义: 如果“表达式_1为真”,则执行程序块1;否则执行程序块2 。

还可以和else if(否则如果)结合起来,根据多个不同条件执行不同的语句块。

  if (表达式_1) 
  {
      ...程序块1
  }
  else if (表达式_2)
  {
      ...程序块2
  }
  else
  {
      ...其他程序块
  }

含义

如果“表达式_1为真”,则执行表达式_1对应的“程序块1”;

否则如果“表达式_2为真”,就执行表达式_2对应的“程序块2”;

否则就执行其他情况下的“其他程序块”。

例1:

#include <stdio.h>         

/* 根据输入整数是否正负等情况,输出不同信息!*/
void main(){
    int n;
    scanf("%d", &n);
    if ( n<0 ) 
       printf (" %d is a 负整数!\n" ,n) ;
    else if ( n==0 )
       printf (" %d is = 0!\n" ,n) ;
    else  printf (" %d is a 正整数!\n" ,n) ;
}

注:

英文单词含义:if(如果) , else(否则), else if(否则如果)。
C语言中0被认为是“假”,而"非0值"被认为真。

另外, 比较运算符产生的结果值是:真(1)和假(0)。 逻辑运算符可以对真和假表达式进行逻辑运算。

比较运算符:

  <        smaller than
  <=        smaller than or equal to
  ==        equal to
  !=        not equal to
  >=        greater than or equal to
  >        greater than

看一个例子

// C Program to demonstrate the working of arithmetic operators
#include <stdio.h>
int main()
{
    int a = 5, b = 5, c = 10;

    printf("%d == %d = %d \n", a, b, a == b); // true真
    printf("%d == %d = %d \n", a, c, a == c); // false假

    printf("%d > %d = %d \n", a, b, a > b); //false
    printf("%d > %d = %d \n", a, c, a > c); //false


    printf("%d < %d = %d \n", a, b, a < b); //false
    printf("%d < %d = %d \n", a, c, a < c); //true


    printf("%d != %d = %d \n", a, b, a != b); //false
    printf("%d != %d = %d \n", a, c, a != c); //true


    printf("%d >= %d = %d \n", a, b, a >= b); //true
    printf("%d >= %d = %d \n", a, c, a >= c); //false


    printf("%d <= %d = %d \n", a, b, a <= b); //true
    printf("%d <= %d = %d \n", a, c, a <= c); //true

    return 0;

}

逻辑运算符

  &&         且  
  ||         或  
  !          非

对于A和B两个数:

只有当A和B都是非0(真)时,逻辑与运算&& 的结果才是真。 只要当A和B有一个非0(真)时,逻辑或运算|| 的结果就是真。 当A非0(真)时,逻辑或运算! 的结果就是假;当A为0(假)时,逻辑或运算! 的结果就是真。

我们看一个例子

// C Program to demonstrate the working of logical operators

#include <stdio.h>
int main()
{
    int a = 5, b = 5, c = 10, result;

    result = (a == b) && (c > b);
    printf("(a == b) && (c > b) equals to %d \n", result);

    result = (a == b) && (c < b);
    printf("(a == b) && (c < b) equals to %d \n", result);

    result = (a == b) || (c < b);
    printf("(a == b) || (c < b) equals to %d \n", result);

    result = (a != b) || (c < b);
    printf("(a != b) || (c < b) equals to %d \n", result);

    result = !(a != b);
    printf("!(a == b) equals to %d \n", result);

    result = !(a == b);
    printf("!(a == b) equals to %d \n", result);

    return 0;
}

switch语句格式:

switch (表达式)
{
    case 常量_表达式_1:
    {
        ...程序块..
        break;
    }
    case 常量_表达式_2:
    {
        ...程序块...
        break;
    }
    default:
    {
        ...程序块..
    }
}

含义

就是当里面的switch表达式等于其中的常量时,就执行其中的程序块, 然后用break跳出整个switch语句,如果不等于任何一个常量,就执行默认(default) 里的程序块。

例2:

#include<stdio.h>

void main( ){
    char command;          
    command = getchar( );       //getchar是一个输入函数,用于从键盘读入一个字符 
    
    switch( command){
      case ' W ' : 
         printf( " welcome to come here ! \n " ); 
         break;
      case 'P':
         printf( " I print some information  for you \n " ); 
         break;
      default:
         printf(" You pressed other key \n ");
         break;
    }               
}      

根据字符command是否等于字符常量’W’或’P’而执行对应的程序块。其他情况就执行默认(default)的程序块。

关于switch有几个语法点:

  • case 标签必须是整型常量表达式
  • case后面的常量表达式值不能相同
  • 某个case里定义变量,必须加花括号,否则假如执行其他case会出现“作用域里的该变量定义未初始化”
  • default标签可以省略

分别看下面的例子

//下面的switch省略了default标签

int x,y;
switch(x){
    case 3.14:                //错:case 标签必须是整型常量表达式 
    
        //... do something
        
        break;
    case y:                   //错:case 标签必须是整型常量表达式
    
        //... do something
        
        break;
}
int x;
//...

//下面的有2个case的标签值都是1,不能相同!

switch(x){
    case 1:
        //...
        
        break;
    case 1:
        //...
        
        break;
    case 2:
        //...
        
        break;
}
//
switch(1) {
    case 1: int x = 0; // 初始化
    
            printf("%d\n",x) ;
            break;
    default: // 编译错误:跳到 default :会进入 'x' 的作用域而不初始化它
    
              printf("default\n") ;
             break;
}

必须将case块里的变量定义放在花括号里

switch(1) {
    case 1: {  int x = 0;
                printf("%d\n",x) ;
               break;
            } //  'x' 的作用域在此结束
            
    default:  printf("default\n") ; // 无错误
    
             break;
}

最后需要说明的是:if语句里可以嵌套其他各种语句包括if语句、while语句、switch语句等。switch语句也是一样。   同样,while,for 等语句里也可以嵌套其他如if语句(请看“4.循环”)。例如:

#include<stdio.h>

void main(){
  int x; 
  scanf("%d",&x);
  if(x>=0){
        /* 只有1行代码的程序块,
            可以省略花括号{ } */
            
        if(x<10)            
           printf("x<10\n");       
        else if(x<20)
           printf("x>=10且x<20\n"); 
        else if(x<30)
           printf("x>=20且x<30\n");
        else if(x<40)
           printf("x>=30且x<40\n");  
        else 
           printf("x>=40\n");  
  }
  else{
       printf("x<0!\n");
  }
}

练习

 1:输入一元二次方向的系数,然后根据判别式的3种情况,输出方程式有2个根、1个根、无根的情况

 2. 写一个程序,根据从键盘输入的学生成绩的100制分数,输出学生的等级:优(>=90)、良(<90但大于等于80)、中、及格、不及格5个等级之一。

  1. 用 switch 语句编写一个相对完整的命令主控程序,用单个字符表示一个命令,根据 用户输入命令字符的不同,输出代表不同命令的一个字符串. 比如一个图书管理程序,大致样子如下:
char cmd;
switch(cmd){
   case i: case I:
        //输出“插入新图书”的提示; 
        break;
   case s: case S:
       //输出“查询图书\n”的提示; 
       break;
  case p: case P:
        //输出”打印所有图书\n”的提示; break;
  case default;
       //输出”程序退出!\n”的提示; 
        break;
}

关注“教小白精通编程”博客微博“教小白精通编程”  


支付宝打赏 微信打赏

您的打赏是对我最大的鼓励!