当前课程知识点:C语言程序设计(上) > 数组(一) > 5.2 一维数组的定义和引用 > 5.2.1_1 数组的定义~1
大家好
我们下来看
有了数组
我们怎么跟计算机来
预定这个数组呢
首先是
我们看
几个相关的概念
然后
结合我们给的这几个例子
比如说
存储学生成绩
我们需要用
整型的数组的话
我100个学生
还有存储一行文字
存储一个
矩阵
这样的
那么在这里边
共同涉及到的概念是什么呢
这么几个概念
就是这么几个
关键问题要注意
什么意思呢
是这样讲
就是说在
我们
描述
也就是说
预定
管系统预订这个数组的时候
它的格式是这样
先说类型
就是我们说的数组的基类型
再说数组的名字
数组的名字
然后呢
下面呢
这个中括号里边是什么呢
表达的是
数组的
长度
就是
这个数组里边有多少个元素
然后呢
再下来是
就是这个中括号
那我们把中括号
没有看成一种形式
看成一种运算符
它的确是一种运算符
因为
我们要
随机的访问数组里的
任何一个元素的时候
我们要确切的知道
这个元素在哪个位置
是通过
带下标的变量
这一块来运算的
那还剩下一个呢
数组的维数
表达的是什么意思呢
如果我们一个中括号
数组的名字后边只带一个中括号
这是一维数组
那我如果带了两个中括号
那是
二维数组
三个
当然就是三维数组
咱们这个课程里边
通常
我们
讨论的
两维数组
也就是一个
平面的问题
当然三维数组
不是不可以
其实道理是一样的
那我们
根据这个格式
来要定义这三种应用的话
应该是
我们要
成绩
要整型的数组
那咱现在写成
float
这就
不对了
是不是应该写成
int
这样子
那要不呢
就是我们上边不是说的
整型的数组
我们说的是
实型的数组
那就是说你的应用
是什么
比如说
我把这个应用
改成
实型的数组
一个
实型的
数组
总之
你的实际应用
要跟你的定义是相符的
一个float型的
mark
是数组名字
然后是
100个元素
这个
是一维的数组
差一个
str
我们是一个字符
字符型的数组
所以是一个char型的
然后是
200个元素
然后还有int型的
什么东西呢
我们要的是整型的数组
存的是什么呢
是一个矩阵
4乘6的矩阵
那这写对了吗
肯定没写对呀
这一定是
4乘6的矩阵
这是
一个
前面两个都是
一个
中括号
那就是一维的数组
而这个是两个中括号
中间
没有
空格
也没有逗号
那就是
4乘6的
两维数组
就是4行
6列
两维数组
那么对于这样的
一个数组的定义
这种类型的定义
我们要关注的一个
非常重要的问题是什么问题呢
一定下标是从0开始的
从0开始的
至于你使用的时候
你是不是从0使用
没有关系
你可以从2开始使用
但是呢
你定义的时候
定义了一个数组
这个数组是
可以从0开始使用的
它给你预留空间
是从0
那么最大的
那个数字
一定不是
你定义的时候的那个数字
而是那个数字减一
就是
你最大的下标
应该是你原数的个数减一
比如说我们刚才说
我们字符是200个
200个字符的一维数组
那我们最大的下标
一定是199
而不是200
是从0
到199
200表达的是
有200个元素
是从0
到199
是这样的一个意思
那我们
看到 通常呢
数组说明里边
有不正确的
说明
是什么样子的呢
比如说
float a
这个不正确在哪里
所有格式都是对的
但是你定义说这个数组
没有元素
那这个数组是无效的
没有意义的
圆括号
这是
我们不允许的
这个符号
因为我们这里边的
运算符是中括号
还有
int k
a k
这哪里不对了呢
这个不对是说
我们这里边必须是
中括号里边必须是常量表达式
不能是变量
而这块k
是变量
因为你定义了一个k
k还没读进来
那这时候为什么不对呢
我们定义一个数组
实际上
计算机在什么时候做这件事情呢
实际上是在编译的时候
你向系统
预订了
一片空间
这片空间是连续的
比如说我们刚才说的
mark是100
字符是200
那么这个200必须是连续
在一起的
那个
100
是连续在一起的
那个4乘6
是连续存放的
如果你的系统的内存
已经没有这么大空间了
那这个数组的定义就会不成功的
编译就会通不过的
所以呢
我们大家
是在
预留空间的时候
必须是确切的知道
你到底要预留的这个空间
是多大
所以不能用变量
这样
当然
也是不对的
先int
n
scanf n
然后再说
定义这个数组
a n
这个错误在哪呢
大家想想看
这个错误在说
我们
定义这个变量的时候
定义这个数组的时候
它是在
编译期间
而scanf的执行
你获取这个变量
获取到这个n的时候
是scanf被执行
这个函数调用被执行完了
那它一定是在程序运行期间
也就是说
当你在编译的时候
要预留a数组的时候
你仍然是不知道n到底是多大
它是没法执行这个预留的
实际上这个预留不要执行
它只是接到了一个信息
计算机没有做任何操作
而scanf的执行
计算机是要确切的做
你从键盘上给了一个数
它要把那个数取进去
计算机有指令在执行的
所以呢
scanf是在
计算机
程序运行期间
执行的
函数调用
而int
int a
这个数组的定义是在编译期间做的
所以这样的定义
是
不对的
c语言是
不允许对数组的
大小
进行这种动态的说明
我们这叫动态的说明
就程序运行的过程中进行的说明
是不允许的
而数组的说明
必须是在
所有的
可执行语句之前
也就是说你的int a
必须放在scanf之前
执行的语句之前
按照我们刚才说的
这些
这一系列的规则
我们看
这个程序
这个程序段
是不是正确
大家看一下
这里边我们定义的是
m
100
这么一个数组
其它的都是
简单变量
i和sum是简单变量
我们在这里边用它做了什么呢
i从0
到小于100
也就是到99
然后做什么呢
scanf
给
m i
里边读数据
m i
i的变化是从哪里开始变的呢
从0到99
没有超过这个下标
没有到100
那就是正确的
sum
每一次
加上什么呢
你给这个
数组元素里边
放了什么东西呢
放的什么东西
我就把这个东西累加
这个程序段
没有问题
我们
来看一下
这段程序
我们来看一下这个程序
刚才咱们看见这个m
在那里边是100
那我这就得写
100
那scanf这块要做100次
那咱肯定是
太长了
我们把它还改成
改少一点
改成5
就输入
我们就
5个元素
我们敲进去5个数
大家看一下那5个数
在前面我们加了一遍
是说
执行scanf的时候我们也会显示
那我每一次
输进去一个
键盘上敲进去一个数
这个数被给了谁了呢
循环是从0
到
4
没到5
那这个数组呢
是5个元素
最大下标是4
好了
这符合我们的规定
从0开始到4
那我每一次给m i
送进去一个数
键盘上敲进去一个数
这个数会显示在屏幕上
然后求和
然后我显示出来的是
刚才送进去的那个数
但是我是从
数组元素里把它输出来的
那就是说
看一下
我们
这个元素里边
是不是存进去的
是我们那个数
这一块前边我们给一点记号
区别出来
是输出的
而前面敲的是输入的
运行一下看看
我们的一个数就给1
这是第一个数
第二个数
第三个数
第四个数
第五个数
一定输入了5个数
这5个数加起来
累加
是15
15
是在
跳出这个循环以后
输出的
我们刚才说这个数组
是从0开始布局的
你可不可以不从0开始使呢
当然是可以的
比如说我从3号元素开始用
我只用了
下标为3和4的两个
那我这个循环只进行了两次
大家看一下
我这个也给1
现在应该是
m3里边是1
m4里边是2
加起来是3
只有m3和m4里边有内容
那我们
现在能不能知道它到底是
m几呢
你其实可以在这
里边输出一下
我可以在这里边说
你给我输出一个
m
中括号
里边
再给一个
百分号d
是说
照原样子输出一个
m
中括号
里边我再要一个
i
当前的这个i
然后下来呢
我再要一个中括号
然后再是
我后边的
m
这个里边的
m i里边的内容
我前边现在要的是格式
m
m i的这个格式
大家看一下
这两个照原样子印
中间对的是
i
那是3的时候它应该就是3
再下来是一个中括号
再下来呢
我们用一个逗号把它隔开
或者用等号
给一个等号
我们先来看一下
这个输出
我们给6
给一个6
m3里边应该是6
m3里是6
m4里边给9吧
m4里边是9
加起来也是15
正好也是15
那这块呢
我们现在
看到了说
你从0号元素使用
是没有问题的
从
3号
从任意一个开始
也是没有问题的
但是我们刚才还说了一点
下标不能越界
那我们造成一个让它
越界
怎么样
这就是说
下标到了5了
会怎么样呢
来看一下
我们还给
6
再给
9
给的是0
那它还继续问
还输入
那在下边就该是
m5了
m5
我们给一个
7
m5
我们给的是7
它却说是14
对吗
而且6加上7也不是14啊
那这件事情做了吗
也就是说这件事情
就是一个无效的数据
那这个数据为什么
无效
却看上去
计算机没报错呢
这种错
它是不报的
是因为它识别不出来这种错
尤其是越界这种事情
容易让我们忽略了
它是错误
就是说
你的数组
现在
越界了
那么越界的过去的那个数是什么呢
是个随机数
我们还可以把这个再到大的做一下
看一下
比如说我这个是7
大家看一下
如果
我还给刚才6
再给一个7
再给一个8
它还在等数
再给一个9
大家看
这显然是一个非常不合理的数
给到9的时候它已经说
我们给
8的时候
给7的时候
前面两个数都是对的
给6的时候它是6
m3里边是6
m4里边也是正确没问题
到了m5
那就不对了
到了
m9
那就
更不对了
为什么呢
是因为根本
数组就没有m5
也没有m9
所以它完全的是随机数
所以大家在使用
数组的时候
非常重要的一点
下标不能越界
越界了以后
系统并不告诉你错了
而你得到了一个
错误的结果
这种我们程序短的时候
你能容易发现
如果是一个长的应用
藏在里边
这种错误是不容易被发现的
所以要特别的注意
-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