C之九剑其三——剑招一、分剑式与环剑式

哈喽,各位小伙伴大家好!我是Elon,一周的时间很快就过去了。愿大家在周六周天过得顺心快乐,那同样的啊,虽然经过了一周的社畜生活。但我们的C之九剑也迎来的第三章,剑招一。这一章可以说非常重要啊。

 

首先,我们来解决上一章遗留的问题:

printf("%-08.5f",5.998875);

我相信很多小伙伴已经自己去实践过了,也得到了结果,但为了照顾一下新来的小伙伴,我们还是将代码运行一下:

可以看到,结果是5.99887,那有没有小伙思考过为什么是这个结果么?

按照咱们之前所学的知识,%f 打印浮点数,那5.998875不就是浮点数么?为啥还被省略了?

这是因为我们在%符号后面加了一串东西:- 0 8 .5。不知道大家还记不记得printf函数的中文名字叫什么?

格式化输出函数:既然是格式化输出,那就意味着可以设定格式。

我们之前一直是用%d %c %f %lf 来给大家演示所谓的格式化的,但这只是代表咱们输出的数据以什么类型输出,对于其它格式并没有进行规定。

那我们就借助这个代码来为大家讲解一下:

%  -  0  8  .5  f 这串数字代表什么,以%符号为始,从左向右解读分别是:- 右对齐;0标志,前面不满的数用0填充;8最小字段宽,就是至少要显示的字符位数;.5精度,小数点后保留几位;f 转换说明,以浮点数类型打印。

那解决完上一章的遗留问题,我们就正式来到了我们的第三章——分剑式与环剑式。其实就是选择语句与循环语句,哈哈哈!

那为了方便大家更好的理解,我们之后的文章将采用:是什么?为什么?怎么做?的三层形式来进行讲解,大家有其他想法的可以留言评论区。

话不多说,咱们直接开始!

首先解决第一个问题:什么是语句?

一般来说,在咱们C语言中,语句可分为五类:1.表达式语句;2.函数调用语句;3.控制语句;4.符合语句;5.空语句。

大家可以简单理解为,以分号为结尾的一行或多行代码就为一个语句。

而今天,我们要学习的就是五大语句当中的第三种——控制语句。

我们大家也知道,在我们的日常生活中,事物的发展往往不是一成不变的。比如说,我今天早上起来看一眼时间8:00,那距离我上班还有一个小时的时间。我可以选择睡个懒觉或者起来洗澡吃个早饭。这是一种情况,那还有第二种情况就是早上起来一看,呀!已经8:40了。那没办法,我只能选择立刻出发去上班,否则我就会丢掉工作。而上班,我们一般是周一到周五上班,周六周天休息。这个事件往往是循环不变的。

这里我们要知道,编程语言的发明是为了解决我们生活中的问题。所以就有了常量与变量,还有了不同类型的变量。

那C语言为了描述我们上面所提到的情况,就使用了分支(选择)语句,以及循环语句来进行表示。

这里我们需要知道,在C语言中,控制语句分为三类,分别是:

1.分支语句

if 

switch

2.循环语句

while

for

do while

3.goto语句

我们一个一个的来进行讲解,分支语句是什么?

分支语句又叫做条件判断语句,选择语句。从字面意思上不难理解,这种语句的作用就是通过对某个表达式进行判断以后选择执行或不执行命令的语句。

为什么?因为生活中,常常面临选择的情况,例如一台PS5游戏机的价格为一千块以下,那我就选择购买,否则放弃购买。

那怎么做呢?

我们来看一下具体的分支语句:if 语句。

if 语句的语法结构是这样的:

if(表达式)

       语句;

其中这个表达式就是需要进行判断的内容,而语句就是选择是否需要执行的结果。

一般来说,表达式结果为真,则语句执行;表达式结果为假,则语句不执行。而在我们C语言中,规定是:0为假,非0为真。

代码演示:

#include <stdio.h>

int main(void)
{
  int n = 0;
  scanf("%d",&n);
  if(n > 0)
  printf("haha\n");
  return 0;
}

在这段代码中,如果我们输入的值大于0,则屏幕上会打印haha,否则就什么也不打印。

第二个知识点,else语句;

else语句是 if 语句的一个补充。因为有时候,我们的选择不是只有1和2的,例如我们去食堂吃饭的时候,可以选择面条,也可以选米饭,还可以选择烤串。

那我们用else语句来进行描述:

#include <stdio.h>

int main(void)
{
  int food = 0;
  scanf("%d",&food);
  if(food > 0)
     printf("面条\n");
  else if(food < 10)
     printf("米饭\n");
  else
     printf("烤串\n");
  return 0;
}

我们可以看到,在使用了else以后,我们不仅选择多样了起来,而且就算判断结果为假也有对应的语句可以执行,这样我们就能更清晰的理解 if else 的组合以及 if 语句的一个运行过程了。 

注意:每一个 if 或else后面只能跟一条语句,这是语法规则。如果需要写多条语句的时候我们可以使用 {} 将目标框起来,因为在C语言中 {} 所包含的内容就判定为一条语句,又叫做——代码块!

如果有细心的小伙伴在操作的过程中就会发现一个问题,if  语句里面,如果我们需要进行重复的操作,它就需要写很多的else if 这是很费劲的,例如我们写一到十二个月,每个月代表一个节日。那么我们就得写至少12条 if 或else if 。

考虑到以上情况,C语言中就为我们提供了第二种选择语句:switch!

switch语句的语法形式是这样的:

switch(整型表达式)

{

          语句项:

我们可以看到,switch选择语句与 if 语句不同的地方有两点,第一式判断表达式,switch要求的是整型表达式,这里就体现了switch语句的一个独特风格,当然这是受到下面大括号里的语句项所影响的。

而语句项是什么呢?其实就是一些case语句的集合。

case 整型常量表达式:

         语句;

在case语句里面,我们可以看到,它的要求是整型常量表达式,不仅是整型,还必须是常量。而每一个case语句都会带有一个“语句”也就是我们上面提到的是否执行的结果。

但其实switch语句是不能自己执行分支的效果的,我们知道在 if 语句里面,往往只会执行一个结果。而在switch语句里面,它的整型表达式判断的结果是switch语句的入口,最后一个case语句为switch语句的出口。这样说起来大家可能会比较懵,咱们看代码:

#include <stdio.h>

int main(void)
{
  int n = 0;
  scanf("%d",&n);
  switch(n)
  {
  case 1:
        puts("1");
  case 2:
        puts("2");
  case 3:
        puts("3");
  case 4:
        puts("4");
  }
  return 0;
}

在上面代码中,如果我们输入的是1,则代码会从case 1 进入,一直打印到case 4。如果输入的是3,则从case 3开始,case 4打印以后结束。

那要想实现,只打印我们所选择的那一行的case语句怎么做呢?

这就需要用到 break 语句,跳出。break语句的作用就是跳出大括号,所以对于上面的代码,我们只需要做这样的修改,就能达到选择的效果:

#include <stdio.h>

int main(void)
{
int n = 0;
scanf("%d",&n);
switch(n)
{
case 1:
      puts("1");
      break;
case 2:
      puts("2");
      break;
case 3:
      puts("3");
      break;
case 4:
      puts("4");
      break;
}
return 0;
}

这样,我们的switch语句就可以进行单项选择了。如果需要增加新的case语句,也记得在最后加一个break,这样是一个好的写代码习惯,方面后面的人修改。

当然,可能有小伙伴会问,你这个switch语句写再多的case,终究是有限的,不像 if 语句的判断可以涵盖所有的情况。如果我输入8,你上面的代码不就不能执行了么?

确实是这样的?但我们还有一个子句来解决这个问题:default 子句。

这个default的意思就是涵盖除了case提到的所有情况,只有所有的case都与整型表达式不匹配的时候,default才会执行:

default:

     语句;

     break;

记得最后要加break哦!

文章到这里,我们就已经讲完了分支语句,接下来进入到咱们的循环语句板块。

循环语句有三种:

while;for;do while;

我们知道,在生活中,我们有时候会做很多重复的工作,比如学习。那每一周,我们要学习五天,那用while循环来表示就是:

#include <stdio.h>

int main(void)
{
  int day = 1;
  while(day <= 5)
  {
     printf("学习\n");
     day = day + 1;
  }
  return 0;
}

可以看到,当day小于等于5的时候,我们就得学习。一旦超过5,那么我们就会从while循环中跳出,回到main函数里面来。

那还有一种情况,就是我们在第三天放假怎么办?还记得我们上面提到的 if 选择语句和 break 跳出语句么?

来看代码实现:

#include <stdio.h>

int main(void)
{
  int day = 1;
  while(day <= 5)
  {
     printf("学习\n");
     day = day + 1;
     if(day == 3)
     break;
  }
  return 0;
}

这样,我们结合了 if 语句,就可以做到第三天放假,后面都就不用再执行while循环了。所以,这里我们知道break在while循环中起到的是永久终止循环的操作。

那要是,我们只想周三请假,后面周四周五还要学习怎么办呢?这时候就需要用到continue语句。看代码实现:

#include <stdio.h>

int main(void)
{
  int day = 1;
  while(day <= 5)
  {
     if(day == 3)
     {
     continue;
     }
     printf("学习\n");
     day = day + 1;
  }
  return 0;
}

这里我们用代码块 {} 将continue框起来,是为了让代码的阅读性提高,这样我们就知道 if 语句作用的是那一段代码了。那上面这个代码,就会在day等于3的时候,跳过打印“学习”起到请假的作用,这就是continue的效果,跳过以它为起点的后面所有的代码。回到下一次循环入口判断表达式的位置。

但其实,我们上面这段代码是错的,它虽然能起到在周三请假的作用,但它跳过了day增加的过程,最后day永远等于3,代码进入死循环。

想解决这个问题,有两个方法。

要么将day初始化为0,day = day +1;放到continue的前面。

或者,使用 for 循环语句。

来看 for 循环的语法表现形式:

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

      循环语句; 

for循环当中,表达式1为初始化部分,用于初始化循环变量的值。

                      表达式2为条件判断部分,用于判断什么时候循环终止。

                      表达式3为调整部分,用于循环条件的调整。

这三者,也是所有循环语句中不可缺少的部分。只是位置的不同罢了。

我们用for循环来实现上面的代码:

#include <stdio.h>

int main(void)
{
  for(int day = 1; day <= 5; day++)
  {
   if(day == 3)
   {
    continue;
   }
   printf("上学\n");
  }
  return 0;
}

这样,就实现了我们之前想要达到的效果,同时,代码看起来也更简洁一些。

day++ == day = day+1

当然break在for循环中也是适用的,这里我们就不做演示了。

我们来到循环语句的最后一个 do while循环。

其实,这个语句和while循环很像,无外乎就是语句必须执行一次罢了。

语法形式:

do

{

循环语句;

}while(判断表达式);

我们写个代码实现,结束:

#include <stdio.h>

int main(void)
{
  int n = 10;
  do 
  {
   if(n == 5)
      break;
   else
      printf("haha\n");
   n++;
   }while(n < 10);
return 0;
}

可以看到,我们的n进去前就不符点循环条件,但它还是执行了一次。

最后最后的最后,我们再讲最后一个语句:

流氓语句 goto!

这个语句大家做个了解就行,不要深究,一般用不到。

go to 语句可以理解为,去哪儿。

我们只需要在 go to 后面加一个随意的名称,它就会跳到该位置,无论当时代码执行到哪里。

#include <stdio.h>

int main(void)
{
  int day = 1;
  while(day <= 5)
  {
     if(day == 3)
     {
     go to ADD;
     continue;
     }
     printf("学习\n");
     day = day + 1;
  }
ADD;
return 0;
}

这样,当代码day=3时,执行go to就会跳出while循环,直接来到最下面的ADD处。好了,今天的文章就到此结束了,我们下一章再见。

下一章:剑招二:合剑式!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值