C语言程序流程设计之循环【程序流程设计】(13)
- 循环
- 循环三要素
- 死循环
- 可控循环
- 可控循环的三要素
- while “当”型循环
- 语法结构及流程
- 解析
- 代码演示
- do while“直到”型循环
- 语法及流程
- 解析
- 代码演示
- while/do while 综合案例
- do while 代码演示
- while 代码演示
- do while 的争议
- for “列表”型循环
- 语法结构及流程
- 解析
- 代码演示
- for(;;)是 for 吗?
- for 与逗号表达式
- 循环的嵌套
- 嵌套的语法格式
- 循环嵌套while 版
- 循环嵌套do while 版
- 循环嵌套for 版
- 循环建议
- 先外后内的循环嵌套写法
- 半开半闭区间写法
- 嵌套的优化
- 循环小结
循环
需要多次重复执行一个或多个任务的问题考虑使用循环来解决。
三大循环样式不一样,但是本质是一样的。
循环三要素
死循环
#include <stdio.h>
#include <windows.h>
int main()
{while (1) {printf("xxxxxxxxxxxxx\n");Sleep(1000);}return 0;
}
运行结果为:
可控循环
#include <stdio.h>
#include <windows.h>
int main()
{int i = 10; //循环变量初始化while (i > 0) //循环终止条件{printf("xxxxxxxxxx\n");Sleep(1000);i--; //有使循环趋于结束的语句}return 0;
}
运行结果为:
打印十次之后就会跳出循环。
可控循环的三要素
循环三要素:
循环变量初始化, 循环变量的变化(趋向终止条件), 循环终止条件。
要做到可控三个条件缺一不可。
while “当”型循环
只有条件为真,才可能向下执行。有可能一次都不执行
语法结构及流程
while (表达式)
{
语句;
}
解析
计算表达式的值,当值为真(非 0)时,执行循环体语句,一旦条件为假,就停止执行循环体。如果条件在开始时就为假,那么不执行循环体语句直接退出循环。
代码演示
用 while 语句求 1~100 所有整数的和。
#include <stdio.h>
int main(void)
{
int i; int sum = 0;
i = 0;
while (i <= 100)
{
sum += i;
i++;
}
printf(“sum = %d\n”, sum);
return 0;
}
运行结果为:
do while“直到”型循环
直到条件为假,才终止循环。
do while循环至少执行一次。
语法及流程
do
{语句;
} while (表达式) ;
解析
它先执行循环体中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环。
代码演示
用 do-while 语句求 1~100 所有整数的和。
#include <stdio.h>
int main(void)
{int i; int sum = 0;i = 0;do{sum += i;i++;} while (i <= 100);printf("sum = %d\n", sum);return 0;
}
运行结果为:
while/do while 综合案例
while 与 dowhile 的区别
如下代码,表示求和,求输入 1 和 11 的比较。
do while 代码演示
#include <stdio.h>
int main()
{int sum = 0;int i;scanf_s("%d", &i);do{sum += i;i++;} while (i <= 10);printf("sum= %d\n", sum);return 0;
}
运行结果为:
while 代码演示
#include <stdio.h>
int main()
{int sum = 0;int i;scanf_s("%d", &i);while (i <= 10){sum += i;i++;}printf("sum= %d\n", sum);return 0;
}
运行结果为:
结论是,当输入 1 时两个运算的求和,是相等的,但是当输入 11 是,while 版本输出的 sum = 0。而 do while 版本输出的则是 11。
所以,do while 至少执行一次,而 while 可能一次都不执行。
do while 的争议
do while 特点是,循环体至少执行一次,这个是比较可怕的。在没有收到任何限制条件的情况下,就开始执行循环体。很可能会带来不可挽回的后果。比如,先格式化了你的 c 盘,然后再来问要不要格式化。
do while 曾一度提议废除,但是他在输入性检查方面还是有点用的。比如,输入 Y/y 设置标志位,退出,执行标志位操作,输入 N/n 直接退出,输入其它,循环输入。
代码演示:
#include <stdio.h>
int main(void)
{char select;do{printf("同意协议请输入 y/Y,不同意请输入n/N\n");scanf_s("%c", &select);getchar();if (select == 'n' || select == 'N')exit(-1);} while (!(select == 'y' || select == 'Y'));printf("next\n");return 0;
}
运行结果为:
只有输入y/Y,n/N才向下执行,否则继续循环
#include <stdio.h>
int main()
{int name;int passwd;do{printf("name:");scanf_s("%d", &name);printf("passwd:");scanf_s("%d", &passwd);} while (!(name == 10 && passwd == 20));printf("wellcome\n");return 0;
}
运行结果为:
直到输入合适的用户名和密码才能够进行下一步操作。
for “列表”型循环
语法结构及流程
for( 表达式 1 ; 表达式 2 ; 表达式 3 ){语句;}
解析
1 、计算表达式 1 的值,通常为循环变量赋初值。
2 、计算表达式 2 ,的值,即判断循环条件是否为真,若值为真则执行循环体一次,
否则跳出循环。
3 、计算表达式 3 的值,这里通常写更新循环变量的赋值表达式,然后转回第 2步重复执行。
代码演示
用for循环求 1~100 所有整数的和。
#include <stdio.h>
int main(void)
{int i; int sum = 0;for (int i = 0; i <= 100; i++){sum += i;}printf("sum = %d\n", sum);return 0;
}
运行结果为:
for(;;)是 for 吗?
上面for循环仍然成立,等价于while(1)。
代码演示:
#include <stdio.h>
int main(void)
{for (;;)printf("xxxxxxxxxx\n");return 0;
}
运行结果为:
for 与逗号表达式
打印 10 的所有加法组和,格式如下:
10 = 1 + 9;
10 = 2 + 8;
10 = 3 + 7;
10 = 4 + 6;
10 = 5 + 5;
10 = 6 + 4;
10 = 7 + 3;
10 = 8 + 2;
10 = 9 + 1;
代码演示:
#include <stdio.h>
int main(void)
{int i; int j;for (i = 1, j = 10 - i; i < 10 && j>0; i++, j--){printf(" 10 = %d + %d\n", i, j);}return 0;
}
运行结果为:
循环的嵌套
一重循环解决线性的问题,而二重循环和三重循环就可以解决平面和立体的问题了。比如打印如下的图形:
******
******
******
****** **********
嵌套的语法格式
三种语法格式,是一种 嵌套的结构, 不可以交叉。三者都可以实现上述的功能,但是比较倾向于使用第三种,为什么呢,因为第三种,循环的初始化不在循环体外,循环变量的改变不在循环体内。整体呈现会更清晰简洁。
循环嵌套while 版
#include <stdio.h>
int main(void)
{int i = 0;while (i < 4){int j = 0;while (j < 6){printf("*");j++;}putchar(10);i++;}return 0;
}
运行结果为:
循环嵌套do while 版
#include <stdio.h>
int main(void)
{int i = 0;do {int j = 0;do{printf("*");j++;} while (j < 6);i++;putchar(10);} while (i < 4);return 0;
}
运行结果为:
循环嵌套for 版
#include <stdio.h>
int main(void)
{for (int i = 0; i < 4; i++){for (int j = 0; j < 6; j++){printf("*");}putchar(10);}return 0;
}
运行结果为:
循环建议
先外后内的循环嵌套写法
循环的嵌套,先写外重循环,外重循环的循环变量,可能作为内重循环的循环终止条件。
半开半闭区间写法
建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法。 这样的作法,跟后面的数组下标,是完全吻合的。但,这并非绝对。
循环变量属于半开半闭区间
for ( x=0; x<N; x++){}
循环变量属于闭区间
for ( x=1; x<=N; x++){}
嵌套的优化
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数。
低效率:长循环在最外层
for (row=0; row<100; row++)
{for ( col=0; col<5; col++ ){sum = sum + a[row][col];}
}
高效率:长循环在最内层
for (col=0; col<5; col++ ){for (row=0; row<100; row++){sum = sum + a[row][col];}}
循环小结
一种循环可以解决的问题,使用另外两种同样可行,只是方便程度不同。
while 循环一般用于循环次数不定的情况,for 循环一般用于循环次数确定的情况(也可以用于循环次数不定的情况),do-while 循环一般用于至少需要执行一次的情况。
for 循环和 while 循环是先判断条件是否为真,再执行循环体,因此,可出现循环一次也不执行的情况;do-while 循环是先执行循环体,再判断条件是否为真,因此,循环体至少执行一次。
C语言程序流程设计之循环【程序流程设计】(13)相关推荐
- c语言菜单输入字母死循环,C语言循环菜单的设计--让程序一直运行
让程序一直运行的秘密就是死循环,即: while(1){ // 要执行的操作 } 在加密解密软件中,要实现的功能有: 文件加密: 文件解密: 修改密码(为了防止其他人使用,程序设置了密码,必须输入密码 ...
- 关于python中程序流程结构-Python语言程序设计(第4章:程序结构设计)
4.1 算法 [1]计算机程序可视为数据结构和算法的集成,这种集成体现为以下两方面的内容:数据是程序实现的基础:算法要依靠程序来完成功能. [2]算法的特点:有穷性:确定性:零个或多个输入:一个或多个 ...
- 凑钱系统C语言,C语言课程设计报告书凑钱程序.doc
C语言课程设计报告书凑钱程序 西北师范大学知行学院 计算机与电子信息工程系 课程设计报告书 课程名称: C语言程序设计 专 业: 电子信息工程 课题名称: 凑钱程序 班 级: 13电本班 学 号: 2 ...
- 热电偶单片机代码c语言,基于单片机的热电偶发生器设计(含电路原理图,程序)...
基于单片机的热电偶发生器设计(含电路原理图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文15000字,程序,答辩PPT) 摘 要 热电偶标准信号发生器为袖珍式键控现场检测仪表.其由 ...
- 骑士游历数组任意起点c语言,java课程设计骑士游历程序的开发
<java课程设计骑士游历程序的开发>由会员分享,可在线阅读,更多相关<java课程设计骑士游历程序的开发(25页珍藏版)>请在人人文库网上搜索. 1.JAVA程序设计 课程设 ...
- 国二C语言文字选择程序选择,全国计算机等级考试二级C语言题型总结(二)——选择循环结构程序设计部分.doc...
全国计算机等级考试二级C语言题型总结(二)--选择循环结构程序设计部分 C语言第二部分上机题型总结 选择结构部分: if结构题型总结 (案例1) 企业发放的奖金根据利润提成.利润(I)低于或等于10万 ...
- c语言循环程序设计教案,10 《C语言程序设计》教案 第三章 程序的控制结构(6)—循环结构 while和do while.doc...
10 <C语言程序设计>教案 第三章 程序的控制结构(6)-循环结构 while和do while.doc C 语言程序设计课程教案表 授课题目 第三章 程序的控制结构 (6) 循环结构 ...
- 包括循环和分支的C语言程序,《C语言程序设计》分支和循环的C程序设计.ppt
<C语言程序设计>分支和循环的C程序设计.ppt 第三章 分支和循环的C程序设计 问题 一元二次方程根求解算法描述 3.1 程序的基本结构 ⒊循环结构Repetition ⒋复合语句 Co ...
- 烟雾检测电路c语言程序,基于51单片机火灾报警器系统烟雾检测温度检测设计(原理图+程序仿真+论文)...
课题题目基于单片机的火灾自动报警系统 课题的目的.意义以及和本课题有关的国内外现状分析:1.目的:本系统以单片机为主控单元,能够及时监测到系统故障和环境中有无火灾,火灾一旦发生将实现声光报警,并采取有 ...
- c语言模拟计算机指令流程图,家居分布式温度监测报警系统-传感器课程设计报告 带程序及仿真全套资料...
资料包: 0.png (13.1 KB, 下载次数: 11) 2018-1-10 04:19 上传 传感器课程设计报告 课 题: 家居分布式温度监测报警系统班 级: 自152 姓 名 ...
最新文章
- 那些年我们踩到过的坑(二):3.1 版 MultiThreadedHttpConnectionManager 未releaseConnection导致应用服务器宕机...
- 特别企划 | 或许是史上最萌的产品经理改需求姿势(多图)
- vue2实践揭秘pdf_《Vue2实践揭秘》源码
- 47 FI配置-财务会计-固定资产-一般评估-定义资产分类中的折旧范围
- 带有.NET Core App的Identity Server 4
- Django----bootstrap导航栏的使用
- hdu 5154 Harry and Magical Computer
- 集成产品开发团队的组成
- “System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
- SSH访问远程主机超时问题解决
- dirsearch命令组合参考
- socket套接字选项列表
- 如何用数据驱动的广告效果
- Attempt to read from field ‘android.os.VibrationEffect com.android.server.VibratorService$Vibration.
- Linux LTP (一)
- 计算机毕业设计ssm文档资料管理系统
- 千里之遥看樱花,“东湖·樱园”元宇宙
- linphone 智能带宽分配
- hackme inndy pwn onepunch writeup
- Kettle — 集群使用