详解C语言分支与循环语句

发布于:2024-07-03 ⋅ 阅读:(19) ⋅ 点赞:(0)

分支语句

  • if else
  • switch

循环语句

  • while
  • for
  • do while

goto语句

1.什么是语句

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

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句
    控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句符号符组成,C语言有9种控制语句:

1.条件判断语句也叫分支语句:if else 语句 switch语句
2.循环执行语句:for语句 while语句 do while语句
3.转向语句:break语句 continue语句 return语句 goto语句

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

这样吧,你先在steam搜索“千恋*万花”点击购买安装好后立即运行打开千恋万花,在主页面点击开始游戏进入游戏页面,然后依次选择“说实话”、“不好说”、“觉得很可爱”、“单独行动”、“摸摸头”、“有点担心”和“安抚”进入丛雨路线
没错,galgame中的选项就是选择语句。
分支语句

达成对应的条件后就进入对应的结果。

2.1 if语句

if语句的语法结构

//单分支
if(exp1)
	语句;
//双分支
if(exp1)
	语句1;
else
	语句2;

//多分支
if(exp1)
	语句1;
else if(exp2)
	语句2;
else
	语句3;

实例演示:

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

//代码2
#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d",&age);
	if(age<18)
	{
		printf("青少年\n");
	}
	else if(age>=18&&age<30)
	{
		printf("青年\n");
	}
	else if(age>=30&&age<60)
	{
		printf("中年\n");
	}
	else if(age>=60&&age<80)
	{
		printf("老年\n");
	}
	else
	{
		printf("寿星\n");
	}
	return 0;
}

在C语言中0表示假,非0表示真
值得注意的是:If只能管理后面一条语句,所有我们要多用{}进行匹配,防止使人误解.
{}就是一个代码块。

2.1.1 悬空else

看下面这个代码:

#include <stdio.h>
int main()
{
	int a = 0;
	if(a)
	   if(a==0)
		   printf("hello\n");
	else
		printf("hi\n");
	return 0;
}

你觉得会打印什么呢?
答案是:什么都不打印,这里的else是和第二个if进行匹配的。
为了避免这种情况,我们要让代码好好对齐或者加入{}来避免误解


//代码对齐
#include <stdio.h>
int main()
{
	int a = 0;
	if(a)
	    if(a==0)
		   printf("hello\n");
	    else
			printf("hi\n");
	return 0;
}

//利用{}
#include <stdio.h>
int main()
{
	int a = 0;
	if(a)
	{
	    if(a==0)
		   printf("hello\n");
		else
			printf("hi\n");
	}
	return 0;
}

else的匹配:else是和离他最近的if匹配的

2.1.3 练习

1.判断一个数是否是奇数。
2.输出1~100之间的奇数。

//1.判断一个数是否是奇数。
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d",&a);
	if(a%2==1)
	{
		printf("是奇数!\n");
	}
	else
	{
		printf("不是奇数!\n");
	}
	return 0;
}

//2.2.输出1~100之间的奇数。
#include <stdio.h>
int main()
{
	//利用while循环
	int i = 1;
	while(i<=100)
	{
		if(i%2==1)
		{
			printf("%d ",i);
		}
		++i;
	}
	return 0;
}


//方法2
#include <stdio.h>
int main()
{
	//利用while循环
	int i = 1;
	while(i<=100)
	{
		printf("%d ",i);
		i+=2;
	}
	return 0;
}

2.2 switch语句

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

switch(整型表达式)
{
	case 整型常量表达式://case是整型常量表达式 也可以是char 因为底层为ASCII码也算
		语句;
}

比如,让你根据数字输出对应的星期。

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

//当我们输入5时
/*
打印结果:
星期五
星期六
星期日
*/

这是为什么呢?因为在switch中我们只有利用了break才能实现真正的分支。

2.2.1 在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;
}
//当我们输入5时
/*
打印结果:
星期五
*/

break语句的实际效果是把语句列表划分为不同的分支部分。
思考:如果有人在这个程序运行时输入8会怎么样?

2.2.2 default子句

答案:当输入的值与所有case都不匹配时,就直接退出switch,然后继续程序。
但是如果你不想要忽略不匹配这种情况。
你可以在语句列表中增加一个default子句。
可以写在任何一个case标签可以出现的位置,switch里面的判断可以没有顺序。

#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;
		default:
			printf("输入错误!\n");
			break;//建议加上	
	}
	return 0;
}

switch允许嵌套使用。

3.循环语句

  • while
  • for
  • do while
    简单的循环结构

简单的循环语句

3.1 while循环

while(条件)
	语句;

当条件满足时,循环就会执行下去。
while语句执行流程:
while语句的执行流程

打印1-10数字

#include <stdio.h>
int main()
{
	//利用while循环
	int i = 1;
	while(i<=10)
	{
		printf("%d ",i);
		i++;
	}
	return 0;
}
//打印结果
//1 2 3 4 5 6 7 8 9 10

3.1.1 while语句中的break和continue

break介绍
在循环中只要执行了break,就会直接终止循环,直接跳出循环体。

#include <stdio.h>
int main()
{
	//利用while循环
	int i = 1;
	while(i<=10)
	{
		if(i==5)
			break;
		printf("%d ",i);
		i++;
	}
	return 0;
}
//打印结果
//1 2 3 4 

continue介绍

continue是用来终止本次循环的,也就是本次循环中continue后面的代码不会执行,
而是直接跳转到while语句的判断部分。进入下一次循环。

//代码1
#include <stdio.h>
int main()
{
	//利用while循环
	int i = 1;
	while(i<=10)
	{
		if(i==5)
			continue;
		printf("%d ",i);
		i++;
	}
	return 0;
}
//打印结果
//1 2 3 4 4 4 4 4 4 4 4....

//代码2
#include <stdio.h>
int main()
{
	//利用while循环
	int i = 1;
	while(i<=10)
	{
		i++;
		if(i==5)
			continue;
		printf("%d ",i);
	}
	return 0;
}
//打印结果
//2 3 4 6 7 8 9 10

3.2 for循环

了解完while循环后,for可以说是while的整合。

3.2.1 语法

for(expr1;expr2;expr3)
	循环语句;

exp1
为初始化部分,用来初始化循环变量的。
exp2
为条件判断部分,用于判断循环终止的
exp3
为调整部分,用于循环条件的调整。

打印1-10

//代码1
#include <stdio.h>
int main()
{
	int i = 0;
	for(i = 1;i<=10;++i)
	{
		printf("%d ",i);
	}
	return 0;
}
//打印结果:1 2 3 4 5 6 7 8 9 10

//代码2
#include <stdio.h>
int main()
{
	for(int i = 1;i<=10;++i)//在里面初始化是c++里的写法,但在c99标准后引入
	{
		printf("%d ",i);
	}
	return 0;
}
//打印结果:1 2 3 4 5 6 7 8 9 10

for执行流程图
for语句的执行流程

for与while循环的对比

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

循环的3个必要条件,无论是while循环还是for都是有的,但是while的三部分比较分散。
查找修改就不够集中于方便,对此,for循环的风格更胜一筹。

3.2.2 break和continue在for循环中

可以发现的是,在for和在while循环里面是没有特别大区别的,但由于for独特的执行调整步骤和while还是略有差异

//continue在while
#include <stdio.h>
int main()
{
	//利用while循环
	int i = 1;
	while(i<=10)
	{
		if(i==5)
			continue;
		printf("%d ",i);
		i++;
	}
	return 0;
}
//打印结果
//1 2 3 4 4 4 4 4 4 4 4....

//continue在for循环
#include <stdio.h>
int main()
{
	//利用for循环
	int i = 1;
	for(i = 1;i<=10;++i)
	{
		if(i==5)
			continue;
		printf("%d ",i);
	}
	return 0;
}
//打印结果
//1 2 3 4 6 7 8 9 10

for循环里的continue在跳过本次循环时,是无法跳过for()中的调整语句的。

3.2.3 for语句的循环控制变量

建议(不是必须):

1.不要在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环变量的取值采用 前闭后开区间的写法

int i = 0;
//前闭后开
for(i = 0;i<10;++i)
{}
//前闭后闭
for(i = 0;i<=9;++i)
{}

3.2.4 一些for循环的变种

#include <stdio.h>
int main()
{
	//利用for循环
	int i = 1;
	for(;;)//for省略判断即为判断恒为真
	{
		printf("hello\n");
	}
	//代码2
	int i = 0;
	int j = 0;
	//打印多少个hello呢?
	for(i = 0;i<10;++i)
	{
		for(j = 0;j<10;++j)
		{
			printf("hello\n");
		}
	}
	//100个
	
	//代码3
	int i = 0;
	int j = 0;
	//打印多少个hello呢?
	for(;i<10;++i)
	{
		for(;j<10;++j)
		{
			printf("hello\n");
		}
	}
	//10个
	
	//代码4 
	int x,y;
	for(x = 0,y = 0;x<2&&y<5;++x,++y)//使用多个变量控制循环
	{
		printf("hello\n");
	}
	
	return 0;
}
//打印结果
//hello hello hello...

3.2.5 试题

//循环多少次
#include <stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for(i = 0,k = 0;k=0;++i,++k)
		k++;
	return 0;
}


//0次

3.3 do…while()循环

3.3.1 do…while()循环语法

do
{
	循环语句;
}while(表达式);

3.3.2 执行流程

do while的执行流程

3.3.3 do语句的特点

循环至少执行一次,使用场景有限,不常使用。

打印1-10

#include <stdio.h>
int main()
{
	int i = 1;
	do
	{
		printf("%d ",i);
		++i;
	}while(i<=10);
	return 0;
}
// 打印结果:
//1 2 3 4 5 6 7 8 9 10

3.3.4 do while 循环中的break和continue

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

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

3.4 习题

1.计算n的阶乘
2.计算1!+2!+…+10!
3.在一个有序数组中查找具体某个数n
4.编写代码,演示多个字符从两端移动,向中间汇聚。

//1.
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d",&n);
	int ret = 1;
	for(int i = 1;i<=n)
	{
		ret*=i;
	}
	printf("%d\n",ret);
	return 0;
}

//2.1
#include <stdio.h>
int main()
{
	int sum = 0;
	for(int n = 1;n<=10;++n)
	{
		int ret = 1;
		for(int i = 1;i<=n;++i)
		{
			ret*=i;
		}
		sum+=ret;
	}
	printf("%d\n",sum);
	return 0;
} 

//2.2
#include <stdio.h>
int main()
{
	int sum = 0;
	int ret = 1;
	for(int n = 1;n<=10;++n)
	{
		ret *= n;
		sum+=ret;
	}
	printf("%d\n",sum);
	return 0;
}

//3.1
#include <stdio.h>
int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int x = 0;
	scanf("%d",&x);
	for(int i = 0;i<10;++i)
	{
		if(x==arr[i])
		{
			printf("找到了,下标为%d\n",i);
			break;
		}
	}
	if(i==10)
	{
		printf("没找到!\n");
	}
	return 0;
}
//3.2二分查找
#include <stdio.h>
int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int x = 0;
	scanf("%d",&x);
	int left = 0,right = 9;
	int flag = 0;
	while(left<=right)
	{
		int mid = (left+right)/2;
		if(arr[mid]==x)
		{
			printf("找到了,下标为%d\n",mid);
			flag = 1;
			break;
		}
		else if(arr[mid]<x)
		{
			left = mid+1;
		}
		else
		{
			right = mid-1;
		}
	}
	if(flag == 0)
	{
		printf("找不到!\n");
	}
	return 0;
}

//4
#include <stdio.h>
int main()
{
	char arr1[] = "hello world!";
	char arr2[] = "************";
	int n = sizeof(arr1);
	int left = 0;
	int right = n - 1;
	for (left = 0, right = n - 1; left <= right; ++left, --right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
	}
	return 0;
}

3.4.3 猜数字游戏

学以上的内容,我们可以写一个简单的猜谜游戏

#include <stdio.h>
#include <stdlib.h>//srand和rand的头文件
#include <time.h>//time的头文件
void menu()
{
	printf("**********************\n");
	printf("*****1.paly***********\n");
	printf("*****0.exit***********\n");
	printf("**********************\n");
}
void game()
{
	int r = rand() % 100 + 1;//rand可以产生随机数,但因为rand的随机数是根据srand所提供的种子生成,所以我们还要使用srand,但是由由于srand所提供的种子也要输入数字才可以生成,为此我在使用了time函数生成当前时间的时间戳数来充当输入的数字,以达到rand生成随机数的效果。
	int guess = 0;//玩家要猜测的数
	printf("游戏开始\n");
	while (1)//直到猜中
	{
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小了\n");
		}
		else if (guess > r)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜中了!\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do//进入循环
	{
		menu();//打印菜单
		printf("请选择_>");//提示信息
		scanf("%d", &input);//根据提示选择进入还是退出
		//根据输入进入相应区域,用到多分支语句switch
		switch (input)
		{
		case 1:
			game();//进入游戏
			break;
		case 0:
			printf("已退出游戏!\n");
			break;
		default:
			printf("输入错误!\n");
			break;
		}
	} while (input);


}

4.goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
从理论上来讲goto语句是没有必要的,实际中没有goto语句也可以很容易的写成代码。
但是在某些场合下goto语句还是用的着的,最常见的用法就是终止某些深层嵌套的结构。
例如一次性跳出多层循环。
多重循环下使用break是达不到目的的,break只能从最内层循环退出到上一层循环。

for(...)
{
	for(...)
	{
		for(...)
		{
			if(disaster)
				goto error;
		}
	}
}
error:
	if(disaster)
		//处理错误情况

大部分部分使用goto的情况是可以利用循环代替的。

//代码1
#include <stdio.h>
int main()
{
again:
	//...
	if(...)
	{
		//...
		break;
	}
	else
	{
		goto again;
	}
	return 0;
}

//代码2
#include <stdio.h>
int main()
{
	while(1)
	{
		if(...)
		{
			//...
			break;
		}
	}
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到