C语言-break与continue语句

1、break语句

break语句是强制结束循环,例如for循环中使用break:

	for (表达式1;表达式2;表达式3){
		语句1;
		break;
		语句2;
	}

其流程图如下:

C语言-break与continue语句_第1张图片
从流程图可以看到,若使用break语句,将直接结束循环,执行for的下一条语句,不再执行循环体中位于其后的其他语句了。而流程图中break的判断框一般是与if搭配使用,代表若条件满足,则执行break跳出循环;若条件不满足,则不执行break语句,执行循环体后面的语句。

从流程图中可以看到,循环有2个出口,分别是表达式2的值为“假”或执行了break语句,这两个条件有一个满足都会结束循环,有时候需要判断循环时如何结束的。

例1:判断素数

输入正整数m,判断它是不是素数。

#include 
#include 

int main(void)
{
	int i, limit, m;
	
	printf("Enter a number:");
	scanf("%d", &m);
	if (m <= 1){					/*小于等于1的数不是素数*/
		printf("No!\n");
	} else if (m == 2){				/*2是素数*/
		printf("%d is a prime number!\n", m);
	} else {						/*其他情况:大于2的正整数*/
		limit = sqrt(m)+1;
		for (i=2; i<=limit; i++){
			if (m%i == 0){
				break;				/*若m能被某个i整除,则m不是素数,提前结束循环*/
			}
		}
		if (i > limit){				/*若循环正常结束,说明m不能被任何一个i整除*/
			printf("%d is a prime number!\n", m);
		} else {					/*m不是素数*/
			printf("No!\n");
		}
	}
	
	return 0;
}

Enter a number:13
13 is a prime number!

Enter a number:27
No!

本例题是判断素数的问题。素数是只能被1和它本身整除的数,规定2是最小的素数。一般来说需要判断这个正整数m不能被区间[2,m-1]的所有的数整除才能是素数,但是实际上这种算法做了很多多余的计算。其实这个区间只要是[2, m \sqrt{m} m ]就可以了。这个是可以证明的。下面是证明过程。

证明:设m是大于2的自然数,且m不能被区间 [ 2 , m ] [2, \sqrt{m}] [2,m ]的任意整数整除。
假设m不是素数,那么必有一个大于 m \sqrt{m} m 的整数,设为k,使得 m / k m/k m/k的余数为0,设商为q。
那么有 m = q k m=qk m=qk,即 m / q m/q m/q的余数也为0,m也能被q整除,所以有 q > m q>\sqrt{m} q>m 。故 m = q k > m m = m m=qk>\sqrt{m}\sqrt{m}=m m=qk>m m =m,矛盾,即m是素数。

上面的程序就是使用这个算法来判断是不是素数,因为2是最小的素数比较特殊,所以单独判断。且该程序将区间选择为了 [ 2 , m + 1 ] [2, \sqrt{m}+1] [2,m +1],这是因为平方根的运算结果是浮点数,而浮点数在计算机中是近似表示的,不能够用于精确比较,为了避免因为这个问题而产生的错误,将区间扩展了一下。
break语句用来跳出循环,因为只要能被一个数整除,那么它一定不是素数,就可以不用判断了,提前结束循环;若是素数,则循环会正常结束,正常结束时肯定有i>limit。最后判断循环是正常结束的还是break结束的,来判断是不是素数。

2、continue语句

continue语句的作用是跳过循环体中countinue后面的语句,继续下一次循环,for结构中使用continue语句的流程图如下:

C语言-break与continue语句_第2张图片
一般来说continue语句也要搭配if语句使用,流程图中continue的判断框图代表是否使用continue语句。从流程图可以看出,若执行了continue语句,则会跳过continue后面的语句,继续执行表达式3,循环没有结束,此时循环仍然只有一个出口。continue的作用是跳过本次循环。

3、break与continue语句总结

break语句在循环语句中表示直接跳出循环,执行循环的下一条语句;而continue语句是跳出本次循环,执行下一次循环,若是for语句则跳到表达式3开始执行,若是while语句,跳到while的判断条件处执行。
break语句还可以用于switch-case语句中,表示跳出switch语句;而continue只能用于循环语句。

例2:猜数游戏

输入你所猜的整数(假定1~ 100),与计算机产生的被猜数比较,若相等,显示猜中;若不等,显示与被猜数的大小关系,最多允许猜7次。

/*猜数游戏*/
#include 
#include 
#include 

int main(void)
{
	int count = 0, flag, mynumber, yournumber;
	
	srand(time(0));				/*设定随机数的产生与系统时钟关联*/
	mynumber = rand()%100+1;	/*计算机随机产生一个1~100之间的被猜数*/
	flag = 0;					/*flag的值为0表示没猜中,为1表示猜中了*/
	while (count < 7){			/*最多能猜7次*/
		printf("Enter your number:");	/*提示输入你所猜的整数*/
		scanf("%d", &yournumber);
		count++;
		if (yournumber == mynumber){	/*若相等,显示猜中*/
			printf("Lucky You!\n");
			flag = 1;
			break;
		} else if (yournumber > mynumber){
			printf("Too big\n");
		} else {
			printf("Too small\n");
		}
	} 
	if (flag == 0){				/*超过7次还没猜中,提示游戏结束*/
		printf("Game Over!\n");
	}
	
	return 0;
}

Enter your number:50
Too small
Enter your number:75
Too big
Enter your number:67
Too small
Enter your number:70
Too big
Enter your number:68
Too small
Enter your number:69
Lucky You!

该程序中使用了产生随机数的函数:rand()函数。若要产生一个随机数,还需要使用srand()函数用来让随机数与系统时钟相关联;time也是标准库的函数,返回的是当前的时间,这样得到的随机数就比较正常。因为计算机的随机数实际上是一组伪随机数。
0~100之间的整数,用二分法来猜,最多7次肯定能够猜出。

参考 C语言程序设计(第4版)/何钦铭,颜晖
例题及课后习题参考程序https://gitee.com/sgxgitee/mooc-c

你可能感兴趣的:(C语言,c语言)