分支和循环

C语言是结构化的程序设计语言,这里的结构指顺序结构、选择结构、循环结构。

if语句

if语法形式

 if(表达式)  	
 	语句;

在这里插入图片描述

表达式成立为真,则语句执行;表达式不成立为假,则语句不执行。
重点!
在从C语言中,0为假,非0为真。

#include<stdio.h>
 int main()
  {
		 int num=0;
		scanf("%d",&num);
		if(num%2==1)
			printf("%d是奇数", num);
			return 0;
    }

else语法形式

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

在这里插入图片描述

示例如下所示:

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d是奇数", num);
	else
		printf("%d是偶数", num);
	return 0;
}

分支中包含多条语句
默认情况下,if和else的后边只能跟一条语句。

#include<stdio.h>
int main()
{
		int age = 0;
		scanf("%d",&age);
		if(age>=18)
		printf("成年了\n");
		printf("可以谈恋爱了\n");
		return 0;

}

无论输入数据是否大于等于18,“可以恋爱了”都会打印在屏幕上。
在这里插入图片描述
在这里插入图片描述
if只能控制一条语句,即printf(“成年了\n”);
if语句若为真,则打印“成年了”。
if语句若为假,则不打印“成年了”。
printf(“可以谈恋爱了\n”); 该语句是独立存在的,无论if为真或假,该语句都会被执行。

***解决方案:***若需要if语句同时控制两条语句,可以借助大括号({ }),else同理。

#include<stdio.h>
int main()
{
		int age = 0;
		scanf("%d",&age);
		if(age>=18)
		{
			printf("成年了\n");
			printf("可以谈恋爱了\n");
		}
		else
		{
			printf("未成年\n");
			printf("不可以早恋哦\n");
		}
		return 0;

}

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

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d",&num);
	if(num==0)
		printf("输入数字是0\n");
		else if(num>0)
			printf("输入的数字是正数\n");
		else
			printf("输入的数字是负数\n");
			return 0 ;
}

悬空else问题
如果有多个if和else,else总是跟最接近的if匹配。

#include<stdio.h>
int main()
{
	int a=0;
	int b=2;
	if(a==1)
		if(b==2)
			printf("hehe\n");
		else
			printf("haha\n");
			
		return 0;
}
#include<stdio.h>
int main()
{
	int a=0;
	int b=2;
	if(a==1)
	{	if(b==2)
			printf("hehe\n");
		else
			printf("haha\n");
	}
	//else与第二个if进行匹配
	
		return 0;
}

如果希望else与第一个if匹配,修改代码。
如下:

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

带上适当的大括号,代码逻辑会更加清晰。

switch语句

switch语句是一种特殊形式的“if ……else……”结构,用于判断条件有多个结果的情况。

switch语法形式

switch(expression)
 {
			case value 1 :	statement
			case value 2 :  statement
		     default : statement
 } 

依据表达式expression的不同值,执行相应的case语句。
若找不到对应的值,就执行default语句。

注意!!!
switch语句后的expression必须为整型表达式
case后面的值必须为整型常量表达式

在这里插入图片描述

题目:输入任意一个整数值,计算除以3后的余数。


//if语句
#include<stdio.h>
int mainI()
{
	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 mainI()
{
	int n = 0;
	scanf("%d",&n);
	switch(n%3==0)
	{	
			case 0:
			     	printf("整除,余数是0\n");
			     	break;
			case 1:
			    	printf("余数是1\n");
			    	break;
			case 2:
					printf("余数是2\n");
					break;
	}	
			return 0;
}

注意!!!
case和后面的数字之间必须有空格
每一个case语句的代码执行后,需要添加break,才可跳出switch语句

switch语句中的break

若上述switch语句中的break去除,出现什么情况?

//switch语句
#include<stdio.h>
int mainI()
{
	int n = 0;
	scanf("%d",&n);
	switch(n%3==0)
	{	
			case 0:
			     	printf("整除,余数是0\n");	
			case 1:
			    	printf("余数是1\n"); 	
			case 2:
					printf("余数是2\n");
	}	
			return 0;
}

> 结果:
>  7 
>  余数是1 
>  余数是2

7除以3余数应该为1,但是实际输出结果多出一行“余数是2”
???
原因:
switch语句具有分支效果,只有在switch语句中继续使用break才可跳出switch语句。
若某一case语句后无break终止,代码会继续向下执行,直至遇见break语句或switch语句结束。

题目:输入一个数字(1~7),打印对应星期几

#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;
}

break语句不是每一个case语句中都要有的,依据实际情况判断。
上述题目出现变化,1至5输出工作日,6至7输出休息日。

#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语句中的default
在使用switch语句时,可能会出现switch后面的表达式中的值无法匹配代码中的case语句的情况,这时需要引入default语句。

switch(expression)
 {
		case value 1 :	statement
		case value 2 :  statement
	   	default : statement
 } 
 //若switch后面的expression结果既不是value 1,也不是value 2,就会执行default子句

示例如下所示:输入一个数字(1~7),打印对应星期几。(若输入数字超过范围限制,则提示“输入错误”)

> #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("输入错误\n");
			break;
	}
	return 0;
}

提示:在switch语句中,case语句和default语句是没有顺序要求的,符合实际问题的需求即可。通常情况下,将default子句放于句尾处理。

while循环语句

while语法形式

while(表达式)
	   语句;
//若循环体想包含更多语句,可以添加大括号

在这里插入图片描述

if与while的代码对比

//代码
#include<stdio.h>
int main()
{
	if(1)
		printf("hehe\n");
	return 0;
}
//代码2
#include<stdio.h>
int main()
{
	while(1)
		printf("hehe\n");
	//若while后边的条件满足,死循环打印hehe	
	return 0;
}

while与if的最大区别:循环与否

for循环语句

for语法形式

 for(表达式1;表达式2;表达式3)
		语句;
//若循环体想包含更多语句,可以添加大括号

表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整

在这里插入图片描述

while循环和for循环的对比
在这里插入图片描述
在这里插入图片描述

for和while在实现循环过程中,均含有初始化、判断、调整三个部分,但for循环相对集中。

do-while循环语句

do-while语法形式

do
	语句;
while(表达式);

在这里插入图片描述

示例如下所示:

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

break语句和continue语句

在循环执行的过程中,若出现某些情况,需要提前终止循环,可以使用break和continue两个关键字。

break:用于永久终止循环(只要break被执行,直接就会跳出循环,继续往后执行)
continue:跳过本次循环continue后面的代码

while循环中的break和continue

#inlcued<stdio.h>
int main()
{
	int i = 1;
	while(i<=10)
	{
	if(1==5)
		break;//当i等于5后,就会执行break语句,循环终止
	printf("%d",i);
	i=i+1;
	}
	return 0;
}
//打印1 2 3 4
#inlcued<stdio.h>
int main()
{
	int i = 1;
	while(i<=10)
	{
	if(1==5)
		continue//当i等于5后,执行continue语句,直接跳出continue循环,去循环判断的地方
	//由于跳出i=i+1,所以i一直等于5,程序陷入死循环
	printf("%d",i);
	i=i+1;
	}
	return 0;
}

for循环中的break和continue

#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 
#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 5 6 7 8 9 10

do-while循环中的break和continue

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

goto语句

goto语句可以实现在同一个函数内跳转到设置好的标号处。
示例如下所示:

#include<stdio.h>
int mian()
{
	printf("hehe\n");
	goto next;
	printf("haha\n");
next:
	printf("跳过了haha的打印\n");
	return 0;	
}

注意!!!
若goto语句使用不当,会在函数内部随意跳转,打乱程序执行流程。

在多层循环的代码中,使用goto语句可以快速跳出。

for(...)
{
 	for(...)
	 {
		 for(...)
 		{
			 if(disaster)
 				goto error;
 		}
	 }
 }
error:
 		//...

for语句若想要提前退出须使用break,一个break可以跳出一层for循环,多层for语句使用goto语句更为快捷。
如有错误,请指正批评!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值