前言:
各位小伙伴大家好,欢迎大家来到C语言第二模块分支语句和循环语句的详解。在这里你将学到更多有趣的C语言知识,if else、if else if …… else 、switch、while、for、do……while等语句的使用规则。
本模块的讲解思路由思维导图给出:
一、C语言的语句
在C语言中,语句是以分号结尾的字符序列,是程序最基本的执行单位,分号是C语句的必要组成部分。书写程序代码时,一行可以写几个语句,一个语句也可以写在多行上。C语句包含多种形式。
1.1说明语句
说明语句用于定义程序所使用的变量与类型。例如:
int a,b; //定义两个类型变量
char ch; //定义一个字符型变量
1.2表达式语句
表达式语句由表达式加上分号“;”组成。其一般形式如下:
表达式;
例如:
c = a + b //是一个赋值表达式。
c = a + b;//是一个表达式语句。
1.3分支语句
分支语句实现分支控制过程,根据条件成立与否执行不同的语句。有两种分支结构,即双分支的if-else语句与多分支的switch语句。例如:
int main()
{
int x = 2;
int y = 3;
if(x>y)
{
z = x;
}
else
{
z = y;
}
return 0;
}
该语句首先判断if后面的表达式(x>y),如果条件成立执行“z = x;”,否则执行“z = y;”if语句执行后,变量z中存放的是变量x与y中较大的值。
1.4循环语句
C语言中实现循环控制的语句由3种,即for语句、while语句和do-while语句。如要输出1~10之间的数,采用while语句代码如下:
上述代码中,首先定义一个整型变量i,然后通过while循环来打印1~10的数字,其中i<=10是循环执行条件。大括号中,循环体执行一次,打印一次i再让i自增1。这样就实现了循环打印1~10的数字。
1.5转向语句
转向语句有break语句、goto语句、continue语句、return语句。
1.6复合语句
用一对大括号{ }将若干语句顺序组合在一起所形成的语句称为复合语句。C语句中除复合语句外的其他所有都以分号结束。如:
{
sum = sum + i;
i = i + 2;
}
1.7空语句
空语句只由一个分号构成。如:
;
1.8函数定义与调用
函数式完成特定功能的小模块,式C语言中唯一的一种子程序,常常在一个C程序中包含若干个函数,复杂的任务通过调用这些函数来完成。如函数:
int max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int x = 3;
int y = 5;
printf("%d\n", max(x, y));
return 0;
}
其中,int max(int x,inty)为函数定义的头部,由函数的返回值类型、函数名、参数列表组成,花括号{ }中的部分称为函数体,函数体由数据表达与流程控制语句组成。有关函数的问题后面文章会详细解释,这里先大概了解以下就可以了。
1.9输入和输出
C语言没有提供用于数据输入及输出的语句,所有的输入和输出都是通过系统提供的有关函数(如scanf()和printf()函数)来实现的。
二 分支语句
分支语句讲解思路
2.1if语句
if语句执行流程图
2.1.1 if语句的语法结构
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
运用以上语法结构书写代码,代码如下:
//写代码将三个整数数按从大到小输出。
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
int t = 0;
if (a < b)
{
t = a;
a = b; //一条语句可以不带大括号,多条语句需要带大括号
b = t;
}
if (a < c)
{
t = a;
a = c;
c = t;
}
if (b < c)
{
t = b;
b = c;
c = t;
}
printf("%d %d %d", a, b, c);
return 0;
}
int main()
{
int x = 2;
int y = 3;
if(x>y)
{
z = x;
}
else
{
z = y;
}
return 0;
}
int main()
{
int score = 0;
scanf("%d", &score);
if (score >= 90 && score <= 100)
{
printf("A");
}
else if (score < 90 && score >= 80)
{
printf("B");
}
else if (score < 80 && score >= 70) //70<=score<=80也可以打印成绩C,但是当score等于85时,也 // 可以打印成绩C,这是由于,85也是大于70的现在表达式为真,
//所以,系统不会判断score是小于80的。
{
printf("C");
}
else if (score < 70 && score >= 60)
{
printf("D");
}
else if (score < 60 && score >= 0)
{
printf("E");
}
else
{
printf("F");
}
return 0;
}
解释:如果表达式的结果为真,则语句执行。
在C语言中0表示假,非0表示真。
2.1.2悬空else
我们来看代码:
注意:else的匹配,else是和它里的最近的if匹配的
2.1.3 if书写形式的对比
//代码一
if(condition)
{
return x;
}
return y;
//这种代码可以在程序中使用,但是一般不建议。
//代码二
if(condition)
{
return x;
}
else
{
return y;
}
//这种代码是推荐使用的。
//代码三
int num = 1;
if (num == 5)
{
printf("hehe\n");
}
//如果条件表达式是 变量==数字 的形式,可以把它们左右调换,避免出错
//代码四
int num = 1;
if (5 == num)
{
printf("hehe\n");
}
2.1.4练习
判断一个数是否为奇数。
输出1-100之间的奇数
2.2switch语句
在C语言中还提供了一种switch语句也可以实现多分支的选择。
switch语句的一般形式如下:
执行流程图:
关于switch语句的几点说明:
switch后的表达式可以是任何表达式,其值只能为整型、字符型、枚举型之一。
每个case后面的常量表达式的值互不相同,否则会出现相互矛盾的现象。
各个case和default的出现次序不影响执行结果。
可以让多个case共用一组执行语句。
2.2.1在switch语句中的break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。可以是一个case一个break也可以是多个case一个break。
编写一个程序,实现如下功能:根据键盘输入的年、月、输出该年、该月的天数。
int main()
{
int year, month, days;
printf("请输入年,月:");
scanf("%d %d", &year, &month);
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 10:
case 12: //多个case使用一个break
days = 31;
break;
case 4:
case 6:
case 9:
case 11: //一个case使用一个break
days = 30;
break;
case 2:
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
{
days = 29; //闰年2月有29天
}
else
{
days = 28; //平年2月有28天
}
break;
}
printf("%d年%d月的天数是%d天\n", year, month, days);
return 0;
}
运行结果截图
break语句的实际效果是把语句列表划分为不同的分支部分。
在最后一个case语句后面加上break语句是一个编程好习惯。
2.2.2default子句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在 C 中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可 以在语句列表中增加一条default子句,把下面的标签
default:写在任何一个 case 标签可以出现的位置。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
2.2.3练习
此程序的输出结果为什么
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++; //m = 3
case 2:
n++; //n = 2
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++; //m = 4
n++; //n = 3
break;
}
case 4:
m++; //m = 5
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n); //m = 5,n = 3
return 0;
}
答案为:m = 5,n = 3。
三 循环语句
循环语句讲解思路
3.1while循环
while语句的基本语句
while语句在使用时,总是先要判断一个条件,所以可以用while语句实现“当型”循环。while语句的一般形式如下
while(表达式){
循环体;
}
while循环的执行流程图:
while循环使用示例
//计算1~100的和
int main()
{
int i = 1;
int sum = 0;
while (i <= 100)
{
sum += i;
i++;
}
printf("%d\n", i);
}
3.1.1while语句中的break和continue
break介绍
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
此时的运行结果为:1 2 3 4
由以上代码可知:循环中遇到break,就停止后期的所有循环,直接终止循环。所以:while中的break是用于永久终止循环。
continue介绍
代码举例:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
此代码的运行结果为:1 2 3 4 死循环。
continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环。continue语句只能用在循环语句中,常与if语句一起使用。
break和continue语句的区别:continue语句只是结束本次循环,并不终止整个循环的执行;而break语句的作用是强制终止整个循环程序。
3.1.2特殊代码讲解
这里可以看这个链接的博客:这个是我同学写的博客,他这部分的内容学的精细,所以就给个链接去看看他的博客。
//编写代码,只打印数字字符,跳过其他字符
//代码实现如下:
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0'|| ch > '9') //这里运用了continue语句在while循环中的作用。
continue;
putchar(ch);
}
return 0;
}
3.2for循环
for语句是C语言提供的功能强大、使用广泛的一种循环结构,不仅可以解决循环次数未知的循环问题,特别适合解决循环次数已知的循环问题。
3.2.1for语句的基本语法
for语句的一般形式为:
for(表达式1;表达式2;表达式3){ 循环体 }
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
for语句的执行流程图
代码举例:
//累加1~10的和
int main()
{
int sum = 0;
for (int i = 1; i <= 10; i++)
{
sum += i;
}
printf("%d\n", i);
return 0;
}
3.2.2break和continue在for循环中
本部分内容同3.1.1,把while循环换成for循环就可以了
3.2.3for语句的循环控制变量
不可在for 循环体内修改循环变量,防止 for 循环失去控制。
建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
这些只是建议并不是绝对的。
3.2.4一些for循环的变种
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
题。
//代码2
int i = 0;
int j = 0;
//这里打印多少个hehe? //这里大印100个hehe
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe? 这里打印十个hehe
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//代码4-使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
3.2.5练习
3.3do-while循环
3.3.1do-while的语法
do
{
循环体
}while(表达式);
3.3.2do-while的执行流程图
3.3.3do语句的特点
循环至少循环一次,使用场景有限,所以不是经常使用。
代码举例:
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
运行结果为:1 2 3 4 5 6 7 8 9 10。
3.3.4 do-while循环中的break和continue语句
这里参考while循环中的break和continue语句
四、练习
1、计算n!
2. 计算 1!+2!+3!+……+10!
五、猜数字游戏
代码如下:
//猜数字游戏,生成1到100的随机数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("****************************************\n");
printf("**************** 1.play ****************\n");
printf("**************** 0.exit ****************\n");
printf("****************************************\n");
}
void game()
{
//产生随机数
int num = rand() % 100 + 1;
int guess = 0;
while (1)
{
printf("请输入数字:>");
scanf("%d", &guess);
if (guess < num)
{
printf("猜小了!\n");
}
else if (guess > num)
{
printf("猜大了!\n");
}
else
{
printf("猜对了! %d\n", num);
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("玩游戏\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
选择循环语句讲解结束,大家可以把后面的题做一做,答案可以私信我
在一个有序数组中查找具体的某个数字n。
编写代码,演示多个字符从两端移动,向中间汇聚。
编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序