C语言学习笔记:循环结构

news2024/12/23 14:39:07

循环结构

什么是循环

代码的重复执行,就叫做循环。

循环的分类

  • 无限循环:程序设计中尽量避免无限循环,其实就是死循环。程序中的无限循环必须是可控的。
  • 有限循环:循环限定循环次数或者循环的条件。

循环的构成:

  • 循环条件
  • 循环体

当型循环的实现

特点:先判断,后执行,如果条件不满足,一次都不执行

代表:while和for

while

语法:

while (循环
       {
           循环语句
       })

说明:

  1. 循环条件的返回值必须是布尔类型(条件表达式之能是关系表达式或逻辑关系,还可以是具体的值(0,非0,true,false)在C语言中,布尔类型为真使用非0,布尔类型为假使用0/如果引入#include <stdio.h>,也可以用true和false表示。
  2. {}包起来的内容整体称之为循环体
  3. 我们要在循环体中控制循环条件的变化,否则会产生死循环。

执行过程:

在这里插入图片描述

特点:先判断,后执行,循环体语句有可能一次都不执行

案例:

#include <stdio.h>
/**
 *需求:while循环案例:如何让编程来计算1+2+3+..+100?(累加求和)
*\

int main(int argc,char *argv[])
{
	// 定义一个变量,用来保存累加的和
	int sum = 0;
	// 定义一个循环变量
	int i = 1;
	
	while(i <= 100)// 循环条件,这里可以有关系表达式、逻辑表达式、整型常量(非0)
	{
		// 累加运算
		// sum = sum + i;
		sum += i;
		// 给循环变量赋值,用来影响循环条件
		i++;
	}
	printf("1~100的累加和是:%d\n",sum);
	
	return 0;
}
死循环
while(1)  // 我们会在死循环进行必要的控制
for

原则上,,for循环能实现,while循环一定也可以实现,for循环可以看作是while循环的一种特殊写法。

语法:

for(①表达式1;②表达式2;③表达式3)
{
    ④循环语句; -- 如果是单语句,可以省略{};如果是复合语句,必须保留{}
}

说明:

  1. ()中可以只保留两个;;,举例:(;;)
  2. ①(表达式1)是循环变量,我们需要赋初值,循环变量可以是列表,多个循环变量使用逗号分割,举例:int i = 0,j = 0
  3. ②(表达式2)是循环条件,用来限制循环的次数,循环条件支持关系表达式,如果加入逻辑表达式,会变成符合表达式,举例:i < 10 && j <= i
  4. ③(表达式3)改变循环条件,支持列表,这里可以使用赋值表达式,举例:i++,j++
  5. 执行顺序:①②④③ → ②④③ → ②④③ → … → ②

执行过程:
在这里插入图片描述

特点:

先判断,后执行,循环体语句有可能一次都不执行

案例:

#include <stdio.h>
/**
*需求:while循环案例:如何让编程来计算2+4+6+..+100?(偶数累加求和)
*\

int for_test2()
{
	// 定义一个变量,用来保存累加的和
	int sum = 0;
	// 定义一个循环变量
	int i = 1;
	
	for(;i <= 100;)// 循环条件,这里可以有关系表达式、逻辑表达式、整型常量(非0)
	{
		if(i % 2 == 0)
		{
			sum += i;
		}
		i++;
	}
	printf("1~100的累加和是:%d\n",sum);
}	
int main(int argc,char *argv[])
{
	for_test2();
	return 0;
}
#include <stdio.h>
#include <math.h>

int main (int argc,char *argv)
{
    // 需求:for循环案例-用户可以通过键盘输入一个整数n,用来作为阶乘的最高位
    // 创建一个变量,用来接收控制台输入一个整数,作为阶乘的位数
    int n;
    int r = 1;
    
    printf("请输入一个整数:\n");
    scanf("%d",&n);
    
    for(int i = 1;i <= fabs(n);i++)
    {
        // r = r * i;
        r *= i;
	}
    printf("1~%d之间的阶乘的结果是%d\n",(int)fabs(n),r);
    
    return 0;
}

总结

  • for语句使用语法规则上,降低/避免因为忘记循环条件更新操作,而引起的产生无限循环的几率。
  • 应用场合:for语句往往应用于循环次数事先可以确定的场景
死循环
for(表达式1;;表达式3)
for(;;);
循环实现的三要素:
  • 循环变量的初始化
  • 循环条件
  • 循环变量的更新

案例:

/**
 * 需求:for循环案例-求斐波拉契数列前20个数
 * 分析:1,1,2,3,5,8...
 */

int main(int argc,char *argv[])
{
	int f1 = 1;前一个数,默认是1,因为第一个是1
	int f2 = 1;
    
    int i =1;// 循环变量
    for(;i <= 10;i++)
    {
        printf("%12d%12d\n",f1,f2);
        //if(i % 2 == 0)
        //{
        //    printf("\n");
        //}
        f1 += f2;
        f2 += f1;
    }
}

直到型循环的实现

特点:先执行,后判断,不管条件满不满足,至少执行一次。

代表:do…while

do…while

语法:

do
{
    循环体;
} while(循环条件)

说明:

  1. 循环条件的返回值必须是布尔类型,在C语言中,布尔类型为真使用非0来表示,为假使用0来表示
  2. {}包起来的内容整体称之为循环体
  3. 我们要在循环体中控制循环条件的变化,否则就会产生死循环

执行过程:

在这里插入图片描述

特点:先执行,后判断,不管条件满不满足,循环体语句至少执行一次

案例:

#include <stdio.h>

int main(int argc,char *argv[])
{
    // 创建一个变量,用来存储累加的和
    int sum = 0;
    
    // 创建一个循环变量,默认值是1
    int i = 1;
    
    do
    {
        if(i % 2 != 0)
        {
            sum +=i;
        }
        // 改变循环变量,防止死循环
        i++;
    } while(i <= 100)
	printf("1~100之间的奇数和是:%d\n",sum);
    return 0;
}

循环的嵌套

3中循环(while、do…while、for)可以互相嵌套。在前一个循环结构的内部又存在一个完整的循环机构。如:

#include <stdio.h>

int main(int argc, char *argv[])
{
  // 创建一个变量,存放100~200之间的自然数
  int num = 100;
  // 循环变量,默认从2开始,因为子认输数以
  int i = 2;
  // 定制标志位:用来表示1~自身之间的能整除的次数,用来校验该自然数是否为素数
  int is_flag = 1;

  for (; num <= 200; num++)
  {
    // 每个自然数在判别之前需要重置标志位
    is_flag = 1;
    // 第二层for循环验证该自然数能否被除了1~自身之间的数整除,能整除就改变is_flag的值
    for (i = 2; i < num - 1; i++)
    {
      // 校验是否能整除
      if (num % i == 0)
      {
        is_flag = 0;
        break;// 只校验第一个能整除的数
      }
    }
    // 根据标志位,判断该自然数是否是素数
    if (is_flag) // 条件判断:is_flag == 1 缩写 is_flag(推荐)
    {
      printf("%-4d", num);
    }
  }
  printf("\n");
  return 0;
}

循环结构的典型应用场景

  • 求累和:举例1+2+3+..+100的和

  • 求累乘:举例1*2*3*..*100的乘积

  • 求均值:举例(1+2+3+..+100)/100的值

  • 求极值:举例12,34,56,67中的最大值或最小值

  • 元素遍历:常用于数组元素的遍历

基础算法模型

  1. 累加和
    • 定义一个变量(sum),并赋初值为0;
    • 该变量累加(+=),每一个数据项(i);
    • 当访问完每一个数据项,此时该变量的取值就是累加和的结果。
  2. 累乘积
    • 定义一个变量,并赋初值为1;
    • 用该变量累乘(*=),每一个数据项;
    • 当访问完每一个数据项,此时改变量的取值就是累乘的结果。
  3. 极值(多应用于数组)
    • 定义一个变量,并赋初值为第一个数据项;
    • 从第二个数据项开始依次与改变了进行比较,如果大于/小于该变量,则将当前数据项的数据赋值给该变量;
    • 当访问完每一个数据项,此时该变量的取值就是求极值的结果。

break和continue

  • break

功能:

①用在switch中,用来跳出switch的case语句;如果case没有break,可能会产生case穿透。

②用在循环中(while、do…while、for),提前结束循环,也就是跳出整个循环。

说明:

①break不能用于循环语句和switch语句之外的任何语句之中。

②break只能终止并跳出最近一层的循环结构。

for(){
    for(){
        for(){
            break;//只会跳出当前循环
        }
    }
}

图示:

在这里插入图片描述

案例:

#include <stdio.h>

/**
 * 需求:break案例-输出1~100以内的偶数,只能输出前10个
 */
int break_test()
{
  for (int i = 1, count = 1; i <= 100; i++)
  {
    if (i % 2 == 0)
    {
      if (count > 10)
      {
        break;
      }
      count++; // 用来计数,循环次数
      printf("%d\t", i);
      //printf("%d\n", i);
    }
  }
  printf("\n");
}

int main(int argc, char *argv)
{
  break_test();
  return 0;
}

  • continue

功能:continue语句不会结束整个循环,而是跳出本次循环尚未执行的语句,进入下一次循环

说明:

①仅用于循环语句中

②在嵌套循环的情况下,continue语句只对包含他的最近的一层循环起作用

图示:

在这里插入图片描述

案例:

#include <stdio.h>

/**
 * continue案例:1~100以内的偶数和
 */
int continue_test()
{
  int sum = 0;
  for (int i = 1; i <= 100; i++)
  {
    if (i % 2 != 0)
    {
      continue;
    }
    sum += i;
  }
  printf("1~100以内的偶数和是%d\n",sum);
}

int main()
{
  continue_test();
  return 0;
}
  • 跳出多层循环

跳出多层循环是不能直接使用break和continue实现的,因为它们只能跳出单层循环,跳出多层循环,需要我们自定义标志位跳出(标志位也可以配合break跳出使用)。

案例:

#include <stdio.h>

int fun0()
{
  // 定义一个标志位
  int is_flag = 1; // 默认循环成立
  // 定义一个变量,用来接收控制台输入
  char fu;

  // 循环
  while (is_flag)
  {
    printf("外层循环执行的内容..\n");

    while (is_flag)
    {
      printf("内存循环执行的内容..\n");
      scanf("%c", &fu);
      if (fu == 'Y' || fu == 'y')
      {
        is_flag = 0}
    }
  }
}

int fun1()
{
  // 定义一个标志位
  int is_flag = 1; // 默认循环成立
  // 定义一个变量,用来接收控制台输入
  char fu;

  // 循环
  while (is_flag)
  {
    printf("外层循环执行的内容..\n");

    while (is_flag)
    {
      printf("内存循环执行的内容..\n");
      scanf("%c", &fu);
      if (fu == 'Y' || fu == 'y')
      {
        is_flag = 0break;
      }
    }
  }
}

int main()
{
  fun0();
  fun1();
  return 0;
}

注意:如果是多层循环(嵌套循环),==进的时候是从外到内,跳出的时候是从内到外==

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

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

相关文章

stable diffusion实践操作-大模型介绍:SD的发展历史,SD1.5和SDXL之间的差别

大家有没有这样的困惑&#xff1a;在找模型时&#xff0c;老是会出现一些奇怪的标签&#xff0c;像 sd1.5、sdxl 之类的模型后缀&#xff0c;真让人摸不着头脑&#xff0c;一会儿 1.0&#xff0c;一会儿 1.5&#xff0c;一会儿 XL&#xff0c;完全搞不清楚状况。今天就来给大家…

AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下AI高中数学教学视频生成技术&#xff1a;利用通义千问、MathGPT、视频多模态大模型&#xff0c;语音大模型&#xff0c;将4个模型融合 &#xff0c;生成高中数学教学视频&#xff0c;并给出实施方案。本文利用专家模…

PyCharm中Python项目打包并运行到服务器的简明指南

目录 一、准备工作 二、创建并设置Python项目 创建新项目 配置项目依赖 安装PyInstaller 三、打包项目 打包为可执行文件 另一种打包方式(使用setup.py) 四、配置服务器环境 五、上传可执行文件到服务器 六、在服务器上运行项目 配置SSH解释器 配置部署 上传代…

git clone超大仓库时报错:fatal: early EOF

环境版本&#xff1a; 系统&#xff1a;Ubuntu git版本&#xff1a;version 2.43.0 在执行git clone命令时报错&#xff0c;信息如下&#xff1a; 系统&#xff1a;Win10 git版本&#xff1a;version 2.47.0 解决办法1&#xff1a; 1、关闭压缩&#xff1a; git conf…

C++基础:list的基本使用

文章目录 1.基本构造和插入删除基本构造和尾插数据迭代器的分类内置排序sort任意位置插入删除 2.链表的合并,去重和剪切链表的合并链表去重链表的剪切 list的本质就是带头双向循环列表 1.基本构造和插入删除 基本构造和尾插数据 与之前vector的方法相同直接调用即可 迭代器的分…

C++ explicit关键字的作用

C explicit关键字的作用 explicit的作用 这个关键字只能用于类的构造函数&#xff0c;被修饰的构造函数不能发生相应的隐式类型转换&#xff0c;只能以显式的方式进行类型转换。 另外&#xff0c;这个关键字只能用于单个参数&#xff08;这里的单个参数包括多参但是具有默认…

Leecode刷题C语言之N皇后②

执行结果:通过 执行用时和内存消耗如下&#xff1a; struct hashTable {int key;UT_hash_handle hh; };struct hashTable* find(struct hashTable** hashtable, int ikey) {struct hashTable* tmp NULL;HASH_FIND_INT(*hashtable, &ikey, tmp);return tmp; }void insert(…

全场景——(八)低成本 Modbus 传感器的实现

文章目录 一、硬件资源介绍与接线二、创建与体验第 1 个工程2.1 创建工程2.2 配置调试器2.3 配置 GPIO 操作 LED 三、UART 编程3.1 使用 STM32CubeMX 进行配置3.1.1 UART13.1.2 配置 RS485方向引脚 3.2 封装 UART3.3 上机实验3.3.1 硬件连接3.3.2 STM32H5 程序改造3.3.3 STM32F…

如何实现一套键盘鼠标控制两台计算机(罗技Options+ Flow功能快速实现演示)

需求背景 之前我写过一篇文章如何实现一套键盘鼠标控制两台计算机&#xff08;Mouse Without Borders快速上手教程&#xff09;_一套键鼠控制两台电脑-CSDN博客 当我们在局域网内有两台计算机&#xff0c;想使用一套键鼠操控时&#xff0c;可以安装Mouse Without Borders软件…

MacOS 配置github密钥

MacOS 配置github密钥 1. 生成GitHub的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxx.com" -f ~/.ssh/id_ed25519_github 其中 xxxxxxxxxxx.com 是注册github、gitee和gitlab的绑定账号的邮箱 -t ed25519:生成密钥的算法为ed25519&#xff08;ed25519比rsa速度快&…

嵌入式Linux之wifi配网脚本分析

嵌入式Linux系统,一般都支持wifi联网,可以通过sh脚本或其它语言代码编程来实现wifi联网。 本篇来介绍一种通过sh脚本来配置wifi的脚本执行原理。 1 sh脚本wifi联网介绍 这里以飞凌开发板中的wifi启动脚本为例来介绍。 在飞凌开发板的串口中,执行如下命令(调用fltest_wif…

Cursor安装与使用,5分钟完成需求

Cursor简单介绍 Cursor是一款基于AI的代码编辑器&#xff0c;旨在帮助开发者更高效地编写和管理代码。它提供了智能代码补全、AI对话和跨文件编辑等创新功能。 一、安装下载 1、下载cursor&#xff1a;https://www.cursor.com/ 2、注册账号&#xff0c;直接拿自己的邮箱登录…

Ubuntu 20.04 Server版连接Wifi

前言 有时候没有网线口插网线或者摆放电脑位置不够时&#xff0c;需要用Wifi联网。以下记录Wifi联网过程。 环境&#xff1a;Ubuntu 20.04 Server版&#xff0c;无UI界面 以下操作均为root用户&#xff0c;如果是普通用户&#xff0c;请切换到root用户&#xff0c;或者在需要权…

IDEA 2024 配置Maven

Step 1:确定下载Apache Maven版本 在IDEA 2024中&#xff0c;随便新建一个Maven项目&#xff1b; 在File下拉菜单栏中&#xff0c;找到Setings&#xff1b; 在Build&#xff0c;Execution&#xff0c;Deployment中找到Maven 确定下载的Apache Maven版本应略低于或等于IDEA绑…

困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析

当电脑提示“mfc140u.dll丢失”时&#xff0c;这可能会导致某些程序无法正常运行&#xff0c;给用户带来不便。不过&#xff0c;有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题&#xff0c;教大家有效解决mfc140u.dll丢失。 判断是否是“mf…

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定

《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者&#xff0c;在游戏开发和维护过程中&#xff0c;我们经常会遇到各种运行时错误和系统报错。今天&#xff0c;我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…

C++STL容器vector迭代器相关函数

目录 前言 主要参考 vector::begin vector::end vector::rbegin vector::rend vector::cbegin等常量迭代器相关. 共勉 前言 本文将讨论STL容器vector中与迭代器相关的函数&#xff0c;模板参数T为int类型。 主要参考 cpluscplus.com 侯捷《STL源码剖析》 通义 vector…

R语言森林生态系统结构、功能与稳定性分析与可视化实践高级应用

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

如何利用微型5G网关为智慧无人矿车提供精确定位

随着5G、AI、物联网技术的发展和普及&#xff0c;越来越多行业正在加快生产、运营、管理的无人化、数字化与智能化&#xff0c;以适应当前我国“智慧、绿色、低碳”的新型发展模式需要。其中矿产业就是典型场景之一。针对矿山场景的智慧化、无人化转型&#xff0c;佰马提供基于…

我的第一个创作纪念日 —— 梦开始的地方

前言 时光荏苒&#xff0c;转眼间&#xff0c;我已经在CSDN这片技术沃土上耕耘了365天 今天&#xff0c;我迎来了自己在CSDN的第1个创作纪念日&#xff0c;这个特殊的日子不仅是对我过去努力的肯定&#xff0c;更是对未来持续创作的激励 机缘 回想起初次接触CSDN&#xff0c;那…