分支语句(if switch)和循环语句(while for dowhile)以及goto语句

一、语句

1.语句分类

C语句可分为以下五类:
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句
今天侧重讲控制语句

2.控制语句

控制语句用于控制程序的执行流程,实现程序的各种结构方式( 顺序结构、选择结构、循环结构
1.条件判断语句也叫分支语句: if 语句、 switch 语句;
2. 循环执行语句: do while 语句、 while 语句、 for 语句;
3. 转向语句: break 语句、 goto 语句、 continue 语句、 return 语句。

二、 分支语句(选择结构)

当函数到达分支函数得时候,要根据当前条件以及分支语句()内得条件进行判断,符合条件就进入相应的部分继续运行该部分后面程序,而不符合部分得程序则跳过,就像数学得单选题,都不符合就都不运行,该题无解。

简言之如果表达式的结果为真,则语句执行。(表达式返回值为0表示假,非0表示真。

2.1 if语句

语法结构:

if ( 表达式 )
    语句 ;
二选一(AorB)
if ( 表达式 )
    语句 1 ;
else
    语句 2 ;
多分支    
if ( 表达式 1 )
    语句 1 ;
else if ( 表达式 2 )
    语句 2 ;
else
    语句 3 ;

2.1.1 悬空else

else的匹配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 ;
}

注:代码运行顺序自上而下,当其中 int a = 0不符合 if(a == 1)直接跳到 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" );//else 的匹配 else 是和它离的最近的 if 匹配的。
  }      
    return 0 ;
}

2.2 switch语句(分支语句,适用于多分支)

比如:
输入 1 ,输出星期一
输入 2 ,输出星期二
输入 3 ,输出星期三
输入 4 ,输出星期四
输入 5 ,输出星期五
输入 6 ,输出星期六
输入 7 ,输出星期日
如果用if elseif 语句
则if
   else if
   else if
   else if
   else if
   else if
   else if
此时过于麻烦和啰嗦此时 switch 语句就是很好的替代。

2.2.1 switch语句表达式

switch ( 整型表达式 )
{
    语句项;
}
case 整形常量表达式 :
    语句 ;

2.2.2 switch语句中的 break

如2.21的表达式是无法实现分支得,搭配break使用才能实现真正的分支。

例(如果不加break,我输入5则会输出星期五 星期六 星期日 因为在满足条件后程序没收到指令会继续向下执行,而break就是跳出语句得命令)

#include <stdio.h>
int main ()
{
    int day = 0 ;
    switch ( day )
  {
        case 1
            printf ( " 星期一 \n" );
            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 ;
}
有时候我们的需求变了:
1. 输入 1-5 ,输出的是 “weekday”;
2. 输入 6-7 ,输出 “weekend”
所以我们的代码就应该这样实现了:
#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 ;
}

2.2.3 default子句

如果表达的值与所有的 case 标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在 C 中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条 default 子句,把下面的标签
default
写在任何一个 case 标签可以出现的位置。
switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个 switch 语句中只能出现一条 default 子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。

三、循环语句

while
for
do while

3.1 while循环

if 语句:
当条件满足的情况下, if 语句后的语句执行,否则不执行。
但是这个语句只会执行一次。
由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。

3.1.1while语法结构

while ( 表达式 )
循环语句 ;
例子: 在屏幕上打印 1-10 的数字。
#include <stdio.h>
int main ()
{
int i = 1 ;
while ( i <= 10 )
{
printf ( "%d " , i );
i = i + 1 ;
}
return 0 ;
}

3.1.2 while语句中的breakcontinue

break while 循环中的作用:
其实在循环中只要遇到 break ,就停止后期的所有的循环,直接终止循环。
所以: while 中的 break 是用于 永久 终止循环的
continue while 循环中的作用就是:
continue 是用于终止本次循环的,也就是本次循环中 continue 后边的代码不会再执行,
而是直接跳转到 while 语句的判断部分。进行下一次循环的入口判断

3.2 for循环

3.2.1 语法

for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
循环语句 ;
表达式 1
表达式 1 初始化部分,用于初始化循环变量的。(
for 循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问 题
表达式 2
表达式 2 条件判断部分 ,用于判断循环时候终止。
表达式 3
表达式 3 调整部分 ,用于循环条件的调整。
实际的问题:
使用 for 循环 在屏幕上打印 1-10 的数字。
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
循环语句 ;
#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 ;
}

3.2.2for循环和while循环对比

int i = 0 ;
// 实现相同的功能,使用 while
i = 1 ; // 初始化部分
while ( i <= 10 ) // 判断部分
{
printf ( "hehe\n" );
i = i + 1 ; // 调整部分
}
// 实现相同的功能,使用 while
for ( i = 1 ; i <= 10 ; i ++ )
{
printf ( "hehe\n" );
}
可以发现在 while 循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较
远,这样
查找修改就不够集中和方便。所以, for 循环的风格更胜一筹; for 循环使用的频率也最高。

3.2.3 breakcontinuefor

循环中
我们发现在 for 循环中也可以出现 break continue ,他们的意义和在 while 循环中是一样的。
但是还是有些差异:

3.3 do...while()循环

3.3.1 do语句的语法:

do

循环语句;

while ( 表达式 );

3.4 折半查找算法

比如我买了一双鞋,你好奇问我多少钱,我说不超过 300 元。你还是好奇,你想知道到底多少,我就让
你猜,你会怎么猜?
答案:你每次猜中间数。
实现在主函数内:
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 ; // 找不到
}

 猜数字游戏实现

参考代码:
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" );
}
//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" );
}
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 ;
}

四、goto语句

适用于一次跳出两层或多层循环

goto与break的区别

多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

for (...)
    for (...)
  {
        for (...)
      {
            if ( disaster )
                goto error ;
      }
  }
   
下面是使用 goto 语句的一个例子

一个关机程序

#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" );
  }
    else
  {
        goto again ;
  }
    return 0 ;
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值