分支,三大循环,循环嵌套及优化

一:比较if switch 以及注意事项

int main()
{
	int num = 0;
	scanf("%d",& num);
	switch (num % 3)
	{
	case 1:
		printf("余数是1");
		break;
		
	case 2:
		printf("余数是2");
		break;
	
	case 0:
		printf("余数是3");
		break;

	}
	return 0;
}
#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 3 == 0)
	{
		printf("余数是0");
	}
	else if (num % 3 == 1)
	{
		printf("余数是1");
	}
	else 

	{
		printf("余数是2");

	}
	
	

	return 0;
}

switch表达式
运行逻辑:switch(expression)
{
case value1:
case value2:
default:statement
}
注意:不能用float为num赋值
同时case后也要是整形不能是1.0
应该是整形常量表达式

switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式
switch后可以是字符,因为字符的本质是它的ask码值
switch语句使用的场景不能强行把if转换为switch
switch()后的表达式能够明确的计算出某个值的时候后才有case
if后的()的表达式则可以明确的给出范围如>多少等。
另外:break在switch中才是真正的实现了分支的效果。

二:重复性问题应该如何解决,以及超出case如何解决

#include<stdio.h>
int main()
{
	int day = 0;
	printf("请输入一个值:");
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
		printf("有课");
		break;
	case 4:
		printf("没课");
		break;
	}
	return 0;
}

三: 分支中包含多条语句即{}的意义

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("已成年\n");
		printf("可以谈恋爱了");
	return 0;
}

发现无论输入多少均打印第二条语句可以谈恋爱了。
这是因为if只能控制一条语句,printf(“可以谈恋爱了”)是独立存在的不管if语句的条件的真假,都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使⽤ {} 将代码括起来,else后也可以跟上⼤括号。如下:

#include<stdio.h>
int main()
{
	int age = 0;
	printf("请输入您的年龄:");
	scanf("%d", &age);
		if (age >= 18)
		{
			printf("已成年\n");
				printf("可以谈恋爱了");
		}
		else//else后使用{}包含多条语句,这个快叫程序块也叫复合语块
		{
			printf("未成年");
			printf("好好学习");
		}
	return 0;
}

四:循环的分类

while循环

if与while的比较:
if(表达式)
语句

while(表达式)
语句
十分相似但执行逻辑不同
比如

#include<stdio.h>
int main()
{
	if (1)
	{
		printf("666");
	}
	return 0;
}//由于1为真,则输出,结果只是666
#include<stdio.h>
int main()
{
	while (1)
	{
		printf("666");
	}
	return 0;
}

为死循环满屏666
在这里插入图片描述
while循环逻辑如下

在这里插入图片描述
while(判断表达式)
{
语句
}
while训练
将数字串逆向打印出来:

#include<stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个数字:");
	scanf("%d", &num);
	while (num)
	{
		printf("%d", num % 10);
		num = num / 10;
	}


	return 0;
}

for循环

for循环的语法形式如下:
for(表达式1;表达式2;表达式3)
(语句)
**表达式一:**循环的初始化
**表达式二:**循环结束的判断条件
**表达式三:**循环的调整
以下为for循环的执行流程在这里插入图片描述
利用for循环计算1-100中3的倍数相加(两种不同的方式)


int main()
{
	int i = 0;
	int num = 0;
	for (i = 1; i<=100; i++)
	{
		if(i%3==0)
		{
			num += i;//num=num+i;
		}
		
	}
	printf("%d", num);
	return 0;
}
int main()
{
	int i= 0;
	int num = 0;
	for (i = 3; i <= 100; i += 3)
	{
		num = i + num;//num+=i;
	}
	printf("%d", num);
	return 0;
}

第一种方式循环100次,判断100次
第二种方式循环34次,判断34次

do-while循环

循环逻辑:
do(语句)
while表达式
在这里插入图片描述
for和while都是先判断然后再执行语句,而do-while循环则是先执行然后再判断。
则在do-while循环中至少要执行一次
练习:

//输入一个正整数判断为几位数
int main()
{
	int num = 0;
	int i = 0;
	printf("请输入一个数字");
	scanf("%d", &num);
	do
	{
		num=num / 10;
			i++;
	} while (num);
	printf("您输入的数字是%d位数", i);

	return 0;
}

问题:并不完全正确如输入999999999999这个12位数时显示为9位数
输入1984651894619849这样的长数字时输出的为1位数

五:循环的嵌套和优化

打印100-200之间的素数

int main()
{
	int num = 0;
	int count=0;
		for (num = 100; num <= 200; num++)
		{
			int i = 0;
			int z = 1;
			
			for (i = 2; i < num; i++)
			{
				if (num%i==0)
				 {
					 z = 0; 
					 break;
				 }	
			}
			
			if (z == 1)
			{
				printf("%d\n", num);
				count++
			}
		}
		printf("一共%d个",count);
}

优化:

#include<stdio.h>
#include<math.h>
int main()
{
	int num = 0;
	int count=0;
//优化1:偶数一定不是素数,则没必要进入循环
	for (num = 101; num <= 200; num+=2)
		{
			int i = 0;
			int z = 1;
//优化2:i=a*b,ab中至少有一个数字<=根号i		
/*sqrt()指的是取根号,需要库函数<math.h>*/	
			for (i = 2; i <= sqrt(num); i++)
			{
				if (num%i==0)
				 {
					 z = 0; 
					 break;
				 }	
			}
			
			if (z == 1)
			{
				printf("%d\n", num);
				count++
			}
		}
		printf("一共%d个",count);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值