C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环

前言
作者龟龟不断向前
简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
专栏:C++初阶知识点

工具分享

  1. 刷题: 牛客网 leetcode
  2. 笔记软件:有道云笔记
  3. 画图软件:Xmind(思维导图) diagrams(流程图)

在这里插入图片描述

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主,如有不足还请指点,博主及时改正

文章目录

      • 分支与循环(二)--循环篇
      • 1.while循环
        • 语法
        • 循环的必要条件
        • while循环中的break和continue
      • 2.for循环
        • 语法
        • for循环中的break和continue
        • for循环相比于while循环的优势和建议
        • for循环的一些变种
          • 变种1
          • 变种2
      • 3.do-while循环
        • 语法
        • do-while的break和continue
      • 4.goto语句
        • 语法
        • goto语句的使用场景
      • 5.循环例题
        • 计算 n的阶乘
        • 计算 1!+2!+3!+……+10!
        • 在一个有序数组中查找具体的某个数字n
        • 编写代码,演示多个字符从两端移动,向中间汇聚。
        • 模拟用户登录情景

分支与循环(二)–循环篇

1.while循环

语法

上篇文章中我们介绍了if语句

if(contition)//条件判断
{
    exp;//语句
}

当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环

而且其语法和if几乎是一致的,不过它会循环地执行“体内”的语句。

while(contition)//条件判断
{
    exp;//语句
}

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第1张图片

例如我们可以使用循环语句在屏幕中打印10个hello world

#include
int main()
{
	int num = 10;
	while (num)
	{
		printf("hello world");
		num--;
	}
	return 0;
}

循环的必要条件

要想构成循环,这三个部分必不可少:1. 循环变量初始化部分(上述代码中的num)

2.循环条件判断部分 3.循环变量的调整部分 这三个部分影响着循环的次数,没有设定好可能会导致死循环

或者循环达到的效果不尽人意,下面咱们描述时将循环{}里面的部分叫做循环体


while循环中的break和continue

break和continue是C语言的关键字,被使用在循环中,其中break还可以使用在switch语句中

其实大家观察上述的流程图即可发现,break和continue语句被使用在循环体中

break:其实在循环体中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。

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

上述的循环i本应该从1至10,到i从1到4时,屏幕输出1 2 3 4,但是当i 等于 5时,遇到了break终止了后期的所有循环

所以上述程序输出1 2 3 4


continue: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

代码演示( 有坑 )

#include
int main()
{
  int i = 1;
  while(i <= 10)
  {
    if(i == 5)
    {
		continue;
    }

    printf("%d ",i);
    i++;
  }
  printf("\n");
  return 0;
}

大家可以思考以下上述代码会输出什么?

友情提示:答案:1 2 3 4 6 7 8 9 10是 错误 的哟!

程序分析:i从1~4,正常输出1 2 3 4,当i等于5时,遇到了continue语句,跳过本次循环,continue下面的语句不被执行,直接跳进循环条件判断部分,但是很bug的是,在此过程中,循环变量的调整部分被破坏(i++循环的三大必要条件),i永远小于等于10,程序陷入死循环!

程序结果:1 2 3 4程序死循环不输出

解决方法:

程序问题:循环变量的控制条件被破坏,所以咱们要恢复这个条件

if(i == 5)中放入i++即可

#include
int main()
{
  int i = 1;
  while(i <= 10)
  {
    if(i == 5)
    {
        ++i;
		continue;
    }

    printf("%d ",i);
    i++;
  }
  printf("\n");
  return 0;
}

2.for循环

语法

有些同学可能会有疑惑,为什么有了while循环已经可以实现循环了,还要出现for循环

这个道理很简单,我们实现一个需求肯定会有不同的方法,方法之间的便利性效率是不一样的

同样的,即使实现循环的方法有很多种,但是肯定也是存在谁好谁坏,谁更便利

我们再来回顾一遍while循环,仔细分析一下:

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第2张图片

我们发现:在使用while实现循环时循环的三大必要条件过于分散,有时候会导致我们写代码时某一条件没控制好,导致程序

的错误,而我们要介绍的for循环(也是大家最爱用的循环),可以很好地避免这个问题

for(表达式1; 表达式2; 表达式3)
 循环语句;

表达式1

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

表达式2

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

表达式3

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

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第3张图片

输出1~10

#include

int main()
{
    int arr[10] = {0};
    int i;
    for(i = 0; i < 10; i++)
    {
        arr[i] = i + 1;
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第4张图片

语法上:循环的三大必要条件被放在了一起,这样很便于我们控制循环

for循环的执行顺序:

进入for循环

  1. 执行exp1–循环变量初始化– 执行一次
  2. 执行exp2–循环条件判断
  3. 执行循环体
  4. 执行exp3–循环调整部分

之后就是 2 3 4循环执行,知道for循环退出


for循环中的break和continue

意义上基本和while中的无差别

break:终止循环

continue:跳过本次循环

注意:for循环的continue是跳入到调整部分,而while循环的continue是跳进判断部分,这也使for循环在使用continue时,不容易进坑

例如上述我们在while中出现的bug代码,1 2 3 4死循环,我们使用for循环就非常的安全,因为调整部分没有收到破坏

#include

int main()
{
	int i;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
	}
	printf("\n");
	return 0;
}

for循环相比于while循环的优势和建议

优势:

  1. 可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较 远,这样查找修改就不够集中和方便。所以for循环的风格更胜一筹;for循环使用的频率也最高。
  2. for循环在使用continue的时候更容易控制

for循环的写法建议:

  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用**“前闭后开区间”(左闭右开)**写法。

for循环的一些变种

变种1

写for循环时,exp1,exp2,exp3都是可以省略的

  1. 省略exp1–省略初始化,咱们就必须在for循环外面就把循环变量初始化好
  2. 省略exp2–省略循环条件判断,循环条件默认为真,循环陷入死循环
  3. 省略exp3–省略调整部分,所以咱们要在循环体内加一个调整部分

建议同学们不要使用省略写法,很容易拿捏不住

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第5张图片

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第6张图片

#include

int main()
{
	int i = 0;
	int j = 0;
	for (; i<3; i++)
	{
		for (; j<3; j++)
		{
			printf("hello\n");
		}
	}
	return 0;
}

问:上述代码会打印多少个hello,答案是3个–因为i=0的第一层循环,输出3个hello,同时使得j=3,后面的两层循环都没有输出内容,因为j已经是3,没有进入内层循环


变种2
int main()
{
	int x, y;
	for (x = 0, y = 0; x<2 && y<5; ++x, y++)
	{
		printf("hello\n");
	}
	return 0;
}

3.do-while循环

语法

do
{
    循环语句;
}
while(表达式);//这里是有分号的,大家不要写漏了

几乎和while循环达到一样的效果,唯一不同的时候,do-while的循环语句至少被执行一次,即使循环判断条件一开始为假

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第7张图片


do-while的break和continue

几乎和while的break和continue没有差异

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

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

4.goto语句

语法

大部分不同学都没有听过goto语句,因为它很容易出错,而且使用场景很少,很多教材上几乎都没有它的身影

但是goto语句其实是可以实现循环的,顾名思义–goto取到一个地方,可以在程序的代码中穿梭,所以很不安全,也让程序变得很凌乱

#include

int main()
{
flag:
	printf("hello world\n");
	goto flag;
	return 0;
}

上述代码即可无限制地输出hello world


goto语句的使用场景

如果一个循环有很多层,比如有四层,而你现在在最内层的时候发现了一个异常,需要跳转到整个循环的外面去对异常进行处理,原先你可能会使用四次break,但是这样代码很挫,这个时候我们可以使用goto,跳出这个深层循环

for(...)
    for(...)
        for(...)
       {
            for(...)
           {
                if(disaster)
                    goto error;
           }
       }
        …
error:
 if(disaster)
         // 处理错误情况

5.循环例题

  1. 计算 n的阶乘。
  2. 计算 1!+2!+3!+……+10!
  3. 在一个有序数组中查找具体的某个数字n。
  4. 编写代码,演示多个字符从两端移动,向中间汇聚。
  5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。

答案在下方,大家可以参考


计算 n的阶乘

思路:使用循环遍历1~n的数字,将这些数字都相乘起来放在一个变量里面即可。

#include

int main()
{
	int ret = 1;
	int n = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d! = %d\n", n, ret);
	return 0;
}

计算 1!+2!+3!+……+10!

思路:使用循环遍历1~10的数字,一边在做累乘计算出n!的同时,一遍将其加进一个变量里面,同步进行。

#include

int main()
{
  int n = 0;
  printf("请输入n!的n值\n");
  scanf("%d",&n);
  int ret = 1;//计算n!
  int sum = 0;//求和
  for(int i = 1;i<=n;++i)
  {
    ret *= i;
    sum += ret;
  }
  printf("sum = %d\n",sum);
  return 0;
}

在一个有序数组中查找具体的某个数字n

思路:你女朋友让你猜1~100她在想哪个数字,有好几次机会,如果想要快速猜出来你可以先猜50,如果大了再猜75

每次从中间猜,即猜一次即可排除一半的数字,这种方法:二分查找法

当然了理想很丰满,现实很骨感,你女朋友可能在你第一次没猜中的时候,就会说你根本就不懂人家

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第8张图片

二分查找法的实现:

#include
int main()
{
  int arr[] = {1,2,3,4,5,6,7,8,9,10,22,33,44,55};
  int k = 0;
  int left = 0;
  int right = sizeof(arr)/sizeof(arr[0])-1;
  
  printf("请输入需要查找的数\n");
  scanf("%d",&k);
  //一次二分查找
  while(left <= right)//等于也要写在里面
  {
       
      int mid = (left + right)/2;
      if(arr[mid] > k)
      {
        right = mid-1;
      }
      else if(arr[mid] < k)
      {
        left = mid + 1;
      }
      else
      {
        printf("找到了,下标是%d\n",mid);
        break;
      }
  }
  if(left > right)
  {
    printf("没找到\n");
  }
  return 0;
}

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

效果如下:

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环_第9张图片

思路:使用两个相等的字符串,一个字符串str1里面是全是#,一个字符串str2放着welcome to CSDN!!!!,每过一秒就打印str1,然后将str1的左右两边的字符被str2的对应字符所替换,之后就是替换,打印,等待…………

linux下的版本

#include
#include
#include
int main()
{
  char str1[] = "Welcome to CSDN!!!!";
  char str2[] = "###################";
  int left = 0;
  int right = strlen(str1)-1;//长度是3的字符串,\0的下标也是3
  while(left <= right)
  {
    //1.替换字符
    str2[left] = str1[left];
    str2[right] = str1[right];
    ++left;
    --right;
    //2.打印str2
    printf("%s\n",str2);
    //3.等1秒,展示移动的效果
    sleep(1);
    //4.清空屏幕,显示移动效果
    system("clear");
  }
  printf("%s\n",str1);
  return 0;
}

windows下的版本

#include
#include
#include
int main()
{
  char str1[] = "Welcome to CSDN!!!!";
  char str2[] = "###################";
  int left = 0;
  int right = strlen(str1)-1;//长度是3的字符串,\0的下标也是3
  while(left <= right)
  {
    //1.替换字符
    str2[left] = str1[left];
    str2[right] = str1[right];
    ++left;
    --right;
    //2.打印str2
    printf("%s\n",str2);
    //3.等1秒,展示移动的效果
    sleep(1000);
    //4.清空屏幕,显示移动效果
    system("clear");
  }
  printf("%s\n",str1);
  return 0;
}

模拟用户登录情景

场景如下,首先你要设置你的密码,然后你要开始输入密码进行登录,有三次登录机会

#include
#include

int main()
{
  char passwd[30] = "";
  char user[30] = "";
  int i = 3;
  printf("请设置你的密码\n");
  fgets(passwd,30,stdin);
  while(i)
  {
    printf("请登录,输入你的用户密码\n");
    fgets(user,30,stdin);

    if(strcmp(user,passwd) == 0)
    {
      printf("密码正确,登陆成功\n");
      break;
    }
    else 
    {
      --i;
      if(i != 0)
      printf("密码错误,你还有%d次机会",i);
    }
  }
  if(i == 0)
  {
    printf("错误三次,请等待下辈子再试密码\n");
  }
  
  return 0;
}

本篇文章就讲到这,咱们下期间

点赞

你可能感兴趣的:(搞定C语言初阶,c语言,开发语言)