C 程序设计教程(16)—— 循环结构程序设计

news2025/1/15 12:43:24

C 程序设计教程(16)—— 循环结构程序设计

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

目录

  • C 程序设计教程(16)—— 循环结构程序设计
    • 一、while 循环
    • 二、do - while 循环
    • 三、for 循环
    • 四、break 与 continue 语句
        • 1、break 语句
        • 2、continue 语句
    • 五、循环的嵌套

循环结构是结构化程序中的三种基本结构之一,和顺序结构、选择结构共同作为这种复杂程序的基本构造单元。

一、while 循环

while 循环的语法格式如下:

while (表达式)
{循环体}

while 循环的执行过程如下:

(1)计算 while 后括号内的表达式的值,当它的值为非 0 时,执行步骤(2),否则退出循环。

(2)执行循环体。然后执行步骤(1)。

while 循环的特点是先计算表达式的值,然后根据表达式的决定是否执行循环体中的语句。如果表达式的值一开始就为 “假”,则循环一次也不执行。例如:

int i=3;
while (i<3){
    printf("i=%d",i);
}

其中,printf 函数是while 循环的循环体,但是一次也不执行,因为循环一开始,while 后面的表达式就不成立。

例如:求 1+2+3+……+100 的结果

程序如下:

#include<stdio.h>
int main() 
{
	int i=1,sum=0;
	while (i<=100){
		sum+=i;
		i++;
	}
	printf("sum=%d",sum);
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

例如:用公式 π/4=1-1/3+1/5-1/7+1/9-……求 π 的值,直到最后一项的绝对值小于 10^(-4)为止。

程序如下:

#include<stdio.h>
#include<math.h>
int main() 
{
	int i=1;
	float pi=0,t=1,s=1;
	while (fabs(t)>1e-4){
		pi+=t;
		i+=2;
		s=-s;
		t=s/i;
	}
	pi=4*pi;
	printf("pi=%f\n",pi);
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

二、do - while 循环

do-while语句构成的循环称为 “直到型循环”,语法格式如下:

do
{
    循环体
} while (表达式);

其中,“表达式” 称为循环条件。循环执行的过程如下:

(1)执行 do 后面的循环体。

(2)计算机 while 后面的表达式的值,如果为 “真” 则继续执行循环体,如果 “表达式” 的值为假,则退出循环结构。

例如:计算 1 + 1/2 + 1/3 + 1/4 +…… + 1/50。程序如下:

#include<stdio.h>
int main() 
{
	int i=2;
	float sum=1; 
	do{
		sum=sum+1.0/i;
		i++;
	} while (i<=50);
	printf("sum=%f\n",sum);
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

三、for 循环

for 循环的语法格式如下:

for(表达式1; 表达式2; 表达式3){
    循环体;
}

for 循环的执行过程为:

(1)计算 “表达式1”。

(2)计算 “表达式2”,如果值为真(非0),执行循环体,否则退出循环。

(3)计算 “表达式3”,然后转向步骤(2)。

说明:

(1)for 循环的执行方式和 while 循环类似。for 循环与 while 循环相比,在格式上显得更紧凑。for 循环的形式可以改写为 while 循环的形式。

表达式1;
while (表达式2){
    循环体;
    表达式3;
}

(2)for 循环的【表达式1】可以写在 for 循环之前,此时,for 语句中有两个表达式,但【表达式2】之前的分号不能省略。即:

表达式1;
for(; 表达式2; 表达式3){
    循环体;
}

例如:

#include<stdio.h>
int main() 
{
	int i,sum;
	for(i=1,sum=0;i<=100;i++){
		sum+=i;
	}
	printf("sum=%d\n",sum);
	return 0;
}

以上程序可以写成如下格式:

#include<stdio.h>
int main() 
{
	int i=1,sum=0;
	for(;i<=100;i++){
		sum+=i;
	}
	printf("sum=%d\n",sum);
	return 0;
}

(3)如果省略【表达式2】,即不在【表达式2】的位置判断循环条件,将形成死循环。此时,应该在循环体中设置退出循环的机制。例如:

#include<stdio.h>
int main() 
{
	int i,sum=0;
	for(i=1;;i++){
		if(i>100) break;
		sum+=i;		
	}
	printf("sum=%d\n",sum);
	return 0;
}

(4) 如果省略【表达式3】,即不在此位置进行循环变量的修改,则应该在循环体中编写使循环趋向于结束的语句。例如:

#include<stdio.h>
int main() 
{
	int i,sum=0;
	for(i=1;i<=100;){
		sum+=i;		
		i++;
	}
	printf("sum=%d\n",sum);
	return 0;
}

(5)可以省略【表达式1】和【表达式3】,仅有【表达式2】。例如:

#include<stdio.h>
int main() 
{
	int i=1,sum=0;
	for(;i<=100;){
		sum+=i;		
		i++;
	}
	printf("sum=%d\n",sum);
	return 0;
}

(6)for 语句中的【表达式1】、【表达式2】或【表达式3】都可以省略,甚至三个表达式可以同时省略,但是分号不能省略。例如:

#include<stdio.h>
int main() 
{
	int i=1,sum=0;
	for(;;){
		if(i>100) break;
		sum+=i;		
		i++;
	}
	printf("sum=%d\n",sum);
	return 0;
}

(7)使用逗号表达式表示【表达式1】和【表达式3】可以使 for 语句更简洁。例如:

#include<stdio.h>
int main() 
{
	int i,sum;
	for(i=1,sum=0;i<=100;sum+=i,i++);
	printf("sum=%d\n",sum);
	return 0;
}

(8)【表达式2】一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,只要其值为非 0,就执行循环体。例如:

#include<stdio.h>
int main() 
{
	char ch;
	for(;ch=getchar()!='\n';);
	printf("ch=%c\n",ch);
	return 0;
}

例1:求斐波那契数列 1,1,2,3,5,8,…的前40项,公式如下:

fn=1 (n=1)
fn=1 (n=2)
fn=f(n-1)+f(n-2) (n>2)

程序如下:

#include<stdio.h>
int main() 
{
	long f1=1,f2=1,f;
	int i;
	printf("%12ld%12ld",f1,f2);
	for(i=3;i<=40;i++){
		f=f1+f2;
		printf("%12ld",f);
		if (i%4==0) printf("\n");
		f1=f2;
		f2=f;
	}	
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

例2:任意输入一个正整数,判断是否为素数。

程序如下:

#include<stdio.h>
#include<math.h>
int main() 
{
	int x,i,w=1;
	printf("请输入一个正整数:");
	scanf("%d",&x);
	if(x<1) printf("输入数据非法\n");
	for (i=2;i<sqrt(x);i++)
		if (x%i==0) w=0;
	if(w!=0) printf("%d是素数\n",x);
	else printf("%d不是素数\n",x);
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

四、break 与 continue 语句

1、break 语句

在循环体中可以通过 break 语句立即终止循环的执行。

说明:

(1)break 语句只用于循环语句或 switch 语句。在循环语句中,break 常常和 if 语句一起使用,表示当条件满足时,立即终止循环。

(2)循环语句可以嵌套使用,break 语句只能终止其所在的循环。

例如:任意输入一个正整数,判断是否为素数。

#include<stdio.h>
#include<math.h>
int main() 
{
	int x,i;
	printf("请输入一个正整数:");
	scanf("%d",&x);
	if(x<1) printf("输入数据非法\n");
	for (i=2;i<sqrt(x);i++)
		if (x%i==0) break;
	if(i>=sqrt(x)) printf("%d是素数\n",x);
	else printf("%d不是素数\n",x);
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

例:从键盘上连续输入字符,并统计字母的个数,直到输入换行符(\n)时结束。

程序如下:

#include<stdio.h>
int main() 
{
	int sum=0;
	char ch;
	do {
		ch=getchar();
		if (ch>=65&&ch<=90||ch>=97&&ch<=122) sum++;
	} while(ch!='\n');
	printf("一共输入了%d个字母\n",sum);
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

2、continue 语句

continue 语句的功能是结束本次循环。即:跳过本次循环中余下尚未执行的语句,接着再次进行循环条件的判定。

在 while 和 do-while 循环中,continue 语句使流程直接跳到循环控制条件的判断部分,以决定循环是否继续执行。

在 for 循环中,遇到 continue 语句后,跳过循环体中余下的语句,对【表达式3】求值,然后进行【表达式2】的判断,决定 for 循环继续执行。

例:输出 100~200 之间所有能被 3 整除的整数。

程序如下:

#include<stdio.h>
int main() 
{
	int i,n=0;
	for(i=100;i<=200;i++){
		if(i%3!=0) continue;
		printf("%6d",i);
		n++;
		if(n%5==0) printf("\n");
	}
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

五、循环的嵌套

一个循环结构的循环体内又包含另一个循环结构,称为循环的嵌套。

利用循环嵌套可以解决复杂问题,一般把内嵌的循环称为内循环,外层的循环称为外循环。

例:求 1!+3!+5!+…+(2n-1)!

程序如下:

#include<stdio.h>
int main() 
{
	int i,j,n=5,p;
	long sum=0;
	for(i=1;i<=n;i++){
		p=1;
		for (j=1;j<=2*i-1;j++)
		p=p*j;
		sum+=p;
	}
	printf("%ld",sum);
	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

使用嵌套循环时,应注意以下几点:

(1)for 循环、while 循环和 do-while 循环可以相互嵌套,无论如何嵌套,都必须满足内层循环完整地包含在外层循环中,不能形成循环的交叉。

(2)嵌套循环的层数没有限制,但嵌套的层数太多,会消耗大量的内存,并且程序的可读性变差。

(3)内外层循环尽量不要使用相同的循环控制变量。

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

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

相关文章

Vue3之对Dialog的简单封装

之前使用的UI框架,无论是Element UI/Plus 还是 Ant design&#xff0c;其中Dialog组件中的结构和样式都难以修改&#xff0c;无论是使用less、deep还是其他方法&#xff0c;对其组件中css的修改都不生效&#xff08;不确定是否有其他解决方法&#xff09;&#xff0c;所以我就自…

【小白必看】2023年PMP考试报名时间,报考条件,超全PMP备考指南

PMP 考试一年能考四次&#xff0c;分别是3月、6月、9月、12月&#xff0c;提前 2 个月开始报名&#xff0c;但还是要关注PMI/基金会官网的信息&#xff0c;有特殊情况的会在官网公布。现在放开了&#xff0c;2023年PMP 考试应该不会再延期了&#xff0c;之前没考上的&#xff0…

重装系统win11的步骤和详细教程

想要给电脑重装系统win11使用&#xff0c;但是自己对于相关的重装操作不熟悉怎么样?我们可以网上的小白装机工具实现&#xff0c;那么具体怎么重装系统win11?下面就演示下重装系统win11的步骤和详细教程。 工具/原料&#xff1a; 系统版本&#xff1a;Windows 11 品牌型号…

js使用小顶堆构建优先级队列

什么是优先级队列? 优先级队列是队列的一个变种,队列是一个先进先出的结构,在头部出队元素在尾部入队元素, 优先级队列顾名思义就是给每个元素具备了优先级,优先级决定了元素在队列中的存储位置,优先级越高的越靠前越先出队 小顶堆又是什么? 小顶堆是堆结构的一个分支,堆…

浙大MEM提面优秀成功上岸经验分享——完全准备才能“聊”的好

近期元旦放假&#xff0c;终于有时间写一写关于自己浙大MEM提面上岸的一些经验分享了。这篇可能对接下来参加2024年浙大mem考试的考生会有一些作用。因为我是参加了提前批面试&#xff0c;并在面试中取得了优秀的资格&#xff0c;所以这也为我后续的联考和录取环节减轻了不少的…

[JAVA安全]filter 内存马

原理&#xff1a; Servlet 有自己的过滤器 filter &#xff0c; 可以通过自定义的过滤器&#xff0c;来对用户的请求进行拦截等操作。 经过filter 之后才会刀Servlet &#xff0c;如果我们动态创建一个 filter 并且将其放在最前面&#xff0c;我们的filter 就会最先被执行&…

Java多线程案例——线程池及ThreadPoolExecutor类

一&#xff0c;线程池1.为什么会有线程池&#xff1f;线程池和多线程的区别&#xff1f;为了很好的解决高并发问题&#xff0c;提高计算机的运行效率&#xff0c;提出了多线程来取代多进程&#xff08;因为一个线程的创创建、销毁和调度比进程更加“轻量”&#xff0c;所以线程…

杰卡德相似度(Jaccard)详解及在UserCF中的应用

1、杰卡德相似度(Jaccard) 这个是衡量两个集合的相似度一种指标。 两个集合A和B的交集元素在A&#xff0c;B的并集中所占的比例&#xff0c;称为两个集合的杰卡德相似系数&#xff0c;用符号J(A,B)表示 另一种表示的方法&#xff1a; jaccard系数衡量维度相似性 jaccard系数很…

IT运维.服务器常见资质认证

3C证书 强制要求 CCC认证的全称为“中国强制性产品认证“ 它是为保护消费者人身安全和国家安全、加强产品质量管理、依照法律法规实施的一-种产品合格评定制度。, 节能

spring之动态代理

文章目录前言一、JDK动态代理1、业务接口OrderService2、目标对象OrderServiceImpl3、客户端程序Client4、InvocationHandler 的实现类TimeInvocationHandler5、运行结果二、CGLIB动态代理1、先引入依赖2、目标类 UserService3、客户端程序Client4、MethodInterceptor的实现类T…

温振传感器的信号输出方式及应用领域

在振动测量系统中&#xff0c;测量振动的仪器排在前端。温振传感器也称为温度振动传感器&#xff08;变送器&#xff09;&#xff0c;它可以将被测对象的振动量&#xff08;位移、速度&#xff09;准确接受后&#xff0c;并将此机械量转换为电信号显示出来。 在工业生产、食品…

内存对齐(memory align)

0. 内存结构 我们平时所称的内存也叫随机访问存储器&#xff08;random-access memory&#xff09;也叫RAM。而RAM分为两类&#xff1a; 一类是静态RAM&#xff08;SRAM&#xff09;&#xff0c;这类SRAM用于前边介绍的CPU高速缓存L1Cache&#xff0c;L2Cache&#xff0c;L3C…

不求星光灿烂,但愿岁月静好

作者&#xff1a;非妃是公主 专栏&#xff1a;《程序人生》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录不求星光灿烂&#xff0c;但愿岁月静好说一说这一年的自己的收获吧2022年的追求自我学会拒绝尝试表达…

Unreal单播委托

单播委托只能注册一个函数:无参无返回值给委托绑定函数:判断如果委托有绑定函数就发起广播:解绑:绑定方式除了BindUObject,还有BindUFunction,通过这种方式绑定需要给函数添加UFUNCTION标记:还有BindLambda匿名函数:BindRaw可以绑定原生C类中的函数:无参有返回值定义委托类型:声…

Linux进程状态与系统负载检测

1.基础知识-进程的5个状态进程可以分为五个状态&#xff0c;分别是&#xff1a;1&#xff09;创建状态一个应用程序从系统上启动&#xff0c;首先就是进入创建状态&#xff0c;需要获取系统资源创建进程管理块&#xff08;PCB&#xff09;完成资源分配。2) 就绪状态在创建状态完…

Dextran-Azide,Dextran-N3结构式;叠氮修饰的葡聚糖 科研用试剂说明

Dextran-N3,叠氮基团葡聚糖 英文名称&#xff1a;Dextran-Azide,Dextran-N3 中文名&#xff1a;叠氮修饰的葡聚糖 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观: 固体或类白色絮状&#xff0c;取决于分子量 溶剂&#xff1a;溶于大部分有机溶剂&…

kafka单节点部署,手把手从零到一

kafka单节点部署 书接上回&#xff1a;zookeeper单节点部署&#xff0c;手把手从零到一 建议配套观看 2、kafka的单节点部署 2.1、下载 这里如果和zookeeper相似的就不再赘述&#xff0c;直接上命令 wget https://archive.apache.org/dist/kafka/2.8.2/kafka_2.12-2.8.2.tgz…

深入了解ArrayBlockingQueue 阻塞队列

1. 前言 开始正式了解阻塞队列之前&#xff0c;我们需要了解什么是队列。 队列有什么作用。其实队列的作用就是解耦&#xff0c;更加确切的说应该是生产者以及消费者 之间的解耦 今天就让我们来看下ArrayBlockingQueue 的实现。虽然通过名称就可以看到&#xff0c;无非是通过数…

Theory for the information-based decomposition of stock price

文章目录MotivationThe potential of Brogaard DecompositionIntuitions for Brogaard decompositionTechnique details in Brogaard decompositionDefine the VAR systemIdentify the VAR systemVariance decompositionSummaryMain ReferencesMotivation Brogaard et al. (20…

1000字带您了解网络设备的接口分类和接口编号规则

通过本文&#xff0c;您可以了解到设备的接口分类和接口编号规则。 文章目录一、接口分类1.1 物理接口1.1.1 管理接口1.1.1 业务接口LAN侧接口WAN侧接口1.2 逻辑接口二、接口编号规则2.1 物理接口编号规则三、总结一、接口分类 接口是设备与网络中的其它设备交换数据并相互作用…