小学生

- 金币
- -210
- 好评
- 16
- 信誉
- 83
|
本帖最后由 lucien2714 于 2019-8-24 21:56 编辑
大噶好,我回来了,不知道大家还记不记得我上一篇教程(https://bbs.binmt.cc/thread-14047-1-1.html)在上一篇教程中,我教了各位如何使用C4droid,以及最基础的一些函数(if, else if,else,switch,printf,scanf,return)(忘记了赶紧去重温一下!!)
作业答案:
1.首先如果数字过大,大过int范围会出错,还有用户输入负数也会输出“你好小孩”,解决方案:用long long 在你好小孩那里加一个边界(将if改成if(age>=0&&age<=10))
2.略
那么,我们这篇教程学for循环以及冒泡算法。
我们先来理解一下什么是“循环”
字面意思:
但是,C语言的循环和这个有点点不同,c语言中大概就是:重复执行一段特定的代码。
且C语言里面的循环有多种方法来实现,常见的有用for和while函数
我们这节课只讲for函数:
使用方法:
for(单次表达式;条件表达式;表达式)
{
特定代码;
}
好了,又到了万众瞩目的分析时间 了(此刻应有bgm)首先 单次表达式,意思就是只会执行一次的表达式(何为表达式?百度啊!!!)(其实就是类似方程)
条件表达式,就是一种条件,只要这个条件是真(条件成立)就执行特定代码。
等特定代码执行完才执行末尾的表达式
- for (int a = 0; a < 100; a++){
- printf("%d ", a);
- }
复制代码
这是一个简单的例子,分析一下
首先int a = 0;第一课的知识 申明一个变量a,给他赋值0。
a<100;条件表达式,当a<100成立就执行第二行:printf("%d ",a);第一课的知识,输出a和一个空格
执行完printf("%d ", a);后,再运行末尾的表达式(a++)
何为a++,“++”是自增运算符,使a(++左边的变量)增加1。
运算符是个很重要的东西,可以让你的程序可读性增加!这很重要!
百度百科上有个很详细的表,各位有兴趣可以去阅读,链接
让我们来看看结果
结果中,第一个数字为0,末尾为99,证实了末尾的表达式是运行了特定代码后才执行的
为什么呢?且听我一一道来
1.首先,因为int a=0;所以此时a=0; a<100条件成立,于是就输出了a,如果是先执行末尾的表达式,那结果应该是1 而并非0
2.而最后一个数字是99而并非100,因为a=99输出了后,就执行了末尾的表达式(a++),那么使a=100,a=100自然条件表达式不成立,也就不运行特定代码了!
上两行信息量略大,请多看几遍,理解ta,不然很容易混乱
ps:过来人的经验
好了,讲完for循环,可以开始讲冒泡排序了!
冒泡排序,就是你给他一串数字,它按照从小到大的顺序排序起来,冒泡排序是很慢的(所以开发中不推荐使用),但是有助于我们理解排序,所以我们这就用冒泡排序
冒泡排序理解很简单,就是你存储了这几个数字后,将第一个和第二个对比,若第二个更大就两个换位,然后第二个跟第三个对比...直到最后一个的上一个和最后一个对比,
但是一次对比是对比不完的,所以我们需要双重循环来保证结果的正确性(这也是为什么冒泡排序最慢的原因之一)
但是,这有个难题:排序的数字一般有很多,我们总不能打int a,b,c,d,e,f,g....a1,b1,c1.....等等那样定义变量吧,
这时候我们就用到一个神奇的东西:数组
“数组是用于储存多个相同类型数据的集合。”----百度百科
啥意思呢,可以理解为,多个储存相同类型的值的箱子组成起来的柜子,
定义数组的方法为: 类型 名字[数量];
例如: int a[10];
然后a[0],a[1],a[2],a[9]都可以分别用来储存不同的int类型的值啦
注意,你定义的数组,例如int a[100],你能访问的只有0-99(100个),a[100]是不行的(数组越界,很麻烦的一个东西,百度走起)
- int a[11];
- for (int get = 0; get < 10; get++){
- scanf("%d", &a[get]);//读取数字
- }
- int temp; //定义一个变量来交换
- for (int j = 0; j<10; j++) //用一个嵌套循环来遍历一遍每一对相邻元素 (所以冒泡函数慢嘛,时间复杂度高)
- {
- for (int i = 0; i<10 -1 - j; i++)//因为每一趟都可以确定一个数,所以可以减少排序次数,由于j是0-9,所以需要加1
- {
- if (a[i]>a[i + 1]) //">"改为"<"这样就实现了从大到下排序
- {
- temp = a[i]; //基本的交换原理"c=a;a=b;b=c"
- a[i] = a[i + 1]; //因为如果a=b,那a的原本的值就丢失了,b=a其实就b=b(废话
- a[i + 1] = temp;//所以要创建一个变量c(在这里是temp)来储存a的值
- }
- }
- }
- for (int p = 0; p < 10; p++){
- printf("%d ", a[p]);//输出排序后的数组
- }
复制代码 冒泡算法的重点是比较相邻的两个数,我来模拟一下最极端的情况
原本的数组:9 8 7 6 5 4 3 2 1 0
排序一次:8 7 6 5 4 3 2 1 0 9
排序二次:7 6 5 4 3 2 1 0 8 9
排序三次:6 5 4 3 2 1 0 7 8 9
排序四次:5 4 3 2 1 0 6 7 8 9
排序五次:4 3 2 1 0 5 6 7 8 9
排序六次:3 2 1 0 4 5 6 7 8 9
排序七次:2 1 0 3 4 5 6 7 8 9
排序八次:1 0 2 3 4 5 6 7 8 9
排序九次:0 1 2 3 4 5 6 7 8 9
建议大家结合代码和模拟观看,有助于理解
因为不难,如果还是无法理解,建议百度一下,网上有很多关于冒泡排序的文章!
没了,就这样了
什么,你想问今天的作业?
hmmmm给你们放个假没作业(逃)
理解好冒泡算法就好了
溜了溜了第三篇:https://bbs.binmt.cc/thread-22449-1-1.html
|
-
查看全部评分
总评分:好评 +6
金币 +5
|