当前课程知识点:C语言程序设计(上) > 数组(一) > 5.1 同类有序数据处理问题 > 5.1.0 数组开篇
大家好
我们经过了前六周的学习
大家
基本上
结束了一个
程序设计的基础的学习的过程
怎么讲是基础呢
是因为我们前边
既涉及到了算法的基本概念
也了解了
计算机语言的规则
也学习了
在c里边
程序流程控制的
语句
也就是说
属于计算机语言的
规则
一些基本的语句
我们
该见的
都见到了
而后边涉及到的
基本的语法的东西
语句的东西
就比较少了
所以呢
它属于
c的基础
其实
也是计算机语言的基础
也是程序设计的基础
那我们从
这么强调基础
从这一章
我们学习的是什么东西呢
我们看到了
是
数组
如果说强调前面是基础
那数组
应该说是
c里边的
也是程序设计语言里边的
共同都有的
一部分的内容
它属于
计算机语言里边的
精彩的部分
怎么这么讲呢
也就是说我们在前边
也讲到过神奇的
if else
说它能解决所有的
选择结构的
一个流程控制
我们也
曾说过
循环的功能是强大的
因为它能构建
所有的解决
重复
重用
程序段的重用的问题
但是呢
我们说一个例子
如果离了数组的支持
循环
都不能解决最简单的排序问题
怎么这么讲呢
我们
看一个
很小的例子
我们这一块
给大家一个最常见的
但是
对我们这个课程来说
是一个新问题
排序
那么排序对我们来说
大家感觉到
你说是新问题
有点
忽悠的意思
实际上呢
排序我们在前面就见过
这种三个数排序
还给了
这么长的一个流程
简化了以后
我们考虑
也有
三个选择
但是呢
我们现在要考虑的问题的排序
排序不是三个数排
排来排去
倒来倒去这样子
我们是
n多个数的排序
比如说
我们的课程里边
本周咱们做了一个
简单的测试
测试的成绩要不要排序呢
我们在线学习讨论区里边
数千个人
我们的
讨论的参与度
要不要排序呢
我们学生期末的综合排名
要不要做呢
比如说
我们生活里边经常会遇到
预约挂号的优先级排序
等等这一类的问题
不是
都是三个数的排序
它是n多个数的排序
那么这样的排序怎么做呢
比如说
我们也不说
成百上千个
我们就说十个数的排序
大家看一下
假如我画的这种
小形状
是人的身高的话
我们且不管
人的胖瘦
那么就身高
我们用数字标识了一下
这是最矮的
矮胖子
最矮的人
那么这是一个最高的人
我们用数字来
1到10来表达了他们的高矮
那我们
如果现在要的结果是这样
说把他们
由高到低排出来的话
我们看
按照我们前面说的
变量的描述
是这样子
最矮的这个人
我们在
给他一个变量名字
x7
那我们最高的这个人的
变量的名字是
x8
那我们十个
变量的名字
表达了十个
人的编号
那么这个编号
没有序
它仅仅是
这个序是它的位置号
是它的
比如说我们的学号
我们的职工号
是一个
序号
那么
此刻我们要的序是什么呢
按身高排序
如果我们按胖瘦排序呢
序又不一样了
我们现在要的是
按身高排序
那么怎么做这件事情呢
那大家觉得
这个事情并不难啊
我们在前边很早的时候就
涉及到了说
从n多个数里找一个大数出来
找一个满足我条件的那个数出来
这件事情并不难
但是目前呢
我们难的是什么呢
我们难的不是找一个数
我们是找
n个大数
因为我们是要排序
我们找了
排名1号的最高个
我们还要排名2号的次高个
我们一直到排名最后的
最低个
这样的
所以我们
如果对n个人排序的话
我们一定要找
多少个呢
n-1个
最后那一个肯定就是最后一名了
不用找了
对不对
我们说
对十个数排序的话
我们一定要找出来九个大数
加上最后那一个数
就不用找了
找九个大数就不是找一个数了
那我们听起来这个
特别像我们前边说
打图形
找一个数如果是内循环
打一行的话
那我们找n-1个
那就是
把那个内循环再循环n-1次
那这内循环里边
做什么呢
是找一个最大数
这个很简单
我们先定义一个
之前我们做这件事情的时候说
定义一个
max
最大数
这个变量里是最大数
那我们进入循环很简单
我就
0到我们要的
n次
去找
每一次读进了一个x的时候
我们就比较一下
你读进来的这个数
比我们假定的那个数还大吗
如果还大
那你就是我要的那个数
把它送进去
那么
如此循环
把这个循环进行完
max里边
一定是
我们要找的那个大数
这个流程
我们非常清楚
现在的问题是什么呢
问题是
第一个问题
是说
当我们
每一个循环里
读进了一个新的x的时候
上一个x还在吗
当我们读进了
第n个x的时候
前边的n-1个x
还在吗
必然是不在了
前边的n-1个x都被覆盖掉了
这有什么关系呢
这个关系是
当我们找
下一个大数的时候
我们还要
用那些被盖掉的x
你愿意把它们重新再输一遍吗
比如说
我们对1000个数在排序
我们才找了第一个大数
我们已经把
999个盖掉了
当我们再找第二个大数的时候
你愿意把这999个数再输一遍吗
你肯定不愿意了
因为
我们读的这个
x
是在我们循环体里边做
这是我们遇到的第一个问题
是什么问题呢
你的数据在
做第一次循环的过程中
那些数据已经被扔掉了
因为我们只考虑了
找一个大数
那我们的第二个问题是什么呢
第二个问题是
就跟我们前边说的打图形一样
如果这个图形
是打一行
那我们希望在
外边这块
还建立一个什么呢
外循环
是要来做什么呢
我要做
找到了一个大数
这是做了一个内循环
我们要找
下一个大数
这把内循环再做了一次
再下一个大数
我们整个把这个过程
循环了多少次呢
n-1次
到这
最后剩下
就是这个矮胖子
那我们是希望什么呢
希望这个内循环
被重用
被重用
什么样的
意思呢
也就是说
我们希望
在这块
再能加进来一个for
是我们的外循环
这个外循环里边
能重用这个过程
可是
现在这个过程里边
怎么就不能重用了呢
是我们这里边用的是
x
而我们现在这里边有十个变量
我们十个变量
不能同时都叫x啊
所以我们这里边分开了
叫x1 x2
是这样叫的
那我们这里边
如果写成x1
那我下一次比较的不是x1呀
我下一次比较的是
另一个x了
所以呢
我们是这样的一个过程
假如说我现在找的是第一个大数
x1
那它需要跟谁比较呢
它需要跟它的下一个数比较
这样比较
比较完了
它俩里边确定一个大的
我在跟下一个比较
再和下一个比较
一直
比较到
最终结束
这个过程你才找出了一个大数
那如果我每一个大数
都是这样一个过程
比如说
我们现在找
第五号位置上的这个大数
那它是跟谁比呢
跟下一个数
它的再下一个数
跟
x6 x7 x8 x9
一直到x10
进行比较
也就是说
它每一次比较的
不是一个固定的数
x呢
也在变
找第一个大数的时候这是x1
找第五个大数的时候
这个
x呢
是
x5
而它要比较的数
我们刚才应该是这样
max
max我们要找的大数
那么此刻
找第一个大数的时候
max是x1
找第五个大数的时候
max是x5
而每一次要比较的这个x
在作第一个数的时候
它是x2 x3
一直到x10
那也就是说
这段代码
我们是没有办法让它重用的
那这样的问题
怎么解决呢
什么问题
怎么样共享
这个程序段
让外边那个循环
怎么样共享这个内循环的程序段
那我们说的就属于
这类问题
这是排序里边的
问题
我们拿它做了个例子
其实呢
除过这类问题之外
用数组
要支持的
还有
比如说
学生
n多学生的
n多门课程的
成绩
还有
一行文字
一页文字
怎么处理
还有
矩阵的存储
运算
到底怎么做
这些实际上
经常用到的
都是用数组来解决的问题
那么c语言
为这一类的应用
提供了什么呢
构造数据类型的
这样的支持
那数组
是一种
构造数据类型
当然
我们下个学期
要学的
c语言的后半段里边
也有
专门的
构造类型的
数据
比如说
像结构体
也属于
构造
数据的类型
那我们
这一章呢
也是有比较多的节
九节
我们
计划用
两周的时间
来完成
这块内容的学习
通过这一章我们希望大家
知道什么呢
首先我们是说
数组要解决的
是什么问题呢
有序数
什么是有序数
这些有序数
怎么样存储
那么
存储在内存里的这样的数据
我们
怎么样才能
更方便的使用它
还有
这一类的应用
最典型的一个应用
是
字符型数据的处理
那么我们如何
用数组的方式处理
字符型的数据
也是
我们这一章
要学习的一个重点
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html