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

news2024/12/22 23:01:09

前言
👻作者龟龟不断向前
👻简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
👻专栏: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;//语句
}

在这里插入图片描述

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

#include<stdio.h>
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 <stdio.h>
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<stdio.h>
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<stdio.h>
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循环,仔细分析一下:

在这里插入图片描述

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

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

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

表达式1

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

表达式2

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

表达式3

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

在这里插入图片描述

输出1~10

#include<stdio.h>

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;
}

在这里插入图片描述

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

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<stdio.h>

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–省略调整部分,所以咱们要在循环体内加一个调整部分

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

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>

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的循环语句至少被执行一次,即使循环判断条件一开始为假

在这里插入图片描述


🍉do-while的break和continue

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

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

#include <stdio.h>
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<stdio.h>

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<stdio.h>

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<stdio.h>

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

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

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

在这里插入图片描述

二分查找法的实现:

#include<stdio.h>
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;
}

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

效果如下:

在这里插入图片描述

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

linux下的版本

#include<string.h>
#include<unistd.h>
#include<stdlib.h>
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<string.h>
#include<windows.h>
#include<stdlib.h>
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<stdio.h>
#include<string.h>

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;
}

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

点赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jupyter怎么换环境?

1.为什么要换环境而不用使用默认环境&#xff1f; 在这之前我只知道&#xff0c;要pip安装很多环境包&#xff0c;来在程序中调用使用&#xff0c;但是在不同的项目中&#xff0c;环境总是相互矛盾&#xff0c;总会出现诸多版本问题。所以需要每个项目对应一个环境。conda默认…

2022第二届中国高校大数据竞赛A题(实时更新)

题目 制造业是国民经济的主体&#xff0c;近十年来&#xff0c;嫦娥探月、祝融探火、北斗组网&#xff0c;一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业的核心&#xff0c;机械设备在工业生产的各个环节都扮演着不可或缺的重要角色。但是&#xff0c;在…

【FTP工具】FileZila安装以及使用详解

一、FTP概念 安装FTP主要是为了传输文件&#xff0c;FTP是持久的&#xff0c;只有一次认证过程&#xff0c;传输多个文件都是使用同一个连接。因为FTP就是为远程文件交互而设计的&#xff0c;有些时候只是为了单纯做一个文件传输&#xff0c;往往搭建FTP服务更省时和节约成本。…

【每日刷题】之【Z字形变换】

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【力扣刷题篇】 &#x1f432;&#x1f432;本篇内容&#xff1a; 每日刷题 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&#…

BI设计上篇 - 像设计师一样思考

形式服从功能。这句产品设计的箴言也适用于数据可视化。就数据可视化的形式和功能而言&#xff0c;我们首先考虑的是我们希望受众能用数据做什么&#xff08;功能&#xff09;&#xff0c;然后才是用可视化&#xff08;形式&#xff09;来简化这个过程。在本文中&#xff0c;我…

总结flutter玩转之-安卓view 承载flutter 的页面

1.假设你已经熟悉flutter 开发熟悉dart 语言 android 原生开发技能 一、在安卓原生项目添加代码 1.创建示例布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

【Linux修炼】6.gcc/g++及Makefile【工具篇】

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 Linux-gcc/g及Makefile本节目标程序的翻译过程1.程序的翻译过程2. 理解选项的含义3. 动态链接和静态链接Linux项目自动化构建工具-make/Makefile1. 背景2. “见见猪跑”3. makefile原理及语法3.1 Makefile原理3.2 Makefile…

pytorch初学笔记(二):TensorBoard之add_scale()的使用

目录 一、SummaryWriter类的介绍 1. 定义 2. SummaryWriter初始化 2.1 初始化 2.2 帮助文档给出的使用范例 2.3 常用方法 二、add_scale()方法介绍 1. 常用参数介绍 2. 绘制图形 2.1 安装tensorboard 2.2 对应代码 2.3 打开tensorboard窗口 2.3 注意事项 三、a…

kubernetes学习笔记

参考 Cloudman 老师的《每天5分钟玩转Kubernetes》&#xff0c;记录如何使用 Kubernetes &#xff0c;由于版本变化&#xff0c;一些命令也有相应的变化&#xff0c;本文对应 Kubernetes 1.25.3 5. 运行应用 010.123 用 Deployment 运行应用 原文使用kubectl run命令&#x…

JS(Dom对象的属性和方法)第十六课

Dom对象的属性和方法自定义的熟悉操作上面是今天博客要讲述的内容 一个案例回顾上次课讲的内容 下面是Html中的元素布局结构 <div>我是div审查元素<p>我是p标记的元素</p><span>我是span的元素信息</span></div><div class"one&…

搭建ftp服务器注意事项

很早之前写过一篇关于FTP服务器相关博客&#xff1a;FTP服务器主动被动模式详解。直到最近生产环境需要搭建一个FTP服务&#xff0c;才发现一些细节还需注意。 生产环境搭建ftp服务器&#xff0c;如果有外部用户需要连接ftp服务器下载文件&#xff0c;一般用的是Passive (PASV&…

[深度学习] 名词解释--正则化

正则化 花书的定义&#xff1a;凡是可以减少泛化误差&#xff08;过拟合&#xff09;而不是减少训练误差的方法&#xff0c;都叫正则化方法。 目的&#xff1a;拟合训练数据&#xff0c;防止模型过拟合&#xff0c;通常使用L2正则化.用各种方法规范模型参数的方法. 什么是神经网…

408 | 【2012年】计算机统考真题 自用回顾知识点整理

选择题 T2&#xff1a;后缀表达式&#xff08;逆波兰表达式&#xff09;—— 注意 操作数的顺序&#xff01; 中缀转后缀 运算顺序不唯一&#xff0c;因此对应的后缀表达式也不唯一“左优先”原则&#xff1a;只要左边的运算符能先计算&#xff0c;就优先算左边的用栈实现中缀…

JS(DOM)第十五课

Dom的全称是Document Object Model DOM 定义了访问 HTML 和 XML 文档的标准 Dom的定义 DOM 文档对象模型 DOM是针对XML的基于树的API。描述了处理网页内容的方法和接口&#xff0c;是HTML和XML的API&#xff0c;DOM把整个页面规划成由节点层级构成的文档。 DOM本身是与语言无…

基于simulink的超级电容,电池及DC motor充放电系统仿真

目录 一、理论基础 二、核心程序 三、测试结果 作者ID &#xff1a;fpga和matlab CSDN主页&#xff1a;https://blog.csdn.net/ccsss22?typeblog 擅长技术&#xff1a; 1.无线基带,无线图传,编解码 2.机器视觉,图像处理,三维重建 3.人工智能,深度学习 4.智能控制,智能优…

【C ++基础】迭代器(iterator)在string里面的简单使用

【C 基础】迭代器(iterator)在string里面的简单使用 前言 本文是为了扫清后面学习的难点&#xff0c;而特意写的文章&#xff0c;只是介绍迭代器如何在string中使用。 迭代器的详细解释请看这里&#xff1a; [点击跳转&#xff08;这里还没有写哦&#xff09;] C专栏主页&am…

【Node.JS】事件的绑定与触发

往期文章 【Node.JS】写入文件内容 【Node.JS】读取文件内容 目录 简介 绑定事件 on&#xff08;&#xff09; addListener&#xff08;&#xff09; once&#xff08;&#xff09; 监听事件emit&#xff08;&#xff09; 传参 删除事件 removeListener&#xff08;&am…

【无人机】基于蚁群算法的无人机航路规划研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【笔试题】【day14】

目录 第一题&#xff08;哪些成员变量需要在初始化列表初始化&#xff09; 第二题&#xff08;多态的条件&#xff09; 第三题&#xff08;多态的条件&#xff08;通过父类对象调用的全部都是父类的方法&#xff09;&#xff09; 第四题&#xff08;菱形继承&#xff0c;虚…

猴子也能学会的jQuery第一期——什么是jQuery

#1024程序员节&#xff5c;用代码&#xff0c;改变世界 &#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引入jQuery 未完待续 目录 &#x1f4da;系列文章—目录&#x1f525; &#x1f4c4;需要具备的…