Linux嵌入式学习---c语言之循环结构

2023-11-07


在通常情况下,我们所写的程序,往往是重复的,我们可以重复写相同的程序段来实现要求,但显然是不现实的,工作量大,代码冗长且重复,对于阅读和维护都是困难的,因此高级语言提供了循环语句,来处理需要重复进行的操作。

一、while语句循环

1.1一般形式

while(表达式){
	语句;
}

表达式的成立,则执行循环体语句,不成立就不执行循环体语句。
语句可以是一个语句,也可以是复合语句,语句块。
注意:while循环的特点是先判断条件表达式,后执行循环体语句。

1.2累加求和

例如:
求1+2+3+4+5…+100

思路:

  1. 累加100次,每次加一个数。
  2. 每次加的数是有规律的,后一个数是前一个数加一,所以不用scanf一个个的从键盘输入数字,而是在加完上一个数i后,使i加一就可以得到下一个数字

流程图:

在这里插入图片描述
代码:

#include <stdio.h>
int main()
{	
	int i = 1;//定义初始变量 
	int sum = 0;
	while(i<=100){//当i>100时,判断条件为假,跳出循环 
		sum = sum + i;//第一次累加后sum的值为1 
		i++;//加完后,i的值加一,为下一次的累加做准备 
	} 
	printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 
	return 0;
}

注意:
这里不能忽视i和sum的初始值,不然结果是不正确的
在这里插入图片描述

二、do…while语句循环

2.1do…while语句一般形式

do
	语句
while(语句)

2.2do…while语句特点

先无条件的执行循环体,然后判断条件是否成立。
先执行一次指定的循环体语句,然后判断表达式,当判断表达式的值为真时,返回重新执行循环体语句,如此反复,直到表达式的值为假为止,此时循环结束。

例:求1+2+3…+100的和

#include <stdio.h>
int main()
{	
	int i = 1;//定义初始变量 
	int sum = 0;
	do{
		sum = sum + i;//第一次累加后sum的值为1 
		i++;//加完后,i的值加一,为下一次的累加做准备 
	}while(i<=100)
	printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 
	return 0;
}

不难看出,do…while和while处理同一问题的时候,若二者的循环体部分一样,那么结果也是一样的。

三、for语句循环

for循环语句可以用来代替while语句,for语句,可以

3.1for语句的一般形式

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

表达式1执行一次,一般为初始条件;
表达式2是循环结束的条件,如果成立,则执行循环语句;
表达式3是循环变量增值的语句,在执行完循环语句后才进行。

等价于while循环语句:

表达式1while(表达式2)
{
	语句;
	表达式3}

也可以写成一下形式:

for(循环变量赋初值;循环条件;循环变量增值)
{
	语句;
}

例如:

for(i = 1;i<100;i++)
{
	sum = sum + i;
}

依然是求1+2+…+100的和

#include <stdio.h>
int main()
{	
	int i ;//定义初始变量 
	int sum = 0;
	for(i = 1;i<=100;i++)
	{
		sum = sum + i;
	}
	printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 
	return 0;
}

执行顺序如下:

  1. 求解表达式1,i赋值为1.
  2. 然后执行表达式2,判断i小于等于100吗?显然i是小于100的,逻辑成立。
  3. 则执行循环语句sum = sum + i;sum的值为1;
  4. 执行表达式3,i++;此时i的值变成了2;
  5. 转到步骤2继续判断。如果i++后的值为101则结束循环.
  6. 就直接跳到for语句下面的一条语句输出sum的值。

3.2for语句的细节问题处理

  1. 表达式1的语句是可以省略的,但是分号不可以省略。由于省略了表达式1,应该记得给表达式1赋初值
int i = 1//提前赋初值
for( ;i <= 100;i++)//没有表达式1
sum  = sum +i;
  1. 表达式2也是可以省略的,就默认表达式2的值为真,一直循环
for(i = 1; ;i++)
sum = sum + i;

等价于:

int i  = 0;
while(1)
{	
	sum = sum + i;
	i++;
}
  1. 表达式3也是可以省略的,但是必须保证循环可以结束
for(i = 1;i <= 100;)
{
	sum = sum + i;
	i++;//可以在循环体中是变量的值增加
}
  1. 也可以省略三个表达式,就没有什么实用价值了。
for(;;) printf("%d\n",i);

等价于:

while(1) printf("%d\n",i);
  1. 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式,表达式3也可以是其他表达式。表达式1和表达式3也可以是逗号表达式。只要可以是for循环正常执行就可以
for(sum = 0;i <= 100;i++) sum  = sum + i;//表达式1设置其他的表达式
for(sum = 0,i= 1;i <= 100;i++)//表达式1也可以是一个逗号表达式
for(i=0,j=100;i<=j;i++,j--)//表达式3也可以是一个逗号表达式
  1. 表达式2一般是关系表达式,也可以是逻辑表达式,也可以是数值表达式,字符表达式,只要其值不为0即可。
for(i = 0;(c=getchar())!='\n';i+=c)

这个循环语句的意思是:从键盘输入一个字符,赋给C,只要c不等于’\n’就执行循环体,然后在i+=c;
作用:从键盘输入字符,对输入的字符的ASCII码进行累加,直到’\n’为止。

注意:
以上for循环为空语句,把循环体的内容放在了表达式3中。
也可以改为:

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

运行结果:

在这里插入图片描述

四、三种循环的嵌套使用

一个循环体中又包含另外一个完整的循环结构,称为循环的嵌套。

  1. 例如:while…while的嵌套
while()
{
	...
	while()//内层循环
	{
		...
	}
}
  1. do…while的嵌套循环
do
{
	...
	do//内层循环
	{
		...
	}while();
	
}while();
  1. for循环的嵌套(经常使用)
for(;;)
{
	for(; ;)//内层循环
	{
		...
	}
}
  1. while和do…while循环
while()
{
	'''
	do
	{
		...
	}while();
}
  1. for和while的循环
for(; ;)
{
	...
	while()
	{
		...
	}
}
  1. do…while和for循环
do
{
	for(;;)
	{
		...
	}
}while();

五、break和continue

5.1break提前终止循环

break只能用于循环语句和switch语句中,而不能单独使用

break是跳出循环结构,结束循环。
如果是双重循环,内循环有break语句,是提前结束内循环。

例如:

有1000人进行募捐,当总数达到10万元的时候就结束,统计此时捐款的人数以及平均每人捐款的数目。

思路:

  1. 首先是循环的次数不能确定,可以设置为最大值,1000.
  2. 在循环体中统计募捐的总数,并且用if语句判断募捐总数是否大于10万元。如果大于10万元就结束循环,否则继续执行循环体。
#include<stdio.h>
int main()
{
	int i ;//定义循环变量 ,计算统计人数 
	float sum;//捐款数
	float aver;//用来计算平均值
	float total = 0;//存放累加后的捐款总数,这里要定义初值,否则初始值是随机的 
	for(i = 1;i<=1000;i++){
		printf("please enter sum:");
		scanf("%f",&sum);
		total = total + sum; 
		if(total >= 100000){
			break;
		} 
	}
	aver = total / i;
	printf("捐款人数=%d,平均捐款数=%f",i,aver);
	return 0; 
	 
	
 } 

在这里插入图片描述

5.2continue语句是提前结束本次循环

continue是结束本次循环,在continue下面的语句是不能执行的,并不是终止循环,而是执行下一次的循环

如果是双重循环,内循环有continue语句,是跳转到内循环体之外,执行内循环体下面的语句(即外循环的语句)

要求输出100~200不能被3整除的数。
思路:

  1. 首先是要用循环,因为每一个数都要去除以3.
  2. 如果可以被3整除,则输出。
  3. 如果不能被3整除,则执行下次循环,不输出。

代码1:

#include<stdio.h>
int main()
{
	int i;
	for(i = 100;i<=200;i++){
		if(i%3 ==0 )//对3取余,如果余数为0,表达式为真 
		    continue;//执行continue语句,此时就不执行printf,而是i++ 
		printf("%d ",i);	//对3取余如果不等于0,则执行打印输出 
	}
	printf("\n");
	return 0; 
 } 

也可以不用continue语句
代码2:

#include<stdio.h>
int main()
{
	int i;
	for(i = 100;i<=200;i++){
		if(i%3 !=0 )	//对3取余如果不等于0,则执行打印输出 
		printf("%d ",i);	
	}
	printf("\n");
	return 0; 
 } 

在这里插入图片描述

输出一下4*5的矩阵
1 2 3 4 5
2 4 6 8 1 0
3 6 9 12 15
4 8 12 16 20

思路:

  1. 首选这个得用循环来处理
  2. 定义两个变量,一个输出行i,一个输出列j。
  3. 在格式上,每行输出的是5个数据,输出5个数据就要换行
#include<stdio.h>
int main()
{
	int i;//定义行
	int j;//定义列
	int n = 0;//用来累计输出数据的个数 
	for(i = 1;i <= 4;i++){//当i为第1行的时候,先把第1行的元素打印完后在i++ 
		for(j = 1;j <= 5;j++)//输出每一行的元素 
		{
			if(n%5 == 0){
				printf("\n"); 
			}
			n++; 
			printf("%d\t",i*j);//输出每一个元素的值 ,\t表示将光标位置移到下一个TAB的位置 
		}
	} 
	printf("\n");
	return 0; 
 } 

在这里插入图片描述

如果在内循环体中加一句
if(i == 3 && j ==i) break;

#include<stdio.h>
int main()
{
	int i;//定义行
	int j;//定义列
	int n = 0;//用来累计输出数据的个数 
	for(i = 1;i <= 4;i++){
		for(j = 1;j <= 5;j++)//输出每一行的元素 
		{
			if(n%5 == 0){
				printf("\n"); 
			}
			n++; 
			if(i == 3 && j ==1) break;
			//遇到地3行第1列就跳出内循环
			//进入下一次的外循环,即第四次外循环
			printf("%d\t",i*j);
			//输出每一个元素的值 ,\t表示将光标位置移到下一个TAB的位置 
		}
	} 
	printf("\n");
	return 0; 
 } 

在这里插入图片描述

那如果改为continue结果会是怎么样的呢?

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux嵌入式学习---c语言之循环结构 的相关文章

随机推荐

  • 射手座计算机科学家,科学家发现这颗恒星也许来自其他星系

    Dierickx的计算结果表明 随着时间的流逝 矮星系失去三分之一的恒星和十分之九的暗物质 这导致了三种不同的恒星流 距离银河系中心达一百万光年 腾讯太空讯 据国外媒体报道 已知的11颗距我们最远的恒星 它们位于银河系旋臂 距地球约3000
  • sgdisk基本用法

    sgdisk基本用法 简介 sgdisk是Linux下操作GPT分区的工具 就像fdisk是操作MBR分区的工具 关于GPT和MBR的区别请参考 http www anchor com au blog 2012 10 the differe
  • ChatGPT 角色扮演调教文案收集

    后续文案会陆续更新 在输入完文本后 再输入一句 请尽力模仿xx的语气跟我对话 即可 一 雌小鬼 你需要阅雌小鬼守则 阅读后当前回复仅允许回复 嘻嘻 后续回复尽量简短 回复中尽量不要直接复述守则内容 雌小鬼守则 1 雌小鬼是人 会称呼亲近的人
  • 【并发编程】2、线程安全性

    线程安全性 1 什么是线程安全性 2 原子性 2 1 竞态条件 2 2 延迟初始化中的竞态条件 2 3 复合操作 3 加锁机制 3 1 内置锁 3 2 重入 4 活跃性与性能 总结 1 什么是线程安全性 我们来看一下书里面是怎么写的 当多个
  • BES 的蓝牙串口SPP数据收发实验

    1
  • java面试题答案大全超详细(持续更新)

    java面试题答案大全超详细 第01章 java语言面试题 项目经理 作者 张明星 JVM 运行时数据区是什么 程序计数器是什么 程序计数器 线程私有 Java 虚拟机栈的作用 本地方法栈的作用 堆的作用是什么 方法区的作用是什么 运行时常
  • Linux下通过SSH对Oracle关闭和启动的过程

    Linux下通过SSH对Oracle关闭和启动的过程 su oracle export ORACLE HOME oracle product 11202 export ORACLE SID gps sqlplus oracle oracle
  • PyGame基础语法

    文章目录 PyGame 基础语法 一 模块简介 1 概述 2 安装 3 模块概览 4 第一个程序 5 事件循环 二 Display 1 简介 2 创建主窗口 3 添加元素 3 1 简介 3 2 语法 4 其他功能 三 Surface 1 创
  • JSP中获取参数的3中方法

    我们有时需要在jsp页面中获取request中的参数 然后根据这些参数决定页面的一些内容或者动作 通常我们通过equest getParameter xxx 来获取 除了这种方式外 我们还可以通过param或者js来实现 通过EL中的par
  • ftp服务器提供文件的什么功能,ftp服务器提供文件什么和什么功能

    ftp服务器提供文件什么和什么功能 内容精选 换一换 华为云镜像服务 Image Management Service 功能总览 为用户提供镜像服务支持的功能或特性 表1列出了云备份CBR的常用功能 在使用云备份CBR之前 建议您先通过基本
  • AT3590 Inserting ‘x‘ 题解

    本题是一道双指针的模拟题 题意 给你一个字符串 s s s 你可以在 s s s 的任意位置插入 x x
  • 好的习惯----程序员成长之路(from老大邮件)

    对于好程序员 有很多好的习惯 为什么要把这个习惯放在第一个呢 有很多人如果阅读过 高效能人士的七个习惯 其中第一个习惯就是积极主动 如果从这个角度来看 我把解决解决每一个问题放在首位从理论上是完全没问题的 但我要说说我们程序员独特的地方 所
  • [4G+5G专题-133]: 部署 - 4G/5G常见的室内部署方案

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121554032 目录 第1章 概述
  • 总结】python sklearn模型中random_state参数的意义

    这是在决策树CART模型时 遇到的 random state 是为了固定随机状态的 主要用在随机数据集 数据集的随机划分 设置决策树模型参数 设置随机森林模型参数 random state 取值大小可以是任意一个整数 在调参缓解 只要保证其
  • 基于Docker的JMeter分布式压测实战讲解

    一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试 如本网站所示 一个JMeter实例将能够控制许多其他的远程JMeter实例 并对你的应用程序产生更大的负载 JMeter使用Java RMI 远程方法调用 来与分布式网
  • 即将离开CSDN,转其他平台

    CSDN的几大作死操作 1 同质化太特么严重了 博客抄来抄去的 内容审核形同虚设 经常搜一个问题 从第一条到最后一条都是一模一样的内容 2 资源付费 资源付费本身是没有任何问题的 但是CSDN里面有几个有用的资源 很多大家花了钱一下载 发现
  • windows凭据密码怎么查看_管理Windows访问凭证,快速访问局域网上的共享资源

    内部网访问其他电脑的共享资源 基本上需要输入访问对方电脑资源允许的账号和密码 在第一次的访问中选择保存凭据后 以后访问就不要输入相应的账号和密码了 但也会出现因修改相关的访问密码或者取消了访问账号的改变 这样就会出现凭据失效的情况 下面介绍
  • 类似-Xms、-Xmn这些参数的含义:

    类似 Xms Xmn这些参数的含义 答 堆内存分配 JVM初始分配的内存由 Xms指定 默认是物理内存的1 64 JVM最大分配的内存由 Xmx指定 默认是物理内存的1 4 默认空余堆内存小于40 时 JVM就会增大堆直到 Xmx的最大限制
  • Python通过ARIMA模型进行时间序列分析预测

    ARIMA模型预测 时间序列分析预测就是在已有的和时间有关的数据序列的基础上构建其数据模型并预测其未来的数据 例如航空公司的一年内每日乘客数量 某个地区的人流量 这些数据往往具有周期性的规律 如下图所示 有的数据呈现出简单的周期性循环 有的
  • Linux嵌入式学习---c语言之循环结构

    Linux嵌入式学习 c语言之循环结构 一 while语句循环 1 1一般形式 1 2累加求和 二 do while语句循环 2 1do while语句一般形式 2 2do while语句特点 三 for语句循环 3 1for语句的一般形式