前言:
刚上大一初学C语言的同学们往往对break,continue感到陌生,在做学校实验题以及一些题目遇到循环没有很好的利用或者想到使用这两个语句。其实,如果能用好他们,往往能省很多事。
知识点:
先简单解释一下这两个语句分别的作用
一般来说,进入循环体(分别为for循环,while循环,do..while循环)之后,在下次循环判断之前程序
执行循环体中的所有语句。而continue和break可以根据循环体内部进行的判断结果来忽略部分循环甚至终止它。
Continue:当执行这条语句的时候,continue之后的语句都会被忽略。直接跳到下一次循环,
如果continue是在双重循环的内层循环,那么它只会影响包含它最里层的结构。
第二个用途是continue充当占位符,最过于典型的例子就是这个
while((ch = getchar()) != '\n'){
continue;
}
如果整个循环只是用来读取字符而不做其他处理,使用continue来代替原本的空语句';',会使代码更加整洁可读。
注意:continue语句执行后,对于while和do..while下一个要执行的是循环的判断条件。
而对于for循环来说,下一个要执行的是更新部分,然后再求循环判断条件
Break:break是相对与continue而言的,与其的区别是break是跳出循环,而continue是跳到下一次循环。在双重循环的嵌套使用中,常用于跳出内层循环
for(int i = 0 ; i < m ; i++){
for(int j = 0 ; j < n ; j++){
if(j == m)
break;
}
}
执行break后,关于j的loop将被跳过,更新一次i的值,判断是否再进入i的loop。
语法错误:break,continue只能在循环或开关中使用
错误原因:循环体加了“;”
下面是道例题去看看continue和break在循环里的运用,你们也可以自己先动手做做看能不能实现。
寻找鞍点
编写一个C程序,实现以下功能:
输入一个二维整数数组(n行, m列),则该二维整型数组中可能存在以下特征的数组元素:它在其所在的行中值是最大的,它在其所在的列中的值是最小的。我们称之为鞍点
如果数组中存在这样的数组元素,请输出该元素的行号和列号;如果数组中不存在这样的数组元素,则输出“不存在该特征的元素”。
这题说难不难,但很多刚刚接触C的同学往往会把打印printf放在循环内部去执行。这样会导致打印多次,但如果把printf放在外面,又不知如何把循环内的值传到外头。
思路就是在一行中寻找最大的值,然后记录该点的纵坐标,执行完之后把flag标记成true。再去寻找该纵里是否这个点为最小。如果存在更小,flag更新成false。
通过一个flag的bool状态量来不断确定是否目前的值属于鞍点。之后用if(flag)判断打印鞍点
但是,怎么让if判断只执行一次呢?之前找我问这道题同学想到了定义一个计数变量来统计if执行的次数,如果if执行0次,就证明了不存在鞍点。这种想法很好,但如果转换思维,想到if(flag)是在循环内部执行的。只要在if(flag)里面写入一个break语句,就能在执行之后跳出循环,达到只打印一次。
答案
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdbool.h>
#define MAX 20
int main()
{
int n, m, max,maxj,i,j;
int arr[MAX][MAX];
bool flag;
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < n; i++) {
max = arr[i][0]; maxj = 0;//初始化;
for (j = 0; j < m; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
maxj = j;
//最大组号和列号保存;
}
}
flag = true;
for (int k = 0; k < n; k++) {
if (max > arr[k][maxj]) {
flag = false;
continue;
}
}
if (flag) {
printf("%d %d", i, maxj);
break;
}
}
if(!flag)
printf("不存在该特征的元素");
}
这段代码最为细节的点就是将一个打印函数
if(flag)
{
printf("%d %d",i,maxj);
break;
}
放在循环内部,如果if条件符合,则执行printf ,之后break跳出i的loop结束循环。
如果我们把这段话的break删去会怎样
if(flag)
{
printf("%d %d",i,maxj);
}
执行结果
鞍点打印出来了,但为什么把外层循环的if(!flag)也执行了呢?,此时flag不应该为真吗?
其实此flag非flag,如果没有break来跳出循环,if执行了之后依然在循环里,程序会一直执行到最后结束循环才能执行下面的
if(!flag)
printf("不存在该特征的元素\n");
而此时当然flag为假拉,除非鞍点刚好就在最后一行最后一列。
新手常犯的错误有:把判断打印放在循环内部
for (i = 0; i < MAXi; i++) {
max = arr[i][0]; maxj = 0; //初始化;
for (j = 0; j < MAXj; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
maxj = j;
//最大组号和列号保存;
}
}
flag = true;
for (int k = 0; k < MAXi; k++) {
if (max > arr[k][maxj]) {
flag = false;
}
}
if (flag) {
printf("%d %d\n",i + 1, maxj + 1);
break;
}
else
printf("不存在该特征的元素\n");
}
结果
所有知识点都不能一下子就掌握,都是需要大量的练习和受挫才能学会的,我也在不断的成长,在这个平台传输一点自己的挫见。如果有错误,希望大佬们在评论区谬误,十分感谢。