第五章、分支和循环

 switch语句

1、使用switch语句,输入数字显示是星期几
#include<stdio.h>
int main(void)
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入值不在范围内\n");
		break;
	}
	return 0;
}

运行结果:

5
工作日

while循环

1、使用while循环打印10个数字
#include<stdio.h>
int main(void)
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}
	return 0;
}循环打印10个数字*/
#include<stdio.h>
int main(void)
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}
	return 0;
}

运行结果:

1 2 3 4 5 6 7 8 9 10
2、输入一个正整数,逆序打印这个整数的每一位 
分析:
521%10——1
521/10——52
52%10——2
52/10——5
5%10——5
5/10——0
0为假退出循环
#include<stdio.h>
int main(void)
{
	int n = 0;
	scanf("%d",&n);
	while (n)
	{
		printf("%d", n % 10);
		n = n / 10;
	}
	return 0;
}

运行结果:

123
321

for循环

for循环相比while更优

1、循环打印1-10
#include<stdio.h>
int main(void)
{
	int n = 0;
	for (n = 1; n <= 10; n++)
	{
		printf("%d ", n);
	}
	return 0;
}

运行结果:

1 2 3 4 5 6 7 8 9 10
2、计算1-100之间3的倍数之和
分析:
1.产生1-100的数字	for
2.找出3的倍数       if(%3 == 0)
3.求和			    sum+=
#include<stdio.h>
int main(void)
{
	int i = 0;
	int sum = 0;
	for (i = 1; i <= 100; i++)
	{
		//每一次循环进入产生i
		//判断每个产生的i是否是3的倍数
		if (i % 3 == 0)
		{
			printf("%d ", i);
			sum += i;
		}
	}
	printf("\n");
	printf("%d\n", sum);
	return 0;
}

 运行结果:

3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
1683
优化:
#include<stdio.h>
int main(void)
{
	int i = 0;
	int sum = 0;
	for (i = 1; i <= 100; i+=3)	
	//i+=3可以保证每次输出的都是3的倍数
	//省去了if条件判断
	{
		printf("%d ", i);
		sum += i;
	}
	printf("\n");
	printf("%d\n", sum);
	return 0;
}

  运行结果:

3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
1683

do-while循环

循环体至少执行一次

1、打印1-10的值
#include<stdio.h>
int main(void)
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}

运行结果:

1 2 3 4 5 6 7 8 9 10
2、输入一个正整数,计算这个整数是几位数
例:
输入:1234	输出:4
输入:12	输出:2
分析:
使用除法去掉位数
1234/10
123/10
12/10
1/10
#include<stdio.h>
int main(void)
{
	int num = 0;
	scanf("%d", &num);
	int cnt = 0;
	do
	{
		cnt++;
		num /= 10;
	} while (num);	//1/10为0即为假跳出循环
	//输入0代码也没问题,因为do-while必须循环一次
	printf("%d\n", cnt);
	return 0;
}

运行结果:

1234
4

continue语句

continue会跳过本次循环后面的代码

1、使用while循环打印1-10
#include<stdio.h>
int main(void)
{
	int i = 0;
	while (i < 10)
	{
		i++;    //从2开始
			if (i == 5)
			{
				continue;    //本次循环后面的代码,即打印函数
			}
			printf("%d ", i);    //不输出5
	}
	return 0;
}

运行结果:

1 2 3 4 6 7 8 9 10
2、使用for循环打印1-10
#include<stdio.h>
int main(void)
{
	int i = 0;
	for (i=1; i < 10; i++)
	{
		if (i == 5)
		{
			continue;    //打印时也会跳过5
		}
		printf("%d ", i);
	}
	return 0;
}

 运行结果:

1 2 3 4 6 7 8 9 10

 for循环中的初始化;判断;循环的三个表达式都可以省略

但是判断部分省略,要注意:如果省略了判断部分则恒为真,就会陷入死循环

for(;;;)
3、以下代码在打印完5之后会陷入死循环,即5之后的数字不会打印
引文continue跳出循环,不会执行后面的i++
#include<stdio.h>
int main(void)
{
	int i = 0;
	for (i=1; i <= 10; )
	{
		if (i == 5)
		{
			continue;
		}
		i++;
		printf("%d ", i);
	}
	return 0;
}

 运行结果:

2 3 4 5
4、找出100-200之间的素数,并打印在屏幕上
注:素数又称为质数,只能被1和本身整除的数字
分析:
1.利用循环产生100-200之间的数。
2.假设要判断i是否为素数,需要用2~i-1之间的数字去试除i,
需要产生2~i-1之间的数字,可以使用循环解决
3.2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数
#include<stdio.h>
int main(void)
{
	//产生100-200之间的数
	int i = 0;
	int count = 0;	//用来统计素数个数
	for (i = 100; i <= 200; i++)
	{
		int flag = 1;	//假设i是素数
		int j = 0;
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
			{
				flag = 0;	//表示i不是素数
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n");
	printf("count=%d\n", count);
	return 0;
}

 运行结果:

101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
count=21
优化:
n=a*b
16=2*8
16=4*4
a*b中至少有一个数字是小于等于根号n的
#include<math.h>    //调用sqrt()开根号函数
#include<stdio.h>
int main(void)
{
	//产生100-200之间的数
	int i = 0;
	int count = 0;	//用来统计素数个数
	for (i = 101; i <= 200; i += 2)	//i+=2产生的数字是奇数
	{
		int flag = 1;	//假设i是素数
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)    //sqrt(i)开根号
		{
			if (i % j == 0)
			{
				flag = 0;	//表示i不是素数
				break;
			}
		}
		if (flag == 1)		//是素数的话打印
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n");
	printf("count=%d\n", count);
	return 0;
}

 运行结果:

101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
count=21

goto语句

C语言提供了一种非常特别的语法,goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。

#include<stdio.h>
int main(void)
{
	printf("hehe\n");
	goto flag;    //下一句语句会被跳过,直接跳转到标号flag:后边的语句
	printf("didi\n");
flag:
	printf("ss\n");
	return 0;
}

  运行结果:

hehe
ss

goto语句不仅可以前后跳转,也可以后前跳转(但是可能会进入死循环)

#include<stdio.h>
int main(void)
{
	printf("hehe\n");
zhangsan:
	printf("didi\n");
	goto zhangsan;    //进入了死循环,一直往前跳转执行didi输出语句
	printf("ss\n");
	return 0;
}

goto语句如果使用不当的话,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以尽量不要使用,但是goto语句在多层循环的代码中,如果想快速跳出循环的话,goto语句就非常方便

#include<stdio.h>
int main(void)
{
	for()
	{
		for ()
		{
			for ()
			{
				for () 
				{
					goto error;		//可以直接跳出循环
				}
			}
		}
	}
error:
	return 0;
}

不需要三个break可以直接跳出最内层的循环。

循环尽量不要省略。

#include<stdio.h>
int main(void)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 5; i++)
	{
		//0
		//01234
		//1
		//01234
		//2
		//01234
		//3
		//01234
		//4
		//01234
		for (j = 0; j < 5; j++)
		{
			printf("hehe\n");	//打印25个hehe
		}
	}
	return 0;
}

 运行结果:

hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
#include<stdio.h>
int main(void)
{
	int i = 0;
	int j = 0;
	for (; i < 5; i++)
	{
		for (; j < 5; j++)   
        //第一次内循环完j变成5去到第一层循环
        //第二次循环开始i++后i变成1,但是再次进入内层的时候j还是5,没有初始化为0
        //所以会跳出循环
        //剩下的4次循环都是直接跳出循环
        //此程序只执行了1一次第二层循环,其余的都直接跳出内循环
		{
			printf("hehe\n");	//打印25个hehe
		}
	}
	return 0;
}

 运行结果:

hehe
hehe
hehe
hehe
hehe

rand()函数

rand函数会返回一个伪随机数,
这个随机数的范围在0 - RAND_MAX之间,
 RAND_MAX的大小是以来编译器上实现的,
但大部分的编译器上是32767,
使用rand()函数需要引用头文件stdlib.h,rand()函数生成随机数的默认种子是1

如果要产生不同的随机数,就需要种子是变化的

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
	RAND_MAX;
	int r = rand();
	printf("%d\n",r);
	return 0;
}

C语言中又提供一个函数叫srand,用来初始化随机数生成器的,srand的原型如下:

void srand(unsigned int seed);

程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机序列也就会变化。

也就是说srand的种子如果是随机的,rand就能生成随机数;在生成随机数的时候又需要一个随机数,这就矛盾了。

time()函数

在程序中我们一般是使用程序运行的时间作为种子的,因为时间时刻在发生变化的。

在C语言中有一个函数叫time,就可以获得这个时间。

time函数会返回一个time_t时间戳,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,返回的类型是time_t。

time_t time(time_t* timer);
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
	srand((unsigned int)time(NULL));
    //种子使用的是time函数
    //种子需要指定为无符号整型
	RAND_MAX;
	int r = rand();
	printf("%d\n",r);
	return 0;
}

 猜数字游戏

猜数字游戏*/
#include<stdio.h>
#include<time.h>
void menu()	//封装菜单函数
{
	printf("**********************\n");
	printf("****请选择以下按钮****\n");
	printf("******* 1.play *******\n");
	printf("******* 0.exit *******\n");
	printf("**********************\n");
	printf("**********************\n");
}

void game()	//猜数字游戏的实现
{
	//1、生成随机数(1-100)
	int ret = rand()%100+1;	
	//因为ran()函数的取值范围为0-32767
	//任何数字对100取模,就变成了1-100
	//2、猜数字
	int guess = 0;
	int count = 5;
	while (count)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了!\n");
		}
		else if(guess > ret)
		{
			printf("猜大了!\n");
		}
		else
		{
			printf("恭喜你猜对了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("你猜失败了,正确的数字是:%d\n", ret);
	}
}
int main(void)
{
	int input = 0;
	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;
}

 生成0~99之间的随机数

rand()%100;    //余数的范围是0-99

生成1~100之间的随机数

rand()%100+1;	

生成100~200之间的随机数

100 + rand () % (200-100+1)
//余数的范围是0~100,加100之后就是100~200

生成a~b之间的随机数

a + rand () % (b-a+1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黄金圣手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值