【C语言必知必会| 第七篇】循环结构入门,这一篇就够了

引言

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言必知必会】系列第七篇,介绍C语言的循环结构,结合专题优质题目,带领读者从0开始,深度掌握知识点。

在这里插入图片描述

文章目录

    • 1️⃣ 概念介绍
    • 2️⃣代码过渡
    • 3️⃣知识点讲解
    • 4️⃣编程实例
    • 5️⃣总结


1️⃣ 概念介绍

循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。

它由循环体中的条件,判断继续执行某个功能还是退出循环。

根据判断条件,循环结构又可细分为以下两种形式:

先判断后执行的循环结构先执行后判断的循环结构

在这里插入图片描述

举个例子:当我们计算阶乘3!时,可以看作初始值为1的i的自增再相乘,即i*(i+1)*(i+2)

如果计算2023!的时候,就不需要一直让程序直接计算1*2*3*4*5*6*......*2023

而这,就是循环结构的优势。


2️⃣代码过渡

在正式开始选择循环结构的代码实现之前,我们需要掌握一些运算符等的知识点。

自加、自减运算符
形式:前缀式 ++i, --i 后缀式 i++, i–
++i和i++都是自增,但a=++i表示先对i自增,再赋值给a
a=i++表示先将i赋值给a,i再自增

我们看以下代码

int  i=3,  j=3, x, y;
x=++i;     y=j--;     
printf(%d,%d;%d,%d\n", i, x, j,y); 

程序的结果是4,4,2,3

是因为x=++i中,i自增为4,再赋值给x,所以x也为4

y=–j中,j先赋值给y,所以y为3,j再自减,所以j最后为2

注意:仅当独立成句时,2者结果相同,即 i++ 与 ++i 得到的 i 是一样的

逗号运算符

形式与作用:

形式:表达式1 ,表达式2,…, 表达式n

作用:将多个表达式连接成一个表达式

求解顺序:式1->式2,最后求式n,以式n值为结果值。

如下

 int  i,  j;j=( i=2,  ++i );printf( "i=%d,j=%d\n",  i, j );

先计算i=2,即2,再计算++i,即3,所以最后j=3,程序输出3,3


3️⃣知识点讲解

这一节我们将细致讲讲while语句形式与执行过程、do while语句形式与执行过程、for语句形式与执行过程

while语句

基本形式:

while( 表达式 )  {  语句  }

举个例子:

 int  i=1;   /*循环变量初值*/ while( i<=2 )  /*循环头,循环条件*/{ puts("$$$$");   //循环体puts("$$$$");   //循环体       i++;  /*使循环趋于结束的操作*/ }

当while表达式为真时,执行循环体内的语句,否则结束while语句并执行其后的语句。

什么意思呢?我们看上面这个例子:
一开始i为1,由于满足i<=2这个条件,所以进入while语句,输出两行的$$$$ ,接着i自增,变为2。

i为2,满足i<=2这个条件,所以所以进入while语句,输出两行的$$$$ ,接着i自增,变为3。

而i=3不满足i<=2这个条件,所以结束循环。

于是整个程序输出:

$$$$
$$$$
$$$$
$$$$

do while 语句

基本形式:

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

do while 语句最大的一个特点就是,不管表达式,先执行一次循环语句。再通过表达式判断需不需要执行循环语句。

看下面这个例子:

int   i=1;
do
{ puts("$$$$"); puts("$$$$");    i++;
} while( i<=2 ); /*分号不能省*/ 

首先,不管怎样,都执行循环语句,所以输出$$$$,并且i变为2

然后由于i=2,是满足i<=2这个条件的,所以执行循环语句,输出$$$$,并且i变为3

接着,i=3不满足i<=2这个条件,所以结束循环。

注意: do-while循环1~n次,while通常循环 0~n次。

最后我们讲一下for循环

基本形式:

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

在这里插入图片描述
表达式1初始化->式2条件->循环体语句->式3结束->式2

我们看这个例子:

int  i;
for( i=1; i<=2; i++ )
{puts("$$$$");puts("$$$$");
}

for语句中,先将1赋值给i,然后判断i是否<=2,由于i满足该条件,所以执行循环体,输出两行的$$$$,并且使i自增

i自增后变为2,满足i<=2,所以执行循环体,输出两行的$$$$,并且使i自增。

i变为3,不满足循环条件,结束循环。

注意:for后的小括号内必须含2个分号


4️⃣编程实例

循环结构的主要形式、知识点、注意事项我们已讲解完毕。

接着我们通过编程实例,进行实战讲解。

1.题目要求:求1+2+…+100的值。

1.解题思路

我们对i初始化为1,并且对其自增,将每次自增的结果相加即可。

2.代码实现

int   i=1,  sum=0; /* i循环变量,sum累加结果*/
while( i<=100) /* 设定能进入循环的条件表达式*/
{ sum=sum+i;   /* 或 sum +=i;*/i++; /* 使循环趋于结束的操作, 循环变量的步长=1*/}
printf("1+2+3+…+100=%d\n",  sum);

3.添加预处理命令等,将代码格式化

#include <stdio.h>int main() {int   i=1,  sum=0; /* i循环变量,sum累加结果*/
while( i<=100) /* 设定能进入循环的条件表达式*/
{ sum=sum+i;   /* 或 sum +=i;*/i++; /* 使循环趋于结束的操作, 循环变量的步长=1*/}
printf("1+2+3+…+100=%d\n",  sum);return 0;
}

编译运行结果:

在这里插入图片描述
注意:进行累加操作时,累加变量sum, i必须初始化,如果sum没有初始化,系统会自动将一个未知的值赋值给sum

2.题目要求:求999内的水仙花数

1.解题思路

我们先看看什么是水仙花数:

水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。

例如153=1^3 + 5^3 + 3^3

2.代码实现

int  x,  g,  s,  b; /*x表示三位整数,g表示个位,s表示十位   b表示百位*/
x=100;//保证x为三位数
while( x<=999 )
{  g=x%10;  //计算个位数s=(x/10)%10;  //计算十位数b=(x/100)%10;  //计算百位数if( x==g*g*g+s*s*s+b*b*b)printf("%6d", x);    /*输出满足水仙花条件的数*/x++;
}
printf("\n");

3.添加预处理命令等,将代码格式化

#include <stdio.h>int main() {
int  x,  g,  s,  b; /*x表示三位整数,g表示个位,s表示十位   b表示百位*/
x=100; //保证x为三位数
while( x<=999 )
{  g=x%10;  //计算个位数s=(x/10)%10;  //计算十位数b=(x/100)%10;  //计算百位数if( x==g*g*g+s*s*s+b*b*b)printf("%6d", x);    /*输出满足水仙花条件的数*/x++;
}
printf("\n");return 0;
}

编译运行结果:

在这里插入图片描述

注意:%6d表示按指定格式显示数据:6是输出数据应占据的最少位数。
当要显示的数据不足6位时,数据左边补空格;当要显示的数据位数超6位时,显示实际位数。

3.输入一个数,判断这个数是否为素数

解题思路:

先看看什么是素数:只能被1和它本身整除的正整数(1不是素数,2是最小的素数)

因此对于某个数x,只要判定这个数不能被2到x-1整除,就能证明该数字是素数。

2.代码实现

#include <stdio.h>
int main()
{int x;scanf("%d",&x);for(int i=2;i<=x-1;i++){if(x%i==0)  //一旦x能被其中一个数整除,就判断它不是素数{printf("%d不是素数",x);}}//当x不能被所有数整除,就判断它为素数printf("%d是素数",x);
}

但是这个代码块出现了一个问题:不管怎么样,都会输出x是素数

而且,如果输入的数为12,会连续输出4个“12不是素数”

在这里插入图片描述
该添加什么条件来避免这个错误呢?

一旦满足 x%i==0 ,则输出“x不是素数”并且跳出循环

当 i 自增到最后都不满足这个循环时, i 数值上变为x,以此来判断x为素数

	for(i=2;i<=x-1;i++){if(x%i==0)  //一旦x能被其中一个数整除,就判断它不是素数{printf("%d不是素数\n",x);break;//break跳出for循环}}//当x不能被所有数整除,就判断它为素数if(x==i){printf("%d是素数",x);
}}

3.添加预处理命令等,将代码格式化

#include <stdio.h>
int main()
{int x,i;scanf("%d",&x);for(i=2;i<=x-1;i++){if(x%i==0)  //一旦x能被其中一个数整除,就判断它不是素数{printf("%d不是素数\n",x);break;//break跳出for循环}}//当x不能被所有数整除,就判断它为素数if(x==i){printf("%d是素数",x);
}}

编译运行结果:

在这里插入图片描述

至此,循环结构的编程实例已讲解完成,读者需要躬身实践来掌握C语言循环结构相关知识点。


5️⃣总结

此文为 【C语言必知必会】系列第七篇 ,带领读者掌握C语言的循环结构,带领读者从0开始,深度掌握知识点。

以题代练对于C语言的学习是十分重要的,所以专栏将提供优质C语言编程题,带领读者全方位掌握C语言,读者可订阅专栏持续跟进。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法|动态规划No.22】leetcode115. 不同的子序列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

构建跨平台应用程序:Apollo在移动开发中的应用

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

ubuntu终端命令行下如何使用NetworkManager(netplan)来配置wifi网络

最近在给家里折腾一个文件共享服务器给家里的小米摄像头保存监控视频用。树莓派太贵了&#xff0c;找来找去发现香橙派orangepi zero3 是最低成本的替代解决方案&#xff08;网络足够快&#xff0c;CPU的IO能力足够强&#xff09;&#xff0c;香橙派orangepi zero3的操作系统是…

electron学习笔记

electron&#xff1a;大前端背景下&#xff0c;用node.js做桌面端app的工具 1、安装&#xff1a;npm i electron 实际上是chromium Node.js 2、创建一个窗口 3、主进程&#xff08;操作硬件等&#xff0c;commonJS&#xff09;与渲染进程&#xff08;渲染页面&#xff0c;E…

凉鞋的 Godot 笔记 202. 变量概述与简介

202. 变量概述与简介 想要用好变量不是一件简单的事情&#xff0c;因为变量需要命名。 我们可以从两个角度去看待一个变量&#xff0c;第一个角度是变量的功能&#xff0c;第二个是变量的可读性。 变量的功能其实非常简单&#xff0c;变量可以存储一个值&#xff0c;这个值是…

Godot2D角色导航-自动寻路教程(Godot获取导航路径)

文章目录 开始准备获取路径全局点坐标 开始准备 首先创建一个导航场景&#xff0c;具体内容参考下列文章&#xff1a; Godot实现角色随鼠标移动 然后我们需要设置它的导航目标位置&#xff0c;具体关于位置的讲解在下面这个文章&#xff1a; Godot设置导航代理的目标位置 获取…

Git基本命令和使用

文章目录 1、Git本地库命令1.1、初始化本地库1.2、设置用户签名1.3、查看本地库状态1.4、将工作区的修改添加到暂存区1.5、将暂存区的修改提交到本地库1.6、历史版本 2、分支操作2.1、查看分支2.2、创建分支2.3、分支合并时产生冲突 3、Gitee远程库实操3.1、克隆远程仓库3.2、创…

基于react18+arco+zustand通用后台管理系统React18Admin

React-Arco-Admin轻量级后台管理系统解决方案 基于vite4构建react18后台项目ReactAdmin。使用了reactarco-designzustandbizcharts等技术架构非凡后台管理框架。支持 dark/light主题、i18n国际化、动态路由鉴权、3种经典布局、tabs路由标签 等功能。 技术框架 编辑器&#xff…

(原创)实现左侧TextView宽度自适应并且可以显示右侧TextView的布局

效果展示 先来看看上面的效果 左侧的文字宽度是自适应的&#xff0c;但是右侧又有一个TextView 左侧的文字被限制不能把右侧的挤出屏幕外面 所以如果左侧文字超过指定宽度后多余部分就用省略号表示 实际开发中这种情况在一些列表的item中用的比较多 但实际实现的时候会发现 左侧…

常见问题-找不到vcruntime140.dll无法继续执行代码解决方案

本文将介绍五种不同的解决方案&#xff0c;帮助大家解决这个问题。 首先&#xff0c;我们需要了解为什么会出现找不到vcruntime140.dll的情况。这种情况通常是由于以下几个原因导致的&#xff1a; 1. 系统环境变量设置不正确&#xff1a;系统环境变量中可能没有包含vcruntime…

C++QT---QT-day3

#include "widget.h" #include "ui_widget.h" //需要在.pro文件第一行加 texttospeechWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->lineEdit->setPlaceholderText("时:分:秒");//设…

华为ICT——云计算基础知识、计算类技术听课笔记

ICT(information and communications technology):信息与通信技术 传统IT架构缺点 TCO&#xff1a;总体拥有成本 云计算模式 云计算价值 云计算通用点 虚拟化技术&#xff1a;将单台物理服务器虚拟为多台虚拟机使用&#xff0c;多台虚拟机共享物理服务器硬件资源。 虚拟化本质…

服务器往浏览器推消息(SSE)应用

1&#xff0c;SSE 和 WebSocket 对比 SSE&#xff08;服务器发送事件&#xff09; SSE是一种基于HTTP的单向通信机制&#xff0c;用于服务器向客户端推送数据。它的工作原理如下&#xff1a; 建立连接&#xff1a;客户端通过发送HTTP请求与服务器建立连接。在请求中&#xff…

Python特征分析重要性的常用方法

前言 特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征&#xff0c;它是机器学习中经常使用的一种方法。 为什么特征重要性分析很重要? 如果有一个包含数十个甚至数百个特征的数据集&#xff0c;每个特征…

Oracle database 开启归档日志 archivelog

Oracle database 开启归档日志 archivelog 归档日志模式 (Archivelog Mode)。归档日志模式是一种数据库运行模式&#xff0c;它允许数据库将日志文件保存到归档日志目录中&#xff0c;以便在需要时进行恢复和还原操作。通过开启归档日志模式&#xff0c;可以提高数据库的可靠性…

驱动day2:LED灯实现三盏灯的亮灭

head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_PE_MODER 0x50006000 #define PHY_PF_MODER 0x50007000 #define PHY_PE_ODR 0x50006014 #define PHY_PF_ODR 0x50007014 #define PHY_RCC 0x50000A28#endif 应用程序 #include <stdio.h> #include <sys/…

通讯网关软件026——利用CommGate X2ORACLE-U实现OPC UA数据转入ORACLE

本文介绍利用CommGate X2ORACLE-U实将OPC UA数据源中的数据转入到ORACLE数据库。CommGate X2ORACLE-U是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;将OPC UA数据源的数据写入到ORACLE数据…

利用Nginx可视化管理工具+Cpolar实现本地服务远程访问

文章目录 前言1. docker 一键安装2. 本地访问3. Linux 安装cpolar4. 配置公网访问地址5. 公网远程访问6. 固定公网地址 前言 Nginx Proxy Manager 是一个开源的反向代理工具&#xff0c;不需要了解太多 Nginx 或 Letsencrypt 的相关知识&#xff0c;即可快速将你的服务暴露到外…

驱动编写应用程序控制三盏灯亮灭

应用程序 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main(int argc, char const *argv[]) {char buf[128] {0};int fd open("/dev/mych…

59 分割等和子集

分割等和子集 NP 完全问题&#xff08;01背包&#xff09;题解1 二维DP题解2 空间优化DP&#xff08;改为1D&#xff09; 给你一个只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&a…