【C语言从不挂科到高绩点】06-流程控制语句-循环语句

2024-09-02 21:36

本文主要是介绍【C语言从不挂科到高绩点】06-流程控制语句-循环语句,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程

本套课程将会从0基础讲解C语言核心技术,适合人群:

  1. 大学中开设了C语言课程的同学
  2. 想要专升本或者考研的同学
  3. 想要考计算机等级证书的同学
  4. 想要从事C/C++/嵌入式开发的同学

----------------------------------------------------------------------

​分享不易,耗时耗力,喜欢的同学给个关注和赞吧

承接毕设指导,技术答疑,学习路上想要找私人教练的同学可以私信我

更多学习资料,公众号:墨轩学习网,B站:墨轩大楼

----------------------------------------------------------------------

另:有下图需求的同学可以私信我

5.3 循环结构-while 循环

5.3.1 while 循环的格式

while(条件表达式){代码块;
}

表示:如果条件表达式成立,结果为 1,就会一直重复执行代码块,直到条件表达式不成立为止。

5.3.2 while 循环的死循环

所谓的死循环:让程序一直重复执行,直到程序死亡为止

死循环的实现方式:让条件表达式恒成立

/**while循环的死循环
**/#include <stdio.h>int main(){// 在c语言中 1表示真  0表示假// while循环括号中写1,代表着这个条件恒为真,所以这个循环是死循环while(1){// 会重复执行这段代码.直到程序强制关闭(死亡为止)printf("O(∩_∩)O哈哈~你中毒了!\n");}return 0;	
}

程序进入到死循环之后,要结束程序,按键盘的 ctrl+c .

5.3.3while 循环指定循环次数

编写一个指定循环次数的循环,一般步骤:

  1. 定义个计数器,记录循环的次数
int n=1;
  1. 使用计数器,在 while 的括号构建条件语句
while(n<=10){  }

n<=10 表示当n<=10就重复执行while代码块中的内容,n>10就结束循环

  1. 每循环一次,让计数器逐渐接近条件表达式的临界点
while(n<=10){n++;  // 每次循环,n的值会自加1
}

【参考代码】

/**创建指定循环次数的循环**/	#include <stdio.h>int main(){// 循环10次的循环//1. 定义计数器,记录循环的次数int n=1;// 2. 使用计数器,在while括号中构建条件表达式while(n<=10){printf("第%d次循环\n",n);// 3. 每次循环之后,让计数器n逐渐接近条件表达式的临界点n++;}// 1. n=1  n<=10 成立 输出 第1次循环  执行n++  之后 n=2// 2. n=2  n<=10 成立 输出 第2次循环  执行n++  之后 n=3// 3. n=3  n<=10 成立 输出 第3次循环  执行n++  之后 n=4// ......// 10.n=10  n<=10 成立 输出 第10次循环  执行n++  之后 n=11// 11.n=11  n<=10 不成立,循环结束// 尝试从10 输出到 1int m = 10; // 循环起点从10开始while(m>=1){printf("%d\n", m);m --;}return 0;
}

5.3.4 提前结束循环

在开发中,如果需要达到某个条件时,提前结束循环,可以随时使用 break 关键字。

#include <stdio.h>int main(){int n = 1;while(n<=10){printf("%d\n",n);// 当n为5的时候退出循环if(n==5){break;// 结束循环}n++;}return 0;
}

运行结果:

【练习案例】

/**提前结束循环
**/#include <stdio.h>int main(){printf("下去跑10圈......\n");// 定义跑10次的循环// 1. 定义计数器int n = 1;int answer = 0;// 接受学生的状态// 2. 在while循环的括号中构建条件表达式while(n<=10){printf("学生:教练我已经跑了%d圈\n",n );printf("学生的状态是否OK(1.ok 2.不ok):");scanf("%d",&answer);if(answer==1){printf("教练:继续跑!别偷懒!\n");}else{printf("教练:快打120\n");break;// 可以用来结束循环// 需要在什么位置上结束循环,就可以在这个位置上加break}n++;}return 0;
}

5.4 循环结构- for 循环

5.4.1 for 循环的格式

for(语句1;语句2;语句3){代码块
}
  1. 语句 1:通常用来定义循环的计数器
  2. 语句 2:通常用计数器侯建条件表达式
  3. 语句 3:通常让计数器逐渐接近条件的临界点

【案例代码】

/**for(语句1;语句2;语句3){代码块}1. 语句 1:通常用来定义循环的计数器2. 语句 2:通常用计数器构建条件表达式3. 语句 3:通常让计数器逐渐接近条件的临界点**/#include <stdio.h>int main(){// 用while循环构造一个循环10次的循环// 1. 定义循环计数器int n=1;//2.用计数器构建条件表达式while(n<=10){printf("%d\n", n);//3.让计数器逐渐接近条件的临界点n++;}printf("---------------------------------\n");for(int i=1;i<=10;i++){printf("%d\n", i);}return 0;
}

while 循环的弊端:控制循环的三个要素,分为了三行代码,放在三个不同的位置,代码结构比较松散,容易漏写或者错写。为了让代码更加紧凑,当需要写固定次数的循环时,推荐使用 for 循环。

  1. 当不确定循环一共要循环多少次的时候,推荐使用 while 循环(构建一个死循环,然后在特定的条件下结束循环)
  2. 当确定循环要循环多少次时,推荐使用 for 循环,因为 for 所有循环要素,都在一行,很直观能看出循环了多少次

5.4.2 for 循环的执行顺序

for(语句1;语句2;语句3){代码块}

执行顺序如下:

  1. 先执行语句 1
  2. 再执行语句 2 中的条件表达式,如果条件表达式成立,就执行代码块,不成立就结束循环
  3. 代码块执行完毕之后,再执行语句 3
  4. 循环重复 第 2 步和第 3 步

注意:在整个循环过程中,语句 1 只在循环开始之前执行一次,后面就不再执行了。

【参考案例】


/** for循环的执行顺序**/#include <stdio.h>int main(){int i=1;for (printf("1 "); i <=5; printf("2 \n")){printf("3 ");i++;}return 0;
}

【运行结果】

5.5 结束循环的关键字

5.5.1 break 关键字

在 switch 语句和循环语句中都可以使用 break 关键字

  1. 当 break 出现在 switch 中,作用是终止某个 case 的值,并结束 switch 语句
  2. 当 break 出现在循环语句中,作用结束当前循环
  3. 当 break 出现在嵌套循环中,只能结束内层循环
  4. 如果一个程序中既有 switch 也有循环,那么如果这个 break 出现在 case 中,它结束的是 switch 语句,而不是循环。
#include <stdio.h>int main(){while(1){printf("1.登录  2.注册  3.退出\n");printf("请输入:");int con = 0;scanf("%d",&con);switch(con){case 1: printf("进入登录功能\n");break;case 2: printf("进入到注册功能\n");break;case 3: printf("再见~~\n");//break; // 此时break,只是结束了switch,并没有结束循环return 0; // 直接将main函数给关闭掉}}return 0;
}

注意:当 switch 的 break 和 while 的 break 有冲突时,有两种方式可以解决:

  1. 将 switch 更换成 if 语句
  2. 在需要退出的时候,不使用 break,而是使用 return 0;直接将 main 函数关掉。

5.5.2 continue 关键字

在循环语句中如果需要立即结束本次循环,直接开启下一次循环,此时就用 continue 关键字。

【案例代码】

/**continue 关键字**/
#include <stdio.h>int main(){for (int i = 1; i <= 10; ++i){if(i==5){//break;continue;  // 结束本次循环,直接开启下一次循环// 本次循环中,continue后面的代码将不会执行}// 当i=5的时候,就会遇到continue,就会结束本次循环// 本次循环中continue后面的代码就不会再执行printf("第%d次循环\n", i);printf("O(∩_∩)O哈哈~\n");printf("┭┮﹏┭┮呜呜~\n");printf("-------------\n");}return 0;
}

5.5.3 goto 关键字

goto 看成保留关键字,知道有这个东西,但是开发中尽量不用。

goto 表示无条件跳转

/** goto 关键字**/#include <stdio.h>int main(){goto flag;  // 无条件跳转到标记为flag的位置,从flag位置开始往下执行// goto 标记名; 注意:标记名必须存在,否则会编译错误//goto ok;printf("哈哈1\n");printf("哈哈2\n");printf("哈哈3\n");printf("哈哈4\n");flag:// 此处的flag打了一个锚点(标记),flag名字是自定义的printf("┭┮﹏┭┮\n");ok:printf("过过~\n");return 0;
}

5.6 循环嵌套

所谓的循环嵌套,在循环中再写循环,也就是多重循环,一般建议循环层数最好不要超过 3 层

#include <stdio.h>int main(){//  外层for循环for (int i = 1; i <=5 ; i++){// 内存for循环for (int j = 1; j<=5; j++){printf("i:%d-j:%d\t", i,j);}// 上面for循环执行完毕之后,再换行printf("\n");}// 外层循环循环一次,内层循环要全部循环完毕之后,才会开启外层循环的下一层循环
}

运行结果:

需要注意的问题:

  1. 外层 for 循环执行一次,内层循环需要全部执行完毕之后,外层循环才会开启下一次循环。
  2. 对于双层 for 循环而言,可以看成多行多列的矩阵,外层循环的 i 可以看成行,内层循环的 j 可以看成列。

【练习案例】打印九九乘法表

【案例代码】

#include <stdio.h>int main(){// 打印九九乘法表// 双层循环,外层循环执行一次,内层循环要全部执行完毕// 双层循环,外层循环i代表着行号,(第几次循环就代表当前在第几行)//          内层循环j代表着列号,(第几次循环就代表当前在第几列)// 外层循环循环n次,就代表着有n行// 内层循环循环n次,就代表着有n列for(int i=1;i<=9;i++){// 外层循环第1次循环:i=1  内层循环 j=1  循环1次 打印1列// 外层循环第2次循环:i=2  内层循环 j=1,2  循环2次  打印2列// 外层循环第3次循环:i=3  内层循环 j=1,2,3 循环3次  打印3列// i和j关系  j<=ifor(int j=1;j<=i;j++){printf("%d*%d=%d\t", i,j,(i*j));}printf("\n");}return 0;
}
printf("-------------------------------------------------\n");
for (int i = 1; i <=9; ++i){//外层第1次循环:i=1  内层j=1,2,3,4,5,6,7,8,9  j<=10-1 循环9次 打印9列//外层第2次循环:i=2  内层j=1,2,3,4,5,6,7,8  j<=10-2 循环8次 打印8列//外层第2次循环:i=3  内层j=1,2,3,4,5,6,7 j<=10-3      循环7次 打印7列//  内层的j :  j<=10-ifor (int j = 1; j <=10-i; j++){printf("%d*%d=%d\t", i,j,(i*j));}printf("\n");}

【格式 3】

【参考代码】

printf("-------------------------------------------------\n");for (int i = 9; i>=1; i--){for (int j = 1; j<=i; j++){printf("%d*%d=%d\t", i,j,(i*j));}printf("\n");}

5.7 do...while 循环

5.7.1 do-while 循环格式

do{代码块;
}while(条件表达式);

表示:先执行一次代码块,然后再判断条件表达式是否成立,如果成立就会重复执行代码块,直到条件表达式不成立为止。

需要注意的点:无论条件表达式是否成立,do 中的代码块,至少会执行一次

【演示案例】

/** do-while循环**/#include <stdio.h>int main(){int age = 17;do {printf("do-while:今年%d岁,去洗个脚吧\n",age);}while(age>18);printf("------------------------\n");while(age>18){printf("while:今年%d岁,去洗个脚吧\n",age);}return 0;
}

需要注意的问题:

  1. do-while 先执行 do 中的代码块,再做 while 括号中条件判断,while 循环,先做判断,再根据判断的结果确定是否要执行 while 中的代码块
  2. do-while 中 do 中的代码块,至少要执行一次。while 循环,如果条件表达式不成立,while 中的代码块,不会执行
  3. 当某些操作至少需要执行一次的时候,可以使用 do-while 循环

【参考代码】

int n = 1; // 定义计数器
do{printf("第%d次循环\n",n);n ++;  // 让计数器逐渐接近条件表达式的临界点
}while(n<=10); // 使用计数器,构建条件表达式的临界点printf("------------------------\n");

前文传送:

【C语言从不挂科到高绩点】01-C语言概述-CSDN博客

【C语言从不挂科到高绩点】02-变量、数据类型、标识符、关键字-CSDN博客

【C语言从不挂科到高绩点】03-C语言运算符

【C语言从不挂科到高绩点】04-流程控制语句-if-CSDN博客

【C语言从不挂科到高绩点】05-流程控制语句-switch语句-CSDN博客

----------------------------------------------------------------------

​分享不易,耗时耗力,喜欢的同学给个关注和赞吧

承接毕设指导,技术答疑,学习路上想要找私人教练的同学可以私信我

更多学习资料,公众号:墨轩学习网,B站:墨轩大楼

----------------------------------------------------------------------

这篇关于【C语言从不挂科到高绩点】06-流程控制语句-循环语句的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131134

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX