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;
}