C语言01——分支和循环语句

分支和循环语句

  1. 分支语句:if、switch
  2. 循环语句:do while、while、for
  3. 转向语句:break、continue、goto、return

一、分支语句(选择结构)

1.1 if语句
  1. 当结果为真(0为假,非0为真)的时候执行语句块【多个语句时用括号{}括住】
  2. else 和离其最近的if去匹配
int main()
{
	int i = 0;
	scanf("%d",&i);
	if (i)
	{
		printf("haha\n");
	}
	else
	{
		printf("aaaaaa\n");
	}
	return 0;
}
int i = 5;
if(5 == i)	//当两个整型变量比较时,常量放在左边
{
    printf("hahha\n");	 
}
1.2 switch 语句 ——常常用于多分支的情况
  1. 结构:
switch(整型表达式)
{
    case 整形常量表达式:
    语句;
}
  1. break 实现分支—— 将语句列表列表划分成不同的分支部分
int main()
{
	int day = 0;
	printf("请输入一个数:>");
	scanf("%d",&day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	}
	return 0;
}
  1. default——所有的语句都被跳过

上个程序如果输入的数不是1-7则会被自动忽略

int main()
{
	int day = 0;
	printf("请输入一个数:>");
	scanf("%d",&day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	default:
		printf("您输入的数不正确,即将跳出程序。");
		break;
	}
	return 0;
}

二、循环语句

while

for

do while

2.1 while语句
  1. while和 if 的区别在于while可以多次循环执行,而if 只执行一次
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d\n",i);
		i++;
	}
	return 0;
}
  1. while语句中的break和continue

while语句中的break用于跳出整个循环

while语句中的continue用于跳出后面的所有语句

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
		{
			break;			//输出1 2 3 4
			//continue;		//输出1 2 3 4 死循环
		}
		printf("%d ",i);
		i++;
	}
	return 0;
}
  1. 另附:= 和 ==
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if(i == 5)		//只会输出5;若写成=,则会输出死循环。因为==表示判断两边是否相等
			printf("%d ",i);
		i++;
	}
	return 0;
}
2.2 for 循环语句——使用频率比while高

for 循环三个条件:初始化、进行条件判断、调整

while 循环中也有这三个条件,但是由于代码风格三个条件偏离较远,不利于集中修改和查找

  1. 用for 循环输出1-10
int main()
{
	int i = 0;
	for (i = 1;i <= 10;i++)
	{
		printf("%d ",i);
	}
	return 0;
}
  1. for 中的break和continue

与while 中的作用一样:break用于跳出整个循环,而continue 用于跳出循环后面的语句

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (5 == i)
		{
			//continue;	// 1 2 3 4 6 7 8 9 10
			break;		//1 2 3 4
		}
		printf("%d ", i);
	}
	return 0;
}
  1. for 语句中的循环控制变量
for(i=0; i<10; i++)		//建议前闭后开
{}
  1. 一些for 循环里的变种
  • 直接省略循环中的初始化、条件判断、调整等部分:
int main()
{
	int i = 0;
	for (; ; )
	{
		printf("haha\n");		//循环中的初始化、条件判断部分、调整部分可以进行省略,但是不建议,会形成死循环
	}
	return 0;
}
  • 嵌套循环
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 1; i < 10; i++)
	{
		for (j = 1; j < 10; j++)
		{
			count++;
			printf("count = %d,haha\n",count);		//9*9=81 个haha循环
		}
	}
	return 0;
}
  • 嵌套循环不进行初始化
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (; i < 10; i++)
{
	for (; j < 10; j++)
	{
		count++;
		printf("count = %d,haha\n", count);			//会输出10个haha循环
	}
}
return 0;
}
2.3 do while循环

循环至少执行一次,所以使用场景有限

  1. 结构
do
{
    循环语句体;
}while(表达式)
  1. do while 循环语句中的break和continue

do while 里的break用于跳出整个循环

continue 用于跳过循环后面的所有语句

int main()
{
	int i = 0;
	do
	{
		if (5 == i)
			continue;
		printf("haha\n");	//输出5个haha.若为continue,则输出5个haha后死循环
		i++;
	} while (i < 10);
	return 0;
}

三、小练习

3. 1 计算阶乘
int main()
{
	int i = 0;
	int n = 0;
	printf("请输入你想计算的阶乘:>");
	scanf("%d",&n);
	int ret = 1;
	for (i = 1;i <= n;i++)
	{
		ret *= i;
	}
	printf("%d ",ret);
	return 0;
}
3.2 计算 1!+2!+3!+……+10!
int main()
{
	int i = 0;
	int ret = 1;
	int sum = 0;
	int j = 0;
	for (i = 1;i < 11;i++)
	{
		ret = 1;		//计算下一个阶乘时一定得将result初始化,不然每一次都会从上一个阶乘的值开始进行相加,结果就会越加越大
		for (j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
    printf("1!+2!+3!+……+10!:%d", sum);
    return 0;
}

计算下一个阶乘时一定得将result初始化,不然每次都会从上一个阶乘的值开始相加

3.3 在一个有序数组中查找具体的某个数字n——二分查找/折半查找
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int key = 0;	//想要查找的数字为5
	printf("请输入你想要查找的值:>");
	scanf("%d",&key);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			printf("%d的下标找到了,下标为%d\n", key, mid);
			break;		//用于找到下标后跳出循环
		}
	}
	if (left > right)
	{
		printf("%d下标没找到。\n",key);
	}
	return 0;
}
3.4 编写代码,演示多个字符从两端移动,向中间汇聚
#include <windows.h>
int main()
{
	char arr1[] = "hello  bjbit";
	char arr2[] = "############";
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++;
		right--;
		Sleep(500);		//0.5s 输出一次
		system("cls");	//引入windows.h头文件
		printf("%s\n",arr2);
	}
	return 0;
}
3.5 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
int main()
{
	int i = 0;
	char password[10] = { 0 };
	for (i = 0;i < 3;i++)
	{
		printf("请输入登录密码:>");
		scanf("%s",password);
		if (strcmp(password,"123456") == 0)
		{
			printf("密码输入正确,登录成功!\n");
			break;
		}
	}
	if (i == 3)
	{
		printf("已输入三次密码,现在退出程序!!");
	}
	return 0;
}
3.6 猜数字小游戏的实现

写一个猜数字游戏:

  1. 自动产生一个1-100之间的随机数
  2. 猜数字
    a. 猜对了,就恭喜你,游戏结束
    b. 你猜错了,会告诉猜大了,还是猜小了,继续猜,直到猜对
  3. 游戏一直玩,除非退出游戏
void menu()
{
	printf("**************************\n");
	printf("******   1.play  *********\n");
	printf("******   2.exit   ********\n");
	printf("**************************\n");
}
void game()
{
	/*生成一个随机数:srand函数设置起点,rand函数生成随机数
	* rand() 函数返回了一个0-32767 之间的数字
	* */
	int ret = rand() % 100 + 1;	//%100 为0-99再+1,即1-100
	//猜数字
	int guess = 0;
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d",&guess);
		if (guess > ret)
		{
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了,退出游戏!\n");
		}
	}
}
int main()
{
	int input = 0;
	/*随机数起点的设置:srand 里传入时间,用函数time(NULL)不用其参数 time得引<time.h>
	* srand 函数返回的是unsigned int 的值,所以进行类型转化
	*/
	srand((unsigned int)time(NULL));  
	do 
	{
		menu();
		printf("请进行选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}
3.7 将3个整数从大到小输出
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d%d%d", &a, &b, &c);
	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	if (a < c)
	{
		int tmp = a;
		a = c;
		c = tmp;
	}
	if (b < c)
	{
		int tmp = b;
		b = c;
		c = tmp;
	}
	printf("%d %d %d",a,b,c);
	return 0;
}
3.8 输出1-100中所有的3的倍数
int main()
{
	int i = 0;
	/*for (i = 1; i < 101; i++)
	{
		if (i % 3 == 0)
			printf("%d ",i);
	}*/
	for (i = 3; i < 101; i += 3)
		printf("%d ",i);
	return 0;
}
3.9 找到两数的最大公约数

两数相等时,任意一个都是最大公约数

不相等时,大数-小数,得到的差和之前的小数再次相减,直到两数相等,这两数中,任意一个都是最大公约数

int main()
{
	int a = 0;
	int b = 0;
	printf("请任意输入两个数:");
	scanf("%d%d", &a, &b);
	while ((a - b) != 0)
	{
		if (a > b)
			a = a - b;
		else
			b = b - a;
	}
	printf("最大公约数为:%d\n", b);
	return 0;
}
3.10 写出1000-2000年之间所有的闰年
int main()
{
	int year = 0;
	int count = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		{
			printf("%d是闰年\n",year);
			count++;
		}
	}
	printf("count = %d\n",count);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值