欢迎点赞支持
个人主页:励志不掉头发的内向程序员;
专栏主页:C语言基础;
文章目录
目录
前言
一、for循环的补充
二、循环的嵌套
1、嵌套的介绍
1.1 练习:
题目解析:
优化:
三、goto语句
1、goto介绍
2、使用方式
四、关机程序
1.、原理
2.、实现
总结
前言
对于上一章节的循环的学习,相信大家对于循环已经有了自己的一些理解,那么我们这一章节就来看看循环的嵌套吧,就是一个循环套着一个循环,本质上还是循环,但是在理解方面可能会更加的困难,我相信小伙伴们肯定已经跃跃欲试了吧,那就让我们来一起看看吧。
一、for循环的补充
上一节课讲了说for循环是建立在while循环的缺陷的基础上的,把while循环的三个关键点放在一起,这样就解决了关键点难以查找的问题,while循环的三个关键点并不是一定要存在的,而是可以缺少的,但是可能会使程序死循环,那么for循环呢,是不是也是这样的呢,我们来尝试一下吧。
int main()
{int i = 0;for (; i < 10; i++){printf("%d ", i);}return 0;
}
我们可以看到在这个地方初始化消失了,但是由于我们在前面已经定义了,所以说我们就可以不再定义一次而直接写判断条件和调整方式,和初始化直接写在for循环里面没有什么区别。
其他也是同理,但是要注意,如果把后面的调整或者判断条件删了,程序就有可能陷入死循环(判断部分缺失就意味着程序恒成立),所以如果要删除的话一定要谨记。
二、循环的嵌套
1、嵌套的介绍
我们之前学了for循环和while循环等,嵌套其实就是在这些循环的基础上,在其内部再次使用一个循环,其实在语法上,没有什么其他的用法,一般来说我们在使用循环时要用到这三种循环的嵌套才能更好的解决问题。所以说我们就从一些练习来看看循环的嵌套的使用方法和精妙之处吧。
1.1 练习:
找出1~100之间的素数???
我们都知道(可能)素数就是除了1和它本身就没有其他的数字能把它整除,所以我们应该怎么解决这一问题呢?
题目解析:
我们既然知道了原理那就应该有思路,不就是看看有没有除了1和它本身的数字可以和它整除嘛,这样我们是不是就可以去试试循环,假如我们要看看a是不是素数,那就看看从1到a有没有其他的数字可以和a整除嘛,如果有的话那就不是素数,如果没有的话就是素数了。但是我们要求的可不是一个数a啊,是要找到从1~100中的素数啊,那怎么办呢,我们想想要是再有一个循环就好了,所以说这时嵌套循环就来了,我们先写两个循环,一个实现找一个数的素数,再一个实现从1~100循环。
1.
int main()
{int a = 13;int flag = 1;for (int i = 2; i <= a - 1; i++){if (a % i == 0){flag = 0;break;}}if (flag){printf("%d ", a);}return 0;
}
这行代码表示的就是如何判断出是否是素数的代码,我想大家可能有一些地方看不懂,但是没有关系,我来给大家讲解一下,我们知道素数就是除了1和它本身之外没有其他的数可以将它整除的数字,所以说我们可以让a去取除了1和a以外的数字的余数,如果有余数为0的数字出现就证明它不是素数,反之则证明了它是素数。所以我们就可以用一个循环去一个一个的试,flat的作用是假设,假设a是素数,如果a不是素数的话就让flat = 0;这样我们跳出循环时就可以判断a到底是不是素数了。
2.
int main()
{for (int i = 1; i <= 100; i++){printf("%d ", i);}return 0;
}
这里很显然就是一个从1~100的遍历。
如果我们把这两个函数嵌套一下,那就即实现了1~100的遍历,也实现了求它们的素数,我们可以来尝试一下。
int main()
{for (int i = 1; i <= 100; i++){int flag = 1;for (int j = 2; j <= i - 1; j++){if (i % j == 0){flag = 0;break;}}if (flag){printf("%d ", i);}}return 0;
}
这里我们可以看到,将两个循环嵌套起来,既实现了找素数的功能,也可以一次性找很多个素数。
这样这一道题就解出来了啦,但是我们可以看看有没有什么办法能让我们的计算机轻松一点呢?就比如说少循环几次呢也就是我们所说的优化程序呢?
优化:
我们都知道,如果不是素数,那么必然是有可以整除的数的,就比如8 = 2 * 4;但是我们再想想,是不是只要找到前面的数就不需要找后面的数了呢,那么我们取中间值就可以了,中间值是取我们的平方根就好了。
#include<math.h>
int main()
{for (int i = 1; i <= 100; i++){int flag = 1;for (int j = 2; j < sqrt(i); j++){if (i % j == 0){flag = 0;break;}}if (flag){printf("%d ", i);}}return 0;
}
我们来看看取平方根的方式吧,本质上是一个sqrt函数,用法非常简单,就是这样
将我们要取平方根的数字放到它的括号里面就可以了,但是它是在一个math的头文件里的,所以要使用时我们得带上。
还可以优化吗?我们再想想,emmmmm~~,是不是只有奇数才可能是素数,而偶数是绝对不可能的呢?那我们来试试看吧
int main()
{for (int i = 1; i <= 100; i += 2){int flag = 1;for (int j = 2; j < sqrt(i); j++){if (i % j == 0){flag = 0;break;}}if (flag){printf("%d ", i);}}return 0;
}
好啦,现在应该不能再优化了,那么这个程序就写完啦。
我们要知道,一个题目的解法肯定是不止一种的,在面对很多种解法是应该怎么办呢,肯定就是选择最好的那种。
三、goto语句
1、goto介绍
goto从字面上看就是去哪里的意思,其实使用方式也差不多,就是去往自己指定的地方,如果指定的地方是在前面,那就会在走一次前面的程序,可能会导致死循环,如果是指定后面,那就会跳过一些程序直接到指定的位置,就是因为goto语句跳来跳去的,所以我们一般不频繁的使用它,因为很容易会导致直接思想混乱。
2、使用方式
1.
goto ***;
***:
2.
***:
goto ***;
使用方法很简单,就是goto后面用一个自己命名的内容然后再跳到自己命名的内容的地方去。
例如:
int main()
{printf("呵呵呵\n");goto next;printf("哈哈哈\n");
next:printf("好好好\n");return 0;
}
这一串代码就是我命名了一个next的地方让goto跳到next的程序去。所以说它会不输出哈哈哈而直接输出好好好。
如果让goto往回跳的话很容易产生死循环,所以说要尽量小心使用。
int main()
{
next:printf("呵呵呵\n");goto next;printf("哈哈哈\n");printf("好好好\n");return 0;
}
四、关机程序
在这里教大家一个非常有意思的程序,可以整蛊一下自己的朋友,那就是让他说自己是猪,不然就关机它的电脑,接下来我们来看看怎么实现吧。
1.、原理
其实在我们计算机中按Window+R后会出现一个窗口
在这个窗口输入cmd后回车就可以打开计算机的底层菜单。
在这个菜单中可以对计算机进行指令,比如说创建菜单啊,关机电脑啊之类的,大家可以自己研究研究,但是在这里输入shutdown -t 60就可以让计算机在60秒后关机,如果说输入shutdown -a就可以取消电脑关机,我们在知道这些以后如何在C语言中实现呢?这得依靠一个system的库函数来实现,它需要一个叫stdlib的头文件来使用。
2.、实现
#include<string.h>
#include<stdlib.h>
int main()
{char a[20] = { 0 };system("shutdown -s -t 60");
again:printf("你的电脑还有1分钟关机,如果不想关机,请输入:我是猪\n");scanf("%s", a);if (strcmp(a, "我是猪") == 0){system("shutdown -a");}else{goto again;}return 0;
}
实现起来还是蛮简单的,但是我们要注意,字符串的比较不是直接用==来比较,而是用一个strcmp的库函数来比较,而这个库函数在string的头文件之中,使用方式如下
将要比较的内容放在里面,如果它们相同,那返回值就为0。
总结
本节课主要是说明了循环的嵌套和对上一章节循环的完善,循环到此就全部结束啦,我们下一章节就来讲讲数组吧,数组部分也有蛮多内容的,期待小伙伴的前来关注,谢谢小伙伴们啦。如果有哪里写的不好请指出。感谢。