分支循环语句(2)

1.break和continue语句

在循环执行的过程中,倘若某些状况进行时,需要提前终止循环,而这种情况就需要break和continue两个关键字,就是应用于循环中的

break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行

continue的作用是跳过本次循环中continue后面的代码,在for循环和while循环中有所差异

1.1 while循环中的break和continue

1.1.1 break举例

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

结果是01234,等于5时由于break的存在,结束了循环
所以break的作用是永久的终止循环,只要break被执行,break外的一层循环就结束了

1.1.2 continue举例

continue是继续的意思,在循环中的作用是跳过本次循环中continue后边的代码,继续进行下一次循环的判断

若将上述代码中的break换为continue会是什么结果?

int main()
{
	int a = 1;
	while(a <= 10)
	{
		if (a == 5)
			continue;
        //当a=5后,就执行continue,直接跳过continue的代码,去循环的判断的地方
        //因为这里跳过了a=a+1,所以a一直为5,程序陷入和死循环
		printf("%d", a);
		a += 1;
	}

	return 0;
}

能够分析出continue帮助我们跳过某一次循环continue后边的代码,直接到循环中的判段部分,进行下一次循环的判断,如果循环的调整是在continue后边的话,可能会造成死循环

1.2 for循环中的break和continue

1.2.1 break举例

其实和while循环中的break一样,for循环中的break也是用于终止循环的,无论循环还要进行多久,只要执行到break 循环就会终止

int main()
{
	int a = 0;
	for(a = 1 ; a <= 10 ; a++)
	{
		if (a == 5)
			break;
		printf("%d", a);
	}
	return 0;
}

结果为1234,和while循环中的break作用大致相同

1.2.2 continue举例

若将上面的代码中的break换成continue会怎样

int main()
{
	int a = 0;
	for(a = 1 ; a <= 10 ; a++)
	{
		if (a == 5)
			continue;
		printf("%d", a);
	}
	return 0;
}
结果是:1234678910

所以在for循环中continue的作用是跳过本次循环中continue后的代码,直接去到循环中的调整部分,未来当某个条件发生的时候,本次循环无需在执行后续某些操作的啥时候,就可以使用continue来实现

而对比while循环和for循环中continue的区别发现

while循环中变量进行改变时发生在continue之后的代码中,从而造成了死循环的出现

for循环中变量的改变发生在continue之前,从而导致仅仅只有这一次循环结束,而继续进行后续的循环

1.3 do while循环中的break和continue

do while语句中的break和continue的作用和while循环几乎一摸一样

break

int main()
{
	int a = 0;
	do
	{
		if (a == 5)
			break;
		printf("%d", a);
		a = a + 1;
	} while (a <= 10);
	return 0;
}

01234

continue

int main()
{
	int a = 0;
	do
	{
		if (a == 5)
			continue;
		printf("%d", a);
		a = a + 1;
	} while (a <= 10);
	return 0;
}

又发生了死循环

2.循环的嵌套

前面一共学习了三种循环while do while for,这三种循环往往嵌套在一起才可以更好的解决问题,就是我们所说的循环嵌套

2.1 练习

找出100-200之间的素数,并打印在屏幕上

注:素数又称质数,只能被1和本身整除的数字

2.2题目解析

1 要从100-200之间找出素数,首先得有100-200之间的数,这里可以使用循环解决

2 假设要判断i是否为素数,需要使用2-i-1之间的数字去除以i,需要产生2~i-1之间的数字,也可以使用循环进行

3 如果2~i -1之间有数字能整除i,则不是素数,如果都不能整除,则是素数

int main()
{
	int a = 0;
	for(a = 100; a >=100&&a<=200;a++)
	{
		//判断a是否是素数
		//要产生2~a-1之间的数字,去试除a
		int i = 1;//假设a是素数
		int result = 0;
		for(result = 2;result < a;result++)
		{
			if (a % result == 0)
			{
				i = 0;
				break;
			}
		}
		if (i == 1)
			printf("%d",a);
	}
	return 0;
}

第二种方法

#include <math.h>//数学相关的头文件
int main()
{
	int i = 0;
	for(i = 100;i<=200;i++)
	{
		//判断i是否为素数
		//要产生2~sqrt(i)之间的数字,去试除i
		int flag = 1;//假设i是素数
		int j = 0;
		for(j = 2;j<=sqrt(i);j++)
		{
			if(i%j==0)
			{
				flag = 0;
				break;
			}
		}if (flag == 1)
			printf("%d", i);
	}
	return 0;
}

sqrt是开根号的意思
在n=a*b的方式
不可能a和b同时大于根号下n
a和b至少有一个数字是<=根号下n
如果n不是素数,一定有一个因子在2~根号下n
倘若在2~根号下n之间没有找到能整除n的数字,那么n就是素数

3 多组输入的问题

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = a + b;
	printf("c=%d", c);
	return 0;
}
//带入循环后:
int main()
{
	int a = 0;
	int b = 0;
	
	while(scanf("%d %d",&a,&b) == 2)//2相当于两个数
	{
		int c = a + b;
			printf("c=%d\n", c);
	}
	return 0;
}

无穷无尽的进行计算
对此想要结束循环,则需要ctrl+z连续3次,才可结束循环

而当读取失败时

scanf读取失败的时候,返回的是EOF

end of file

EOF---1

修改后
while(scanf("%d %d",&a,&b) != EOF)//
其中的!=EOF则意味着scanf读取成功了,所以结果不变

4 随机数生成

要想完成猜数字游戏,首先得产生随机数,那怎么产生随机数呢?

4.1 rand

c语言提供一个函数叫rand,这函数是可以生成随机数,函数原型如下所示:

 int rand (void);

rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767

rand函数的使用需要包含一个头文件:stdlib.h

那我们就测试一下rand函数,这里多调用几次,产生5个随机数:

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


41
18467
6334
26500
19169

这是一个固定值,堪称伪随机数
多运行几次也是一样的结果

我们先运行一次,看看结果,再运行一次再看看结果,多运行几次呢?

我们可以看到虽然一次运行中产生的5个数字是随机的,但是下一次运行程序生成的结果和上一次一摸一样,这就说明有点问题

如果再深入了解一下,我们就不难发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的某种算法生成的随机数.真正的随机数是无法预测下一个值是多少的.而rand函数是对一个叫"种子"

的基准数进行运算生成的随机数

之所以前面每次运行程序产生的随机数序列是也一样的是一样的,那是因为rand函数生成随机数的默认种子是1

生成不同的数,种子需要变化

4.2 srand

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

void srand (unsigned int seed);

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

如果给srand的种子如果是随机的,rand就能生成随机数:在生成随机数的时候有需要一个随机数,这就矛盾了

4.3 time

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

在c语言中有一个函数叫time 就可以获得这个时间,time函数原型如下:

time_t time (time_t*timer)

time函数还会返回当前的日历时间,本质是返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,返回类型是time_t类型,time_t类型本质上其实是32为或者64位的整型类型

time函数的参数timer如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去.

如果timer是NULL,就只返回这个时间的差值,time函数返回的这个时间差也被叫做:时间戳

time函数的时候需要包含头文件:time.h

#ifndef _CRT_NO_TIME_T
	#ifdef _USE_32BIT_TIME_T
		typedef __time32_t time_t
	#else
		typedef __time64_t time_t;
	#endif
#endif


typedef long                      __time32_t;
typedef __int64                   __time64_t;

如果只是让time函数返回时间戳,我们可以这样写

time(NULL);

time函数,time函数会返回一个时间戳

时间戳:是一个数字

是当前时间-计算机的起始时间的差值,单位是秒

1970-1-1,0:0:0

srand((unsigned int)time(NULL));

4.4 设置随机数的范围

如果我们想要生成0~99之间的随机数,方法如下:

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

如果想要生成1~100之间的随机数

rand() % 100 + 1 //%100的余数是0~99,0~99的数字+1,范围是1~100

如果想要生成100~200之间的随机数

rand() % (200 -100 + 1) + 100

所以想要生成a~b之间的随机数,方法如下

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

写一个猜数字游戏

游戏要求:

1.电脑自动生成1~100的随机数

2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出了大了或小了的反馈,直到猜对,游戏结束

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
	printf("----------------------------------\n");
	printf("----------   1.玩游戏 ------------\n");
	printf("----------   0.推出游戏 ----------\n");
	printf("----------------------------------\n");
}


//void game()
//{
//	int guess = 0;
//	//游戏的实现
//	//1.生成随机数
//	int r = rand() % 100 + 1;
//	//printf("r = %d\n",r)
//	//猜数字
//	while(1)
//	{
//		printf("猜数字:");
//	scanf("%d", &guess);
//	if (guess > r)              //此为一次循环,为了无线,则需while循环
//		printf("猜大了\n");
//	else if (guess < r)
//		printf("猜小了\n");
//	else
//		printf("恭喜你猜对了\n");
//	//或者是带大括号后将语句诺如其中
//	}
//}
//也可为其加上范围进行范围调控

void game()
{
	int guess = 0;
	//游戏的实现
	//1.生成随机数
	int r = rand() % 100 + 1;
	//printf("r = %d\n",r)
	//猜数字
	int count = 5;
	while (count)//5 4 3 2 1 
	{
		printf("剩余%d次机会:\n",count);
		printf("猜数字:");
		scanf("%d", &guess);
		if (guess > r)              //此为一次循环,为了无线,则需while循环
			printf("猜大了\n");
		else if (guess < r)
			printf("猜小了\n");
		else
			printf("恭喜你猜对了\n");
		//或者是带大括号后将语句诺如其中
		count--;
	}
	if(count == 0)
	{
		printf("5次机会使用完,猜数字失败\n");
	}
}


int main()
{
	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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值