首页 > 其他分享 >C语言第六部分(循环结构)

C语言第六部分(循环结构)

时间:2024-12-06 19:58:20浏览次数:5  
标签:语句 变量 int 第六 C语言 while 循环 fu

C语言

循环结构

什么是循环

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

循环的分类

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

循环的构成

  • 循环条件
  • 循环体

当型循环的实现

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

代表:while和for

while

语法:

while (循环条件)
{
	循环语句;// 循环语句如果是单语句,可以省略{},如果是复合语句,不可以省略{}
}

说明:

  1. 循环条件的返回值必须是布尔类型(条件表达式只能是关系表达式或者逻辑表达式,还可以是

具体的值(0,非 0,true,false))。在C语言中,布尔类型为真使用 非0 ,布尔类型为假使

用 0 。如果引入 #include <stdbool.h> ,也可以用true和false来表示。

  1. {} 包起来的内容整体称之为 循环体 。
  2. 我们要在 循环体 中控制 循环条件 的变化,否则会产生死循环。

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

案例:

#include <stdio.h>
/*
* 需求:while循环案例:如何编程来计算 1 + 2 + 3 + .. + 100?(累加求和)
*/
int main(int argc,char *argv[])
{
// 定义一个变量,保存累加的和
	int sum = 0;
// 定义一个循环变量
	int i = 1;
	while(i <= 100)// 循环条件,这里可以有关系表达式、逻辑表达式、整型常量
	{
// 累加运算
// 		sum = sum + i;
		sum += i;
// 给循环变量赋值,用来影响循环条件
		i++;
	}
	printf("1~100的累加和是%d\n",sum);
	return 0;
}

案例:

#include <stdio.h>
/**
* 需求:while循环案例:计算1~100以内的偶数和,也就是2+4+6+..+100的累加和
*/
int test02()
{
	// 创建一个变量,用来存放累加和
	int sum = 0;
	// 创建一个循环变量,初始值2
	int i = 2;
	while(i <= 100)
	{
	// 过滤掉奇数
		if(i % 2 == 0)
		{
			sum += i;
		}
		i++;
	}
	printf("1~100之间的偶数和是%d\n",sum);
}
int main(int argc,char *argv[])
{
	test02();
	return 0;
}
for

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

语法:

for (①表达式1;②表达式2;③表达式3)

{

​ ④循环体语句; —如果是单语句可以省略{}

}

说明:

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

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

总结:

  • for语句使用语法规则上,降低/避免因为忘记循环条件更新操作,而引起的产生无限循环的几率。
  • 应用场合:for语句往往应用于循环次数事先可以确定的场景,

死循环

for(;;);
for(表达式1;;表达式3);
循环实现的三要素
  • 循环变量的初始化
  • 循环条件
  • 循环变量的更新

案例:

#include <stdio.h>
/**
* 需求:while循环案例:计算1~100以内的偶数和,也就是2+4+6+..+100的累加和
*/
int while_test()
	{
	// 创建一个变量,用来存放累加和
	int sum = 0;
	// 创建一个循环变量,初始值2
	int i = 2;
	while(i <= 100)
    {
	// 过滤掉奇数
		if(i % 2 == 0)
		{
			sum += i;
		}
		i++;
	}
	printf("1~100之间的偶数和是%d\n",sum);
}
/**
* 需求:for循环案例:计算1~100以内的偶数和,也就是2+4+6+..+100的累加和
*/
int for_test()
{
	// 创建一个变量,用来存放累加和
	int sum = 0;
	// 创建一个循环变量,初始值2
	int i = 2;
	for(;i <= 100;)
	{
// 过滤掉奇数
		if(i % 2 == 0)
		{
			sum += i;
		}
		i++;
	}
	printf("1~100之间的偶数和是%d\n",sum);
}
/**
* 需求:for循环案例:计算1~100以内的偶数和,也就是2+4+6+..+100的累加和
*/
int for_test2()
{
	// 创建一个变量,用来存放累加和
	int sum = 0;
	for(int i = 2; i <= 100;i++)
	{
		// 过滤掉奇数
		if(i % 2 == 0)
		{
			sum += i;
		}
	}
	printf("1~100之间的偶数和是%d\n",sum);
}
int main(int argc,char *argv[])
{
	while_test();
	for_test();
	for_test2();
	return 0;
}

直到型循环的实现

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

代表:do…while goto

do…while

语法:

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

说明:

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

语法:

goto 标签(lable);

标签:标明目标代码的位置,是一个不加“ ”的字符串

注意事项:
1.可读性: goto 语句会破坏代码的结构和可读性,使得代码难以理解和维护。因此,应尽量避免使用。

2.替代方案:大多数情况下,可以使用循环、条件语句、函数等结构来替代 goto 语句,使代码更加清晰和易于管理。

3.嵌套限制:虽然 goto 语句可以跨函数跳转(即跳转到另一个函数中的标签),但这种用法是不合法的,并且会导致编译错误。 goto 语句只能在同一函数内部跳转。

4.错误处理:在某些情况下, goto 语句可以用于错误处理,例如从嵌套的多层循环中跳出。但即使在这种情况下,也应谨慎使用,并考虑是否有更好的替代方案。

总结
虽然 goto 语句在C语言中是合法的,并且有时可能看起来很方便,但过度使用或不当使用会导致代码质量下降。因此,建议尽量避免使用 goto 语句,而是采用更结构化和可维护的编程方法。

循环的嵌套

3种循环可以互相嵌套,在前一个循环结构的内部又存在一个完整的循环结构,

案例:

#include <stdio.h>
/**
* 需求:嵌套for循环案例-求100~200之间的所有素数
* 分析:素数又被称作质数,只能被1和自身整除的数叫做素数。(做这个题,思路反着来,过滤非素数)
*/
int main(int argc,char *argv[])
{
	// 创建一个变量,存放100~200之间的自然数
	int num = 100;
	// 循环变量,默认从2开始,因为自然数除以1没有意义
	int i;
	// 定义标志位:用来记录1~自身之间的能整除的次数,用来校验该自然数是否为素数
	int is_flag;
	// 第1层for循环:生成100~200之间的自然数
	for(;num <= 200;num++)
	{
		// 每个自然数在判别之前,需要重置标志位
		is_flag = 1;
		// 第2层for循环:验证该自然数能否被除了1~自身之间的数整除,能整除,就改变is_flag的值
		// for(i = 2;i < num -1;i++)
		for(i = 2;i < num / 2;i++)
		{
		// 校验是否能整除
			if(num % i == 0)
			{
				is_flag = 0;
				break;// 只校验第一个能整除的数
			}
		}
		// 根据标志位,判断该自然数是否是素数
		if (is_flag) // 条件判断:is_flag == 1 缩写 is_flag(推荐) is_flag == 0 缩写 !is_flag
		{
			printf("%-4d",num);
		}
	}
	printf("\n");
	return 0;
}

循环结构的典型应用场景

  • 求累和:举例 1+2+3+…+100
  • 求累乘:举例 1 * 2 * 3 * 4 * … * 100
  • 求均值:举例 (1+2+3+…+100)/100
  • 求极值:举例 12,34,56,78中的最大最小值
  • 元素的遍历:常用于数组元素的遍历

基础算法模型

1,累加和

  • 定义一个变量sum,并赋初值为0
  • 当该变量累加(+=)每一个数据项(i)
  • 当访问完每一个数据项,此时该变量的取值就是累加和的结果。

2,累乘

  • 定义一个变量,并赋初值为1;
  • 用该变量累乘(*=)每一个数据项;
  • 当访问完每一个数据项,此时该变量的取值就是累乘的结果

3,极值(多应用于数组)

  • 定义一个变量,并赋初值为第一个数据项:
  • 从第二个数据项开始,依次于该变量进行比较,如果大于/小于该变量,则将当前数据项的数据赋值给该变量
  • 当访问完每一个数据项,此时该变量的取值就是求极值的结果。

break和continue

  • break

​ 功能:

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

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

​ 说明:
​ ①)break不能用于循环语句和switch语句之外的任何其他语句之中。
​ ②break只能终止并跳出最近一层的循环结构。

  • continue

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

​ 说明:

​ ① 仅用于循环语句中。
​ ②在嵌套循坏的情况下,continue语句只对包含它的最近的一层循环起作用。

案例:

#include <stdio.h>
/**
* continue案例:求1~100以内的偶数和,(不使用continue)
*/
int continue_test1()
{
	int sum = 0;
	for(int i = 1; i <= 100; i++)
	{
		// 查找偶数
		if ( i % 2 == 0)
		{
			sum += i;
		}
	}
	printf("1~100以内的偶数和是%d\n",sum);
}
/**
* continue案例:求1~100以内的偶数和,(使用continue)
*/
int continue_test2()
{
	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_test1();
	continue_test2();
}
  • 跳出多层循环

​ 跳出多层循环是不能直接使用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(1)
		{
			printf("内存循环执行的内容..\n");
			scanf("%c",&fu);
			if(fu == 'Y' || fu == 'y')
			{
				is_flag = 0;
				break;
			}
		}
	}
}
int main()
{
	fun0();
	fun1();
}

注意:如果是多层循环(嵌套循环),进的时候是从外到内,跳出的时候是从内到外。
tch的case语句;如果case没有break,可能会产生case穿透。

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

​ 说明:
​ ①)break不能用于循环语句和switch语句之外的任何其他语句之中。
​ ②break只能终止并跳出最近一层的循环结构。
​ 图示:

[外链图片转存中…(img-SDjPiT6i-1733140244751)]

  • continue

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

​ 说明:

​ ① 仅用于循环语句中。
​ ②在嵌套循坏的情况下,continue语句只对包含它的最近的一层循环起作用。
​ 图示:

[外链图片转存中…(img-47iPSSmZ-1733140244751)]

案例:

#include <stdio.h>
/**
* continue案例:求1~100以内的偶数和,(不使用continue)
*/
int continue_test1()
{
	int sum = 0;
	for(int i = 1; i <= 100; i++)
	{
		// 查找偶数
		if ( i % 2 == 0)
		{
			sum += i;
		}
	}
	printf("1~100以内的偶数和是%d\n",sum);
}
/**
* continue案例:求1~100以内的偶数和,(使用continue)
*/
int continue_test2()
{
	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_test1();
	continue_test2();
}
  • 跳出多层循环

​ 跳出多层循环是不能直接使用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(1)
		{
			printf("内存循环执行的内容..\n");
			scanf("%c",&fu);
			if(fu == 'Y' || fu == 'y')
			{
				is_flag = 0;
				break;
			}
		}
	}
}
int main()
{
	fun0();
	fun1();
}

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

标签:语句,变量,int,第六,C语言,while,循环,fu
From: https://blog.csdn.net/expectsl/article/details/144197028

相关文章

  • 初探C语言|浅谈函数的递归
    文章目录1.什么是递归?2.递归的两个必要条件代码示例3.两个例题(阶乘和斐波那契)发现问题为什么呢?stackoverflow(栈溢出)常规写法(迭代)4.递归与迭代相比较欢迎讨论:如有错误或不足,欢迎指正和建议,本人主打“听劝”。当然,如有疑问,也期待你在评论区留言互动。点赞+关注:如果......
  • C++从零到进阶 ③.1循环结构(介绍)
    本次是【C++从零到进阶】的第③课(介绍):循环结构介绍我们一个个来介绍提示:介绍单吃很难吃透,需要结合后续练习跟进才能做到掌握哦!目录一、for语句1.语句格式:2.使用范例3.详细说明4.语句执行过程二、while语句1.格式2.例子三、do-while语句四、循环嵌套五、退......
  • (王道练习代码仓库)408考研真题2022 年42题————C语言
    题目:代码实现:#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>typedefintElemType;typedefstruct{ ElemType*elem; intTableLen;}SSTable;voidST_Init(SSTable&ST,intlen)//申请空间,并进行随机数生成{ ST.Ta......
  • 关于for循环语句嵌套
    做了半天,才做出来,崩溃。还是练的少。。。。。呜呜呜。进入正题。以题来讲解该知识点。题目是输出**********`#include<stdio.h>intmain(){ inti,j=0,k=0;for(i=1;i<5;i++){ for(j=0;j<=i;j++)if(j<=1){continue;}elseprintf(""); for(k;k<i;k++) ......
  • 学习C语言升级c++的笔记
    此篇文章在2022年2月8日被记录,工作这两年多了,也没用过C++做开发,令人唏嘘1、#include<cmath>#include<cstdio>用这种方法来调用C语言中的函数2、namespace名字空间,防止命名重复::叫做限定调用符usingnamespaceX:引入整个名字空间usingX::name使用单个名字X::na......
  • 第六章:开发方法
    我们上几章已经把项目管理的五大过程组和十大知识领域理清楚了,本章继续来说下开发方法。选择哪种开发生命周期取决于:组织(公司)、产品、服务或结果类型,项目本身的管理要求。有以下5种开发方式:1.预测型定义:预测型又叫瀑布型,它是一种线性的、顺序的软件开发方法。它按照固定的......
  • STM32:(入门)实现LED2灯循环闪烁
    思路:认识开发板的引脚——进行参数配置——运行代码——烧入开发板一、认识开发板的引脚(认识开发板)(STM32有2个LED灯的引脚分别是LED1-PA3,LED2-PB8【反面】) 依据题目,LED2灯---PB8二、进行参数配置(打开STM32CubeMx软件(新建项目)----选择版本【例题使用STM32F151C8】-......
  • Spring循环依赖
    Spring中循环依赖1.什么是循环依赖两个类之间相互引用,或者多个类之间依次引用对方,最终构成一个环,例如下图所示,ServiceA类中定义了一个ServiceB类型的属性,ServiceB类中定义了一个ServiceC类型的属性,ServiceC类中定义了一个ServiceA类型的属性,三个类型之间引用构成了一个环。2.......
  • c语言题目 之 杨氏矩阵
    杨氏矩阵,就是行和列里面的值都是越来越大的;第一种:通过结构体将坐标带回第二种:通过指针将坐标带回//方法一:structpoint{ intx; inty;};structpointserch_(int(*p)[4],intr,intc,intn){ intx=0; inty=c-1; structpointrety={-1,-1}; ......
  • C语言实验 二维数组
    时间:2024.12.6一、实验7-1矩阵运算代码 #include<stdio.h>intmain(){inta[20][20]={0};intn,i,j;intsum=0;scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j])......