【C语言修炼手册】(二)分支语句和循环语句

分支语句和循环语句

分支语句
1.if
2.switch

循环语句
1.while
2.for
3.do while

goto语句

分支语句

if语句
#include<stdio.h>
int main()
{
	if()
	{
	}
	else if()
	{
	}
	else
	{
	}
	return 0;
}

else会和最近的if配对

swiitch语句

常用于多分支情况

比如:

switch()
{
	default:
		break;
	case 1:
	case 2:
		printf();
		break;
	case 3:
		printf();
		break;
}
//break不是语法要求,当没有要求时可不加(一般加上)

switch(整型表达式)
{
case 整型常量表达式:
语句项;
}

当switch语句表达式的值并不匹配所有case标签的值时,可以用default子句来指向另一个值或者跳出该switch循环
每个switch语句只能出现一个default子句,可以出现在任何位置

switch中的break

在这里插入图片描述
结果为:
在这里插入图片描述

break跳出所在switch

循环语句

循环多次进行

while循环
//结构
while(表达式)
	循环语句;
while循环中的break和continue
	int i = 1;
	
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	}

	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i++;
	}

执行完break; 程序会直接跳出while循环,不去执行下面的语句 ;
执行完continue;程序将结束本次循环(即不再往下执行 ) ,去到判断部分,看是否进行下一次循环

  • 看到continue时立即结束本次循环,继续执行下一次循环。
  • break 在while循环中的作用是 跳出一个循环或者结束一个循环
for循环
//语法
for(表达式1;表达式2;表达式3)
	循环语句;

for循环使用频率较while循环高

for循环中的break和continue

意义与while循环中一样,有些微区别

tips
  • 尽量不要在for循环体内修改循环变量
int main()
{
	int i = 0;
	for (i = 1; i <= 10;)
	{
		printf("%d ", i);
		i++; //这种情况可能会导致错误
	}
	return 0;
}
  • 建议循环控制变量取值使用”前闭后开“区间
int i = 0;
//前闭后开写法
for(i=0;i<10;i++)
{
}
//两边都是闭区间
for(i=0;i<=9;i++)
{
}
  • 在这里插入图片描述
  • for循环()内不要随意省略表达式
int main()
{
	int i = 0;
	int j = 0;
	for (; i < 3; i++)
	{
		for (; j < 3; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

在这里插入图片描述

为什么结果打印三次呢?
第二个for循环内经过了三次打印“hehe”,执行i++,i<3进入第二个for循环。由于j初始化被省略,j没有被初始化;此时j=3;不再打印
由此可见:for(…)不能随意省略

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		if (i = 5)//error
			printf("%d", i);
	}
	return 0;
}

注意:i = 5为赋值,结果为死循环

do while循环
//语法
do
	循环语句
while(表达式);

不管三七二十一,先进去执行一次。
循环至少执行一次

do while中break和continue的区别
在这里插入图片描述

结束do while 循环
如果for里嵌套for,跳过break所在for循环(即只跳一层循环)

在这里插入图片描述

跳过continue后面语句,来到判断部分,最后进入死循环

goto语句

可随意滥用跳转

int main()
{
flag:
	printf("hehe\n");
	printf("haha\n");

	goto flag;
	return 0;
}

在这里插入图片描述

结果为死循环

下面我们通过一个小程序来介绍一下goto语句

预备知识:

1.打开命令指示符
在这里插入图片描述
2.输入
在这里插入图片描述

shutdown -s -t 60 ----让电脑在60秒后关机
shutdown -a ----停止关机

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	//system()---执行系统命令
	char input[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("请注意,你的电脑将在一分钟后关机,如果输入:努力搬砖,就取消关机\n");
	scanf("%s", input);
	if (strcmp(input, "努力搬砖") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
}

在这里插入图片描述

哈哈O(∩_∩)O~这个小程序是不是很有趣呢?你可以尝试将它安装到女朋友的电脑里,这样你的女朋友就会来找你玩耍啦!

好叭~言归正传,我们还是来看一下

goto语句的适用场景
for (...)
{
	for (...)
	{
		for (...)
		{
			if (disaster)
					goto error;
		}
	}
}
...
error:
	if(disaster)
		//处理错误情况

注意:goto 语句只能在一个函数范围内跳转,不能跨函数

笔试题

循环循环多少次?

#include<stdio.h>

int main()
{
	int i = 0;
	int k = 0;
	for (i = 0,k=0; k = 0; i++, k++)
		k++;
	return 0;
}

for循环里判断语句为赋值,将0赋给k,语句为假,循环不进去,所以循环0次
改为k==0可以循环一次

考考你

同学们,动动你们的小脑筋,敲起来吧!
不要偷懒哦

1.计算n的阶乘

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

2.计算1!+2!+3!+.....+10!

int main()
{
	int n,i,j;
	int sum = 1;
	int sum1 = 0;
	//scanf("%d", &n);
	for (n = 1; n <= 10; n++)
	{
		sum = 1;//这一步很重要!要将sum初始为1
		for (i = 1; i <= n; i++)
			sum *= i;
		sum1 = sum1+sum;
	}
	//更简写法
	for (n = 1; n <= 3; n++)
	{
		sum *= i;
		sum1 += sum;
	}

	printf("%d", sum1);
	return 0;
}

3.在一个有序数组中查找具体的某个数字n

折半查找法(二分法)

在这里插入图片描述

#include<stdio.h>
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;
	int right = sz - 1;

	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}

	}
	if (left > right)
	{
		printf("找不到了\n");
	}
}

``

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

#include<string.h>
#include<windows.h>
int main()
{
	char arr1[] = "welcome to bit!!!!!!";
	char arr2[] = "####################";
	int left = 0;
	int right = strlen(arr1) - 1;//此为数组名下标,所以要减一
	
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		Sleep(1000);//睡眠一秒
		system("cls");//清空屏幕
		printf("%s\n", arr2);
		left++;
		right--;
	}
	return 0;
}

在这里插入图片描述

结果动态打印字符串
通过这一练习,我们还能学到:
Sleep(1000);//睡眠一秒
system(“cls”);//使屏幕清空

使用这一函数要引用头文件
#include<windows.h>

5.模拟用户登录情景,并且只能登录三次

#include<string.h>
int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:>");
		scanf("%s", password);//数组名,不需要&
		if (strcmp(password, "123456") == 0)
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误,重新输入\n");
		}
		
	}
	if (i == 3)
	{
		printf("三次密码均错误,退出程序\n");
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

引用头文件**#include<string.h>**
字符串1<字符串2------<0
字符串1>字符串2------>0
字符串1=字符串2------=0

5.给定两个数,求它们的最大公约数

法一
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d%d", &m, &n);
	int max = m>n?n:m;//假设最大公约数是m和n的较小值
	while (1)
	{
		if (m % max == 0 && n % max == 0)
		{
			printf("最大公约数是:%d\n", max);
			break;
		}
		max--;
	}
	return 0;
}

法二:辗转相除法
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d%d", &m, &n);
	int t = 0;

	while (t = m % n)
	{
		m = n;
		n = t;
	}
	printf("最大公约数:%d\n", n);
	//最小公倍数 = 两数相乘/最大公约数

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值