3.分支和循环(上)

C语言是结构结构化的程序语言设计,结构指:循环结构选择结构循环结构

用if,switch实现分支结构,使用for,while,do-while实现循环结构。

1.if语句

if语句形式如下:

if ( 表达式 )
  
    语句

 表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行

C语言中,0为假,非0表示真,也就是表达式的结果是0,则语句不执行,表达式的结果不是0,语句执行

例子:输入一个整数,判断是否为奇数 

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
    if(num % 2 == 1)
         printf("%d 是奇数\n", num);
 return 0;
}

1.2 else

如果一个数不是奇数,那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数。

就要用到if----else----用法如下:

if ( 表达式 )
 
   语句1

else
   
   语句2

例子:输入一个偶数判断是否为奇数,是奇数就打印奇数,是偶数就打印偶数 。

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
     if(num % 2 == 1)
          printf("%d 是奇数\n", num);
     else
          printf("%d 是偶数\n", num);
 return 0;
}

例子2:输入一个年龄,>=18岁就输出:成年,否则就输出:未成年。

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
    if(age>=18)
       printf("成年\n");
    else
       printf("未成年\n");
 return 0;
}

1.3 分支中包含多条语句 

默认if和else语句都只能控制一条语句,比如:

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
    if(age >= 18)
        printf("成年了\n");
        printf("可以谈恋爱了\n");
 return 0;
}

上面的代码,会发现输入的值不管是>=18 还是<18,“可以女朋友了”都会出现。

因为if只控制一条语句,就是printf("成年了\n");if语句为真,则打印成年了,if语句为假,则不打印,对于printf("可以恋爱了\n");是独立存在的,不管if语句条件的真假,都会被执行。那如果我们要用if同时控制两条语句,就要用{}将代码阔起来,else后也可以跟上大括号。 

如下 

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
    if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {
       printf("成年了\n");
       printf("可以交⼥朋友了\n");
 }
 return 0;
}


#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
    if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {
      printf("成年了\n");
      printf("可以交⼥朋友了\n");
 }
     else //else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
 {
       printf("未成年\n");
       printf("不可以早恋哦\n");
 }
 return 0;
}

1.4 嵌套if 

在if语句中,else可以与另一个if语句连用,构成多重结构判断

比如:输入一个整数,判断输入的整数时0,还是正数或者负数。代码如下:

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
    if(num == 0)
       printf("输⼊的数字是0\n");
      else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
         printf("输⼊的数字是正数\n");
      else
         printf("输⼊的数字是负数\n");
 
 return 0;
}

上图的else if构成了嵌套的if语句。

再比如:

输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数:负数。

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
    if(num>0)
 {
       if(num%2 == 0)
          printf("偶数\n");
       else
          printf("奇数\n");
 }
     else
 {
        printf("负数\n");
 }
 return 0;
}

上面代码中的if语句中还有个if--else---,这样就构成了嵌套的if语句。

1.5 悬空else问题 

如果有多个if和else,可以记住这样一条规则,else总最接近的if匹配。

1 #include <stdio.h>
2 int main()
3 {
4    int a = 0;
5    int b = 2;
6    if(a == 1)
7       if(b == 2)
8           printf("hehe\n");
9    else
10      printf("haha\n");
11 return 0;
12 }

这个容易被误导,容易判断a是0,不等于1,那就执行else子句,打印haha

但是在代码运行的时候,输出的结果:     

这个就是if悬空问题,如果有多个if和else,可以记住这样一条规则,else总是跟最接近的if匹配。

上面的排版,让else和第一个if语句对齐,让我们以为else是和第一个if匹配的,当if语句不成立的时候,自然就想到是执行else子句,打印haha,但实际上else是和第二个if 进行匹配的,这样后面的if---else---语句是嵌套在第一个if语句中的,如果第一个if语句就不成立,嵌套if和else就没机会执行了,最终什么都不输出。

如果代码改成下面这样就更容易理解了

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
             printf("hehe\n");
        else
             printf("haha\n");
    }
   return 0;
}

或者如果我们希望else确实和第一个if匹配,可以这样修改代码:

#include <stdio.h>
int main()
{
     int a = 0;
     int b = 2;
     if(a == 1)
    {
        if(b == 2)
            printf("hehe\n");
    }
 else
 {
         printf("haha\n");
 }
 return 0;
}

带上大括号代码逻辑就会更加清晰,注意大括号的使用,让代码可读性高。 

2. switch语句 

除了if语句外,C语言提供了switch语句来实现分支结构。

个人认为switch语句是一种特殊形式的if---else---结构,用于判断条件有多个结果的情况。他把多重的if---else---改成更易用,可读性更好的形式。

switch (expression)
 {
 case value1: statement
 case value2: statement
 default: statement
}

注: 

switch后的expression必须是整型表达式

case后面的值,必须是整型常量表达式

2.1 if语句和switch语句的对比

练习:输入一个任意整数值,计算除3之后的余数

如果使用if语句完成,如下:

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    if(n%3 == 0)
         printf("整除,余数为0\n");
    else if(n%3 == 1)
         printf("余数是1\n");
    else
         printf("余数是2\n");
    return 0;
}

如果使用switch语句改写,就可以是这样:

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    switch(n%3)
  {
    case 0:
       printf("整除,余数为0\n"); 
       break;
    case 1:
       printf("余数是1\n"); 
       break;
    case 2:
       printf("余数是2\n"); 
       break;
   }
   return 0;
}

上述代码中有注意的点有:

1.case和后面的数字之间必须有空格

2.每一个case语句中的代码执行完成后,必须加上break,才可以跳出switch语句。

 5.2 switch语句中的break

前面的代码如果去掉case语句中的break。

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    switch(n%3)
  {
    case 0:
      printf("整除,余数为0\n"); 
    case 1:
      printf("余数是1\n"); 
    case 2:
      printf("余数是2\n"); 
  }
    return 0;
}

结果:

7除以3本来余数是1,但是我们发现程序运行的结果多了一行“余数是2”。

原因是switch语句也是有分支效果的,只有在switch语句中使用break才能在跳出 switch语句,如果某一个case语句后边没有break语句,代码会继续往下执行其它的case语句中的代码,直到遇到break语句或者switch语句结束。

所以switch语句中break语句非常重要的,能实现真正的分支效果。

当然,break也不是每个case语句得有,这就是根据实际情况来看了。

1#include<stdio.h> 
2int main()
3{
   int day = 0;
   scanf("%d", &day);
   switch(day)
   
      {case 1:
        printf("星期1\n");
        break
      case 2:
        printf("星期2\n");
        break
      case 3:
        printf("星期3\n");
        break
      case 4:
        printf("星期4\n");
        break
      case 5:
        printf("星期5\n");
        break
      case 6:
        printf("星期6\n");
        break
      case 7:
        printf("星期天\n");
        break;
}
  return 0;
}

需求改变时,变为:

1.输入1-5,输出“工作日”;

2.输入6-7,输出“休息日”;

#include<stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch(day)
    {
     case 1:
     case 2:
     case 3:
     case 4:
     case 5:
       printf("工作日\n")
       break
     case 6:
     case 7:
       printf("休息日\n")
       break;
}
   return 0;
}

2.3 switch语句中的default

就拿上面的 星期的例子来说,如果我要输入的值不是1--7的值,如果我们要提示:输入错误,则可以完成这样的代码:

#include<stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch(day)
    {
     case 1:
     case 2:
     case 3:
     case 4:
     case 5:
       printf("工作日\n")
       break
     case 6:
     case 7:
       printf("休息日\n")
       break;
     default:
          printf("输入错误\n")
          break;
}
   return 0;
}

 2.4 switch语句中的case和default的顺序问题

在switch语句中case子句和default子句没有要求顺序,default不止可以放在最后,只要是你的顺序满足实际需求就可以了。

通常我们把default子句放在最后处理的。

3. while循环

C语言有三种循环语句,while就是其中一种。

3.1 if 和 while的对比

if(表达式)
    语句;

while(表达式)
    语句//如果想在循环体中包含更多的语句,可以加上大括号

具体看一个代码:

#include <stdio.h>
 int main()
{
   if(1)
     printf("hehe\n");//如果条件满足。打印一次hehe
   return 0;
}
#include <stdio.h>
int main()
{
   while(1)
      printf("hehe\n");//while满足后边条件,死循环打印hehe
   return 0;
}

3.2 while语句执行流程 

 3.3 while循环的实践

例子:输出1--10的值

#include <stdio.h>
   int main()
{  
   int i = 1;
   while(i <= 10);
   {
     printf("%d",i);
     i = i + 1;
   }
   return 0;
}

4 for循环 

4.1 语法型式

个人觉得for循环时使用最多的,for循环的语法形式如下:

for(表达式1;表达式2;表达式3)
   

        语句//如果循环体包含更多语句,可以加上大括号

表达式1 用于循环变量初始化

表达式2 用于循环结束条件的判断 

表达式3 用于循环变量的调整

4.2 for循环代码实践

输出1--10的值:

#include <stdio.h> 
int main ()
{
  int i = 0;
  for(i=1;i<=10;i++)
  {
     printf("%d",i);
  }
  return 0;
}

4.3 while循环和for的对比 

用while循环

#include <stdio.h>
int main()
{  
   int i = 1;//初始化
   while(i <= 10)//判断
  {
     printf("%d",i);
     i = i + 1;//调整
   }
   return 0;
}
#include<stdio.h>
int main()
{  
   int i = 0;
     //初始化//判断//调整
   for(i = 1;i <= 10;i++)
    {
        printf(“%d”,i);
    }
   return 0;
}

for和while都会用到实现循环的过程有初始化,判断,调整这三部分,但是for循环的三个部分非常集中,对于我个人来说从形式上for更优。 

     

  • 30
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

脆脆鲨<码>

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

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

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

打赏作者

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

抵扣说明:

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

余额充值