【谭浩强C程序设计精讲 chap4】选择结构程序设计

第4章 选择结构程序设计

一、用 if 语句实现选择结构

  • 一般形式:
    if (表达式)  语句1
    [ else  语句2 ]

  • 其他形式,常用的有以下三个:

    • (1)if (表达式)   语句1

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

    • (3)if (表达式1)     语句1
         else if (表达式2)  语句2
         else if (表达式3)  语句3
         … 
         else if (表达式m)  语句m
         else       语句m+1


  • 【说明】
  1. 整个 if 语句可以写在多行上,也可以写在一行上

    //写法1
    if      (number>500) cost=0.15;
    else if (number>300) cost=0.10;
    else if (number>100) cost=0.075;
    else if (number>50)  cost=0.05;
    else                 cost=0; 
    
    //写法2(推荐这种写法)
    if(number>500) 
      cost=0.15;
    else if(number>300) 
      cost=0.10;
    else if(number>100) 
      cost=0.075;
    else if(number>50)  
      cost=0.05;
    else                 
      cost=0; 
    
  2. 常用形式(3)中的语句1~语句m+1都是 if 语句的内嵌语句,它们是 if 语句中的一部分。每个内嵌语句结尾都要有分号(它是语句组成的成分),否则出现语法错误。

    if(x>0) 
      y=1;  //结尾必须有分号
    else 
      y=-1;  //结尾必须有分号
    
  3. if 语句无论写在几行上,都是一个整体,属于同一个语句。不要认为 if 部分是一个语句,else 部分是一个语句。注意:else 子句不能作为语句单独使用,它必须是 if 语句的一部分,与 if 配对使用。

  4. 语句1~语句m可以是一个简单的语句,也可以是一个包括多个语句的复合语句(用花括号括起来)。

    if(x>0) 
    {
      y=1;
      z=2;
    }
    else 
    {
      y=-1; 
      z=9;
    }
    
  5. 内嵌语句也可以是一个if语句。
    如用 if 语句表示阶跃函数:
    y = { 1     ( x > 0 ) 0     ( x = 0 ) − 1     ( x < 0 ) y=\left\{ \begin{aligned} 1 \ \ \ (x>0)\\ 0 \ \ \ (x=0)\\ -1 \ \ \ (x<0)\\ \end{aligned} \right. y= 1   (x>0)0   (x=0)1   (x<0)

    if(x<0) 
      y=-1;
    else  //内嵌语句是一个 if 语句,它也是else的一部分
    {
      if(x==0)
        y=0;
      else
        y=1;
    }
    
  6. 在 if 语句中要对给定的条件进行检查,判定所给定的条件是否成立。判断的结果是一个逻辑值“是”(“真”)或“否”(“假”)

  • 示例:实现输入x的值,输出y相应值
    y = { x     ( x < 1 ) 2 x − 1     ( 1 ≤ x < 10 ) 3 x − 11     ( x ≥ 10 ) y=\left\{ \begin{aligned} &x \ \ \ &(x<1)\\ &2x-1 \ \ \ &(1\leq x<10)\\ &3x-11 \ \ \ &(x\geq 10)\\ \end{aligned} \right. y= x   2x1   3x11   (x<1)(1x<10)(x10)
#include <stdio.h>
int main(void)
{
    int x,y;
	printf("输入x:");
	scanf("%d",&x);
	if(x<1)
	{
		y=x;
		printf("x=%d,y=x=%d\n",x,y);
	}
		
	else if(x>=1 && x<10)
	{
		y=2*x-1;
		printf("x=%d,y=2*x-1=%d\n",x,y);
	}
	else
	{
		y=3*x-11;
		printf("x=%d,y=3*x-11=%d\n",x,y);
	}	2
}

运行结果1:
请添加图片描述

运行结果2:
在这里插入图片描述

运行结果3:
在这里插入图片描述

二、用 switch 语句实现多分支选择结构

  • 一般形式:
  • switch (表达式)
    {
    case  常量1 : 语句1
    case  常量2 : 语句2
       … 
    case  常量n : 语句n
    default :     语句n+1
    }

  • 【说明】
  1. 上面 switch 一般形式中括号内的表达式,其值的类型应为整数类型(包括字符型)

    switch(a+b)//a+b的值是整数
    {
     case 2:   break;
     case 33:  break;
     case 'a': break;
     default:  break;
    }
    
  2. switch 下面的花括号内是一个复合语句

    • 这个复合语句包括若干语句,它是switch语句的语句体
    • 语句体内包含多个以关键字 case 开头的语句行和最多一个default 开头的行。
    • case 后面跟一个常量(或常量表达式),如case ‘A’,它们和 default 都是起标号的作用,用来标志一个位置。
    • 执行 switch 语句时,先执行 switch 后面表达式的值,然后将它与 case 标号比较,如果与某一个 case 标号中的常量相同,流程就转到此 case 标号后面的语句。如果没有与 switch 表达式相匹配的 case 常量,流程转去执行 default 标号后面的语句。
  3. 可以没有 default 标号,此时如果没有与 switch 表达式相匹配的 case 常量,则不执行任何语句,流转到 switch 语句的下一个语句。

  4. 各个 case 标号出现次序不影响执行结果。

  5. 每一个 case 常量必须互不相同;否则就会出现互相矛盾的现象。但是如果语句后面加上 break 则执行到 break 后跳出 switch 语句。

  6. case 标号只起到标记的作用,不作条件检查。

  7. 在 case 子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动执行 case 后面所有的语句。当然加上大括号也可以。

  8. 多个 case 标号可以共用一组执行语句。

    case 'A':
    case 'B':
    case 'C':printf(">60\n");break;
    ...
    
  • 示例:功能要求:输入学生分数,百分制,输出学生的等级。
    (1)90分以上为等级A
    (2)80-89分为等级B
    (3)70-79分为等级C
    (4)60-69分为等级D
    (5)60分以下为等级E
#include <stdio.h>
int main(void)
{
    float score;
	char grade;
	printf("请输入学生的成绩:");
	scanf("%f",&score);
	while(score>100 || score<0)
	{
		printf("\n输入错误,请重新输入:");
		scanf("%f",&score);
	}

	switch((int)(score/10))
	{
		case 10:
		case 9:
			grade='A';
			break;
		case 8:
			grade='B';
			break;
		case 7:
			grade='C';
			break;
		case 6:
			grade='D';
			break;
		default:
			grade='E';
			break;
	}

	printf("学生成绩等级为 %c\n",grade);  
    return 0;
}

运行测试结果1:
在这里插入图片描述

运行测试结果2:
在这里插入图片描述

三、条件运算符和条件表达式

  • 条件运算符:由两个符号(?和:)组成,必须一起使用。

    要求3个操作对象,称为三目(元)运算符,它是C语言中唯一的一个三目运算符。

  • 条件表达式的一般形式为:

  • 表达式1 ? 表达式2 : 表达式3

  • 执行顺序:
    在这里插入图片描述

  • 【说明】

  1. 条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表示2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
    //赋值表达式
    max=(a>b)?a:b;//功能:将a和b二者中的大者赋给max
    
  2. 条件运算符优先级高于赋值运算符,所以以上示例赋值表达式中,先求解条件表达式,再将它的值赋给max。
  3. 条件表达式后面加一个分号就是一个独立的语句。
    //赋值表达式形式
    max=(a>b)?a:b;
    //条件表达式语句形式
    (a>b)?(max=a):(max=b);
    //相当于
    if(a>b) max=a;
    else    max=b;
    //还可以写成以下形式
    (a>b)?printf("%d",a):printf("%d",b);
    //相当于
    if(a>b) printf("%d",a);
    else    printf("%d",b);
    
  • 示例:输入一个字符,判断它是否是大写字母,如果是,将它转换成小写字母并输出。
#include <stdio.h>
int main(void)
{
  char ch;
scanf("%c",&ch);
ch=(ch>='A' && ch<='Z')?(ch+32):ch;
  printf("%c\n",ch);
  return 0;
}

运行结果:
在这里插入图片描述


本节完

  • 31
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MJY二进制

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值