C语言的分支和循环

目录

前言

1. if 语句

1.1 if

1.2 else

1.3 分支中包含多条语句

1.4 嵌套 if

1.5 悬空 else 问题

1.6 练习题——闰年的判断

2. switch 语句

2.1 if 语句和 switch 语句的对比

2.2 switch语句中的break

2.3 switch 语句中的 default

2.4 switch 语句中的 case 和 default 的顺序问题

3. while 循环

3.1 if 和 while 的对比

3.2 while 语句的执行流程

3.3 while 循环的实践

3.4 练习题——输入一个正数,逆序打印这个整数的每一位

4. for 循环

4.1 语法形式

4.2 for循环的执行流程

4.3 for循环的实践

4.4 while循环和for循环的对比

4.5 练习题 

5.do while 循环

5.1 语法形式

5.2 do while 循环的执行流程

5.3 do while 循环实例

5.4 练习——输入一个正整数,计算这个整数是几位数

6.break 和 continue 语句

6.1 while 循环中的 break 和 continue

6.1.1 break 举例——打印数字

6.1.2 continue 举例

6.2 for循环中的break和continue

6.2.1 break 举例

6.2.2 continue 举例

6.3 do while 循环中的 break 和 continue

7.循环的嵌套

*  goto 语句

总结


C语言中的分支和循环结构在程序设计中占据着核心地位,它们为程序员提供了强大的控制流灵活性,我们一定要熟练掌握。

前言

C语言是可以实现顺序结构、选择结构、循环结构的结构化程序设计语言,可以使用if、switch实现分支结构,使用for、while、do while实现循环结构。


1. if 语句

1.1 if

if 语句的语法形式如下:

1 if (表达式)

2 语句

表达式为真,则语句执行,表达式为假,则语句不执行

举例:输入一个整数,判断是否为奇数

#include<stdio.h>

int main()
{
	int num = 0;
	scanf_s("%d", &num);
	if (num % 2 != 0)
		printf("%d 是奇数\n", num);
	return 0;
}

1.2 else

if else 语句的语法形式如下:

1 if (表达式)

2 语句 1

3 else

4 语句 2

举例:输入一个整数,判断是否为奇数。

#include<stdio.h>

int main()
{
	int num = 0;
	scanf_s("%d", &num);
	if (num % 2 != 0)
		printf("%d 是奇数\n", num);
	else
		printf("%d 是偶数\n", num);
	return 0;
}

1.3 分支中包含多条语句

默认在 if 和 else 语句中都只控制一条语句。

举例:判断一个人是否可以考驾照

#include<stdio.h>

int main()
{
	int age = 0;
	scanf_s("%d", &age);
	if (age >= 18)
		printf("已成年\n");
	printf("可以考驾照了!");
	return 0;
}

以上代码中,无论输入的年龄为多少,“ 可以考驾照了!”这句话都会打印在屏幕上,因为 if 语句只能控制一条语句,如果要 if 语句同时控制2条语句,就要使用{ }将代码括起来,else 后也可以跟大括号。

改进:

#include<stdio.h>

int main()
{
	int age = 0;
	scanf_s("%d", &age);
	if (age >= 18)
	{
		printf("已成年\n");
		printf("可以考驾照了!");
	}
	else
	{
		printf("未成年\n");
		printf("不可以考驾照!");
	}
	return 0;
}

1.4 嵌套 if

在 if else 语句中,else 可以与另一个 if 语句连用,构成多重判断。

举例:输入一个整数,判断其是正数、负数还是零

#include<stdio.h>

int main()
{
	int num = 0;
	scanf_s("%d", &num);
	if (num == 0)
		printf("输入的数字是0\n");
	else if (num > 0)//这里的if相当于嵌套在else语句中,形成了嵌套结构
		printf("输入的数字是正数\n");
	else
		printf("输入的数字是负数\n");

	return 0;
}

复杂逻辑判断举例:通过年龄判断一个人正处于什么阶段

#include<stdio.h>

int main()
{
	int age = 0;
	scanf_s("%d", &age);
	if (age < 18)
	{
		printf("少年\n");
	}
	else
	{
		if (age <= 44)
		{
			printf("青年\n");
		}
		else
		{
			if (age <= 59)
			{
				printf("中老年\n");
			}
			else
			{
				printf("老年\n");
			}
		}
	}
	return 0;
}

1.5 悬空 else 问题

如果有多个 if 和 else ,else 总是与最接近的 if 匹配。只要带上大括号,代码的逻辑就会更加清晰,可读性会更高。

1.6 练习题——闰年的判断

题目:输入一个年份 year,判断 year 是否为闰年

闰年判断规则:

1.能被4整除并且不能被100整除是闰年

2.能被400整除

#include<stdio.h>

//法一:

int main()
{
	int year = 0;
	scanf_s("%d", &year);
	if (year % 4 == 0 && year % 100 != 0)
		printf("是闰年\n");
	else if (year % 400 == 0)
		printf("是闰年\n");

	return 0;
}

//法二:

int main()
{
	int year = 0;
	scanf_s("%d", &year);
	if (year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)
		printf("是闰年\n");

	return 0;
}

2. switch 语句

除了 if 语句,C语言还提供了 switch 语句来实现分支结构

switch 语句是一种特殊的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 该车更易用、可读性更好的形式。

语法形式如下:

1 switch (expression) {

2 case value1:statement

3 case value1:statement

4 default: statement

5 }

以上代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行 default 分支

注意:

  • switch后的expression必须是整型表达式
  • case后的值,必须是整型常量表达式

2.1 if 语句和 switch 语句的对比

举例:输入任意一个整数值,计算除3后的余数

使用 if 语句如下:

#include<stdio.h>

int main()
{
	int n=0;
	scanf("%d", &n);
	if (n % 3 == 0)
		printf("整数,余数为0\n");
	else if (n % 3 == 1)
		printf("余数是1\n");
	else
		printf("余数是2\n");
	return 0;
}

使用 switch 语句如下:

#include<stdio.h>

int main()
{
	int n=0;
	scanf("%d", &n);
	switch (n % 3)
	{
	    case 0:(冒号)
			printf("整数,余数为0\n");
			break;
		case 1:
			printf("整数,余数为1\n");
			break;
		case 2:
			printf("整数,余数为2\n");
			break;
	}
	return 0;
}

总结以上代码,注意:

  • case和后面的数字之间必须有空格
  • 每一个case语句中的代码执行完成后,需要加上break才能跳出这个switch语句

2.2 switch语句中的break

switch语句有分支效果,只有在switch语句中使用break才能跳出switch语句,若某个case语句后没有break语句,代码会继续往下执行,直到遇到break语句或者switch语句结束。

所以在 switch 语句中 break 语句非常重要,能实现真正的分支效果。当然,它的位置根据实际情况而定。

举例:输入1~7的数字,判断是工作日还是休息日

#include<stdio.h>

int main()
{
	int day = 0;
	printf("请输入1-7的数字用于判断");
	scanf_s("%d", &day);

	switch (day)
	{
	   case 1:
	   case 2:
	   case 3:
	   case 4:
	   case 5:
		   printf("工作日\n");
		   break;
	   case 6:
	   case 7:
		   printf("休息日\n");
		   break;
	}
	return 0;
}

2.3 switch 语句中的 default

在使用 switch 语句时,可能遇到 switch 后的表达式中的值无法匹配代码中的 case 语句,这时,要不不做处理,要不在 switch 语句中加入 default 子句。

1 switch (expression) {

2  case value 1: statement

3  case value 2: statement

4  default: statement

5 }

switch 后边的 expression 的结果不是 value1,也不是 value2 的时候,就会执行 default 子句。

举例:判断今天是工作日还是休息日,输入错误时要显示

#include<stdio.h>

int main()
{
	int day = 0;
	printf("请输入1-7的数字用于判断");
	scanf_s("%d", &day);

	switch (day)
	{
	   case 1:
	   case 2:
	   case 3:
	   case 4:
	   case 5:
		   printf("工作日\n");
		   break;
	   case 6:
	   case 7:
		   printf("休息日\n");
		   break;
	   default:
		   printf("输入错误\n");
		   break;
	}
	return 0;
}

2.4 switch 语句中的 case 和 default 的顺序问题

在switch 语句中,case 语句和 default 语句没有顺序要求,满足实际需求即可,不过通常把 default子句放在最后处理。


3. while 循环

3.1 if 和 while 的对比

1 if(表达式)

2     语句;

3 while(表达式)

4     语句;//如果循环体想包含更多语句,可以加上大括号

举例:

#include<stdio.h>
//代码一:

int main()
{
	if (1)
		printf("hello world!");//if后条件满足,打印一次hello world!
	return 0;
}


#include<stdio.h>
//代码二:

int main()
{
	while(1)
		printf("hello world!");//while后条件满足,死循环打印hello world!
	return 0;
}

3.2 while 语句的执行流程

首先执行判断表达式,表达式的值是0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断是否进行下一次判断。

3.3 while 循环的实践

举例:在屏幕上打印1~10的值

#include<stdio.h> 

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

3.4 练习题——输入一个正数,逆序打印这个整数的每一位

解析:

1.可以使用n%10得到n的最低位,得到的余数就是最低位,如:1234%10=4

2.可以使用n/10去掉n的最低位,找出倒数第二位,如:1234/10=123,123%10=3

3.循环1和2步骤,在n变成0之前,可以得到所有位。

#include<stdio.h> 

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	while (n)
	{
		printf("%d", n % 10);
		n /= 10;
	}
	return 0;
}

4. for 循环

4.1 语法形式

for 循环氏三种循环中使用最多的,for 循环语法形式如下:

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

2 语句;//如果循环想包含更多语句,可以加上大括号

表达式1 用于循环变量的初始化

表达式2 用于循环结束条件的判断

表达式3 用于循环变量的调整

注意:for 循环的初始化、判断、循环三个表达式都可以省略,但是判断部分省略表示判断部分恒为真

4.2 for循环的执行流程

首先执行表达式1,初始化循环变量,接着执行表达式2的判断部分,表达式2的结果为0,则循环结束;表达式2的结果!=0,则执行循环语句,循环语句执行完后再执行表达式2,调整循环变量,然后回到表达式2,判断表达式2结果是否为0,决定循环是否继续。

4.3 for循环的实践

举例:在屏幕上打印1~10的值

#include<stdio.h> 

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

4.4 while循环和for循环的对比

for和while在实现循环的过程中都有初始化、判断、调整三个部分,但是for循环的这三个部分非常集中,便于代码维护,如果代码较多的时候while循环的三个部分就比较分数,所以形式上for循环要更优一些。

4.5 练习题 

题目:计算1~100之间3的倍数的数字之和

#include<stdio.h> 

int main()
{
	int i = 0;
	int sum = 0;
	for (i = 3; i <= 100; i+=3)
	{
			sum += i;
	}
	printf("%d\n", sum);
	return 0;
}

5.do while 循环

5.1 语法形式

在循环语句中do while语句的使用最少,语法如下:

1 do

2     语句;

3 while(表达式);//循环至少执行一次

while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;但do while 循环是先进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就进行下一次,表达式为假,不在继续循环。

5.2 do while 循环的执行流程

在 do while 循环中先执行图上的“语句”,执行完语句,再执行“判断表达式”,判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。

所以在 do while 语句中循环体至少执行一次,这时 do while 循环特殊的地方。

5.3 do while 循环实例

题目:在屏幕上打印1~10的值

#include<stdio.h> 

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

一般 do while 使用在循环体至少被执行一次的场景下,所以少一些。

5.4 练习——输入一个正整数,计算这个整数是几位数

#include<stdio.h> 

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int cnt = 0;
	do
	{
		cnt++;
		n = n / 10;
	} while (n);//n=0就跳出循环
	printf("%d\n", cnt);

	return 0;
}

这里并非必须使用 do while 语句,但是这个代码比较适合do while 循环,因为n即使是0,也是1位数,要统计位数。


6.break 和 continue 语句

在循环执行的过程中,若某些状况发生时需要提前终止循环,这种情况很常见。C语言提供了 break 和 continue 两个关键字用于循环。

  • break的作用是永久终止循环,只要break被执行,直接跳出循环,继续往后执行。
  • continue的作用是跳过本次循环continue后边的代码,在for循环和while循环中有所差异

6.1 while 循环中的 break 和 continue

6.1.1 break 举例——打印数字

#include<stdio.h> 

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;//当i等于5后,就执行break,循环就终止了
		printf("%d", i);
		i = i + 1;
	}

	return 0;
}

执行结果为:1 2 3 4

此处,break 的作用是永久终止循环,只要 break 被执行,break 外的第一层循环就终止了。

所以在循环中,想在某种条件下终止循环,可以使用 break 达到效果。

6.1.2 continue 举例

continue 是继续的意思,在循环中的作用是跳过本次循环中的 continue 后的代码,继续执行下一次循环的判断。

将上一个例子中的 break 换成 continue 举例:

#include<stdio.h> 

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		//当i等于5后,就执行continue,直接跳过continue后面的代码,去循环的判断地方
		//这里跳过了i=i+1,所以i一直为5,程序陷入死循环
		printf("%d", i);
		i = i + 1;
	}

	return 0;
}

通过以上可以总结出continue可以使程序跳过某一次循环continue后的代码,直接到循环判断部分,进下一次循环,如果循环调整在continue后的话,可能会造成死循环

6.2 for循环中的break和continue

6.2.1 break 举例

同 while 循环中的 break , for 循环中的 break 也用于终止循环,不管循环需要多少次,只要执行到break ,循环就彻底终止。

#include<stdio.h> 

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

	return 0;
}

运行结果:1 2 3 4

6.2.2 continue 举例

将上一个例子中的 break 换成 continue 举例:

#include<stdio.h> 

int main()
{
	int i = 1;
	for(i=1;i<=10;i++)
	{
		if (i == 5)
			continue;//这里continue跳过了后边的打印,来到了i++的部分
		printf("%d", i);
	}

	return 0;
}

运行结果:1 2 3 4 6 7 8 9 10

通过以上可以总结出 for 循环中 continue 的作用是跳过本次循环中 continue 后的代码,直接到循环的调整部分。当某个条件发生时,本次循环无需再执行后续某些操作时,可以使用 continue 实现。

6.3 do while 循环中的 break 和 continue

do while 循环中的 break 和 continue 的作用和 while 循环中几乎一模一样,请看相关代码:

#include<stdio.h> 

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

	return 0;
}

运行结果:1 2 3 4

#include<stdio.h> 

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

	return 0;
}

运行结果:1 2 3 4_程序陷入死循环


7.循环的嵌套

前面提到的三种循环 while,do while , for , 这三种循环往往会嵌套在一起才能更好的解决问题,成为循环嵌套。

题目练习——找出100~200之间的素数,并打印在屏幕上:

题目解析:

  • 首先得到100~200之间的数,可以使用循环解决问题。
  • 假设判断i是否为素数,需要拿 2~( i-1) 之间的数字去试除 i , 产生2~( i-1 )之间的数字,也可用循环。
  • 若2~( i-1)之间有数字能整除 i ,则 i 不是素数,若不能整除,则 i 是素数。

以上是基本解题思路,但是具体编写程序时还可以优化,提高效率。

#include<stdio.h> 
#include<math.h>

int main()
{
	int i = 0;

	for (i = 101; i <= 200; i += 2)//优化:素数不可能是偶数,所以从101开始,每次+2
	{
		int j = 0;
		int flag = 1;//假设i是素数
		for (j = 2; j<=sqrt(i); j++)//优化
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
			printf("%d ", i);
	}

	return 0;
}

*  goto 语句

C语言提供了一种特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。

例如:

#include<stdio.h> 

int main()
{
	printf("hello\n");
	goto next;
	printf("world\n");

next:
	printf("跳过world的打印\n");

	return 0;
}

goto语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以尽量不去使用;但是goto语句并非一无是处,在多层循环的代码中,若想快速跳出,使用goto语句就很方便。

1 for(...)

2 {

3       for(...)

4       {

5             for(...)

6              {

7                   if (disaster)

8                          goto error;

9               }

10       }

11 }

12

13 error:

14       //...

本来 for 循环想提前退出得使用 break ,一个 break 只能跳出一层 for 循环,如果3层循环嵌套就得使用3个break才能跳出循环,所以在这种情况下使用goto语句就会更快捷。


总结

       以上就是要讲的内容,本文仅仅简要介绍了C语言分支和循环结构的知识及应用。这些结构不仅为程序员提供了编程的灵活性,而且对于构建清晰、高效的程序流程至关重要。例如,使用嵌套的分支和循环可以解决更复杂的问题,如图形渲染、算法优化等。此外,分支和循环的高级应用,如循环嵌套、分支嵌套、循环套分支和分支套循环等,进一步扩展了它们的功能和实用性。
       总之,分支和循环结构是C语言的核心组成部分,对程序的逻辑和控制流起到了关键作用。深入理解和掌握这些结构对于编写高效、健壮的C语言程序至关重要。希望以上内容可以帮助到您!

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值