C语言—循环结构

article/2025/7/28 4:55:59

目录

循环结构

 循环控制语句 

循环类型

一.while循环

语法

break在while循环中的作用 

 continue在while循环中的作用 

多组输入

清空输入缓存区

二.for循环

语法

三.do while

语法

 break和continue在do while循环中的使用


循环结构

循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。

根据判断条件,循环结构又可细分为以下两种形式:先判断后执行的循环结构和先执行后判断的循环结构。

 循环控制语句 

循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转

在正式讨论循环类型前,先大致介绍一下循环控制语句

break: 

 当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。

contine: 

告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。

循环类型

在使用代码解决一些问题时,会出现一些重复度很高的操作,需要多次执行同一块代码。在这种情况时,使用C语言提供的循环类型可以很好的解决这些问题。

C语言提供了三种循环类型 while     for    do while

一.while循环

语法

  • while(表达式)
    {循环语句;
    }
  • 表达式
  1.  表达式的返回值为任意非零值时都为真。
  2. 当条件为真时执行循环。 当条件为假时,退出循环,程序流将继续执行紧接着循环的下一条语句。
  • 循环语句
  1. 可以是一个单独的语句,也可以是几个语句组成的代码块。

例:打印1~10

#include <stdio.h>
int main()
{int i = 1;while(i<=10)    //当i<=10时 表达式返回值非零为真,进入循环{printf("%d ", i);i = i+1;        //每循环依次i自增1,第十次循环时 i自增为11。return 0;       //表达式返回值为0,结束循环。
}

 

break在while循环中的作用 

循环中遇到break,就停止后期的所有的循环,直接终止循环。

while中的break是用于永久终止循环的

举一个例子

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

 

 continue在while循环中的作用 

continue是用于终止本次循环的

本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

举一个例子

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

 在while()循环中使用continue时,可能会跳过循环中的调整部分,导致死循环

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

 

 可以发现函数没有结束,死循环了。使用continue

多组输入

     多组输入的实现也常常通过while循环来达成。再写一些题目时,会发现很多题目都有多组输入的要求,这时候使用while循环便能很好的解决问题

以判断两数大小为例

未要求多组输入代码如下:

#include<stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);if (a > b)printf("%d>%d\n", a, b);else if (a < b)printf("%d<%d\n", a, b);elseprintf("%d=%d\n", a, b);return 0;
}

 当要求多组输入时:

#include<stdio.h>
int main()
{int a =0;int b =0;while(scanf("%d %d",&a,&b) != EOF){if(a > b)printf("%d>%d\n",a,b);else if(a < b)printf("%d<%d\n",a,b);elseprintf("%d=%d\n",a,b);}return 0;
}

 可以发现在代码中多了这样一个部分

    while (scanf("%d", &n) != EOF){代码块}

这样一个代码乍然出现在面前,想必是让人 摸不着头脑。

想要理解这个代码,就需要先了解一下scanf()函数的返回值。

scanf()的返回值:

返回值类型 int

该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

返回成功匹配和赋值的个数,如下所示:

int main()
{int a = 0;int b = 0;printf("%d", scanf("%d", &a));printf("%d", scanf("%d %d", &a, &b));return 0;
}

 而EOF就让人有些摸不到头脑,转到定义便可以发现,EOF其实是一个标识符常量,值为 -1

 那么表达式 while (scanf("%d", &n) != EOF) 的意思为,当scanf()的返回值不为-1时,表达式为真,进入循环。这时候便出现了一个问题,scanf()返回值为返回成功匹配和赋值的个数,个数最小也不为 -1 ,何时会停止输入呢?当在键盘上按下 ctrl + z 时,scanf()将会返会 EOF(-1),此时循环便会结束。

多组输入的代码,也有多种写法。

比如

#include<stdio.h>
int main()
{int a = 0;int b = 0;while (scanf("%d %d", &a, &b) == 2 ) //当正确输入时返回值为2进入循环{if (a > b)printf("%d>%d\n", a, b);else if (a < b)printf("%d<%d\n", a, b);elseprintf("%d=%d\n", a, b);}return 0;
}

 还有这样写的

    while (~scanf("%d", &n)){代码块}

 这种写法与  while(scanf("%d %d",&a,&b) != EOF) 等价,只是做了一些变形。

正常输入时,scanf()的返回值为非负整数,按位取反后为非零,及表达式为真。

而当需要结束输入时,scanf()的返回值为 -1,按位取反的值恰好是0,及表达式为假,终止循环。

清空输入缓存区

while循环也可以用来清空输入缓存区

先来看一段代码

int main()
{char a = 0;char b = 0;scanf("%c", &a);scanf("%c", &b);if (a == 'a')printf("hello ");if (b == 'b')printf("world");elseprintf("haha");return 0;
}

对于程序输出的结果是不是很是疑惑?我们来看一下 变量b 中到底存了什么

 

 变量b中存储的居然是空格。

当输入  a b时输入缓存区实际输入了3个字符 'a'、' ' 、‘b’。当使用scanf("%c", &a)时‘a’被读取,

scanf("%c", &b) 时取走了‘ ’,导致了输出hello haha这一尴尬的场景。

这时使用 while ((c = getchar()) != EOF && c != '\n');便可以很好的解决问题。

while ((c = getchar()) != EOF && c != '\n') 不断地使用getchar()获取输入缓存区的内容,直到获取到'\n'为止

二.for循环

  • 语法

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

    表达式1 表达式1为初始化部分,用于初始化循环变量的。

  • 首先被执行,且只会执行一次。这一步允许声明并初始化任何循环控制变量。也可以不在这里写任何语句,只要有一个分号出现即可。

  • 表达式2 表达式2为条件判断部分,用于判断循环时候终止。

  • 表达式2将进行判断,如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。

  • 表达式3 表达式3为调整部分,用于循环条件的调整。

  • 该语句允许更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。

例:打印1~10

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

 break和continue在for循环中的作用

整体上与在while循环中差别不大,不过在for循环中使用continue不会跳过调整部分,不会出现像while循环中不当使用continue导致的死循环。

例:

使用break

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

使用continue

#include <stdio.h>
int main()
{int i = 0;for(i=1; i<=10; i++){if(i == 5)continue;printf("%d ",i);}return 0;
}

 未出现死循环

不过在使用for循环时,不建议在循环体内修改循环变量,防止 for 循环失去控制。

一般在不知需要循环几次时,往往会采用while循环。明知循环次数时,使用for循环会好很多。

三.do while

语法

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

 do while循环while很相近,不过循环至少循环一次,使用的场景有限,所以不是经常使用

例:打印1~10

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

 break和continue在do while循环中的使用

与在while中区别不大,也存在使用continue可能导致代码死循环的情况。

例:

使用break

#include <stdio.h>
int main()
{int i = 1;do{if (5 == i)break;printf("%d ", i);i++;} while (i <= 10);return 0;
}

 使用continue

#include <stdio.h>
int main()
{int i = 1;do{if (5 == i)continue;printf("%d  ", i);i++;} while (i < 10);return 0;
}

while一样,出现了死循环。


http://chatgpt.dhexx.cn/article/mASMYOpi.shtml

相关文章

利用汉字在计算机里面的编码来得到汉字的首拼音:

利用汉字在计算机里面的编码来得到汉字的首拼音&#xff1a; static public string GetChineseSpell( string strText) {int len strText.Length;string myStr "";for(int i0;i<len;i){myStr getSpell(strText.Substring(i,1));}return myStr;} static publ…

获取中文拼音首字符

2019独角兽企业重金招聘Python工程师标准>>> http://pinyin4j.sourceforge.net/ 转载于:https://my.oschina.net/soho00147/blog/1633932

Excel中文转换为拼音(大写首字母、小写首字母、全拼、全拼首首字母大写)

很多时候我们需要处理一下汉字转换为拼音的需求&#xff0c;今天给大家分享一下标题包含的一下转换方法 1 、excel通过宏可以很好的处理汉字转换为拼音的 1.1下面的是转为全拼音的宏代码 Function pinyin(p As String) As String i Asc(p) Select Case i Case -20319 To -203…

php 获取字符串完整拼音,PHP 获取中文字符串的首字符拼音字母

class"php"><?php header(Content-Type: text/html; charsetutf-8); $str"阅谁问君诵&#xff0c;水落清香浮"; echo getFirstCharCode($str); function getFirstCharCode($str){ $str iconv("UTF-8","gb2312", $str); $targe…

拼音首字符检索

原理很简单&#xff0c;找出汉字表中拼音首字符分别为“A”至“Z”的汉字内码范围&#xff0c;这样&#xff0c;对于要检索的汉字只需要检查它的内码位于哪一个首字符的范围内&#xff0c;就可以判断出它的拼音首字符。 程序更简单&#xff0c;包括3个控件&#xff1a;一个…

C#中获得汉字的首拼音(加强版)

/// <summary> /// 汉字拼音首字母列表/// 包含了20901个汉字,收录的字符的Unicode编码范围为19968至40869/// </summary>#region ChineseCharListprivate static string[] ChineseCharList { "A阿啊锕嗄厑哎哀唉埃挨溾锿鎄啀捱皑凒溰嘊敳皚癌毐昹嗳矮蔼躷噯…

C#获得汉字的首拼音

利用汉字在计算机里面的编码来得到汉字的首拼音&#xff1a; static public string GetChineseSpell( string strText) ... { int len strText.Length; string myStr ""; for(int i0;i<len;i) ...{ …

PHP中文字符串转化为英文首拼音首字母大写

效果&#xff1a; 中国 >ZG 中文转化为英文首字母 中国&#xff1a;ZG &#xff1b;中2国&#xff1a;ZG&#xff1b;z国&#xff1a;ZG1:省略了数字&#xff08;不转化&#xff09; 用法&#xff1a; $result Character::getEnByCnByString(‘i是中国人’,3);//这边的3为截…

使用完整拼音查找汉字(完整拼音,不是网上散布的首字符拼音那种方法)

注意&#xff1a;这绝不是网上散播的只能使用拼音首字符进行汉字查找的方案&#xff0c;这是一个真正的输入完整拼音得到相应汉字的解决办法。 大部分程序员眼中只有变量、函数……他们忽略生活中的一切&#xff0c;他们并不理解真正的优雅的程序解决方案往往来自生活&#xff…

基于LeNet5实现交通标志分类任务

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

Lenet5网络结构

Lenet5网络是深度学习中最基本的网络结构,开始于90年代,最早是应用于手写数字识别。受限于当时的环境,所以一开始不怎么出名。但是,在2012年,出现了Alexnet,在图像分类领域打败了所有机器学习方法。深度学习开始变得火热。 import torch import torch.nn as nn import t…

[PyTorch][chapter 41][卷积网络实战-LeNet5]

前言 这里结合前面学过的LeNet5 模型&#xff0c;总结一下卷积网络搭建&#xff0c;训练的整个流程 目录&#xff1a; 1&#xff1a; LeNet-5 2: 卷积网络总体流程 3&#xff1a; 代码 一 LeNet-5 LeNet-5是一个经典的深度卷积神经网络&#xff0c;由Yann LeCun在1998年提…

(一)Lenet5 手写数字识别原理及代码解析

模型简单&#xff0c;本地可跑 论文参考&#xff1a;Gradient-based learning applied to document recognition MNIST手写数据集 50000个训练数据 10000个测试数据 图像大小2828 10类&#xff08;0-9&#xff09; 一、python预安装库 pip install torch pip install torchvi…

【LeNet5】简单车牌识别

文章目录 1. 项目准备1.1. 问题导入1.2. 数据集简介 2. LeNet5模型2.1. 卷积神经网络2.2. 模型介绍 3. 实验步骤3.0. 前期准备3.1. 数据准备3.2. 网络配置3.3. 模型训练3.4. 模型评估3.5. 模型预测 写在最后 1. 项目准备 1.1. 问题导入 本次实践是一个多分类任务&#xff0c;…

LeNet5—论文及源码阅读

LeNet5实现图像分类 &#x1f42c; 目录: 一、概论二、论文选读三、源码精读 所用数据集介绍LeNet5模型网络构建LeNet5模型训练 测试代码 四、参考资料 一、概论 LeNet-5是一种经典的卷积神经网络结构&#xff0c;于1998年投入实际使用中。该网络最早应用于手写体字符识别应…

重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)

重学深度学习系列—LeNet5实现手写数字识别(TensorFlow2-mnist数据集) 文章目录 重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)我的环境&#xff1a;一、LeNet5简单介绍二、LeNet-5代码实现三、训练四、对图片进行预测五、训练过程截图&#xff1a;参考…

经典网络-LeNet-5

上图展示展示了 LeNet-5 模型的架构。 是Yann LeCun 教授于1998 年在论文Gradient-based learning applied to document recognition中提出的&#xff0c;它是第一个成功应用于数字识别问题的卷积神经网络。 LeNet-5 详细结构 在下面的篇幅中将详细介绍LeNet-5 模型每一层的…

深度学习---卷积神经网络之LeNet5(TensorFlow 代码实现)

一、前言 1.1 使用全连接神经网络对图像进行处理存在的问题 1、需要处理的数据量大&#xff0c;效率低 现在的图像都有着极高的像素&#xff0c;假设一张需要处理的图片像素是 1000 * 1000 * 3(彩色图片&#xff0c;具有 RGB 3 个通道)&#xff0c;使用具有 100 个隐藏单元的…

浅谈LeNet-5

浅谈LeNet-5 基于Tensorflow的实现欢迎查看我下一篇博客Tensorflow实战 LeNet-5神经网络进行手写体数字识别 一、LetNet是什么&#xff1f; LetNet是一种入门级的神经网络模型&#xff0c;是一个简单的卷积神经网络&#xff0c;可以用来做手写体识别。 下面我将以上图为例简…

卷积神经网络CNN与LeNet5详解(可训练参数量、计算量、连接数的计算+项目实战)

文章目录 神经网络CNN卷积神经网络CNN的由来局部感受野共享权重池化CNN的结构光栅化 LeNet5详解LeNet5-C1层LeNet5-S2层LeNet5-C3层LeNet5-S4层LeNet5-C5层LeNet5-F6层LeNet5-OUTPUT层计算公式 LeNet5实战定义网络模型初始化模型参数训练测试准确率预测结果 神经网络 神经网络可…