第3讲:分支和循环


C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,
我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使用 if 、 switch 实现分支结构,使用for 、 while 、 do while 实现循环结构。

第一部分

1. if语句

执行条件

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0表示真,
也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行。

悬空else问题

如果有多个 if 和 else ,记住这样⼀条规则, else 总是跟最接近的 if 匹配

练习01:判断奇数与偶数

#include <stdio.h>
int main()
{
	//输入一个数
	int num = 0;
	printf("please enter the num:");
	scanf("%d", &num);
	//判断奇数与偶数
	if (num % 2 == 1)
	{
		printf("num是奇数");
	}
	else
	{
		printf("num是偶数");

	}
	return 0;
}

练习02:判断成年与否

#include <stdio.h>
int main()
{
	//输入年龄
	int age = 0;
	printf("please enter the age:");
	scanf("%d", &age);
	//判断成年与否
	if (age >= 18)
	{
		printf("成年");
	}
	else
	{
		printf("未成年");
	}
	return 0;
}

练习03:输入一个整数,判断输入的整数是0,还是正数或者负数

#include <stdio.h>
int main()
{
	// 输⼊⼀个整数
	int num = 0;
	printf("please enter the num:");
	scanf("%d", &num);//千万记得取地址
	//判断输⼊的整数是0,还是正数或者负数
	if(num == 0)
	{ 
		printf("输入的整数是0");
	}
	else
	{
		if (num > 0)
		{
			printf("输入的整数是正数");
		}
		else//else后面无需加判断表达式
		{
			printf("输入的整数是负数");
		}
	}
		
	return 0;
}

练习04:输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:负数

#include <stdio.h>
int main()
{
	// 输⼊⼀个整数
	int num = 0;
	printf("please enter the num:");
	scanf("%d", &num);
	//如果是正数,再判断是奇数还是偶数,并输出;
	if (num > 0)
	{
		if (num % 2 == 1)
		{
			printf("奇数");
		}
		else
		{
			printf("偶数");
		}
	}
	//如果不是正数则输出:负数
	else
	{
		printf("负数");
	}
	return 0;
}

2. 关系操作符

关系表达式通常返回 0 或 1 ,表示真假,用于判断语句。
关系表达式常用于 if 或 while 结构。

不混淆

注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。
有时候,可能会不小心写出下⾯的代码,它可以运行,但很容易出现意料之外的结果。

if (x = 3)

为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。

if (3==x)

不连用,连用需结合逻辑操作符

另⼀个需要避免的错误是:多个关系运算符不宜连用。

//输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。
#include <stdio.h>
int main ( )
{
	//输⼊⼀个年龄
	int age = 0;
	printf("please enter the age:");
	scanf("%d", &age);
	//如果年龄在18岁~36岁之间,我们输出⻘年
	if (age >= 18 && age <= 36)
	{
		printf("青年");
	}
	else
	{
		printf("bzd");
	}
	return 0;
}

3. 条件操作符

使用条件表达式实现找两个数中较大值

#include <stdio.h>
int main()
{
	//输入两个数字
	int a = 0, b = 0,max = 0;
	printf("please enter two num:");
	scanf("%d %d", &a, &b);
	//使⽤条件表达式实现找两个数中较⼤值
	max = a > b ? a : b;
	printf("max=%d", max);
	return 0;
}

4. 逻辑操作符:&& , || , !

短路

&&与:一假则假;||或:一真则真

#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	//i = a++||++b||d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
	return 0;
}

判断一年四季

#include <stdio.h>
int main()
{
	int month = 0;
	printf("请输入要判断的月份:");
	scanf("%d", &month);
	if (month >= 3 && month <= 5)
	{
		printf("春天");

	}
	else if (month >= 6 && month <= 8)
	{
		printf("夏天");

	}
	else if (month >= 9 && month <= 11)
	{
		printf("秋天");

	}
	else if (month==12||month==1||month==2)
	{
		printf("冬天");
	}
	else
	{
		printf("eror");

	}
	return 0;
}

闰年的判断

  1. 能被4整除并且不能被100整除是闰年
  2. 能被400整除是闰年
#include <stdio.h>
int main()
{
	int year = 0;
	printf("请输入要判断的年份:");
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		printf("是闰年");
	}
	else
	{
		printf("不是闰年");
	}
	return 0;
}

5. switch语句

输入任意一个整数值,计算除3之后的余数

#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	switch (num % 3)
	{
	case 0://必须在后面加上冒号,以表示说明分类情况
		{
		printf("余数为0");
		}
			break;
	case 1:
		{
		printf("余数为1");
		}
			break;
	case 2:
		{
		printf("余数为2");
		}
			break;
	default:
			{
		printf("error");
}
	}
	return 0;
}

关于case与break

#include <stdio.h>
int main()
{
	int day = 0;
	printf("请输入一个数字:");
	scanf("%d", &day);
	switch (day)
	{
	case 1://case后面需要加冒号,以表示说明选择情况
	case 2:
	case 3:
	case 4:
	case 5:
	{
		printf("实名开卷中");
	}
		break;
	case 6:
	case 7:
	{
		printf("开摆");
	}
		break;
	default:
	{
		printf("躺平");
	}
	break;//default也需要break跳出选择
	}
	return 0;
}

第二部分

6. while循环

在屏幕上打印1~10的值

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

逆序打印整数的每一位

#include <stdio.h>
int main()
{
	int num = 0,wei = 0;//初始化部分
	printf("请输入整数:");
	scanf("%d", &num);
	while (num)//判断部分
	{
		wei = num % 10;
		printf("%d", wei);
		num /= 10;//调整部分
	}
	return 0;
}

7. for循环

在屏幕上打印1~10的值

#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)//for循环后面不加分号,已经有代码块在后面了
	{
		printf("%d ", i);
	}
	return 0;
}

计算1-100之间3的倍数的和

#include <stdio.h>
int main ( )
{
	int i = 0,sum = 0;
	for (i = 1; i <= 100; i++)//for后面不加分号!!!
	{
		if (i % 3 == 0)
		{
			sum += i;
		}
	}
	printf("%d", sum);//将printf置于不同逻辑层,结果也不同。
	return 0;
}

8. do-while循环

在屏幕上打印1~10的值

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

	} while (i < 10);//while后必须加分号,后面没有代码块
	return 0;
}

输入一个正整数,计算这个整数是几位数

#include <stdio.h>
int main()
{
	int num = 0, count = 0;
	printf("输入:");
	scanf("%d", &num);
	do
	{
		++count;
		num /= 10;
	} while (num);
	printf("这个数是%d位数", count);//printf要根据需求,判断是否放置于逻辑内部
	return 0;
}

第三部分

9. break和continue语句

在while中,循环的调整是在 continue 后边的话,可能会造成死循环。
在for循环中,调整部分始终在continue的前面,不易造成死循环。
while 循环和 for 循环中 continue 的区别

while,去到循环的判断地方

#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
printf("%d ", i);
i = i+1;
}
return 0;
}

for,去到循环的调整部分

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

do.while 语句中的 break 和 continue 的作用和 while 循环中几乎⼀模⼀样

10. 循环的嵌套

【疑难杂症】求100-200中的素数-正解

1.使用状态标示值

#include <stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1;//标记状态值
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (1 == flag)
		{
			count++;
			printf("%d是素数\n", i);
		}
	}
	printf("素数有%d个\n", count);
	return 0;
}

2.定义并调用函数

#include <stdio.h>
int is_ss(int i)//用于判断素数的函数
{
	//关于内环的判断难点,是否break,明确作用
	//产生2-i-1之间的数被除
	int j = 0;//j的作用,被i除,遍历取模
	for (j = 2; j < i; j++)//空间思维,循环结构为空中的一圆环,为横向全面思考
	{
		//直到等于0才跳出循环,遍历只加一个条件判断
		//想象成开锁,转了一圈都没有匹配的,就跳出这个圈

		if (i % j == 0)//空间思维,选择结构为空中的一竖直分叉,为纵向分类思考
			return 0;
		//如:(105%2==1)但是(105%5==0)
	}
	return 1;
}
int main()
{
	//产生100-200之间的数组
	int i = 0;
	int count = 0;//计算素数的个数,置于判断成功之后,跳出循环再打印
	for (i = 100; i <= 200;i++)
	{
		//第一环,产生100-200
		if (is_ss(i) == 1)//调用函数时,不要忘记形参,否则就是没有调用,参数传不过去
		{
			count++;//注意计数器的位置
			printf("%d是素数", i);
		}
	}
	printf("100-200之间的素数有%d个", count);
	return 0;
}

11. goto语句

#include <stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}

本来 for 循环想提前退出得使用 break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使用3个 break 才能跳出循环,所以在这种情况下我们使⽤用goto 语句就会更加的快捷。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空阿瞒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值