分支语句和循环语句

分支语句
if
switch
循环语句
while
for
do while
goto 语句
正文开始 @ 比特科技
什么是语句?
C 语言中由一个分号 ; 隔开的就是一条语句。 比如:
分支语句(选择结构)
如果你好好学习,校招时拿一个好 offffer ,走上人生巅峰。
如果你不学习,毕业等于失业,回家卖红薯。
这就是选择!
printf ( "hehe" );
1 + 2 ;
if 语句
if 语句的语法结构是怎么样的呢?
语法结构:
if ( 表达式 )
    语句 ;
if ( 表达式 )
演示代码:
    语句 1 ;
else
    语句 2 ;
// 多分支    
if ( 表达式 1 )
    语句 1 ;
else if ( 表达式 2 )
    语句 2 ;
else
    语句 3 ;
#include <stdio.h>
// 代码 1
int main ()
{
int age = 0 ;
    scanf ( "%d" , & age );
    if ( age < 18 )
  {
        printf ( " 未成年 \n" );
  }
}
// 代码 2
#include <stdio.h>
int main ()
{
int age = 0 ;
    scanf ( "%d" , & age );
    if ( age < 18 )
  {
        printf ( " 未成年 \n" );
  }
    else
  {
        printf ( " 成年 \n" );
  }
}
// 代码 3
#include <stdio.h>
int main ()
{
int age = 0 ;
    scanf ( "%d" , & age );
    if ( age < 18 )
  {
        printf ( " 少年 \n" );
  }
    else if ( age >= 18 && age < 30 )
  {
        printf ( " 青年 \n" );
  }
    else if ( age >= 30 && age < 50 )
  {
        printf ( " 中年 \n" );
解释一下:
如果表达式的结果为真,则语句执行。
C 语言中如何表示真假?
0 表示假,非 0 表示真。
如果条件成立,要执行多条语句,怎应该使用代码块。
这里的一对 { } 就是一个代码块。
悬空 else
当你写了这个代码:
  }
    else if ( age >= 50 && age < 80 )
  {
        printf ( " 老年 \n" );
  }
    else
  {
        printf ( " 老不死 \n" );
  }
   
}
#include <stdio.h>
int main ()
{
    if ( 表达式 )
  {
        语句列表 1
  }
    else
  {
        语句列表 2
  }
    return 0 ;
}
#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 ;
}
改正:
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 ;
}
// 代码 1
if ( condition ) {
    return x ;
}
return y ;
// 代码 2
if ( condition )
{
    return x ;
}
else
{
    return y ;
}
// 代码 3
int num = 1 ;
if ( num == 5 )
{
    printf ( "hehe\n" );
}
// 代码 4
int num = 1 ;
if ( 5 == num )
{
    printf ( "hehe\n" );
}
代码 2 和代码 4 更好,逻辑更加清晰,不容易出错。
练习
1. 判断一个数是否为奇数
2. 输出 1-100 之间的奇数
switch 语句
switch 语句也是一种分支语句。 常常用于多分支的情况。
比如:
输入 1 ,输出星期一
输入 2 ,输出星期二
输入 3 ,输出星期三
输入 4 ,输出星期四
输入 5 ,输出星期五
输入 6 ,输出星期六
输入 7 ,输出星期七
那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。 这就是
switch 语句。
语句项 是什么呢?
switch 语句中的 break
switch 语句中,我们没法直接实现分支,搭配 break 使用才能实现真正的分支。
比如:
switch ( 整型表达式 )
{
    语句项;
}
// 是一些 case 语句:
// 如下:
case 整形常量表达式 :
    语句 ;
#include <stdio.h>
int main ()
{
    int day = 0 ;
    switch ( day )
  {
        case 1
            printf ( " 星期一 \n" );
            break ;
有时候我们的需求变了:
1. 输入 1-5 输出的是 “weekday”;
2. 输入 6-7 输出 “weekend”
所以我们的代码就应该这样实现了:
break 语句 的实际效果是把语句列表划分为不同的部分。
编程好习惯
在最后一个 case 语句的后面加上一条 break 语句。 (之所以这么写是可以避免出现在以前的最
后一个 case 语句后面忘了添加 break 语句)。
        case 2 :
            printf ( " 星期二 \n" );
            break ;
        case 3 :
            printf ( " 星期三 \n" );
            break ;    
        case 4 :
            printf ( " 星期四 \n" );
            break ;    
        case 5 :
            printf ( " 星期五 \n" );
            break ;
        case 6 :
            printf ( " 星期六 \n" );
            break ;
        case 7 :
            printf ( " 星期天 \n" );    
            break ;
  }
    return 0 ;
}
#include <stdio.h>
//switch 代码演示
int main ()
{
    int day = 0 ;
    switch ( day )
  {
        case 1
        case 2 :
        case 3 :
        case 4 :
        case 5 :
            printf ( "weekday\n" );
            break ;
        case 6 :
        case 7 :
            printf ( "weekend\n" );
            break ;
  }
    return 0 ;
}
default 子句
如果表达的值与所有的 case 标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在 C 中并不认为适合错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条 default 子句,把下面的标签
default
写在任何一个 case 标签可以出现的位置。
switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个 switch 语句中只能出现一条 default 子句。
但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个 case 标签一样贯穿 default 子句。
编程好习惯
在每个 switch 语句中都放一条 default 子句是个好习惯,甚至可以在后边再加一个 break
练习
#include <stdio.h>
int main ()
{
    int n = 1 ;
    int m = 2 ;
    switch ( n )
  {
    case 1 :
            m ++ ;
    case 2 :
            n ++ ;
    case 3 :
            switch ( n )
          { //switch 允许嵌套使用
            case 1 :
                    n ++ ;
            case 2 :
                    m ++ ;
                    n ++ ;
                    break ;
          }
    case 4 :
            m ++ ;
            break ;
    default :
            break ;
  }
    printf ( "m = %d, n = %d\n" , m , n );
    return 0 ;
}
循环语句
while
for
do while
while 循环
我们已经掌握了, if 语句:
当条件满足的情况下, if 语句后的语句执行,否则不执行。但是这个语句只会执行一次。
但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢? C 语言中给我们引入了: while 语句,可以实现循环。
if ( 条件 )
    语句 ;
while 语句执行的流程:
比如我们实现:
在屏幕上打印 1-10 的数字。
这个代码已经帮我了解了 while 语句的基本语法,那我们再了解一下:
while 语句中的 break continue
break 介绍
//while 语法结构
while ( 表达式 )
循环语句;
#include <stdio.h>
int main ()
{
int i = 1 ;
while ( i <= 10 )
{
printf ( "%d " , i );
i = i + 1 ;
}
return 0 ;
}
//break 代码实例
#include <stdio.h>
int main ()
{
int i = 1 ;
while ( i <= 10 )
{
这里代码输出的结果是什么?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
总结: break while 循环中的作用:
其实在循环中只要遇到 break ,就停止后期的所有的循环,直接终止循环。 所以: while 中的
break 是用于 永久 终止循环的。
continue 介绍
这里代码输出的结果是什么?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
if ( i == 5 )
break ;
printf ( "%d " , i );
i = i + 1 ;
}
return 0 ;
}
//continue 代码实例 1
#include <stdio.h>
int main ()
{
int i = 1 ;
while ( i <= 10 )
{
if ( i == 5 )
continue ;
printf ( "%d " , i );
i = i + 1 ;
}
return 0 ;
}
//continue 代码实例 2
#include <stdio.h>
int main ()
{
int i = 1 ;
while ( i <= 10 )
{
    i = i + 1 ;
if ( i == 5 )
continue ;
这里代码输出的结果是什么?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
2 3 4 6 7 8 9 10
总结 : continue while 循环中的作用就是:
continue 是用于终止本次循环的,也就是本次循环中 continue 后边的代码不会再执行,而是直接
跳转到 while 语句的判断部分。进行下一次循环的入口判断。
再看几个代码:
for 循环
我们已经知道了 while 循环,但是我们为什么还要一个 for 循环呢?
首先来看看 for 循环的语法:
语法
表达式 1 表达式 1 初始化部分 ,用于初始化循环变量的。 表达式 2 表达式 2 条件判断部分 ,用于判断
循环时候终止。 表达式 3 表达式 3 调整部分 ,用于循环条件的调整。
printf ( "%d " , i );
}
return 0 ;
}
// 代码什么意思?
// 代码 1
#include <stdio.h>
int main ()
{
int ch = 0 ;
while (( ch = getchar ()) != EOF )
      putchar ( ch );
    return 0 ;
}
// 代码 2
#include <stdio.h>
int main ()
{
while (( ch = getchar ()) != EOF )
{
    if ( ch < ‘0’ || ch > ‘9’ )
        continue ;
    putchar ( ch );
}
return 0 ;
}
for ( 表达式 1 ;表达式 2 ;表达式 3 )
循环语句;
比特科技 实际的问题:
使用 for 循环 在屏幕上打印 1-10 的数字。
for 循环的执行流程图:
现在我们对比一下 for 循环和 while 循环。
#include <stdio.h>
int main ()
{
int i = 0 ;
//for(i=1/* 初始化 */; i<=10/* 判断部分 */; i++/* 调整部分 */)
for ( i = 1 ; i <= 10 ; i ++ )
{
printf ( "%d " , i );
}
return 0 ;
}
int i = 0 ;
// 实现相同的功能,使用 while
i = 1 ; // 初始化部分
while ( i <= 10 ) // 判断部分
{
可以发现在 while 循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离
较远,这样查找修改就不够集中和方便。所以, for 循环的风格更胜一筹。 for 循环使用的频率也最高。
break continue for 循环中
我们发现在 for 循环中也可以出现 break continue ,他们的意义和在 while 循环中是一样的。 但是还是
有些差异:
for 语句的循环控制变量
一些建议:
1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议 for 语句的循环控制变量的取值采用 前闭后开区间 写法。
printf ( "hehe\n" );
i = i + 1 ; // 调整部分
}
// 实现相同的功能,使用 while
for ( i = 1 ; i <= 10 ; i ++ )
{
printf ( "hehe\n" );
}
// 代码 1
#include <stdio.h>
int main ()
{
int i = 0 ;
for ( i = 1 ; i <= 10 ; i ++ )
{
if ( i == 5 )
break ;
printf ( "%d " , i );
}
return 0 ;
}
// 代码 2
#include <stdio.h>
int main ()
{
int i = 0 ;
for ( i = 1 ; i <= 10 ; i ++ )
{
if ( i == 5 )
continue ;
printf ( "%d " , i );
}
return 0 ;
}
一些 for 循环的变种
一道笔试题:
do...while() 循环
do 语句的语法:
执行流程
int i = 0 ;
// 前闭后开的写法
for ( i = 0 ; i < 10 ; i ++ )
{}
// 两边都是闭区间
for ( i = 0 ; i <= 9 ; i ++ )
{}
#include <stdio.h>
int main ()
{
// 变种 1
for (;;)
{
printf ( "hehe\n" );
}
// 变种 2
int x , y ;
    for ( x = 0 , y = 0 ; x < 2 && y < 5 ; ++ x , y ++ )
  {
        printf ( "hehe\n" );
  }
return 0 ;
}
// 请问循环要循环多少次?
#include <stdio.h>
int main ()
{
int i = 0 ;
int k = 0 ;
for ( i = 0 , k = 0 ; k = 0 ; i ++ , k ++ )
        k ++ ;
return 0 ;
}
do
循环语句;
while ( 表达式 );
do 语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
do while 循环中的 break continue
#include <stdio.h>
int main ()
{
int i = 10 ;
do
{
printf ( "%d\n" , i );
} while ( i < 10 );
return 0 ;
}
#include <stdio.h>
int main ()
{
int i = 10 ;
do
{
        if ( 5 == i )
            break ;
printf ( "%d\n" , i );
} while ( i < 10 );
return 0 ;
}
#include <stdio.h>
int main ()
练习
1. 计算 n 的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 在一个有序数组中查找具体的某个数字 n 。 编写 int binsearch(int x, int v[], int n); 功能:在 v[0]
<=v[1]<=v[2]<= ….<=v[n-1] 的数组中查找 x.
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则
提示登录成,如果三次均输入错误,则退出程序。
练习参考代码:
{
int i = 10 ;
do
{
        if ( 5 == i )
            continue ;
printf ( "%d\n" , i );
} while ( i < 10 );
return 0 ;
}
// 代码 1
// 编写代码,演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
int main ()
{
char arr1 [] = "welcome to bit..." ;
char arr2 [] = "#################" ;
int left = 0 ;
int right = strlen ( arr1 ) - 1 ;
printf ( "%s\n" , arr2 );
//while 循环实现
while ( left <= right )
{
Sleep ( 1000 );
arr2 [ left ] = arr1 [ left ];
arr2 [ right ] = arr1 [ right ];
left ++ ;
right -- ;
printf ( "%s\n" , arr2 );
}
//for 循环实现
for ( left = 0 , right = strlen ( src ) - 1 ;
    left <= right ;
    left ++ , right -- )
  {
    Sleep ( 1000 );
    arr2 [ left ] = arr1 [ left ];
arr2 [ right ] = arr1 [ right ];
        printf ( "%s\n" , target );
  }
retutn 0 ;
}
折半查找算法
比如我买了一双鞋,你好奇问我多少钱,我说不超过 300 元。你还是好奇,你想知道到底多少,我就让
你猜,你会怎么猜?
答案:你每次猜中间数。
代码实现:
// 代码 2
int main ()
{
    char psw [ 10 ] = "" ;
    int i = 0 ;
    int j = 0 ;
    for ( i = 0 ; i < 3 ; ++ i )
  {
        printf ( "please input:" );
        scanf ( "%s" , psw );
        if ( strcmp ( psw , "password" ) == 0 )
            break ;
  }
    if ( i == 3 )
        printf ( "exit\n" );
    else
        printf ( "log in\n" );
}
实现在主函数内:
int main ()
{
int arr [] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
int left = 0 ;
int right = sizeof ( arr ) / sizeof ( arr [ 0 ]) - 1 ;
int key = 7 ;
int mid = 0 ;
while ( left <= right )
{
mid = ( left + right ) / 2 ;
if ( arr [ mid ] > key )
{
right = mid - 1 ;
}
else if ( arr [ mid ] < key )
{
left = mid + 1 ;
}
else
break ;
}
if ( left <= right )
printf ( " 找到了 , 下标是 %d\n" , mid );
else
printf ( " 找不到 \n" );
猜数字游戏实现
参考代码:
}
如果实现一个二分查找函数:
int bin_search ( int arr [], int left , int right , int key )
{
int mid = 0 ;
while ( left <= right )
{
mid = ( left + right ) >> 1 ;
if ( arr [ mid ] > key )
{
right = mid - 1 ;
}
else if ( arr [ mid ] < key )
{
left = mid + 1 ;
}
else
return mid ; // 找到了,返回下标
}
return - 1 ; // 找不到
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu ()
{
printf ( "**********************************\n" );
printf ( "*********** 1.play     **********\n" );
printf ( "*********** 0.exit     **********\n" );
printf ( "**********************************\n" );
}
//TDD- 测试驱动开发。
//RAND_MAX--rand 函数能返回随机数的最大值。
void game ()
{
int random_num = rand () % 100 + 1 ;
int input = 0 ;
while ( 1 )
{
printf ( " 请输入猜的数字 >:" );
scanf ( "%d" , & input );
if ( input > random_num )
{
printf ( " 猜大了 \n" );
}
else if ( input < random_num )
{
printf ( " 猜小了 \n" );
}
goto 语句
C 语言中提供了可以随意滥用的 goto 语句和标记跳转的标号。
从理论上 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码。
但是某些场合下 goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
程,例如一次跳出两层或多层循环。
这种情况使用 break 是达不到目的的。它只能从最内层循环退出到上一层的循环。
下面是使用 goto 语句的一个例子:
一个关机程序
else
{
printf ( " 恭喜你,猜对了 \n" );
break ;
}
}
}
int main ()
{
int input = 0 ;
srand (( unsigned ) time ( NULL ));
do
{
menu ();
printf ( " 请选择 >:" );
scanf ( "%d" , & input );
switch ( input )
{
case 1 :
game ();
break ;
case 0 :
break ;
default :
printf ( " 选择错误 , 请重新输入 !\n" );
break ;
}
} while ( input );
return 0 ;
}
#include <stdio.h>
int main ()
{
    char input [ 10 ] = { 0 };
    system ( "shutdown -s -t 60" );
again :
    printf ( " 电脑将在 1 分钟内关机,如果输入:我是猪,就取消关机 !\n 请输入 :>" );
    scanf ( "%s" , input );
    if ( 0 == strcmp ( input , " 我是猪 " ))
  {
        system ( "shutdown -a" );
  }
而如果不适用 goto 语句,则可以使用循环:
关于 shutdown 命令的扩展 - (请点这里)
goto 语言真正适合的场景如下:
本章完。
    else
  {
        goto again ;
  }
    return 0 ;
}
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    char input [ 10 ] = { 0 };
    system ( "shutdown -s -t 60" );
    while ( 1 )
  {
        printf ( " 电脑将在 1 分钟内关机,如果输入:我是猪,就取消关机 !\n 请输入 :>" );
        scanf ( "%s" , input );
        if ( 0 == strcmp ( input , " 我是猪 " ))
      {
            system ( "shutdown -a" );
            break ;
      }
  }
    return 0 ;
}
for (...)
    for (...)
  {
        for (...)
      {
            if ( disaster )
                goto error ;
      }
  }
   
error :
if ( disaster )
        // 处理错误情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千城OVO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值