分支与循环语句1

简介: 分支与循环语句1

语句

C语句可分为以下五类:

1. 表达式语句

2.函数调用语句

3.控制语句

4. 复合语句

5. 空句

本章后面介绍的是控制语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。

可分成以下三类:

1.条件判断语句也叫分支语句:i语句、switch语句:

2.循环执行语句:do whie语句、while语句、for语句:

3.转向语句:break语句、goto语句、continue语句、return语句。

分支语句(选择结构)

if语句

语法结构

单分支

if(表达式)//C语言中:0为假,非0为真
语句;

多分支

if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;

PS: (18<= age <=30 )是有问题的 C语言中先执行前面 为真则变为1,即只要18这个语句一定正确

(age >= 18 && age <= 30)是真正的写法

嵌套分支

if(表达式1)
语句1;
else{
if(表达式2)
语句2;
else{
if(表达式3)
语句3;
else
语句4;
}
}

简化 else if 嵌套

if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
else if(表达式4)
语句4;
else
语句5;

PS:else是和离着最近的else对应

switch语句

比如:

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期日

那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。

这就是switch 语句。

switch(整型表达式)

{

语句项

}

int main(){
int day = 0;
scanf("%d"&day);
switch (day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}

PS:break 才可以实现分支

也可以多个case在一起输出一种结果:

switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n" );
break;
case 6:
case 7:
printf("weekend \n");
break;
}
default:
printf("处理除case情况以外的数据");
break;

default 用法如上

int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)//switch 允许嵌套的
{
case 1:
n++;
case 2:
m++;
n++; 
break;
}
case4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n) ;
return 0;
}

结果输出: 5,3

循环语句

while // for // do while

while语句

语法结构:

while(表达式)

循环句;

循环流程:

 

expr (evaluate expressions的缩写)。"表达式求值"。

stmt 表示预处理语句。

breakcontinue是shell脚本中的两个关键字,用于控制循环语句的执行。

break用于跳出循环语句,即使循环条件没有达到结束的条件,也可以强制退出循环。例如,在一个for循环中,如果某个条件满足,就可以使用break语句跳出循环。

continue用于跳过循环中的某个迭代,即使循环条件没有达到结束的条件,也可以跳过当前迭代,继续执行下一次迭代。例如,在一个for循环中,如果某个条件不满足,就可以使用continue语句跳过当前迭代,继续执行下一次迭代。

continue 在while循环中 :跳过本次循环的后边的代码,直接去判断部分,看是否进行下一次判断i

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

输出:2 3 4 6 7 8 9 10 11

PS:注意11,当i等于10的时候仍然进入循环,i++变为11,输出,下一次不进入循环。

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

输出:1 2 3 4

break :while循环中break是永久的终止循环

getchar与putchar

getchar() -- 标准输入流(通常是键盘)中读取一个字符

putchar() --单个字符输出到标准输出流(通常是屏幕)

putchargetchar 是 C 语言的标准库函数,用于字符的输入和输出。

putchar 函数的作用是将单个字符输出到标准输出流(通常是屏幕),其函数原型为:

int putchar(int c);

其中 c 表示要输出的字符,函数返回值为输出的字符的 ASCII 码

例如,以下代码将字符 'A' 输出到屏幕上:

putchar('A');

getchar 函数的作用是从标准输入流(通常是键盘)中读取一个字符,其函数原型为:

int getchar(void);

函数返回值为读取到的字符的 ASCII 码。例如,以下代码从键盘中读取一个字符,并将其输出到屏幕上:

int c = getchar();
putchar(c);

需要注意的是,getchar 函数每次只能读取一个字符,如果需要读取多个字符,可以通过循环的方式来实现。同时,getchar 函数在读取字符时,遇到换行符('\n')或文件结束符(EOF)会停止读取。

在window系统 按CTRL+Z getchar 返回EOF。

int main(){
int ch = 0;
while ((ch = getchar ()) != E0F)
{
if (ch < '0' || ch > '9' )
continue;
putchar (ch);
}
return 0;
}

多组输入 如果是0~9的数字,则putchar执行输出该数字;

              如果不是则不输出,继续输出。

ASCII表附上

补充:清空缓冲区的代码

Linux缓冲区是指在内存中开辟的一块区域,用于存储输入输出数据的临时存储区域。当应用程序向文件或设备进行读写操作时,数据会先被存储到缓冲区中,然后再由缓冲区将数据写入磁盘或设备中。缓冲区的作用是提高数据读写的效率,减少磁盘或设备的访问次数,从而提高系统的性能。在Linux系统中,缓冲区的大小可以通过修改内核参数来进行调整。

int main()
{
char password [20];
printf("请输入密码:>");
scanf ("%s ",password);
printf("请确认(Y/N):");
int ch = getchar();
if ('Y' == ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;

数组名本来就是地址 scanf不用取地址

这个代码是直接 确认失败

如果输入密码abcdef->在缓存区是 abcdef\n -> getchar直接读取\n 直接确认失败

getchar();//处理\n

int main()
{
char password [20];
printf("请输入密码:>");
scanf ("%s ",password); //scanf函数在读取数据字符串的时候,遇到空格就不再读取
getchar();//处理\n
printf("请确认(Y/N):");
int ch = getchar();
if ('Y' == ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;

这个代码是如果密码有空格还是 确认失败

如果输入密码abcdef ddddd->在缓存区是 abcdef ddddd\n -> scanf读取 abcdef 遇到空格就不读取

getchar读取( ddddd) 直接确认失败

while((ch = getchar())!= '\n')

{;}//空语句

int main()
{
char password [20];
printf("请输入密码:>");
scanf ("%s ",password); //scanf函数在读取数据字符串的时候,遇到空格就不再读取
while((ch = getchar())!= '\n')
{;}//空语句
printf("请确认(Y/N):");
int ch = getchar();
if ('Y' == ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;

通过while循环用getchar处理掉包括\n之前的全部内容->然后通过Y/N判断确认

这个代码是最终可以解决

for语句

语法:

for(表达式1;表达式2;表达式3)

循环语句;

表达式1:初始化部分

表达式2:判断部分

表达式3:调整部分

int main(){
int i = 0;
for(i = 1; i <= 10; i++){
printf("%d",i);
}
return 0;
}

流程:

continue: 在for循环中会跳过continue后面的代码,直接取循环的调整部分

与while中的continue有些区别(while中是否跳过调整部分,看调整部分的位置

break:在for中也是直接终止循环(和break在while中一样)

关于循环变量的建议:

不可在for 循杯体内修改循环変量,防止 for 循坏失去控制。(不要写单= 进行赋值)

建议for语句的循环控制变量的取值采用"前闭后开区间"写法。

一些for循环的变种:

初始化,判断,调整三个部分都可以省略

for(;;){
}

但调整部分被省略,会变成死循环。

int main(){
int i = 0;
int j = 0;
for (; i < 3; i++){
for (; j < 3 ;j++){
printf("hehe\n");
}
}
return 0;
}

只能打印三个hehe

因为第一次循环之后 j就变成3了

//请问循环要循环名少次?
#include <stdio.h>
int main(){
int i = 0;
int k = 0;
for(i =0, k=0; k=0; i++, k++) 
k++;
return 0;
}

循环执行0次

判断语句中是赋值语句 k=0 直接为假 不执行循环。

相关文章
|
传感器 物联网 5G
物联网的通信技术以及Wi-Fi、一键配网技术、BLE、GPRS(2G)、LTE-Cat1 、NB-IoT简介
物联网的一个重要的特点是接入了网络,因此这些设备才能将传感器采集的数据上传到云平台,然后根据平台对数据的分析做出反应。而这种接入网络的技术,就是通信技术,是物联网的基础之一。通信的方式可以分为有线和无线两种方式,因为有线通信的成本较高,无线通信技术在物联网中应用比较广泛。
607 1
下载python所有的包 国内地址
下载python所有的包 国内地址
|
JavaScript
如何解决ElementUI中的el-tab-pane组件使用v-show不生效的问题?
如何解决ElementUI中的el-tab-pane组件使用v-show不生效的问题?
1055 3
|
SQL 数据采集 存储
Hive 判断某个字段长度
【8月更文挑战第13天】
403 2
|
JavaScript 数据可视化 定位技术
echart:html中使用& echarts 的使用
本文介绍了如何在HTML中使用ECharts图表库,包括通过CDN引入ECharts和ECharts-GL,创建基本的柱状图示例,以及在Vue项目中使用ECharts的方法。同时,提供了快速安装和配置ECharts的代码示例,以及如何添加地图插件的指导。
919 1
|
消息中间件 存储 Java
一览纵山小,原来RocketMQ是这样工作的!
本文介绍了阿里巴巴开源的高性能分布式消息队列系统RocketMQ的核心组件及其作用。RocketMQ拥有四个关键组件:NameServer、Broker、Producer和Consumer。NameServer作为注册中心维护路由信息;Broker负责消息的接收、存储和转发;Producer生成消息并通过Topic与Broker关联;Consumer则订阅并处理消息。文章详细解析了各组件的功能及交互逻辑,并展示了RocketMQ在异步通信、日志收集、流处理及事件驱动架构中的典型应用场景。通过整体框架的梳理,有助于读者更好地理解和掌握RocketMQ的工作机制。
197 4
|
12月前
|
缓存
Discuz! X3.5论坛如何去除隐藏文章内容图片鼠标经过时显示“下载附件”等信息
Discuz! X3.5论坛如何去除隐藏文章内容图片鼠标经过时显示“下载附件”等信息
404 1
|
资源调度 数据管理 测试技术
自动化测试框架的演进与实践
软件测试作为保障产品质量的重要环节,在技术迭代的浪潮中不断进化。本文从自动化测试框架的角度出发,探讨了其发展历程、当前面临的挑战以及未来的趋势。我们将深入分析自动化测试框架的设计原则、核心组件和最佳实践,旨在为读者提供一套系统化的解决方案,帮助团队提升测试效率,确保软件质量。
176 31
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
272 0