Day06

分支结构                                                                              

分支结构:又称之为选择结构
 
概念:

选择结构:根据某个条件成立与否,决定是否执行指定的任务

条件判断

条件判断的结果是逻辑值:成立或不成立,
在程序中用“真”(1)和“假”(0)来表示。
 

条件构建
  • 关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)
  • 逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的符合条件

比如:

if(year % 100 != 0 && year % 4 != 0)//即含有关系表达式,又含有逻辑表达式的条件叫做复合条件

  • 常量/变量:值是否非0,取值(0|1)

注意:类似以下写法,是无效的,没有意义的。

if(x+y)//编译通过,但是没有实际意义,不建议写
if(5*6)

算数运算符高于关系运算符

选择结构的形式
单分支

语法:

if(条件表达式)
{
    语句1;
}

说明:条件表达式成立,执行语句1,否则跳过该分支结构

例子:

/**
 * 需求:从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符
 */
#include <stdio.h>
int main()
{
  // 声明一个变量,存放从键盘录入的字符
  char c;
  printf("请输入一个英文字母:\n");
  scanf("%c", &c);
  // 判断
  if (c >= 'A' && c <= 'Z')
  {
    // c = c + 32;
    c += 32;
  }
  printf("输入的字符是:%c\n", c);
  return 0;
}
int a = 5;
if(a < 0)
{
    a =  -a;
}
printf("a=%d\n",a)
双分支

语法:

if(条件表达式)
{
    语句1;
}
else
{
    语句2;
}

说明:条件表达式成立,执行语句1,否则执行语句2。双分支不管条件是否满足,都要执行。

例子:
 

#include <stdio.h>

int main(void)
{
        //申明三个变量来存放计算数
        double x,a,y;

        //通过键盘录入x,a
        printf("请输入两个数值: \n");
        scanf("%lf,%lf",&x,&a);

        //检验除数
        if(x != 0 && a != 0)
        {
            y = 1.0 / x + 1.0 / a;
        }
        else
        {
            y = 10000;
        }
        //输出
        printf("y=%f\n",y);

        return 0;
}

逻辑表达式:

逻辑表达式中各种运算符的优先级顺序如下:
!(逻辑非)→ 算术运算符→ 关系运算符→ && 与‖→ 赋值运算符

实际上,逻辑运算符两侧的运算对象不但可以是0和1,或是0和非0,而且也可以是字符型、实型和指针型等。系统最终是以0和非0来判定它们的真假的。
例如:’c’  &&  'd’ 为1
 

三目运算符

语法:

表达式1 ?语句1 :语句2;

说明: :条件运算符,主要可以简化双分支为同一变量赋值的操作,

求值过程:先计算表达式1的值,非0,则将语句1的结果作为条件运算符的最终结果;否则则将语句2的结果作为条件运算符的最终结果。
案例:

#include <stdio.h>
int main()
{
  // 需求:求a,b两个数中最大数
  // 写法1:正常写法
  int a = 5, b = 3;
  if (a > b)
  {
    printf("最大数是:%d\n", a);
  }
  else
  {
    printf("最大数是:%d\n", b);
  }
  // 写法2:省略{}
  int a1 = 5, b1 = 3;
  if (a1 > b1)
    printf("最大数是:%d\n", a1);
  else
    printf("最大数是:%d\n", b1);
  // 写法3:三目运算符
  int a2 = 5, b2 = 3;
  int ret = a2 > b2 ? a2 : b2;
  printf("最大数是:%d\n", ret);
  return 0;
}

案例:

#include <stdio.h>
int main()
{
  // 需求:输入两个实数,按代数值由 小到大的顺序输出这两个实数。
  // 申明变量,存储操作数
  int a, b;
  printf("请输入两个数值作为操作数:\n");
  scanf("%d,%d", &a, &b);
  // 校验
  // 方式1
  if (a > b)
  {
    printf("由小到大的顺序是:%d,%d\n", b, a);
  }
  else
  {
    printf("由小到达的顺序是:%d,%d\n", a, b);
  }
  // 方式2
  // 创建一个临时变量,用来存放交换信息
  int t = 0;
  if (a > b)
  {
    t = a;
    a = b;
    b = t;
  }
  printf("由小到大的顺序是:%d,%d\n", a, b);
}

案例:

#include <stdio.h>
int main()
{
  // 需求:输入3个数a,b,c,要求按由小到大的顺序输出这3个数
  // 申明变量,用来存放操作数
  int a, b, c, tmp;
  printf("请输入三个整数:\n");
  scanf("a=%d,b=%d,c=%d", &a, &b, &c);
  // 条件判断
  if (a > b)
  {
    tmp = a;
    a = b;
    b = tmp;
  }
  if (a > c)
  {
    tmp = a;
    a = c;
    c = tmp;
  }
  if (b > c)
  {
    tmp = b;
    b = c;
    c = tmp;
  }
  printf("a,b,c三个数按照由小到大的顺序是:%d,%d,%d\n", a, b, c);
  return 0;
}

多分支


语法:

if(条件1)
{
    语句1;
}else if(条件2)
{
    语句2;
}
...
else {
    语句n+1;
}
案例:
#include <stdio.h>
int main()
{
  // 需求:编一程序,要求输入一个x值,输出y值
  // 方式1:嵌套的if..
  int x, y;
  printf("请输入一个整数:\n");
  scanf("%d", &x);
  // 条件判断
  if (x < 0)
  {
    y = -1;
  }
  else
  {
    // x >= 0
    if (x == 0)
    {
      y = 0;
    }
    else
    {
      y = 1;
    }
  }
  printf("方式1:x=%d,y=%d\n", x, y);
  // 方式2:多分支if..else if....else..
  // 条件判断
  if (x < 0)
  {
    y = -1;
  }
  else if (x == 0)
  {
    y = 0;
  }
  else
  {
    y = 1;
  }
  printf("方式2:x=%d,y=%d\n", x, y);
}
案例:
#include <stdio.h>
/**
* 需求:高校要求粤嵌对实训学生根据实训成绩进行评级
范围:0 <= score <= 100;
评级:
score >= 90 优秀
score >= 80 良好
score >= 70 中等
score >= 60 及格
score < 60 不及格
*/
int main()
{
  // 声明一个变量,存储成绩
  int score;
  printf("请录入学生成绩:\n");
  scanf("%d", &score);
  // 对score进行合法校验
  if (score >= 0 && score <= 100)
  {
    // 对合法输入的成绩进行评级
    if (score >= 90)
    {
      printf("优秀\n");
    }
    else if (score >= 80)
    {
      printf("良好\n");
    }
    else if (score >= 70)
    {
      printf("中等\n");
    }
    else if (score >= 60)
    {
      printf("及格\n");
    }
    else
    {
      printf("不及格\n");
    }
  }
  else
  {
    printf("成绩录入不合法!\n");
  }
}

 switch语句

语法:

switch(表达式)
{
    case 常量表达式1:
        语句体1;
        break;
    case 常量表达式2:
        语句体2;
        break;
    。。。
    case 常量表达式n:
        语句体n;
        break;
    default:
            语句体n+1;
            break;//可以省略
}
说明:
switch 后括号内的表达式可以是任何类型的表达式;
⑵ 若表达式的值与某个常量表达式的值相等时,执行此 case 后面的语句;若没有相等的值时,执行 default后面的语句;
⑶ 每个 case 后面的常量表达式的值都必须不相同,否则出现矛盾;
⑷ 各个 case default 出现的次序不影响执行结果;
case 后面的语句中如果没有 break 语句,则执行完本 case 后的语句会接着执行下面的 case case 穿透) ;
⑹ 多个 case 可共用一组语句。
案例:
/*
需求:根据成绩进行评级
score <= 100;
评级:
90 <= score < 100 优秀 90~99/10 == 9 && 100/10 ==10
80 <= score < 90 良好 80~89/10 == 8
70 <= score < 80 中等 70~79/10 == 7
60 <= score < 70 及格 60~69/10 == 6
score < 60 不及格
*/
#include <stdio.h>
int main()
{
  int score; // 成绩
  printf("请输入实训成绩:\n");
  scanf("%d", &score);
  if (score >= 0 && score <= 100)
  {
    // 对成绩进行加工
    int l = score / 10;
    switch (l)
    {
    case 10:            // 100分
    case 9:             // 90~99分
      printf("优秀\n"); // 这里:多个case共用一块代码
      break;
    case 8:
      printf("良好\n");
      break;
    case 7:
      printf("中等\n");
      break;
    case 6:
      printf("及格\n");
      break;
    default:
      printf("不及格\n");
    }
  }
  else
  {
    printf("成绩录入不合法!\n");
  }
}
案例:
/*
需求:实现一个简易计算器,要求实现+,-,×,/运算
*/
#include <stdio.h>
int main()
{
  printf("简易计算器 v1.0\n");
  printf("请输入两个操作数:\n");
  double x, y; // 存放计算数
  char ch;     // 运算符
  scanf("%lf,%lf", &x, &y);
  scanf("%c", &ch); // 消除上面产生的最后一个回车符
  printf("请输入运算符:(+、-、.*、/)\n");
  scanf("%c", &ch);
  // 计算
  switch (ch)
  {
  case '+':
    printf("%.2lf+%.2lf=%.2lf\n", x, y, x + y);
    break;
  case '-':
    printf("%.2lf-%.2lf=%.2lf\n", x, y, x - y);
    break;
  case '.':
  case '*':
    printf("%.2lf*%.2lf=%.2lf\n", x, y, x * y);
    break;
  case '/':
    if (y == 0)
    {
      printf("除数不能为0\n");
    }
    else
    {
      printf("%.2lf/%.2lf=%.2lf\n", x, y, x / y);
    }
    break;
  default:
    printf("输入错误!");
  }
  return 0;
}

注意:

1. 表达式一般写一个变量,变量的值是一个确定的常量。
2. 当遇到 break 或者 switch 语句的右大括号时, switch 语句结束。
3. 表达式中的数据类型: char short int long long long ,不能是浮点型。
表达式和常量的数据类型要一致(支持隐式转换),比较是否相同。

案例:
/*
需求:根据成绩进行评级
score <= 100;
评级:
90 <= score < 100 优秀 90~99/10 == 9 && 100/10 ==10
80 <= score < 90 良好 80~89/10 == 8
70 <= score < 80 中等 70~79/10 == 7
60 <= score < 70 及格 60~69/10 == 6
score < 60 不及格
*/
#include <stdio.h>
int main()
{
  int score; // 成绩
  printf("请输入实训成绩:\n");
  scanf("%d", &score);
  if (score >= 0 && score <= 100)
  {
    // 对成绩进行加工
    int l = score / 10;
    switch (l)
    {
    case 10:            // 100分
    case 9:             // 90~99分
      printf("优秀\n"); // 这里:多个case共用一块代码
      break;
    case 8:
      printf("良好\n");
      break;
    case 7:
      printf("中等\n");
      break;
    case 6:
      printf("及格\n");
      break;
    default:
      printf("不及格\n");
    }
  }
  else
  {
    printf("成绩录入不合法!\n");
  }
}
案例:
/*
需求:实现一个简易计算器,要求实现+,-,×,/运算
*/
#include <stdio.h>
int main()
{
  printf("简易计算器 v1.0\n");
  printf("请输入两个操作数:\n");
  double x, y; // 存放计算数
  char ch;     // 运算符
  scanf("%lf,%lf", &x, &y);
  scanf("%c", &ch); // 消除上面产生的最后一个回车符
  printf("请输入运算符:(+、-、.*、/)\n");
  scanf("%c", &ch);
  // 计算
  switch (ch)
  {
  case '+':
    printf("%.2lf+%.2lf=%.2lf\n", x, y, x + y);
    break;
  case '-':
    printf("%.2lf-%.2lf=%.2lf\n", x, y, x - y);
    break;
  case '.':
  case '*':
    printf("%.2lf*%.2lf=%.2lf\n", x, y, x * y);
    break;
  case '/':
    if (y == 0)
    {
      printf("除数不能为0\n");
    }
    else
    {
      printf("%.2lf/%.2lf=%.2lf\n", x, y, x / y);
    }
    break;
  default:
    printf("输入错误!");
  }
  return 0;
}

switch语句的case穿透:

  1. case穿透:当case后的bread被省略,就会直接执行它后面紧跟的case中的语句(不会判断表达式是否和它后面的case常量是否相同),这样的现象称之为case穿透。
  2. default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语句
总结:
  • 如果只需要一个判断结果,使用单分支
  • 如果需要两个判断结果,且只能有两个判断结果,使用双分支
  • 如果需要判断N个结果中的某几个,或者所有,使用多分支
扩展

条件表达式中的运算符优先级

逻辑非(!) > 算数运算符(+-*/%)>关系运算符(>,<,>=,<=,!=,==,=) > 逻辑运算符 (&&,||)>赋值运算符(=,+=)

设置 vim tab 字符数
set tabstop=4
set shiftwidth=4
set expandtab

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值