【C语言】分支语句与循环语句

一、分支语句

1、多分支语句

if else语句,if与else if的使用

	int main()
	{
		int age = 100;
		if (age < 18)
			printf("未成年\n");
		else if (age >= 18 && age < 28)  
			printf("青年\n");
		else if (age >= 28 && age < 50)
			printf("壮年\n");
		else if (age >= 50 && age < 90)
			printf("老年\n");
		else
			printf("长寿\n");
		return 0;
	}

if与else if的使用,if与else if使用时,如果if执行else if就不会执行。

2、悬空else

else与最近的且未匹配的if匹配

	int main()
	{
		int a = 0;
		int b = 2;
		if (a == 1)
			if (a == 2)               //若在这加{}else就无法和这个if匹配
				printf("hehe\n");
			else
				printf("haha\n");
		return 0;
	}

3、switch语句

switch(整型表达式)
{
case(整型常量表达式):
}

	int main()
	{
		int day = 0;
		scanf("%d", &day);
		switch(day)          //switch括号内的必须是整型表达式
		{
		case 1:             //case后面必须是整型常量表达式
			printf("星期一\n");
			break;
		case 2:                               //若1-5的内容都相同
			printf("星期二\n");               //case 1:
			break;                           //case 2:
		case 3:                              //case 3:
			printf("星期三\n");              //case 4:
			break;                          //case 5:
		case 4:                             //       printf();
			printf("星期四\n");             //       break;
			break;
		case 5:
			printf("星期五\n");
			break;
		case 6:
			printf("星期六\n");
			break;
		case 7:
			printf("星期天\n");
			break;
		default:                        
			printf("输入错误\n");
			break;
		}
		return 0;
	}

2.循环语句

2.1 while循环

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

结论:break的作用------直接跳到结尾(只要遇到break直接终止所有循环)

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

结论:continue的作用-----回到开头-----终止本次循环,即本次continue后面的语句不再执行,跳回while的判断部分

2.2 getchar()和putchar()

getchar()-----读取一个字符
putchar()-----输出/打印一个字符

	int main()
	{
		char password[20] = { 0 };
		printf("请输入密码:");
		scanf("%s", password);

		//清理缓冲区
		while (getchar() != '\n')
		{
			;
		}

		//scanf读取完password后剩余一个\n,若不加getchar();会直接读取\n然后输出放弃确认

		printf("请确认(Y/N):");
		int ch = getchar();
		int ret = getchar();
		if (ret == 'Y')
		{
			printf("确认成功\n");
		}
		else
		{
			printf("放弃确认\n");
		}
		return 0;
	}

2.3 for循环

	for(表达式1; 表达式2; 表达式3)
	{
		循环语句;
	}

表达式1:初始化
表达式2:判读
表达式3:调整

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

2.4 do…while循环

do…while()循环-----先执行再判断

	  do
	 {
	 	循环语句;
	 }
	while(表达式);     (判断)
	
	如:
	
	int main()
	{
		int i = 1;
		do
		{
			printf("%d ", i);
			i++;
		} 
		while (i <= 10);
		return 0;
	}

2.5 在arr数组(有序的)中找到某个数-----二分查找

	int main()
	{
		int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
		int k = 7;
		int sz = sizeof(arr) / sizeof(arr[0]);    //计算元素个数
		int left = 0;          //左下标(以中间元素的下标为标准)      数组元素   1 2 3 4 5 6 7 8 9 10
		int right = sz-1;     //右下标(以中间元素的下标为标准)          下标    0 1 2 3 4 5 6 7 8 9

		while (left <= right)     //若查找的元素存在,右下标是会比左下标大的
		{
			//int mid = (left + right) / 2;
			int mid = left + (right - left) / 2;
			if (arr[mid] > k)
			{
				right = mid - 1;
			}
			else if (arr[mid] < k)
			{
				left = mid + 1;
			}
			else
			{
				printf("找到了,下标是:%d\n",mid);
				break;
			}
		}
				if (left > right)            //若查找的元素不存在,左下标是会比右下标大的
				printf("找不到\n");
				return 0;
			}

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

	int main()
	{
		char arr1[] = "welcome to LOL!!!!!";
		char arr2[] = "###################";
		int left = 0;
		int right = strlen(arr1)-1;

		while (right >= left)
		{
			arr2[left] = arr1[left];   //使arr1数组左边的元素赋给arr2左边,下同 
			arr2[right] = arr1[right];
			printf("%s\n", arr2);
			Sleep(1000);           //休息1秒,需引用头文件#include<windows.h>
			system("cls");         //执行系统命令的一个函数-cls-清空屏幕,需引用头文件#include<stdlib.h>
			left++;
			right--;
		}
		printf("%s\n", arr2);
		return 0;
	}

2.7 编写代码实现,模拟登陆情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次都输入错误,则退出程序)

	int main()
	{
		int i = 0;
		char password[20] = { 0 };
		for (i = 0; i < 3; i++)
		{
			printf("请输入密码:");
			scanf("%s", &password);
			if (strcmp(password, "123456") == 0)      //(password=="123456"), == 不能用来比较两个字符串是否相等,应该使用一个库函数-strcmp
			{
				printf("登陆成功\n");
				break;
			}
			else
			{
				printf("密码错误\n");
			}
		}
		return 0;
	}

2.8 猜数字游戏

	void menu()
	{
		printf("****************************************\n");
		printf("****       1.play     0.exit        ****\n");
		printf("****************************************\n");
	}

	void game()
	{
		//1.电脑生成一个随机数-使用rand()函数--在调用rand之前,使用srand函数为伪随机数生成器种子--在srand()函数里面要放一个随机值,所以引用时间戳放进去
		int ret = 0;
		int guess = 0;
		//拿时间戳来设置随机数的生成起点
		//time_t time(time_t *timer)  -时间戳的使用方法time函数(需引用time.h头文件)--time_t是它的类型,实质是long(长整型)--time_t *是指针类型
		ret = rand() % 100 + 1;
		//printf("%d\n", ret);
	
		//2.猜数字,猜大了提示你大了,......
		while (1)
		{
			printf("请输入一个整数(1-100):\n");
			scanf("%d", &guess);
			if (guess > ret)
			{
				printf("猜大了\n");
			}
			else if (guess < ret)
			{
				printf("猜小了\n");
			}
			else
			{
				printf("恭喜你,猜对了\n");
				break;
			}
		}
	}
	
	int main()
	{
		int input = 0;
		//srand 放在主函数,防止在game()函数里面过于频繁使用,以至于生成的随机值过于相近
		srand((unsigned int)time(NULL));
		do
		{
			menu();
			printf("请选择:\n");
			scanf("%d", &input);
			switch (input)
			{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误\n");
				break;
			}
	
		} while (input);
		return 0;
	}

2.9 goto语句的应用-----一个关机程序

在cmd中输入shutdown -s -t 60,电脑会在60s后关机;输入shutdown -a 会取消。代码形式:

int main()
{
	char input[] = { 0 };
	//system()--执行系统命令
	system("shutdown -s -t 60");
again:
	printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就会取消关机\n请输入:");
	scanf("%s", input);     //这里的input是数组,可以不用加&
	if (strcmp(input, "我是猪") == 0)      //strcmp()比较两个字符串
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	return 0;
}

用循环形式:

int main()
{
	char input[] = { 0 };
	//system()--执行系统命令
	system("shutdown -s -t 60");
	while (1)
	{
		printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就会取消关机\n请输入:");
		scanf("%s", input);     //这里的input是数组,可以不用加&
		if (strcmp(input, "我是猪") == 0)      //strcmp()比较两个字符串
		{
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

2.10 辗转相除法求最大公约数

求两个数的最大公约数-----辗转相除法:
假如两个数a=24,b=18,先让k=a%b=6,若结果不为0,则将b的值赋给a(a=b=18),k的值赋给b(b=k=6),a%b=0,则b为他们的最大公约数

			int main()
			{
				int a = 190;
				int b = 25;
				int k = 0;
				while (a % b)         //a%b不等于0即为真,执行下面内容;a%b等于0为假,不执行
				{
					k = a % b;
					a = b;
					b = k;
				}
				printf("最大公约数为:%d\n", b);		//5
				return 0;
			}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值