C语言循环与分支不会用?来看看!

2024-10-09 20:09:50 浏览数 (3)

(本人新手小白,欢迎指正)

在C语言中,结构可以分为三种,分别是:循环结构、选择结构、顺序结构。

顺序结构:

循环结构:while、for、do-while

选择结构:if-else、swich

1.0顺序结构

即自上而下按进行。

代码语言:javascript复制
#include <stdio.h>
int main()
{
	printf("1");
	printf("2");
	printf("3");
	printf("4");
	printf("5");
	return 0;
}

2.0循环结构

2.1while

我们先来看看while的语法

代码语言:javascript复制
while(表达式)
{
   循环体
}
2.1.1实践:在屏幕上打印1~10的数
代码语言:javascript复制
#include<stdio.h>//main的头文件
int main()//主函数
{
   int m = 1;//初始化变量
   while(m)
   {
      printf("%d ",m);
      m   ;
   }
   return 0;
}

此时就会打印1~10的数字,这就是while循环的简单应用了。

首先在循环外初始变量,然后

2.2 for

for循环在三种循环中最常见,也是应用较为多的一种。

代码语言:javascript复制
for(表达式1;表达式2;表达式3)
{
   循环体
}

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

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

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

2.2.1实践:在屏幕上打印1~10的值
代码语言:javascript复制
#include <stdio.h>
int main()
{
   int i = 0;
   for(i = 1; i <= 10; i  )
   {
      printf("%d ",i)
   }
   return 0;
}

2.3 do-while

代码语言:javascript复制
do
{ 
   循环体
}while(表达式)

while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环; ⽽ d o while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ 达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。

2.3.1实践:在屏幕上打印1~10的值
代码语言:javascript复制
#include <stdio.h>
 int main()
 {
   int i = 1;
   do
   {
       printf("%d ", i);
       i = i   1;
    }while(i<=10);
   return 0;
 }

2.4 while和for的比较

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

2.5 break和continue语句

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中 提供了 continue 两个关键字,就是应该到循环中的

  1. break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执 ⾏。
  2. co ntinue 的作⽤是跳过本次循环 差异的。
2.5.1 while循环中的break和continue
2.5.1.1 break举例
代码语言:javascript复制
#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 后遇到5,满足i=5时,break执行,跳出循环,不再执行。

break的作用就是永久的终止循环,只要brake执行,break外的第一层循环就不会被执行,以后若想在某种条件下终止循环,则可以使用break来完成,达到我们想要的效果。

2.5.1.2 continue举例

我们把上面break换成continue看看结果会是什么?

代码语言:javascript复制
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (i == 5)
            continue;//当i等于5后,就执行continue,5的循环就被跳过了。
                     //但i=i 1也被跳过,所以这里进入死循环。
        printf("%d ", i);
        i = i   1;
    }
    return 0;
}

到这里,不难发现,continue的作用,就是跳过continue后的代码,但若把循环的调整放在continue则会进入死循环。

2.5.2 for循环中的break和continue

for循环和while循环中的break是一样的,都是跳出循环,不管后面还有多少次循环。

2.5.2.1 break举例
代码语言:javascript复制
#include <stdio.h>
int main()
{
    int i = 1;
    for (i = 1; i <= 10; i  )
    {
        if (i == 5)
            break;
        printf("%d", i);
    }
    return 0;
}

运行结果

2.5.2.2 continue举例

将上面代码的break换成continue会是什么结果?上代码。

代码语言:javascript复制
#include <stdio.h>
int main()
{
    int i = 1;
    for (i = 1; i <= 10; i  )
    {
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}

运行结果

所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。

2.5.3 do-while中的break和continue

do-while中的情况几乎和while的情况一模一样,在次不做过多演示。

3.0选择结构

3.1 if-else

3.1.1if

if的语法形式如下

代码语言:javascript复制
if (表达式)
{
    语句
}

若表达式成立(为真),则执行语句;表达式不成立(为假),则语句不执行。

在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果是 不是0,则语句执⾏。

3.1.1.1 if示例
代码语言:javascript复制
#include <stdio.h>
int main()
{
	int m = 10;
	if (m % 2 == 0)
		printf("偶数");
	return 0;
}
3.2 else

一个数不是偶数就是奇数,当不是偶数时就需要用到else。即if......else......

其语法形式如下:

代码语言:javascript复制
if (表达式)
{
    语句1
}
else
{
    语句2
}
3.1.2.1 else示例

如果一个数不是偶数,那么怎么用代码实现效果。

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int m = 9;
	if (m % 2 == 0)
		printf("偶数");
	else
		printf("奇数");
	return 0;
}
3.1.3 分⽀中包含多条语句

if和else只能控制一条语句,比如:

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int m = 0;
    scanf("%d",&m);
	if ( m >= 18)
		printf("已成年");
        printf("可以谈恋爱");
	return 0;
}

不管是>=18 还是⼩于18,大屏幕上都会打印可以谈恋爱。

若想让if与 printf("可以谈恋爱");关联起来,则需要加个大括号,如下:

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int m = 0;
	scanf("%d", &m);
	if (m >= 18)//if 后使⽤{} 控制多条语句这个块也叫:程序块,或者复合语句
	{
		printf("已成年");
		printf("可以谈恋爱");
	}
	return 0;
}

这样当m<18时,则不会打印任何东西。

3.嵌套if

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

⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。请看如下代码:

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("输入的数为0");
	else if (num < 0)
		printf("输入的数为负数");
	else
		printf("输入的数为正数");
	return 0;
}

从第二个if到printf("输入的数为正数");结束都是嵌套的if,这样我们便可以实现更为复杂的逻辑。

下面用练习来巩固一下:

输⼊⼀个⼈的年龄 如果年龄 <18 岁,打印 " 少年 " 如果年龄在 18 岁⾄ 44 岁打印 " ⻘年 " 如果年龄在 45 岁⾄ 59 岁打印 " 中⽼年 " 如果年龄在 60 岁⾄ 89 岁打印 " ⽼年 " 如果 90 岁以上打印 " ⽼寿星 "

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		printf("少年n");
	else if (age <= 44)
		printf("⻘年n");
	else if (age <= 59)
		printf("中⽼年n");
	else if (age <= 90)
		printf("⽼年n");
	else
		printf("⽼寿星n");
	return 0;
}

带上大括号,更清晰

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num < 18)
		printf("少年");
	else
	{
		if (num < 44)
			printf("青年");
		else
		{
			if(num < 59)
				printf("中老年");
		    else
			{
				if (num < 89)
					printf("老年");
				else
					printf("老寿星");
			}
				
		}
	}
	return 0;
}

3.2 switch

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 的 el if...else 结构,⽤于判断条件有多个结果的情况。它把多重 se if 改成更易⽤、可读性更好的形式。

代码语言:javascript复制
switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
 }

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

注意:

switc后面的表达式必须为整形表达式。

case后的值,也必须为整形常量。

3.2.1 if语句和Switch语句的对比

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

用if语句完成的效果,如下:

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n % 3 == 0)
		printf("整除,余数为0n");
	else if (n % 3 == 1)
		printf("余数是1n");
	else
	return 0;
}

如果改用Switch语句,可以这样写:

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0n");
		break;
	case 1:
		printf("余数是1n");
		break;
	case 2:
		printf("余数是2n");
		break;
	}
    return 0;
}

上述的代码中,我们要注意的点:

case和后面的数字间必须要有空格。

3.2.2 switch语句中的break

前面的代码中,如果我们去掉break,会出现什么情况呢?

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0n");
	case 1:
		printf("余数是1n");
	case 2:
		printf("余数是2n");
	}
    return 0;
}

我们发现7除以3余数是1,但还打印了余数是2,这是为什么?

原因是:其除7除以3余数是1,但执行完后没遇到break,让其跳出来,则会继续打印,case的其他语句,直达遇到break或是switch执行完。

就比如上面的代码就后执行了case2中的语句。

所以在switch中break语句是非常非常重要的,能体现真正的分支效果。当然,也不是所有的case都要加break,具体看下来例子:

练习

输⼊⼀个1~7的数字,打印对应的星期⼏ 例如: 输⼊:1 输出:星期⼀ 输⼊:2 输出:星期⼆ 输⼊:3 输出:星期三 输⼊:4 输出:星期四 输⼊:5 输出:星期五 输⼊:6 输出:星期六 输⼊:7 输出:星期天

代码实现:

代码语言:javascript复制
#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.输⼊1-5,输出的是“⼯作⽇”; 2.输⼊6-7,输出“休息⽇”

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%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;

}

根据上面的练习,我们知道了应该根据实际需求来判断switch的书写。

3.2.3 switch语句中的default

在上述代码中,如果输入的值不是1~7,那则不会进行打印,为了解决这一情况,这就需要用到default;

代码语言:javascript复制
#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%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("输入错误,请重新输入");
	}
	return 0;
}
3.2.4 switch中default和case的顺序问题

其实在switch中不管是case在钱,还是default在后,这都是可以的,甚至可以将default放在中间,这都是没有毛病的。

4.0 特殊语句goto

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

例如:

代码语言:javascript复制
#include<stdio.h>
int main()
{
	printf("hehen");
	goto next;
	printf("hahan");
next:
	printf("跳过haha的打印n");
	return 0;
}

运行结果

goto语句如果使用不当·,就会导致在函数内部随意乱跳转个,打乱程序的执行流程,所以我们的建议是能不用尽量不去用;但goto语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使用goto就方便了。

0 人点赞