分支语句与循环语句

190 阅读8分钟

一、分支语句

1.if语句|

if语句语法 0表示假,非0表示真。

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

示例

屏幕截图 2024-10-22 195018.png

屏幕截图 2024-10-22 200232.png 注意 如果执行多条语句要用大括号括起来

#include<stdio.h>
int main()
{
 if(表达式)
  {
  语句列表1;
  }
 else //else只管一个printf
 {
 语句列表2;
 }
return 0;
}

这里一对{}是代码块

1.1悬空else

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

结果:未输出结果!

屏幕截图 2024-10-22 203108.png 编译器默认将else与离它最近的if匹配(就近原则) 解决:只需一个大括号就可解决

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

屏幕截图 2024-10-22 203649.png

1.2 if书写形式的对比

//代码1
if(condition)
{
return x;
}
else
return y;
//条件满足返回下,条件不满足返回y。

//代码2 与代码1相比阅读更清晰
if(condition)
{
return x;
}
else
{
return y;
}
//代码3
int a=1;
if(a==5)// =赋值 ==相等 若少个等号不会报错
{
printf("hhh\n");
}
//代码4
int a=1;
if(5==a) // 若少个=会报错,这样书写更好
{
printf("hhh\n");
}
//代码1示例 
#include<stdio.h>
int test()
{
	int a = 5;
	if (a == 3)
		return 1;
	return 0;
}
int main()
{
	int r = test();
	printf("%d\n", r);
	return 0;
}

屏幕截图 2024-10-23 090416.png

屏幕截图 2024-10-23 090634.png

//代码2 阅读更清晰
#include<stdio.h>
int test()
{
	int a = 3;
	if (a == 3)
		return 1;
	else
	    return 0;
}
int main()
{
	int r = test();
	printf("%d\n", r);
	return 0;
}

屏幕截图 2024-10-23 090910.png

2.switch语句

语法:

switch(整型变量或字符型变量)
{
case 常量1:语句1;break;
case 常量2:语句2;break;
.....
case 常量n:语句n;break;
default:语句n+1:break;
}
//示例
#include<stdio.h>
int main()
{
	int day=0;
	scanf_s("%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;
}

屏幕截图 2024-10-25 185142.png 上下结果相同时上方可不写

switch(整型变量或字符型变量)
{
 case 1;
 case 2;
 case 3;
 case 4;printf("...");break;
 case 5;
 case 6;printf("...");break;
}

二、循环语句!

1.while循环

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

打印1-10数字

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

结果 屏幕截图 2024-10-25 191706.png

1.1while语句中的break和continue

1.1.1break 是用于永久终止循环
#include<stdio.h>
int main()
{
 int i=0;
 while(i<=10)
 {
   i++;
   if(5==i)
     break;
   printf("%d",i);
 }
 return 0;
}

屏幕截图 2024-10-25 193545.png

1.1.2continue 跳过本次循环后面的代码,直接去判断部分,进行下一次循环判断
#include<stdio.h>
int main()
{
 int i=0;
 while(i<=10)
 {
   i++;
   if(5==i)
    continue;
   printf("%d",i);
 }
 return 0;
}

屏幕截图 2024-10-25 193647.png 结果跳过5

2.for循环(最常使用)

2.1语法
for(表达式1;表达式2;表达式3)
    循环语句;

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

打印1-10的数字

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

屏幕截图 2024-10-25 220135.png

2.2 for语句中的break和continue

2.2.1break

循环中的break一样,for循环中的break也是用于终止循环的,不管循环还需要循环多少次,只要执行到了break,循环就彻底终止

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

屏幕截图 2024-10-25 223508.png

2.2.2 continue
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		
		if (5 == i)
			continue;//这里continue跳过了后面的打印,直接来到i++部分
		printf("%d", i);
	}
	return 0;
}

屏幕截图 2024-10-25 223343.png

2.3for循环的变量

for循环的判断部分省略意味着这判断会恒成立(最好写明条件)

//for循环中的初始化部分,判断部分,调整部分,可省略,不建议初学时省略,容易导致问题
#include<stdio.h>
int main()
{
	for (;;)
	{
		printf("hhhh\n");
	}
	return 0;
}
//陷入死循环

屏幕截图 2024-10-26 002116.png

#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("hhhh\n");
		}
	}
	return 0;
}
//打印10*10=100个hhhh
//如果初始化部分省略
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (; i < 3; i++)
	{
		for (; j < 3; j++)
		{
			printf("hhhh\n");
		}//j=3时不再进入该循环
	}
	return 0;
}
//打印3个hhhh
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i=0; i < 3; i++)
	{
		for (j=0; j < 3; j++)
		{
			printf("hhhh\n");
		}
	}
	return 0;
}
//打印9个hhhh
//使用多余一个变量控制
#include<stdio.h>(
int main()
{
	int x, y;
	for (x = 0, y = 0; x < 7 && y < 4; ++x, ++y)
		printf("hhhh\n");
	return 0;
}
//打印4个hhhh

3.do…while循环

3.1语法

do 
   循环语句;
while(表达式);
//错误示范1
int main()
{
	int i = 0;
	do
       printf("hhhh\n");
	while (i < 10);
	return 0;
}
//错误示范2
#include<stdio.h>
int main()
{
	int i = 0;
	do
		printf("hhhh\n");
	    i++;
	while (i < 10);
	return 0;
}
//正确示范
#include<stdio.h>
int main()
{
	int i = 0;
	do
	{
		printf("hhhh\n");
		i++;
	}
	while (i < 10);
	return 0;
}

3.2 break,continue

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

![](C:/Users/金思思/Pictures/Screenshots/屏幕截图 2024-10-26 005308.png)

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

![](C:/Users/金思思/Pictures/Screenshots/屏幕截图 2024-10-26 005735.png)

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

![](C:/Users/金思思/Pictures/Screenshots/屏幕截图 2024-10-26 010129.png)

三、练习

1.计算n的阶乘

==代码如下==
#include<stdio.h>
int main()
{
	int n;
	int a = 1;
	int s = 1;
	
	scanf_s("%d", &n);
	for (a = 1; a <= n; a++)
	{
		s = s * a;
		//s*=a;
	}
	printf("%d", s);
	return 0;
}

==结果==

屏幕截图 2024-10-26 011359.png

2.计算阶乘的和 例如:1!+2!+3!+…+10!|

==代码如下==

代码1:
#include<stdio.h>
int main()
{
	int a = 1;
	int n = 0;
	int s = 1;
	int sum = 0;
	for (n = 1; n <=10; n++)
	{
		s = 1;
		for (a = 1; a <= n; a++)
		{
			s = s * a;
		}
		sum = sum + s;
	}
	printf("%d", sum);
	return 0;
}
//for (a = 1; a <= n; a++)
//		{
//			s = s * a;
//		}
//计算n的阶乘,每次计算s为1必须说明

屏幕截图 2024-10-26 084724.png

代码2:
#include<stdio.h>
int main()
{
	int n = 1, sum = 0, a = 1;
	while (n <= 10)
	{
		n++;
		sum = sum + a;
		a = a * n;
	}
	printf("%d", sum);
	return 0;
}

屏幕截图 2024-10-26 084724.png

代码3:
#include<stdio.h>
int main()
{
	int n = 1, sum = 0, a = 1;
	for (n = 1; n <= 10; n++)
	{
		
		a = a * n;
		sum = sum + a;
	}
	printf("%d", sum);
	return 0;
}

3.在一个有序数组中查找某个数

代码1:
#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int k;
	int sz = sizeof(arr) / sizeof(arr[0]);
	scanf_s("%d", &k);
	for (i = 0; i < sz; i++)
	{
		if (arr[i] == k)
		{
			printf("找到了,下标是:%d\n", i);
		}

		if (i == sz)
		{
			printf("没找到\n");
		}
	}
	return 0;
}

屏幕截图 2024-10-26 091839.png 代码2 二分查找(更高效):

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int k = 3;

	while (left<=right)
	{
		    //int mid = (left + right) / 2;
		    int mid = left + (right - left) / 2;//防止left和right的平均值超出范围
		    // left/2+right/2这种表达是错误的
			if (arr[mid] < k)
			{
				left = mid + 1;
			}
			else if (arr[mid] > k)
			{
				right = mid - 1;
			}
			else
			{
				printf("找到了,下标是:%d", mid);
				break;
			}
			
	}
	if (left > right)
		printf("无\n");
	return 0;
}

屏幕截图 2024-10-26 094039.png

4.编写代码,演示多个字符从两端移动,向中间汇聚

替代

#include<stdio.h>
int main()
{
	char arr1[] =  "I LOVE YOU !" ;
	char arr2[] =  "############";
	int left = 0;
	int right = strlen(arr2) - 1;            //strlen是求长度,strlen不算\0,算的是\0之前的元素个数 
  //int right=sizeof(arr1)/sizeof(arr[0])-2; //size是求内存,sizeof算\0,算总元素个数
	//char buf[]="a,b,c";
	//[a,b,c,\0] 四个元素 c的下标为2,用strlen-1;用sizeof-2
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		left++;
		right--;
	}
	return 0;
}

屏幕截图 2024-10-26 162513.png 要延迟效果的话:可加Sleep函数并添加头文件#include<windows.h> 清空屏幕的话:可用system函数并添加头文件#include<stdlib.h>

#include<windows.h>
#include<stblib.h>
#include<stdio.h>
int main()
{
	char arr1[] =  "I LOVE YOU !" ;
	char arr2[] =  "############";
	int left = 0;
	int right = strlen(arr2) - 1;            //strlen是求长度,strlen不算\0,算的是\0之前的元素个数 
  //int right=sizeof(arr1)/sizeof(arr[0])-2; //size是求内存,sizeof算\0,算总元素个数
	//char buf[]="a,b,c";
	//[a,b,c,\0] 四个元素 c的下标为2,用strlen-1;用sizeof-2
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);// 延迟 休息 毫秒为单位
		//清空屏幕
		system("cls")//system是一个库函数,可以执行系统命令
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

屏幕截图 2024-10-26 164120.png 4.代码编写实现,模拟用户登录场景,并且只能登陆3次。(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序。

错误示范

#include<stdio.h>
int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s",password)//数组名本来就是地址不需要取地址
			if (password == "abcdef")//比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
			{
				printf("登陆成功\n");
				break;
			}
			else
		{
			printf("密码错误");
		}
	}
	if (i == 3)
	{
		printf("三次密码均输入错误,退出程序");
	}
}

屏幕截图 2024-10-26 170310.png 后面无法进行下去,if (password == "abcdef")//比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp

正确示范

#include<stdio.h>
#include<string.h>
int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf_s("%s", password);//数组名本来就是地址不需要取地址
		if (strcmp(password, "abcdef") == 0)//比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
			{
				printf("登陆成功\n");
				break;
			}
		else
		{
			printf("密码错误");
		}
	}
	if (i == 3)
	{
		printf("三次密码均输入错误,退出程序");
	}
}

5.猜数字游戏的实现

四、goto语句