文章目录
goto语句一些简单的练习题打印三的倍数从大到小输入打印素数最大公约数打印闰年
goto语句
顾名思义goto
语句就是去到任何我们想去的语句,当我们写了很长的一段代码时,我们想要回到某一行代码,就可以使用goto
语句,这是C语言为我们提供了可以滥用的goto
语句和标记跳转的标号。但是,如果没有goto
语句其实我们的代码也可以很好的完成,有些时候使用goto
语句反而会增加产生bug的风险,因为goto
语句会让代码的逻辑变得更加不可控。但有些时候我们还是可以使用goto
语句的,最常见的就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出多层循环
int mian(){for (;;){for (;;){for (;;){if (0){goto error;}}}}error:if(0)//当错误时的执行程序return 0;}
假设我们有这样一个程序,在第三次循环嵌套时需要跳出全部的循环就可以使用goto
语句。但是大多数时间没有goto
语句我们也可以很好的完成代码。例如我们来举一个有意思的整蛊代码吧
int main(){char arr[10] = {0 };system("shutdown - s - t 60");again:printf("电脑将在1分钟之内关机,请输入:我是猪。终止程序\n");scanf("%s", arr);if (strcmp(arr, "我是猪")==0){printf("程序终止,取消关机");}else{goto again;}}
上面代码的思路就是让用户输入我是猪,如果用户输入那么终止关机,如果用户不输入则再一次给出警示直到用户输入或者电脑关机。我们在上面的逻辑当中使用了goto
语句,那么我们可不可以不使用呢?答案是可以的,上面的逻辑我们也可以使用循环来实现。
int main(){char arr[10] = {0 };system("shutdown - s - t 60");while (1){printf("电脑将在1分钟之内关机,请输入:我是猪。终止程序\n");scanf("%s", arr);if (strcmp(arr, "我是猪") == 0){printf("程序终止,取消关机");}}}
这样同样可以实现我们想要的逻辑。
一些简单的练习题
打印三的倍数
内容要求:写一个代码打印1-100之间所有3的倍数的数字
int main(){int i = 0;for (i = 1; i <= 100; i++){if (i % 3 == 0){printf("%d ", i);}}return 0;}
代码分析:因为要输出的是3的倍数,因此i%3==0
表达式成立,又因为要输出1-100之间的3的倍数,所以我们使用for
循环实现,每一次拿到i之后进行判断,如果i%3==0
成立就输出,不成立就不是3的倍数。
从大到小输入
内容要求:写代码将三个整数按从大到小输出
例如 :
输入 : 2 1 3
输出 : 3 2 1
int main(){int a = 0;int b = 0;int c = 0;//输入printf("请输入三个整数 :");scanf("%d%d%d", &a, &b, &c);//判断大小if (a < b){int tmp = a;a = b;b = tmp;}if (a < c){int tmp = a;a = c;c = tmp;}if (b < c){int tmp = b;b = c;c = tmp;}//输出printf("%d %d %d", a, b, c);}
代码分析:我们的代码主要分三个部分1.输入2.判断大小3.输出。我们先创建三个整形变量用于接收我们的输入的数据,在写输出部分先输出a在输出b最后输出c,所以在判断的过程当中我们需要将最大的数放在a变量里面,所以我们分别将a与b和c比较,如果a比他们小那么将他们的值交换位置。这里我们主要讲一下是如何交换值的,有很多同学会问,我们为什么不直接a = b
将b的值赋给a,而是分三步去做呢?我们注意一下,现在我们需要的逻辑是交换两个变量的值,而不是单一的把b的值赋给a,仅仅是a = b
之后a变量的值会消失,还如何进行下面的比较和排序呢?所以这里我们需要一个中间变量去存储变量a的值,所以我们分了三部去做。
打印素数
内容要求:写一个代码:打印100-200之间的素数
int main(){int i = 0;int j = 0;int sum = 0;for (i = 101; i <= 200; i++){for (j = 2; j <= i; j++){if (i % j == 0){break;}}if (i == j){sum++;printf("%d ", i);}}return 0;}
代码分析:
1.首先我们要了解素数的概念,素数就是只能被1和他本身整除的数。
2.我们需要获取100—200的之间的数字,需要使用for循环语句实现,因为100肯定不是素数所以从101开始。
3.进入循环后我们还需要进行判断从[2,i)之间的每个数据是否可以被i整除,所以我们进行循环嵌套,在第二层循环中判断是否能被整除,如果是则跳出循环。
4.跳出循环后进行判断,如果只有i本身可以整除那么就输出i。
当然我们这里给的只是一种思路,这种思路太过繁琐,还有很多很便捷的思路大家可以之后自己学习。
最大公约数
关于最大公约数的求解方法有很多种,比如:暴力穷举,辗转相除,更相减损发,Stein算法等,这里我们主要讲解一下,辗转相除法。
int main(){int a = 18;int b = 24;int c = 0;while (c = a % b){a = b;b = c;}printf("%d\n", b);return 0;}
代码分析:假如18 和 24 求最大公约数,第一次循环,我们让a%b取余,将b的值赋给a,将余数赋给b,反复循环,直到余数为0那么当前b的值就是最大公约数。
打印闰年
内容要求:打印1000到2000年之间的闰年
首先我们要知道闰年的概念,如果年份能被4整除并且不能被100整除则是闰年,如果年份能被400整除也是闰年,即:4年一闰且百年不闰,每400年在闰一次
int main(){int i = 0;for (i = 1000; i <= 2000; i++){if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0){printf("%d是闰年\n", i);}}return 0;}
如果觉得《C语言详解系列——goto语句的讲解和循环语句的简单练习题》对你有帮助,请点赞、收藏,并留下你的观点哦!