初阶C语言-分支和循环语句(上)

“花会沿途盛开,以后的路也是。” 今天我们一起来详细了解一下分支语句和循环语句。

1.什么是语句?

C语言中,语句可以分为以下5类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句
    3 + 2;//表达式语句
	printf("Hello World!\n");//函数调用语句
	;//空语句-当我们需要一条语句,但这条语句什么都不需要做,那么我们可以选择空语句

这里我们重点介绍一下控制语句,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们是由特定的语句定义符组成。 C语言中有9种控制语句:

1.条件判断语句即分支语句:

  • if
  • switch

2.循环执行语句

  • while
  • for
  • do…while

3.转向语句

  • goto语句
  • break语句
  • continue语句
  • return语句

2.分支语句(选择结构)

2.1 if语句

语法结构:
if(表达式)//表达式结果为真,语句被执行;表达式结果为假,语句就不会被执行。
     语句;   

注:C语言中:0表示假,非0表示真
下面给出示例:

#include <stdio.h>
int main()
{
    
    
	int age = 0;
	scanf("%d",&age);
	if (age >= 18)
		printf("成年人!\n");
	return 0;
}

在这里插入图片描述

双分支if语句:

if(表达式)//表达式为真,语句1被执行;表达式为假,语句2被执行
     语句1else
     语句2

下面给出示例:

#include <stdio.h>
int main()
{
    
    
	int age = 0;
	scanf("%d",&age);
	if (age >= 18)
		printf("成年人!\n");
	else
		printf("未成年人!\n");
	return 0;
}

在这里插入图片描述
在这里插入图片描述

多分支if语句:

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

下面给出示例:

#include <stdio.h>
int main()
{
    
    
	int age = 0;
	scanf("%d",&age);
	if (age < 18)
		printf("未成年人!\n");
	else if (age >= 18 && age <= 40)//这行的表达式不能写成18<=age<=40!!!
		printf("青年!\n");
	else if (age > 40 && age <= 65)
		printf("中年!\n");
	else
		printf("老年!\n");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
这边给出一段代码:大家思考一下该段代码的执行结果是什么?

#include <stdio.h>
int main()
{
    
    
    int a = 0;
	int b = 2;
	if (a == 1)
		if(b==2)
		printf("haha!\n");
	else
		printf("hihi\n");
	return 0;
}

这里,一眼看过去,大家的第一想法可能是屏幕上打印出hihi,但是实际上,应该什么都不打印,这里可以运行出来给大家看一下。
在这里插入图片描述
为什么会这样呢?这里就需要我们注意一下,一般情况下,else与离它最近的if匹配==,上面代码规范之后,应当如下:

#include <stdio.h>
int main()
{
    
    
    int a = 0;
	int b = 2;
	if (a == 1)
		if(b==2)
		printf("haha!\n");
		else
		printf("hihi\n");
	return 0;
}

从上述代码,我们了解到在第一个if语句中的表达式a==1就不成立,所以会直接跳出下面的嵌套if语句,打印输出不会被执行。

2.1.1 if语句练习

1.判断一个数是不是奇数?

#include <stdio.h>
int main()
{
    
    
	int n;
	scanf("%d", &n);
	if (n % 2 == 1)
		printf("Yes!\n");
	else
		printf("No!\n");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
2.输出1~100的所有奇数

//输出1~100的奇数
//方法一:
#include <stdio.h>
int main()
{
    
    
	int n = 1;
	while (n <= 100)
	{
    
    
		if (n % 2 == 1)
			printf("%d ", n);
		n++;
	}
	return 0;
}
//方法二:
#include <stdio.h>
int main()
{
    
    
	int n = 1;
	while (n <= 100)
	{
    
    
	    printf("%d ", n);
		n = n + 2;y		
	}
	return 0;
}

在这里插入图片描述

2.2 switch语句

switch语句也是一种分支语句,常常用于多分支的情况。

比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期七

这里就出现了多分支的情况,用if语句来表示就较为复杂,要用到不一样的语法形式,这里我们就可以考虑switch语句。

switch(整形表达式)//表达式的结果必须是整型,根据表达式的值来选择相应的语句项来执行
{
    
    
    语句项://语句项是一些case语句
    //示例如下:
    case 整型常量表达式:
         语句;
}

对于上面的例子,我们给出下面这段代码:

#include <stdio.h>
int main()
{
    
    
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
    
    
	case 1:
		printf("星期一!\n");
	case 2:
		printf("星期二!\n");
	case 3:
		printf("星期三!\n");
	case 4:
		printf("星期四!\n");
	case 5:
		printf("星期五!\n");
	case 6:
		printf("星期六!\n");
	case 7:
		printf("星期天!\n");
	}
	return 0;
}

那么,这样到底对不对呢?我们运行一下试试:
在这里插入图片描述
我们可以发现,当我们输入3的时候,它不仅仅打印了星期三,包含下面的几个语句项也都执行了,执行流程如下:
在这里插入图片描述
但是,我们并不希望它打印这么多出来,而是只希望打印一个星期三,那么我们应该如何调整呢?
这里我们就引出了switch语句中的break

2.2.1switch语句中的break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
那么我们修改一下上述代码,改成我们希望的那个样子:

#include <stdio.h>
int main()
{
    
    
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
    
    
	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;
	}
	return 0;
}

在这里插入图片描述
下面,我们对于这个示例,在给出变化,大家可以尝试写一下:当输入1-5的时候,输出weekday,当输出6-7的时候,输出weekend.下面给出我的代码:

#include <stdio.h>
int main()
{
    
    
	int day;
	scanf("%d", &day);
	switch (day)
	{
    
    
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("Weekday!\n");
		break;
	case 6:
	case 7:
		printf("Weekend!\n");
		break;
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述
这个时候,还出现了一个问题,就是当我输入8的时候,能否给出一个提示呢?这里我们就引进了default子句。

2.2.2default子句

如果表达的值与所有的case标签的值都不匹配,这该怎么办?就是所有的语句都被跳过而已,程序不会被终止,也不会报错,在C中它不认为这是一个错误。但是,你不想忽略不匹配所有标签的表达式的值,该怎么办?你可以在列表中增加一条default子句,default子句可以出现在任何一个case标签可以出现的位置。当switch表达式的值并不匹配所有case标签的值的时候,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。 这里我们可以对上述代码做出修改:

#include <stdio.h>
int main()
{
    
    
	int day;
	scanf("%d", &day);
	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("选择错误!\n");
		break;
	}
	return 0;
}

在这里插入图片描述

3.循环语句

  • while
  • for
  • do while

3.1while循环

在前面,我们已经掌握了if语句:

if(条件)
     语句;

我们知道当条件满足的情况下,if语句执行,否则不执行。但是这个语句只会执行一次。但是在日常生活中,我们发现同一件事情,可能需要我们做很多次。那么,我们应该怎么做呢?这里我们引入了while语句:

while(表达式)
    循环语句;

while语句的执行流程为:先对表达式的值进行判断,如果表达式的值为真,则执行循环语句。然后再对表达式进行判断,只要为真,则执行循环体,以此往复,直到表达式的值为0,跳出循环。
下面我们给出一个示例:如果我们要在屏幕上打印1~10的数字,我们该如何做呢?

#include <stdio.h>
int main()
{
    
    
	int n = 1;
	while (n <= 10)
	{
    
    
		printf("%d ", n);
		n++;
	}
	return 0;
}

在这里插入图片描述
上面已经了解到while的基本语法,接着我们再详细了解一下:

3.1.1while语句中的break和continue

对于下面这段代码,会输出什么样的结果呢?

#include <stdio.h>
int main()
{
    
    
	int n = 1;
	while (n <= 10)
	{
    
    
		if (n == 5)
			continue;
		printf("%d ", n);
		n++;
	}
	return 0;
}

大家可以运行着试一试,我们可以发现出现了死循环,光标在4的后面一直闪烁。
在这里插入图片描述
这是为什么呢?n从1~4都不存在问题,但是当n=5的时候,遇到了continue,跳出了本轮循环,下面的语句没有被执行,此时,n依旧为5,又遇到了continue,跳出本次循环后面的代码,以此往复,n的值会一直为5,进入了死循环。

continue在while循环中的作用:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是跳转到while语句的判断部分,进行下一次循环的入口判断。

还是上面的例子,当我们把n++放到if语句上面,会出现什么样的结果呢?

#include <stdio.h>
int main()
{
    
    
	int n = 1;
	while (n <= 10)
	{
    
    
		n++;
		if (n == 5)
			continue;
		printf("%d ", n);
	}
	return 0;
}

不难看出,这里的n先进行+1的操作在打印输出,只有当n=5的时候跳出,所以会打印输出2~4、 6~11。
在这里插入图片描述
那么,continue我们已经有所了解,那么break又有什么作用呢?

//break语句:
#include <stdio.h>
int main()
{
    
    
	int n = 1;
	while (n <= 10)
	{
    
    
		if (n == 5)
			break;
		printf("%d ", n);
		n++;
	}
	return 0;
}

在这里插入图片描述
这里,为什么只输出了1~4呢?这里,我们就给出break的用法!

break在while循环中的作用:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。所有,while中的break就是永远终止循环的。

3.2getchar()和putchar()语句

getchar()-获取(输入)一个字符,读取字符成功的时候,返回字符的ASCII码值,读取失败或遇到文件末尾时就返回EOF(-1)
putchar()-输出一个字符

#include <stdio.h>
int main()
{
    
    
	int ch = getchar();
	putchar(ch);
	return 0;
}

在这里插入图片描述
我们发现上述代码可以接受并打印出该字符!
下面,我们再看一看下面这段代码,看看它是用来干什么的?

#include <stdio.h>
int main()
{
    
    
	int ch = 0;
	while ((ch = getchar())!= EOF)
	{
    
    
		if (ch < '0' || ch>'9')
			continue;
		putchar(ch);
	}
	return 0;
}

对于这段代码的研究,我们就需要弄清楚ASCII码值,前面我们其实已经给大家看过了,这里我们在拿出来给大家看一下:
在这里插入图片描述
我们可以发现上面那段代码的意思是只打印字符0~9之间的字符,通过ASCII码表,我们发现对应的是数字字符0 ~9。这段代码的作用是只打印数字字符,跳过其他字符。通过下方的示例输出,我们也可以发现这个结果。在运行的时候,我们发现,这个光标会一直往下闪烁,程序没法退出,这个时候,我们可以按键盘上的ctrl+Z+回车键解决这个问题。
在这里插入图片描述

好啦,今天就学到这里啦,欢迎大家关注、点赞和评论!

猜你喜欢

转载自blog.csdn.net/qq_73121173/article/details/131787816