循环结构程序设计

news/2024/10/22 0:46:11

为什么需要循环控制

循环结构或称重复结构

几乎每一种计算机高级语言都提供了循环控制,用来处理需要进行的重复操作

大多数的应用程序都会包含循环结构

循环结构和顺序结构、选择结构是结构化程序设计的3中基本结构,它们是各种复杂程序的基本构成单元。

用 while 语句实现循环

while 语句的一般形式:while (表达式) 语句

其中“语句”就是循环体。循环体只能是一个语句,可以是一个简单的语句,还可以是复合语句(用花括号包起来的若干语句)

执行循环体的次数是由循环条件控制的,这个循环条件就是“表达式”,它也成为循环条件式。

当循环条件式的值为“真”(非0)时,就执行循环,否则就不执行循环语句

在执行 while 语句时,先检查循环条件表达式的值,当为非0值(真)时,就执行 while 语句中的循环体语句;当表达式为0(假)时,不执行循环体语句

while 循环流程:

while循环的特点:先判断条件表达式,后执行循环体语句

例:求1+2+3+...+100的值


//例:求1+2+3+...+100的值#include <stdio.h>int main(void)
{int i = 1, sum = 0;while (i < 101){sum += i;i++;}printf("%d\n", sum);return 0;
}

在VS编译器内会报C4996错误,解决见下文:(下同)

C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. - EricsT - 博客园 (cnblogs.com)

运行结果:

循环体如果包含一个以上的语句,应该用花括号括起来,作为复合语句出现。如果不加花括号则 while 语句的范围只到 while 后面的第一个分号处。

循环体中应该有使循环趋向于结束的语句。

用 do...while 语句实现循环

do...while 语句的执行过程是:先执行循环体,然后再检查条件是否成立,若成立则再执行循环体。

do...while 语句的特点是:先无条件的执行循环体,然后判断循环条件是否成立

//do...while 语句的一般形式:
do语句
while (表达式);

do...while 循环的流程:

先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(真)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0(假)为止,此时循环结束

例:求1+2+3+...+100的值


//例:求1+2+3+...+100的值#include <stdio.h>int main(void)
{int i = 1, sum = 0;do {sum += i;i++;} while (i < 101);printf("%d\n", sum);return 0;
}

运行结果:

对同一个问题可以用 while 语句处理,也可以用 do...while 语句处理。do...while 结构可以转换为 while 结构。

在一般情况下,用 while 语句和用 do...while 语句处理同一问题时,若二者的循环体部分是一致的,那么结果也是一致的。但是如果 while 后面的表达式一开始就是为假(0值)时,两种循环的结果是不同的,while 循环一次不进行,但是 do...while 循环会进行一次循环。

当 while 后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则,二者结果不相同(指二者具有相同的循环体的情况)

用 for 语句实现循环

for 语句更为灵活,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替 while 语句

//for语句的一般形式:
for (表达式1; 表达式2; 表达式3)语句

3个表达式的主要作用:

  • 表达式1:设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值
  • 表达式2:是循环条件表达式,用来判别是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环
  • 作为循环的调整,例如使循环变量增值,它是在执行完循环体后才进行的

 

//for语句的理解:
for (循环变量赋初值; 循环条件; 循环变量增值)语句

for 语句的执行过程:

  1. 先求解表达式1
  2. 求解表达式2,若此条件表达式的值为真(非0)则执行 for 语句中循环体,然后执行第3步;若为假(0),则结束循环,转到第5步
  3. 求解表达式3
  4. 转回步骤2继续执行
  5. 循环结束,执行 for 语句下面的一个语句

for 循环的过程:

//for 语句的一般形式:
for (表达式1; 表达式2; 表达式3)语句
//改写为 while 语句:
表达式1;
while (表达式2)
{语句;表达式3;
}
//二者无条件等价

“表达式1”可以忽略,即不设置初值,但是分号不能省略

“表达式2”可以忽略,即不用“表达式2”来作为循环条件表达式,不设置和检查循环的条件

“表达式3”可以忽略

“表达式1”可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式

“表达式3”也可以是与循环控制无关的任意表达式

“表达式1”和“表达式3”可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔

在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为最右边的表达式的值

“表达式2”一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体

从终端键盘向计算机输入时,是在按 Enter 键以后才将一批数据一起送到内存缓冲区中去的。

C语言的 for 语句比其他语言(如 FORTRAN,Pascal)中的 for 语句功能强得多。可以把循环体和一些与循环控制无关的操作也作为“表达式1”或“表达式3”出现,这样程序可以短小简洁。过分的利用这一特点会使 for 语句显的杂乱,可读性降低,最好不要把与循环控制无关的内容放到 for 语句中

循环的嵌套

一个循环体内又包含另一个完整的循环结构,称为循环嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。各种语言中关于循环的嵌套的概念是一致的

3种循环( while 循环、do...while 循环和 for 循环)可以互相嵌套。

循环嵌套的例子:

几种循环的比较

3种循环都可以用来处理同一问题,一般情况下它们可以互相代替

在 while 循环和 do...while 循环中,只在 while 后面的括号内执行循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句

for 循环可以在“表达式3”中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到“表达式3”中。

for 语句的功能更强,凡是用 while 循环能完成的,用 for 循环都能实现

用 while 和 do...while 循环时,循环变量初始化的操作应在 while 和 do...while 语句之前完成,而 for 语句可以在“表达式1”中实现循环变量的初始化

while 循环、 do...while 循环和 for 循环,都可以用 break 语句跳出循环,用 continue 语句结束本次循环

改变循环执行的状态

可以用 break 语句和 continue 语句来实现提前结束循环

用 break 语句提前终止循环

break 语句还可以用来宠循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句

例:在全系1000学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目


//在全系1000学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目#include <stdio.h>int main(void)
{int iTotle = 100000;int iSum = 0;int iCount = 0;while (1){int money;printf("请输入捐款数目\n");scanf("%d", &money);iSum += money;iCount++;if (iSum >= iTotle)break;}printf("捐款人数%d,平均每人捐款的数目%lf", iCount, iSum / (double)iCount);return 0;
}

运行结果:

break 语句的一般形式为:break;其作用是使流程跳到循环体之外,接着执行循环体下面的语句

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

用 continue 语句提前结束本次循环

例:要求输出100~200之间的不能被3整除的数


//要求输出100~200之间的不能被3整除的数#include <stdio.h>int main(void)
{for (int i = 100; i < 201; i++){if (0 == i % 3)continue;printf("%d\t", i);}return 0;
}

运行结果:

continue 语句的一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,转到循环体结束点之前,接着执行下一次循环

break 语句和 continue 语句的区别

continue 语句只结束本次循环,而不是终止整个循环的执行;而 break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立

            

如果是双重循环,在内循环体内有一个 break 语句,是提前终止内循环,流程是跳转到内循环体之外(执行内循环体下面的语句)


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

运行结果:

循环程序举例


#include <stdio.h>
#include <math.h>int main(void)
{double sun = 0;for (int i = 1; ; i += 2){if (0 == ((i / 2) % 2))sun += 1.0 / i;elsesun -= 1.0 / i;if (fabs(1.0 / i) < 1E-6)break;}printf("%lf", sun * 4);return 0;
}

运行结果:


#include <stdio.h>int main(void)
{int f1 = 1, f2 = 1;printf("%10d\t", f1);printf("%10d\t", f2);for (int i = 3; i < 41; i++){int temp = f2;f2 = f1 + f2;f1 = temp;printf("%10d\t", f2);if (0 == (i % 5))printf("\n");}return 0;
}

运行结果:

例:输入一个大于 3 的整数 n,判定它是否为素数(prime,又称质数)


//输入一个大于 3 的整数 n,判定它是否为素数(prime,又称质数)#include <stdio.h>int main(void)
{int n;while (1){printf("请输入一个大于3的整数\n");scanf("%d", &n);if (n > 3)break;}for (int i = 2; i < n; i++){if (0 == (n % i)){printf("不是素数\n");return 0;}}printf("是素数\n");return 0;
}

 运行结果:

例:求100~200间的全部素数

 


//求100~200间的全部素数#include <stdio.h>int main(void)
{for (int i = 100; i < 201; i++){char isPrime = 1;for (int j = 2; j < i; j++){if (0 == (i % j)){isPrime = 0;break;}}if (1 == isPrime)printf("%d\t", i);}return 0;
}

运行结果:


#include <stdio.h>int main(void)
{char ch;while ('\n' != (ch = getchar())){if (((ch >= 'A') || (ch <= 'Z')) || ((ch >= 'a') || (ch <= 'z'))){ch = ch + 4;switch (ch){case 91:ch = 'A';break;case 92:ch = 'B';break;case 93:ch = 'C';break;case 94:ch = 'D';break;case 123:ch = 'a';break;case 124:ch = 'b';break;case 125:ch = 'c';break;case 126:ch = 'd';break;}}printf("%c", ch);}return 0;
}

运行结果:

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

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

相关文章

python 实现课堂练习

module.py中的:import math class Complex:def __init__(self,real=0,imag=0):self.real=realself.imag=imagdef add(self,other):if isinstance(other,Complex):self.real=self.real+other.realself.imag=self.imag+other.imag def output(other):if isinstance(other, Compl…

Portainer - 用于管理容器的 UI-k8s

简介 🔰什么是Portainer? Portainer 是一个开源的轻量级管理 UI,它允许我们在 Docker、Docker Swarm、Kubernetes 和 Azure ACI 中轻松构建和管理容器,例如管理 Swarm 服务的创建和删除、用户身份验证、授权、连接、执行命令运行容器的控制台,并查看容器的日志。 Portainer …

k8s-Portainer 让应用部署变得简单

什么是搬运工 Portainer 是一个 Kubernetes、Docker/Swarm 和 Nomad 通用容器管理系统,它简化了容器操作,因此我们可以更快地将软件部署到更多地方。 概述 Portainer 服务器和 Portainer 代理是 Portainer 的两个组件。两者都作为轻量级容器在您现有的容器化基础设施上运行。集…

2000+多种开源大模型随意部署!一键搭建本地大模型,不挑环境、不挑配置(ollama 安装部署教程《Windows/Linux,Mac》)

2000+多种开源大模型随意部署!一键搭建本地大模型,不挑环境、不挑配置(ollama 安装部署教程《Windows/Linux,Mac》) 一、Ollama介绍 2.1 基本介绍 Ollama是一个支持在Windows、Linux和MacOS上本地运行大语言模型的工具。它允许用户非常方便地运行和使用各种大语言模型,比如…

SPSS、R 语言因子分析FA、主成分分析PCA对居民消费结构数据可视化分析

全文链接:https://tecdat.cn/?p=37952 原文出处:拓端数据部落公众号 分析师:Ting Mei在经济发展的大背景下,居民消费结构至关重要。本文围绕居民消费结构展开深入研究,运用 SPSS25.0 和 R 语言,以因子分析法和主成分分析法对东北三省居民消费价格指数及全国城镇居民消费…

LLM学习-基础知识

NLP NLP代表自然语言处理,是关于计算机和人类语言之间交互的领域。NLP涵盖了一系列任务,包括文本处理、语音识别、语言翻译、信息检索等。NLP技术的发展使得计算机能够理解、解释和生成人类语言,促进了许多领域的发展,包括智能助手、文本分析、情感分析等。 LLM LLM指的是大…

Photoshop PS 免费安装使用2024 最新使用

传送门:https://pan.quark.cn/s/3166efc40518 ps:下载后解压就可使用在前端开发的过程中,设计师没有空的时候,或者独自在加班的时候,图像处理是一个不可避免的任务。无论是切图、调整图片尺寸,还是简单的修饰,掌握一款强大的图像编辑工具都是非常重要的。作为一名前端工…

form表单元素测试(checkbox和radio)

form表单元素测试之checkbox(复选框)和radiobutton(单选按钮)一、定义form表单 用到的元素:checkbox和radiobutton 下图定义了一个选择爱好和选择性别的form表单,区域1用到的表单元素是checkbox(复选框),区域2用到的表单元素是radiobutton点击查看代码 <!DOCTYPE htm…