当前位置:网站首页>4.分支语句和循环语句
4.分支语句和循环语句
2022-07-06 09:20:00 【是王久久阿】
在之前学习的C语言中,都是顺序结构的,各语句是按自上而下的顺序执行的,语句之间的衔接不需要判断,执行完上一条语句自动执行下一条语句。但是在实际中,需要根据是否满足某个条件,以此来决定是否执行程序或是选择执行某一个程序。C语言中有着丰富的控制语句,控制语句可分为三大类:
1.条件判断语句(分支语句):if语句、switch语句;
2.循环执行语句:while语句、for语句、do while语句;
3.转向语句:return语句、break语句、continue语句、goto语句。
目录
分支语句
在现实中有很多需要进行判断和选择的情况。
例如:参加考试,如果我们考试前选择好好学习,就能取得好成绩;如果选择不学习,只能参加补考;如果选择作弊,则会被学校开除。
(1)if语句
if语句的一般结构
a. b. c.
if(表达式) if(表达式) if(表达式1)
语句; 语句; 语句;
else else if(表达式2)
语句; 语句;
else
语句;
注:
- 如果表达式为真则执行,为假则不执行。C语言中0表示假,非0表示真。因此,if(1)必执行,if(0)必不执行。
- 如果语句是多段语句,那么需要用大括号括起来,括起来的部分为一个代码块。(为了养成良好的习惯,最好都要用大括号括起来)
if语句的使用
输入一名学生的数学考试成绩,判断不及格、及格、良好、或是优秀。
#include<stdio.h>
int main()
{
int math = 0;
scanf("%d", &math);
if (math >= 0 && math < 60)//&&为逻辑与操作符,当操作符两边都为真时则执行,有一个不为真则不执行
{
printf("不及格\n");
}
else if (math >= 60 && math < 70)
{
printf("及格\n");
}
else if (math >= 70 && math < 90)
{
printf("良好n");
}
else if (math >= 90 && math <= 100)
{
printf("优秀\n");
}
else
printf("输入错误\n");
return 0;
}
注:
- &&为逻辑与操作符,当操作符两边都为真时则执行,有一个不为真则不执行。
- (math >= 0 && math < 60)可以理解为:分数大于等于0分并且小于60分
- ||为逻辑或操作符,操作符两边只要有一个为真则执行,如果都为假则不执行。
- (math < 60 || math > 90)可以理解为:分数小于60分或者大于90分
不同卷面总分不一样,所对应的标准也不同,可以运用我们之前学过的用#define定义的常量来表示,这样可以大大减少修改代码时的任务量。
例如:
#include<stdio.h>
#define 及格 60
#define 良好 70
#define 优秀 90
#define 满分 100
int main()
{
int math = 0;
scanf("%d", &math);
if (math >= 0 && math < 及格)
{
printf("不及格\n");
}
else if (math >= 及格 && math < 良好)
{
printf("及格\n");
}
else if (math >= 良好 && math < 优秀)
{
printf("良好\n");
}
else if (math >= 优秀 && math <= 满分)
{
printf("优秀\n");
}
else
printf("输入错误\n");
return 0;
}
C语言中的运算符:
C语言中的加减乘与我们日常理解的一致、除略有所差异。如果是两个整数相除,所得的结果为两数相除的商。
例如:5/2=2 。想要小数结果,只需要将其中一个整数改为小数结构即可,例如:5.0/2=2.5 。
此外,C语言中还有取模运算符%,取模就是取余数,例如5%2=1,这个1就是5除以2的余数。
判断一个数是否为奇数。
#include<stdio.h>
int main()
{
unsigned int num = 0;//无符号整型
scanf("%d", &num);
if (num % 2 == 1)
{
printf("是奇数\n");
}
else
{
printf("不是奇数\n");
}
return 0;
}
因为只有正整数才有奇偶的概念,并且0也规定到偶数中。所以我们可以设置一个无符号整型来存放变量num。在正整数中不是奇数,就必定是偶数,所以当我们对奇数判断完成后,偶数部分不用再去判断了。
注:
- == 为判断是否相等操作符,(num % 2 == 1)的意思为:判断num%2的余数是否等于1 。
- 当if语句的表达式中只有一个等号时,便不再是判断,而是赋值了,很多bug来源于此。
- 例如:if(a=1)则表示为将1的值赋给a,因为1是非0,所以if条件必执行 。
输出1到100之间的奇数。
#include<stdio.h>
int main()
{
int num = 1;
while (num <= 100)
{
if (num % 2 == 1)
{
printf("%d ", num);
num++;//与num=num+1同理
}
else
num++;
}
return 0;
}
因为if是条件判断语句,打印1到100之间的奇数需要用到循环,这里可以使用while循环,while循环下面会讲到。
注:
- a++为后置++,后置++为:先使用,再++;例如:b=a++的意思为,先将a的值赋给b, 再将a加1。
- ++a为前置++,前置++为:先++,再使用;例如:b=++a的意思为,先将a加1,再将a的值赋给b。
- 不管是++a,还是a++,最终都会改变a的值。
(2)switch语句
switch语句的一般格式
switch(整型表达式) //表达式的返回值必须是整型
{
case 整型常量表达式: //例如case 1 case2等等...
语句;
break; //break执行后,将不再往下执行,跳出switch,以此来实现分支
default: //defalut为缺省情况,只有当无法找到匹配项时才执行
语句;
}
注:
- 红标部分为一般格式,是不可缺少的。
switch语句的使用
输入一个正整数(1~7),来判断是星期几,如果输入超出范围,提示输入错误。
#include<stdio.h>
int main()
{
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("输入错误\n");
}
return 0;
}
假设将每次的break删除后,会怎么样?
假如我们输入4,那么编译器将会从case 4进入,并且一直往下执行。所以break才是switch实现分支的关键。
假如需求改变,输入1~5显示工作日,输入6~7显示休息日,如何实现?
#include<stdio.h>
int main()
{
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
}
return 0;
}
注:
- 一个switch语句中只可以有一个default语句,default语句可以放在switch语句中的任何位置,但是一般推荐将default语句放在最后。
循环语句
在前面介绍了顺序结构和分支结构,但是光有这两种结构是不够的,所以还需要循环结构(重复结构)。顺序结构、选择结构、循环结构是结构化程序设计的三种基本结构,是各种复杂程序构成的基本单元。
(1)while语句
在之前的学习中,判断一个数是不是奇数用到了if语句,但是if语句只能执行一次,想要打印1-100之间的奇数时,用到了while循环,我们设置了一个变量a,初始化a=1,while(a<=100),每一次循环都会判断a是不是奇数,并且a++,当a>100时,循环就跳出来了,这就是一个简单是while循环。
while语句的一般结构
while(表达式) //表达式为真则执行,为假则不执行
{
循环语句; //每一次循环都要接近表达式的条件值,跳出while,否则将会死循环
}
while语句中的break和continue
break:while中的break会终止while的所有循环,只要遇到break,就会跳出当前while循环。
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
{
break;
}
}
printf("%d\n", i);//打印结果为5
return 0;
}
通过测试可以看到i的值为5,虽然5<10,但是通过break跳出了while循环。
注:
- 如果是多层循环嵌套,break只能跳出一层循环,想要一下子跳出多层循环可以用goto语句,后面会讲goto语句的用法。
continue:while中的continue会终止本次循环,continue后面的部分不会再执行,直接跳到while语句的判断部分。
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
{
continue;
}
printf("%d ", i);
}
printf("\n");
return 0;
}
通过测试可以看到,当i=5时,continue跳过了后面的打印,直接来到了下一次循环。
注:
- continue是跳出本次循环,分支语句不是循环语句,故switch里无法使用continue。
(2)for语句
for语句更加的灵活,除了可以用于循环次数确定的情况下,在循环次数不确定的时候依然适用。
for语句的一般结构
for(表达式1;表达式2;表达式3) //表达式1为:初始化部分,用于初始化循环变量的。
{ //表达式2为:条件判断部分,用于判断循环时候终止。
循环语句; //表达式3为:调整部分,用于循环条件的调整。
}
for语句的执行过程为:首先执行表达式1(在整个for循环中,表达式1只执行一次),然后执行表达式2,如果表达式2为假则跳出循环,如果表达式2为真则进行循环语句,然后进行表达式3。之后的循环便为:表达式2——循环语句——表达式3——表达式2的循环。
用for循环在屏幕上打印1~10个数字
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
i=1为初始化部分,因为打印的数字从1开始,所以将i初始化为1即可。
i<=10为判定部分,当i<=10时,执行循环语句,i>10跳出循环。
i++为调整部分,每一次循环最后将i++,越来越接近判定部分的条件值。
for循环的使用非常方便,它可以完全代替while语句。
for语句中的break和continue
for语句中也可以插入break和continue,并且他们的用法与while中的用法是一致的,continue的用法略有差异。
break:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", i);
if (i == 5)
{
break;
}
}
putchar('\n');
return 0;
}
当i=5时,if表达式判定为真,执行break跳出循环,最终打印1 2 3 4 5。
continue:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
putchar('\n');
return 0;
}
这里printf函数在continue后面,当i=5时,if表达式判定为真,continue执行跳出本次循环,来到调整部分i++(while循环中的continue是直接跳到判断部分,for循环如果也跳到判断部分将会导致死循环,所以要先跳到调整部分,然后再判断)。
for语句的使用技巧
(1)for语句中的初始化部分、判断部分、调整部分都可以省略。
#include <stdio.h>
int main()
{
for (;;)
{
printf("hello ");
}
return 0;
}
即使将for循环中的3个部分全部省略,代码依然可以执行,不过3个部分都省略后代码将进入死循环,无限打印“hello”。(初学时不建议省略)
(2)for循环的嵌套使用
打印九九乘法口诀表
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i < 10; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", j, i, j * i);//%2d设置域宽为2,这样就可以实现右对齐了
}
printf("\n");
}
return 0;
}
设置两个变量i和j,通过两个for循环的嵌套来实现乘法口诀表的打印。每次打印完一行,在第一个循环最后单独打印一个换行符,实现自动换行。
因为两个数的乘积有个位数也有两位数,所以为了保持口诀表的对其,我们将最后乘积的数在打印时设置%2d,即域宽为2的整型,这样就可以保持右对齐了,使口诀表更加美观。
(3)设置多个变量控制循环
#include<stdio.h>
int main()
{
int i=0, j=0;
for (i = 0, j = 0; i < 4 && j < 5; ++i, j+=2)
{
printf("hello\n");//打印3次
}
return 0;
}
有些稍微复杂的情况,可以设置多个变量来帮忙控制循环。上述代码一共打印三次hello,当第三次循环语句结束后,++i,j+=2,i的值为3,j的值为6,条件判断为假,结束循环。
下述代码一共将执行多少次?
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0, j = 0; j = 0; i++, j++)
{
j++;
}
return 0;
}
答:0次。注意:条件判断部分为j=0,此为赋值操作,将0的值赋给j,因为0为假,结束循环。
(3)do...while语句
do...while语句的一般结构
do //先做事,再判断
{
循环语句; //do...while的循环语句至少执行一次
}while(表达式); //循环语句结束后,再判断是否执行下一次循环
do...while语句中的break和continue
用法与while语句中的用法一致。
break:
#include <stdio.h>
int main()
{
int i = 10;
do
{
if (i == 5)
break;
printf("%d\n", i);
i--;
} while (i < 10);
return 0;
}
当i=5时遇到break,直接跳出循环。
continue:
#include <stdio.h>
int main()
{
int i = 10;
do
{
if (i == 5)
continue;
printf("%d\n", i);
i--;
} while (i < 10);
return 0;
}
将break改为continue后,再执行代码,发现打印10 9 8 7 6后进入死循环。这是因为我们的调整部分i--在continue后面,导致循环一直卡在i=5,只需要将i--挪至continue前方即可。
goto语句
goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。例如:一次跳出两层或多层循环。多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。(从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。)
设置密码的程序:输入密码然后确认密码,如果两次密码不一致则重新输入,如果两次一样则提示密码确认成功。
#include<stdio.h>
#include<string.h>
int main()
{
char num1[10] = { 0 };//存放第一次输入密码
char num2[10] = { 0 };//存放第二次确认密码
printf("请设置您的密码:>");
again:
scanf("%s", num1);
printf("请确认密码:>");
scanf("%s", num2);
if (strcmp(num1, num2)!=0)//stecmp比较两个字符串的内容
{
printf("输入错误,请重新设置:>");
goto again;//这里again可以自定义,只要前后一致即可。
}
else
printf("输入正确,密码已确认:>\n");
return 0;
}
想要使用goto语句,需要为goto语句提供一个标签。例如上述代码中在scanf函数之前先设置一个again,当两次输入结果不同时,执行goto again,程序将跳到scanf函数,这里again可以自定义,只要前后的名称一样即可。goto语句可以跳至主函数的任何一个地方,这也是为何使用goto语句时bug容易出现的原因。
注:
- strcmp是用来比较两个字符串内容的函数:使用格式为strcmp(字符串1,字符串2),返回值为整型。
- 当字符串1和字符串2的内容一致时,strcmp返回值为0;
- 当字符串1小于字符串2时,strcmp返回值<0;
- 当字符串1大于字符串2时,strcmp返回值>0。(VS编译器中小于返回-1,等于返回0,大于返回1)
- 想要使用strcmp函数需要包含头文件<string.h>,否则编译器将会报警告“strcmp”未定义。
边栏推荐
- Fairygui bar subfamily (scroll bar, slider, progress bar)
- 3.C语言用代数余子式计算行列式
- Conceptual model design of the 2022 database of tyut Taiyuan University of Technology
- Tyut Taiyuan University of technology 2022 introduction to software engineering examination question outline
- Rich Shenzhen people and renting Shenzhen people
- View UI Plus 发布 1.2.0 版本,新增 Image、Skeleton、Typography组件
- What are the advantages of using SQL in Excel VBA
- 2年经验总结,告诉你如何做好项目管理
- 8.C语言——位操作符与位移操作符
- Voir ui plus version 1.3.1 pour améliorer l'expérience Typescript
猜你喜欢
更改VS主题及设置背景图片
Conceptual model design of the 2022 database of tyut Taiyuan University of Technology
Application architecture of large live broadcast platform
系统设计学习(一)Design Pastebin.com (or Bit.ly)
3.猜数字游戏
Database operation of tyut Taiyuan University of technology 2022 database
Dark chain lock (lca+ difference on tree)
最新坦克大战2022-全程开发笔记-2
十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩
图书管理系统小练习
随机推荐
Alibaba cloud microservices (IV) service mesh overview and instance istio
Employment of cashier [differential constraint]
1.C语言矩阵加减法
Iterable、Collection、List 的常见方法签名以及含义
3.猜数字游戏
(超详细onenet TCP协议接入)arduino+esp8266-01s接入物联网平台,上传实时采集数据/TCP透传(以及lua脚本如何获取和编写)
Ten minutes to thoroughly master cache breakdown, cache penetration, cache avalanche
(ultra detailed onenet TCP protocol access) arduino+esp8266-01s access to the Internet of things platform, upload real-time data collection /tcp transparent transmission (and how to obtain and write L
Alibaba cloud microservices (II) distributed service configuration center and Nacos usage scenarios and implementation introduction
西安电子科技大学22学年上学期《信号与系统》试题及答案
MySQL 30000 word essence summary + 100 interview questions, hanging the interviewer is more than enough (Collection Series
Tyut outline of 2022 database examination of Taiyuan University of Technology
TYUT太原理工大学2022软工导论大题汇总
FileInputStream和BufferedInputStream的比较
Network layer 7 protocol
Alibaba cloud microservices (III) sentinel open source flow control fuse degradation component
Atomic and nonatomic
Decomposition relation model of the 2022 database of tyut Taiyuan University of Technology
Design a key value cache to save the results of the most recent Web server queries
凡人修仙学指针-2