分支与循环(2)

本文详细介绍了C语言中的switch、while、for、dowhile循环,包括break和continue语句的用法,以及循环嵌套和goto语句的特性和注意事项。通过实例演示展示了如何运用这些控制结构解决问题。
摘要由CSDN通过智能技术生成

switch语句

1.1 初步认识switch
在c语言中,除了if语句,还可以使用switch语句来实现分支结构。
switch语句用于判断条件有多个结果的情况,它把多重的else if改成更易用、可读性更好的形式。
switch的形式如下;

1 switch (expression){
2  case value1 : statement
3  case value2 : statement
4  default : statement
5 }

上述代码形式中,根据表达式expression不同的值,执行相应的case分支,如果没有相对应的case,则执行default分支。
注意:
1 switch后面的erpression必须时整型表达式
2 case 后的值,必须是整型常量表达式。

下面给出一个例题:
输入任意一个整数值,计算除3之后的余数。

#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语句。

1.2 break 在switch中的应用
假如将上述代码中的break删去,则结果会出乎我们的意料。
在这里插入图片描述
会出现如上结果,因为7%3 == 1,进入case1,执行下面的语句,因为没有break,故还会进入case2并执行下面的语句。
所以在switch语句中break语句是非常重要的,能实现真正的分支效果。
当然,break 也不是每个case语句都得有,这就得根据实际情况来看了。
1.3 switch语句中的default
在使用switch语句的时候,我们经常可以遇到一种情况,比如switch后的表达式中的值无法匹配代码中case语句的时候,这时候可以选择不做处理,也可以在switch语句中假如default子句。

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

switch后面的expression的结果不是value1,也不是value2的时候,就会执行default语句。
例如打印星期几的练习,如果day输入的不是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;
   } 

1.4switch语句中的case和default的顺序问题
在switch语句中通常case和default是没有顺序要求的,只要你的顺序是满足实际需求就可以。
不过我们通常是把default子句放在最后处理。

while循环

c语言中提供了3种循环,while就是其中的一种,下面我们来介绍while语句。
2.1 while语句的执行流程

在这里插入图片描述
首先上来就是执行判断表达式,表达式的值为0时,循环直接结束;表达式的值不为0时,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
2.2 while循环的实践
练习:在屏幕上打印1~10的值

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

输出结果自然是:1 2 3 4 5 6 7 8 9 10;
2.3练习
输入一个正的整数,逆序列打印这个整数的每一位
例如:
输入:1234,输出:4 3 2 1
输入:521,输出:1 2 5
题目解析
1.要想得到n的最低位,可以使用n%10的运算,得到的余数就是最低的,如:123%10 == 3;
2.要想去掉n的最低位,找出倒数第二位,则使用n = n / 10操作就可以去掉最低位,如:n = 123 / 10 得到12,12%10,就得到了倒数第二位 2;
3.利用while循环前面两个步骤,直到n为0,停止。

参考代码:

#include <stdio.h>
int main()
{
 int a = 0;
 scanf("%d",&a);
 while(a)
 { 
   printf("%d",n%10);
   n / = 10;
 }
  return 0;
  }
 
 

for循环

3.1 for循环的语法形式
请添加图片描述
首先执行表达式1 初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
注意:整个循环的过程中,表达式1初始化部分只被执行一次,剩下的就是表达式2、循环语句、表达式3在循环。
3.2 for循环的实践
练习:在屏幕上打印1~10的值
参考代码:

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

运行结果自然是:1 2 3 4 5 6 7 8 9 10
3.3 练习
计算1-100之间3的倍数的数字之和

参考代码:

#include <stdio.h>
int main()
{
 int i = 0;
 int sum = 0;
 for(i = 1;i<=100;i++)
 {
   if(i%3 == 0)
   sum += i;
 }
  printf("%d\n",sum);
  return 0;
  }
  

上述代码是我们一般的基本思路。
当然我们也可以对他进行优化,我们可以从i= 3开始每次i+=3,直接求i的和,这样是不是更简单了呢。

#include <stdio.h>
int main()
{
 int i = 0;
  int sum = 0;
  for(i = 3;i<=100;i+=3)
  {
   sum+= i;
  }
   printf("%d\n",sum);
   return 0;
   }

do while 循环

4.1 语法形式
在循环语句中do while语句的使用应该是最少的,它的语法如下:

do
 语句
 while(表达式)

while 和 for循环都是先判断是否符合条件,如果条件符合就进入循环,执行循环语句,如果不满足就跳出循环;而do while循环则是先直接进入循环,执行循环语句,然后再执行while后的判断表达式,表达式为真,就睡进入下一次,表达式为假,则不再进入循环。

4.2 do while 循环的执行流程
在这里插入图片描述

do while循环先进入循环体,执行相关语句,再去判断表达式真假,所以不同于前面两个循环的是,dowhile循环最少执行一次,这是do while循环特殊之处。

4.3 do while循环的实例
在屏幕上打印1-10的值
参考代码:

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

正是由于do while 使用在循环体至少被执行一次,所以用的比较少。
4.4 练习
输入一个正整数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入12 输出:2

参考代码:

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d",&n);
 int count = 0;
 do
 {
  count ++;
  n/=10;
  }while(n);
  printf("%d\n",count);
  return 0;
  }
  

上面这一练习题,并非一点更要用do while循环,但是用do while循环会简化步骤,因为输入0,也会count++一次,输出1。

break 和continue语句

在循环语句中,遇到复杂问题常常会用到这两个语句。
break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环,看往后执行。

continue的作用是跳过本次循环continue后边的代码,在for循环和while循环中有所差异。
5.1break的举例

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

执行的结果是1 2 3 4;
在这里当i == 5的时候执行break,跳出while循环,所以只打印1 2 3 4.由于其他循环中break的作用与之差不多,在这儿不再举例。
5.2 while循环中的continue

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

当i == 5的时候,就执行continue 直接跳过continue后面的代码,去循环判断的地方,因为这里跳过了i = i+1,所以程序陷入了死循环,只打印出1 2 3 4.
5.3for循环中的continue

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

上述代码的结果是1 2 3 4 6 7 8 9 10
在for循环中 循环变量的变化语句没有放在for循环里面,所以,当i= 5,执行continue的时候,跳过了打印5,但i仍会++。这也是与continue在while中不同的地方。

循环嵌套

6 循环嵌套
练习:找出100-200之间的素数,并打印在屏幕上。
注:素数又称质数,是只能被1或本身整除的数字。

题目解析:
1.要产生100-200的数字,应该用循环产生。
2.假设判断i是否为素数,需要拿出2~i-1之间大的数字去试除i,可以用循环解决。
3.如果2~i-1有数字可以整除i,则i不是素数,反之是素数。

参考代码:

#include <stdio.h>
int main()
{
 int i = 0;
 for(i = 100;i<=200;i++)
 {
  int x = 1; //假设i是素数
  for(int j = 2;j<=i-1;j++)
   {
    if(i%j == 0)
    {
     x = 0;//i不是素数。
    }
     if(x == 1)
     {
      printf("%d ",i);
     }
  }
  return 0;
}

goto语句

7 goto语句
c语言提供了非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处,
例如:

#include <stdio.h>
int main()
{
 printf("hehe\n");
 goto next;
 printf("haha\n");
 next:
 printf("跳过了haha的打印\n");
 return 0;
 }

值得注意的是 goto语句使用不当,就会导致在函数内部乱旋转,打乱程序的流程。所以我们在非必须的时候尽量不使用。
当然goto语句也不是一无用处,在多层循环中,如果想快速跳出循环,使用goto语句是个不错的选择。

for()
{
   for()
   {
      for()
      {
        if()
          goto error;
      }
   }
}
error:
    
           

感谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值