【C 学习】10-循环结构

“知道做不到就是不知道”

一、条件循环

1. while

只要条件为真(true),就会重复执行循环体内的代码。

while (条件) {// 循环体(要重复执行的代码)
}//示例
int i = 1;
while (i <= 5) {printf("%d\n", i);i++;  // 让 i 递增,否则会无限循环
}输出:
1
2
3
4
5

(1)检查 条件是否为真(true)。

(2)如果为真,执行循环体代码。

(3)再次检查 条件,重复上述过程。

(4)如果 条件为假(false),退出循环。

2. do-while

do-while在进入循环的时候不做检查,而是执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足,则继续执行下一轮;不满足,则结束循环。

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

注意事项:

(1)不要忘记在while条件最后的分号!!

(2)while和do-while循环的区别就在于前者是先判断条件再执行语句;后者是先执行1次语句,再判断条件。

(3)对比判断条件:if是一次性的,while是反复多次的。

(4)要求在循环体内有结束循环的机会,否则就会进入死循环。

3. 示例1-猜数游戏

让计算机随机产生一个数,然后让用户来猜。用户每输入一个数字,就告诉用户是输大了,还是输小了,直到用户猜中为止,最后再输出计算机一共猜了多少次。

分析:可以知道,只要用户输入的数字a和计算机随机生成的数字不相等,循环就应该继续执行下去,所以a与随机数相等就是循环的停止条件。

补充:每次使用rand()函数就得到一个随机的整数。计算机随机生成的数一般都比较大,为了获取两位整数,可以将数据在输出的时候对100取余。a%n(得到的结果是0~n-1)

printf("猜数字游戏(1-100)开始!\n");while (1) {printf("请输入你的猜测:");scanf("%d", &guess);attempts++;if (guess > target) {printf("太大了!\n");} else if (guess < target) {printf("太小了!\n");} else {printf("恭喜你猜中了!数字是 %d。\n", target);printf("你一共猜了 %d 次。\n", attempts);break;}
}return 0;

4. 示例2-整数逆序

基本的方法:先对10取余,得到个位数,再除以10,去掉个位数;按此方法,再得到十位数、百位数……

(1)要在写程序之前就确定好需要哪些变量;

(2)不同的题目有不一样的要求,700对应的是007还是7,其表达的意思都是不一样的,但是前者就算使用printf(不换行)也是可以做到的;后者有个十百千……位具体的要求,需要乘以相应的倍数。

#include <stdio.h>int main() {//不保留前导零,计算数值int num, reversed = 0;printf("请输入一个最多三位数的整数:");scanf("%d", &num);// 使用 while 循环计算逆序while (num > 0) {reversed = reversed * 10 + num % 10;num /= 10;}printf("逆序结果:%d\n", reversed);return 0;
}输出:
输入:700
输出:7   // 因为 007 和 7 数值相同

二、for循环

for(初始动作(1);条件(2);每轮的动作(3))
{//语句块(4)
}

1. 在条件为真的情况下,执行的顺序是(1)-(2)-(4)-(3);如果不满足条件(2),就直接停止;如果满足条件(2),则一定会执行(4)、(3) 

2. (1)和(3)可以分别放到for语句的前后,在括号中省略,此时相当于while语句。

初始动作(1)for(  ;条件(2);   )
{//语句块(4)
}每轮的动作(3)

理解:for循环就像一个计数循环:设定一个计数器,初始化,然后在计数器达到某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定的步进进行调整:++或者--

3. 注意事项

(1)求和的程序初始值设为0;求积的程序初始值设为1。

(2)循环控制变量只在循环里面被用到了,在循环外面是无法访问的,因此可以把该变量的定义直接写在for语句中去。

(3)通过控制for语句后面的条件,可以控制语句能否进入到循环中,进而简化运算。比如说for(int i = 1;i<=i,i*i),这个语句就根本没有意义,就可以改变判断条件,让过程跳过该语句。

4. 循环的选择

(1)次数:i=0;i<5;i++   相当于  i=1;i<=5;i++  初始值和条件判断是互相关联的!!

(2)选择方法

        a)如果有固定的次数——for
b)如果无论如何必须要执行一次——do-while
c)其他情况——while

三、循环嵌套

1. 嵌套的循环

(1)外层循环控制行数,内层循环实行具体的语句(计算、空格…)

注意:

(1)每一层循环里面的计数变量应该是有区别的

(2)注意在for循环里面声明的变量,不一定非要出现在条件语句里面,只要能够控制循环的结束即可

(2)具体案例(右侧图案)

#include <stdio.h>int main() {int rows = 4; // 金字塔的行数for (int i = 0; i < rows; i++) {// 打印前导空格(用于居中)for (int space = 0; space < rows - i - 1; space++) {printf("  ");}// 打印左半部分(递减字母)for (int j = i; j >= 0; j--) {printf("%c ", 'A' + j);}// 打印右半部分(递增字母,从第二个字母开始)for (int j = 1; j <= i; j++) {printf("%c ", 'A' + j);}printf("\n");}return 0;
}输出:A B A B C B A B C 
D C B A B C D 

(3)提高程序效率的方法

        a)在满足题目条件的情况下,在for循环中,用“break”提前结束程序的循环部分;
b)利用if语句的特点,用0和非0来标志是否进入循环以及“返回值”。

2. 跳出嵌套训循环

案例-凑硬币:如何用1/2/5角的硬币凑出10元以下的金额?

(1)接力break(传统教材方式):因为break和continue只能控制最近的循环,所以单纯地把break放在想要结束的语句后面是行不通的。故同样需要一个变量来记录语句的成功和失败。1表示成功;0表示失败。在判断语句中给变量重新赋值,之后想要结束循环的时候就可以直接“if(exit==1) break;”

(2)“goto语句”:离开所有的循环!!跳到最外面去!!最好只是在有多重嵌套的环境下使用。很多人认为这个“goto”破坏了程序的结构性!!

四、其他“碎碎念”

  1. 进入循环之前尽可能的保留一份原有数据,输出的时候可能会用到(新定义一个变量用于存储);
  2. 循环条件决定了能不能进入循环体 : x>2?x>=2?
  3. 预先设定的用于计数的变量和循环进入的条件是互相影响的,要考虑能不能进,计数次数是多了还是少了,要实践。刚开始的时候可以用表格/手写的方式分析;
  4. 自加、自减,要注意放在语句中的位置!(会影响循环的开始和结束)
  5. 循环控制
  • break:跳出最近的循环
  • continue:跳过最近的循环内部剩余的语句,到达该次循环的最后,再进入下一轮的循环(或者开始外部代码)!

6. 不借用第三个变量实现数值交换

//用其中一个变量保存和,可以作差互相计算int i=3;j=5;j=i+j;  //j=3+5=8
i=j-i;  //i=8-3=5
j=j-i;  //j=8-5=3

写在最后:

更新C语言学习笔记

如有错误,烦请多多批评指正!

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

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

相关文章

音视频的下一站:协议编排、低时延工程与国标移动化接入的系统实践

一、引言&#xff1a;音视频的基础设施化 过去十年&#xff0c;音视频的两条主线清晰可辨&#xff1a; 娱乐驱动&#xff1a;直播、电商、短视频把“实时观看与互动”变成高频日常。 行业扩展&#xff1a;教育、会议、安防、政务逐步把“可用、可管、可控”引入产业系统。 …

SAM-Med3D:面向三维医疗体数据的通用分割模型(文献精读)

1) 深入剖析:核心方法与图示(Figure)逐一对应 1.1 单点三维提示的任务设定(Figure 1) 论文首先将3D交互式分割的提示形式从“2D逐片(每片1点,共N点)”切换为“体素级单点(1个3D点)”。Figure 1直观对比了 SAM(2D)/SAM-Med2D 与 SAM-Med3D(1点/体) 的差异:前两者…

【Spring】原理解析:Spring Boot 自动配置进阶探索与优化策略

一、引言在上一篇文章中&#xff0c;我们对 Spring Boot 自动配置的基本原理和核心机制进行了详细的分析。本文将进一步深入探索 Spring Boot 自动配置的高级特性&#xff0c;包括如何进行自定义扩展、优化自动配置的性能&#xff0c;以及在实际项目中的应用优化策略。同时&…

OpenCV:图像直方图

目录 一、什么是图像直方图&#xff1f; 关键概念&#xff1a;BINS&#xff08;区间&#xff09; 二、直方图的核心作用 三、OpenCV 计算直方图&#xff1a;calcHist 函数详解 1. 函数语法与参数解析 2. 基础实战&#xff1a;计算灰度图直方图 代码实现 结果分析 3. 进…

docke笔记下篇

本地镜像发布到阿里云 本地镜像发布到阿里云流程 镜像的生成方法 基于当前容器创建一个新的镜像&#xff0c;新功能增强 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]] OPTIONS说明&#xff1a; OPTIONS说明&#xff1a; -a :提交的镜像作者&#xff1b; -m :提交时的说…

《大数据之路1》笔记2:数据模型

一 数据建模综述 1.1 为什么要数据建模背景&#xff1a; 随着DT时代的来临&#xff0c;数据爆发式增长&#xff0c;如何对数据有序&#xff0c;有结构地分类组织额存储是关键定义&#xff1a; 数据模型时数据组织和存储的方法&#xff0c;强调从业务、数据存取、使用角度 合理存…

“量子能量泵”:一种基于并联电池与电容阵的动态直接升压架构

“量子能量泵”&#xff1a;一种基于并联电池与电容阵的动态直接升压架构摘要&#xff1a;本文揭示了一种革命性的高效电源解决方案&#xff0c;旨在彻底解决低电压、大功率应用中的升压效率瓶颈与电池一致性难题。该方案摒弃传统磁性升压拓扑&#xff0c;创新性地采用并联电池…

DeepSeek实战--自定义工具

1. 背景 当前已经有很多AI基础平台&#xff08;比如&#xff1a;扣子、Dify&#xff09;&#xff0c;用户可以快速搭建Agent&#xff0c;那怎样将已有的接口能力给大模型调用呢 &#xff1f; 今天我们来探索一个&#xff0c;非常高效、快捷的方案&#xff1a;将http接口做成Dif…

“移动零”思路与题解

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。思路讲解&#xff1a;举例如下&#xff1a;实现代码是&#xff1a;class Solution { public:v…

关于行内元素,行内块元素和块级元素

1、什么是行内元素&#xff0c;什么是行内块元素&#xff0c;什么是块级元素行内元素的特点&#xff1a;不独占一行&#xff0c;相邻元素会在同一行显示&#xff0c;直到一行排不下才换行。宽度和高度由内容本身决定&#xff0c;无法通过width&#xff0c;height手动设置&#…

⽹络请求Axios的概念和作用

Axios 是一个基于 ​​Promise​​ 的轻量级、高性能 ​​HTTP 客户端库​​&#xff0c;主要用于在浏览器和 Node.js 环境中发起 HTTP 请求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;。它通过简洁的 API 和强大的功能&#xff0c;简化了前端与后端之间的数据交互过…

在AgentScope中实现结构化输出

在AgentScope中实现结构化输出 概述 在AgentScope框架中&#xff0c;结构化输出功能允许开发者定义明确的输出模式&#xff0c;确保AI模型的响应符合预期的格式和约束。本教程将介绍如何使用AgentScope的structured_model参数来实现结构化输出。 结构化输出的优势 数据一致性&a…

Linux 磁盘I/O高占用进程排查指南:从定位到分析的完整流程

在Linux服务器运维工作中&#xff0c;磁盘I/O瓶颈是导致系统性能下降的常见原因之一。当服务器出现响应缓慢、应用卡顿等问题时&#xff0c;及时定位并解决高I/O占用进程就显得尤为重要。本文将从核心思路出发&#xff0c;通过“确认问题-定位磁盘-锁定进程-深入分析”四个步骤…

解决React中通过外部引入的css/scss/less文件更改antDesign中Modal组件内部的样式不生效问题

不生效原因Ant Design 的 Modal 默认通过 ReactDOM.createPortal 挂在 <body> 下&#xff0c;与你的组件树平级&#xff0c;所以写在 .module.css / scoped less 里的选择器根本匹配不到它&#xff0c;就算写全局样式&#xff0c;也可能因为权重不足或异步挂载时机而“看…

day41 51单片机最小系统、GPIO控制、时序逻辑器件(74HC138/595)与LED点阵驱动原理

day41 51单片机最小系统、GPIO控制、时序逻辑器件&#xff08;74HC138/595&#xff09;与LED点阵驱动原理一、嵌入式系统基础概念 1.1 嵌入式系统定义先设计硬件&#xff0c;基于硬件设计软件实现一个具体的功能 —— 专用的计算机系统硬件/软件可剪裁&#xff1a;根据功能需求…

html列表总结补充

1.有序列表的type属性不同的type值表示不同的排序标号1 表示列表项目用数字标号&#xff08;1,2,3...&#xff09; 1 a 表示列表项目用小写字母标号&#xff08;a,b,c...&#xff09; 2 A 表示列表项目用大写字母标号&#xff08;A,B,C...&#xff09; 3 i 表示列表项目用小写罗…

smartctl Current_Pending_Sector 硬盘待处理扇区

smartctl -a /dev/sdae当前值: 312 个待处理扇区 严重警告信号&#xff0c;硬盘发现了 312 个可疑扇区&#xff0c;正在等待重新分配 197 Current_Pending_Sector 0x0022 100 100 000 Old_age Always - 312读取错误频发 错误计数: 38 次 ATA 错误 …

MATLAB1-基本操作和矩阵输入-台大郭彦甫

目录 基础的指令 format 矩阵和向量 找出某行某列的矩阵元素 快速打出多个矩阵或者向量 矩阵连接 矩阵计算 一些特殊矩阵fuction 矩阵相关函数 基础的指令 clc 清空命令行窗口 clear all 清空工作区的全部变量 who 将工作区的全部变量显示出来 whos 工作区的变量信息详…

【CSS 3D 交互】实现精美翻牌效果:从原理到实战

效果图 前言 在现代网页设计中&#xff0c;交互效果是提升用户体验的重要手段。3D 翻牌效果作为一种常见的交互模式&#xff0c;广泛应用于卡片展示、问答切换、产品详情等场景。本文将详细介绍如何使用 CSS 3D 技术实现一个精美的翻牌效果&#xff0c;并深入解析其实现原理。…

Python核心技术开发指南(062)——静态方法

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 静态方法的定义 静态方法是类中定义的一种特殊方法,它不需要依赖类实例或类本身即可调用,也不隐含传递self(实例引用)或cls(类引用)参数。在Python中,通过@staticmethod装饰器来定义静态…