【分支与循环】||超长详解+代码分析+一个整蛊小游戏

Stay hungry. Stay foolish. ——Steve Jobs

求知若饥,虚心若愚。

 

                   


                                           

c语言是结构化的程序设计语言,它有三种基本结构,分别是:顺序结构,选择结构,循环结构。

  • C语言顺序结构就是让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。

  • C语言选择结构也称分支结构,就是让程序“拐弯”,有选择性的执行代码;换句话说,可以跳过没用的代码,只执行有用的代码。

  • C语言循环结构就是让程序“杀个回马枪”,不断地重复执行同一段代码。

 

顺序结构不再赘述,今天我们来重点学习一下一下分支语句(选择结构)和循环语句。

首先,我们先搞清楚两个概念。

什么是语句

C语言中,由一个分号隔开的就是一条语句。eg:

printf("你真漂亮");

a++;

;    -------空语句

什么是语句块

C语言中,由一个{}括起来的一个或多个语句,就称为语句块。如果语句块中只有一个语句,也可以省略{ }。

int main()

{

      return 0;

}


目录

分支语句

if语句

if-else语句

悬空else

switch语句

循环

while循环

while语句中的break和continue

for循环

continue问题:

do-while循环

continue问题:

代码练习:

一个整蛊小游戏

goto语句


分支语句

 

  • if语句

 

我们需要在满足某种条件时进行一些操作,而不满足条件时就不进行任何操作,这个时候我们可以只使用 if 语句。

 

例如判断一个数是否为偶数。

int n=0;

scanf("%d",&n);

if ( n % 2 == 0)

{

    printf( " 是偶数 ");

}

return  0;

  • if-else语句

if 和 else 是两个新的关键字,if 意为“如果”,else 意为“否则”,用来对条件进行判断,并根据判断结果执行不同的语句。不同情况执行不同代码,从而实现多分支

 

if(判断条件)

    语句1;

    else if(判断条件)

    语句2;

else

    语句2;

应用:

转换学生成绩。

悬空else

if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对,例如:

int main()

{

        int a = 0;

        int b = 2;

        if (a == 1)

               if (b == 2)

                       printf("hehe");

        else

               printf("haha");

        return 0;

}

你觉得是输出什么?

 

解析:else 总是与它前面最近的 if 配对,a=0,第一个if语句根本就没进入,所以无输出。

 

这里就要注意一下我们的书写形式,我们需要养成良好的代码风格。修改一下。

 

if书写形式的对比

代码一:

if(condition)

{

    return x;

}

return y;

 

代码二:

if(condition)

{

    return x;

}

else

{

    return y;

}

这两个代码表达的意义一样吗?如果是你你选择哪一种代码?

代码三:

 

int num=1;

if(num==5)

{

    printf("haha");

}

代码四:

int num=1;

if(5==num)

{

    printf("haha");

}

如果是你你选择哪一种代码?

 

代码2、4更为直观逻辑性好不易出错可读性高

练习:

1:判断一个数是否为奇数

2.打印1-100之间的奇数

 

  1.  

 

 

  • switch语句

 

  C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。对于这种情况,一般使用 switch 语句代替。

switch(表达式)

{

case 整形常量表达式1:语句1;

case 整形常量表达式2:语句2;

case 整形常量表达式3:语句3;

case 整形常量表达式4:语句4;

case 整形常量表达式n:语句n;

default: 语句n+1;

 

运行过程:

1.首先执行switch后的表达式,设得出它的值为a

2.如果a==整形常量表达式1,则执行其后所有的语句; 也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功

3.  如果“整形常量表达式1”和a 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整形常量表达式1”相等,那么就会从“语句5”一直执行到“语句n+1”。

4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。

需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。

break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。

练习:

int main()

{

        int n = 1;

        int m = 2;

        switch (n)

        {

        case 1:

               m++;

        case 2:

               n++;

        case 3:

               switch (n)

               {

               case 1:

                       n++;

               case 2:

                       m++;

                       n++;

                       break;

               }

        case 4:

               m++;

               break;

        default:

               break;

        }

        printf("m=%d n=%d\n", m, n);

}

 

 

 

 


循环

所谓循环(Loop),就是重复地执行同一段代码。

  • while循环

while(表达式)

{

   语句块;

}

运行过程:先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。

while 循环的整体思路:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。

 

while语句中的break和continue

break:永久终止循环。

continue:终止本次循环。

 

int main()

{

        int i = 1;

        while (i <= 10)

        {

               if (i == 5)

                       continue;

               printf("%d", i);

               i++;

        }

        return 0;

}

代码输出结果是什么?

 

 

练习:

1.看两个代码

注:1.EOF------文件结束的标志

2.getchar 读取失败的时候就会返回EOF

3.返回的字符,本质上是ASCII码值,是整数,可以存放到ch中

4.getchar 函数不仅仅是返回正常字符,还会返回EOF,其值为-1

2.分析下边的代码

 

 

scanf/getchar 都是在输入缓冲区中获取输入值,scanf获取输入值时,取走了\0前的值,赋给了数组,所以下一个getchar来的时候,从输入缓冲区中取走剩下的\0,因而不再等待输入。

修改代码:

 

 

这样操作依旧有缺陷:

 

 

 

修改:

  • for循环

for 循环的一般形式为:

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

{

    语句块

}

 

它的运行过程为:

1) 先执行“表达式1”。

2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。

3) 执行完循环体后再执行“表达式3”。

4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。

上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。

continue问题:

continue跳过后边的代码,去了调整部分,使得循环变量得以调整,不容易造成死循环。

 

  • do-while循环

do-while循环的一般形式为:

do

{

    语句块

}while(表达式);

do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。

 

continue问题:

 

 


 

 

代码练习:

1.计算n的阶乘:

 

2.计算1!+2!+3!+.....+n!

3.在一个有序数组中查找数字n

二分查找

 

3.编写代码,演示多个字符从两端移动向中间汇聚

4.编写代码实现,模拟用户登录场景,并且只能登陆三次。

5.猜数字游戏

简介:

rand()函数

功能:返回一个伪随机数。之所以说是伪随机数,是因为在没有其它操作下,每次执行同一个程序,调用rand得到的随机数序列是固定的(不是真正的“随机”)。

为了使rand的结果更“真”一些,也就是令其返回值更具有随机性(不确定性),C语言在stdlib.h中还提供了srand函数,通过该函数可以设置一个随机数种子,一般用当前时间的毫秒数来做参数。通过time(NULL)可以获取到当前时间的毫秒值(该函数位于time.h)中。如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。

使用rand的流程可以总结为:

1 调用srand(time(NULL))设置随机数种子。

2 调用rand函数获取一个或一系列随机数。

需要注意的是,srand只需要在所有rand调用前,被调用一次即可,没必要调用多次。

void menu()

{

        printf("**********************************\n");

        printf("****1.paly************************\n");

        printf("****0.exit************************\n");

        printf("**********************************\n");

        printf("**********************************\n");

}

void play()

{

        int input = 0;

        int random_num = rand() % 100 + 1;

          while (1)

        {

               printf("请输入数字:");

               scanf("%d", &input);

               if (input > random_num)

               {

                       printf("猜大了\n");

               }

               else if (input < random_num)

               {

                       printf("猜小了\n");

               }

               else

               {

                       printf("恭喜你,猜对了");

                       break;

               }

        }     

}

int main()

{

        int input = 0;

        int random_num = rand() %100 + 1;

        do

        {

               menu();

               printf("请选择(0/1):");

               scanf("%d", &input);

               switch (input)

               {

               case 0:

                       break;

               case 1:

                       play();

                       break;

               default:

                       printf("输入错误");

               }

        } while (input);

        return 0;

}

 

 

 

 


一个整蛊小游戏

(把文件发给你的盆友,感受一下生活的快乐~)

goto语句

goto语句最常见的用法是跳出两层或多层循环。 不过由于 goto 语句很容易造成代码混乱,维护和阅读困难,饱受诟病,不被推荐,而且 goto 循环完全可以被其他循环取代。

现在让我们用goto玩一个小游戏

 

uploading.4e448015.gif转存失败重新上传取消

 

不用goto也可以用while

uploading.4e448015.gif转存失败重新上传取消


完结。

天天开心~


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值