流程控制语句 continue 和 break P

(本篇同时介绍Python和c语言下的continue和break)

首先我们先写一个函数:输入一个最大值,求这个[1, 最大值)这个区间内的质数

Python:(因为为了让新手能看懂,我们这里就不写的太难,基于python3.8)

def get_prime(num):
    if num <= 1:
        return []
    if num == 2:
        return [2]
    res = []
    for i in range(2, num):
        tem = []
        for j in range(2, i):
            tem.append(i % j)
        if not tem.count(0):
            res.append(i)
    return res
print(is_prime(100))

        首先我们对该函数进行解释:当输入的num = 1时,而1不属于质数,所以返回为空列表,而当num为2时,也只有2本身这个质数。但num大于2时,我们对区间[2, num) 内的数进行逐步遍历。例如num = 100,某次的遍历值i = 10,此时我们再对[2, i)的区间进行变量,向临时列表tem中添加i % j的值(若一个数为质数,即除了1和它本身,它对任何数的相除的余数都不应为0),遍历完后如果我们在tem中找到了0,即表示该数i不是质数。如对于10来说,它的tem为[0, 1, 2, 0, 4, 3, 2, 1],其中有0,则表示它不是质数,而对于11来说,它的tem为[1, 2, 3, 1, 5, 4, 3, 2, 1],没有0则表示它是质数。

(除了使用tem.count(0)外,也可以直接使用0 in tem来进行判断tem中是否有0)

c语言:(为了新手能看懂,此处我们不使用动态内存开辟进行书写,如下c语言标准均为c99)

void GetPrime(int num, int* arr){
    if (num <= 1)
        return;
    if (num == 2){
        arr[0] = 2;
    }
    for (int i = 2; i < num; i++){
        int have_zero = 0;
        for (int j = 2; j < i; j++){
            if (i % j == 0)
                have_zero += 1;
        }
        if (!have_zero){
            *arr = i;
            arr++;
        }
    }
}
int main() {
    int arr[100] = { 0 };
    GetPrime(100, arr);
    for (int i = 0; i < 100; i++)
        if (arr[i] != 0)
            printf("%d ", arr[i]);
    return 0;
}

        原理同上。

        我们可以发现,无论是在python还是c语言中,对于一个合数(即非质数)如10,在j=2时,10 % 2 = 0,即在此时已经出现了判断10不是质数的数字0,但是此时我们的代码还是会继续向后走,这里是不是有点浪费空间和时间呢?对于此时的情况我们应该怎么去控制解决该情况?这时就需要使用到我们的流程控制语句 —— continue 和 break。


1.break - 用于结束循环结构,通常与分支结构if一起使用

格式:

在python中:

for ... in ...:
   ...
   if ...:
   break


while ... :
  ...
  if ...:
  break

在c语言中:

for (...){
    ...
    if (...){
        break;
    }
}
while(...){
    if (...){
        break;
    }
}

        如当我们做一个密码输入系统,而且只给3次密码输入的机会:

在Python中:

password = "abcd1234"
for i in range(3):
    if input("请输入密码:> ") == password:
        print("密码正确")
    else:
        print("密码错误")

        我们尝试执行代码: 

        可以发现此时输入正确还是错误,都需要继续输入,所以此时我们可以使用break语句,当密码输入正确时,我们停止输入,具体如下:

password = "abcd1234"
for i in range(3):
    if input("请输入密码:> ") == password:
        print("密码正确")
        break
    else:
        print("密码错误")

        此时我们再执行代码:

 可以发现,当输入正确时,循环就停止了,代码也就结束了。

在C语言中:

int main(){
    char password[10] = "abcd1234";
    for (int i = 0; i < 3; i++){
        char tem[10];
        printf("Please Input Password :>");
        scanf("%s", tem);
        if (strcmp(password, tem) == 0)
            printf("Password is true\n");
        else
            printf("Password is error\n");
    }
    return 0;
}

 我们尝试执行代码: 

     

  可以发现此时输入正确还是错误,都需要继续输入,所以此时我们可以使用break语句,当密码输入正确时,我们停止输入,具体如下:

int main(){
    char password[10] = "abcd1234";
    for (int i = 0; i < 3; i++){
        char tem[10];
        printf("Please Input Password :>");
        scanf("%s", tem);
        if (strcmp(password, tem) == 0){
            printf("Password is true\n");
            break;
        }
        else
            printf("Password is error\n");
    }
    return 0;
}

        此时我们再进行执行代码:

          可以发现,当输入正确时,循环就停止了,代码也就结束了。

2.continue - 用于结束当前循环,进入下一次循环,通常与分支结构中的if一起使用

格式:

Python中:

for ... in ...:

    if ....:

        continue

while ...:

    if ...:

        continue

C语言中:

for (...){
    if (...){
        continue;
    }
}

while (...){
    if (...){
        continue;
    }
}

        如我们输入一个字符串,对其进行输出时,对H和V字母不进行打印:

在Python中:不使用continue

for i in input("请输入字符串 :>"):
    if i != "H" and i != "V":
        print(i, end="")

        当我们输入:HELLO VICTOR!

        似乎能达到我们预期的理想,但如果print语句换成其他更为复杂的语句,直接将if放在外面可能会导致代码的累赘。此时使用continue,似乎有更好的效果:

for i in input("请输入字符串 :>"):
    if i == "H" or i == "V":
        continue
    print(i, end="")

         此时我们的print语句在外层,看着也更加简洁。执行结果为:

 

在C中:

char arr[20];
printf("Please Input string :>");
scanf("%s", arr);
for (int i = 0; i < strlen(arr); i++){
    if (arr[i] != 'H' && arr[i] != 'V'){
        printf("%c", arr[i]);
    }
}

        当输入HELLO,VICTOR!时执行如下:

        分析同上,此时我们写一个continue版本:

char arr[20];
printf("Please Input string :>");
scanf("%s", arr);
for (int i = 0; i < strlen(arr); i++){
    if (arr[i] == 'H' || arr[i] == 'V')
        continue;
    printf("%c", arr[i]);
}

        所以截止到现在,我们学会了流程控制语句break和continue的使用,那么我们再对我们最开始的例子进行改造:

Python:

def get_prime(num):
    if num <= 1:
        return []
    if num == 2:
        return [2]
    res = []
    for i in range(2, num):
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            res.append(i)
    return res
print(get_prime(100))

 输出结果为:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]


C语言:

void GetPrime(int num, int* arr){
    if (num <= 1)
        return;
    if (num == 2){
        arr[0] = 2;
    }
    for (int i = 2; i < num; i++){
        int have_zero = 0;
        int j = 0;
        for (j = 2; j < i; j++){
            if (i % j == 0)
                break;
        }
        if (j == i){
            *arr = i;
            arr++;
        }
    }
}
int main() {
    int arr[100] = { 0 };
    GetPrime(100, arr);
    for (int i = 0; i < 100; i++)
        if (arr[i] != 0)
            printf("%d ", arr[i]);
    return 0;
}

输出结果为:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值