当前课程知识点:C语言程序设计 > 第22讲 编程训练 > 编程训练 > 数组基础
讲解了数组的定义、初始化、引用、输入/输出。
同学们好
这节课我们讲一下数组的基础知识
为什么要使用数组呢
我们来看一下前面没有使用数组的时候
如果出现这样一个问题
你现在要读入5位同学的成绩
然后要求出这位同学的成绩的平均值
那应该怎么做呢
按照前面的知识的话
我们可以这么来做
你定义五个不同名的变量
score1、score2……一直到score5这5个变量
然后你还得用5个scanf输入这五个同学的成绩
当然在后面的计算过程当中
你还得把这五个变量加起来
然后除以五
这5个同学这么做似乎还可以接受
但是大家想一想
如果是100个人的成绩怎么办呢
你要定义100个变量
然后呢
scanf这个函数要使用100次
到后面再加100个这种变量
这样的程序
不管是写起来还是读起来
都觉得非常的不舒服
那么如果你使用数组就方便多了
比如说五个同学成绩你可以这样来做
就是int score[5]这样就定义了
五个同类型元素的这样一个数组
它在读入的时候
也可以用一个循环来读入
这样操作起来就方便多了
下面我看一下一维数组的定义
一维数组的定义的时候
首先前面是数据类型
数据类型和我们定义普通变量的数据类型一样
比如说整型、浮点型、字符型等等
这个数组名起名的方法也和普通变量名类似
然后后面是一个方括号
括号里面是个整数
整数里面就放的这个数组应该存放的元素个数
比如像我刚才那个例子当中
5位同学 这里就是5
这样就定义了有5个整型元素的这样一个数组
下面一个重要的问题就是数组的初始化
数组在刚刚定义完了以后
他的初值就和普通变量定义完了以后一样
它可以理解成是一个随机数
一般情况下是需要进行初始化的
初始化怎么做呢
初始化是在定义数组的同时给它赋初值
这叫初始化
那比如说刚才定义的这个int a[5]
你可以这样
拿花括号给它里面填五个整数
这是第一种方法
也是最常规的一种方法
第二种
你可以只填一个元素的值
比如说只填一个0
它的含义就是所有的元素的值都是零
那么第三种方法呢
第三行就是在这个初始化里面只有一个值1
这个含义是什么
它的含义是这个数组的最开始的一个元素的值是1
后面没写的那些元素值就是零
就是没写的都是零
还有第四种的初始化方法
在括号里面先不写元素的个数
然后在初始化的里面看看给了多少个值
比如我们这个例子当中
11,22,33,44,55这五个值
它等同于你在前面a括号里面把5写上
这就是初始化的几种形式
下面一个问题是数组的引用
所谓数组的应用就是读取和写入
数组的引用与普通变量基本相同
它是通过采用数组名、括号加下标的形式来进行
需要注意的是数组的下标
C语言是从0开始的
那么你引用的时候
五个元素这样一个数组
引用是a[0]、a[1]、a[2]、a[3]、a[4]这种形式
下标可以是常量
也可以是一个表达式
比如说a[i]这种形式
需要注意的是
数组引用的时候
看起来那个样子
跟数组定义很像
但是实际上定义的时候
括号的含义和引用的时候是完全不同的
比如说定义的时候
int a[5]表示数组当中有五个元素
引用的时候你写成a[2]
它表示的是引用的数组a里面的第三个元素
因为下标是从0开始的
0、1、2就是第三个元素
所以一定要切记
这个定义的时候的括号和引用的时候的括号是不一样的
引用的时候
一定要注意不能越界
刚才定义的有五个元素的这样一个整型数组
如果你在引用的时候出现了a[5]
那么就越界了
为什么越界了呢
正常情况下应该是a[0]、a[1]、a[2]、a[3]、a[4]
这是五个元素
你写a[5]就超出了它的范围
在程序设计的时候
很容易就发生这种下标越界的错误
而且在编译的时候
它不提示你下标越界
就相当于你稀里糊涂的犯了错误
这样有什么问题呢
下标越界就是访问的时候
实际上你访问了数组以外的空间
这是非常严重的问题
有个不太恰当的比喻
就好像你们家分了五亩地
那么你正常操作
你应该在这5亩地之内
但是你去耕地的时候把别人家的地耕了
这个肯定是有问题的
下面看一个数组输入输出的例子
通过这个数组的输入输出
你也可以看看数组操作的时候一个比较惯常的方法
我们看这个例子当中
我们首先定义了一个a[10]
就是有10个元素的这样一个整型
然后读入的时候
我们一般是通过循环
就是一个for循环
然后scan f这种形式来读入
注意scanf后面&a[i]这种形式
它本身跟普通变量的读入是比较相似的
下面读入完了以后
后面是通过循环
就是用printf输出这个数组的所有内容
这种代码是非常常见的
一定要非常清楚
下面我们看一下二维数组的使用
首先也是二维数组定义
二维数组定义的时候
它是这样的
比如说 我们看 这儿定义了一个int b[2][3]
这个表示什么意思呢
这个表示的是你定义了有两行三列的这样
一共有六个元素的整型元素
同样的
二维数组也有初始化的问题
它的初始化
比一维数组的情况更多一点
比较常规的一种初始化的形式
就是在定义二维数组的同时(就是第一行的内容)
用两层花括号
里层的花括号对应的是其中的一行
比如说我们这样定义了以后
这个数组有三行四列
那么里边的花括号里的1,2,3,4
就表示的是第一行的四个元素
然后在后面的5,6,7,8是第二行的四个元素
9,10,11,12是第三行的四个元素
这样呢就把这个二维数组三行四列的的所有的元素
就给定位了
这是一种方法
第二种方法就是第二行
你可以把里面的花括号给它省掉
采用这种定义方式得到的效果和第一行的效果是一样
那么还有另外的形式就是第三行这种形式
他在大的花括号里面
有内层花括号{1},{5},{9}
这样表示什么意思呢
就它等价于下面
就是说第一行第一个元素是1
后面都是零
第二行第一个元素是5
后面三个元素是0
第三行的第一个元素是9
后面是0
这是一种简写的一种形式
还有更简单的一种形式
就是再下面
它相当于是只定义第一行和第二行
第三个没写
没写的默认是0
还有在第二维数组的时候
就是定义和初始化同时做的时候
你可以在数组的表示行数的那个方括号里面不写具体的值
直接后面给出初始化的东西
它会根据初始化的值
然后能够确定你这个第一个方括号当中的值具体是多少
比如说像这个你初始化的时候写的1,2,3,4,5,6……
一直到12
那么这一共有12个元素
它的列数有了
就是4
那么这样12除以4
我们就知道它的行数了
它是这样的一种初始化形式
二维数组初始化的形式还是比较多的
也比较复杂
实际上大家正常写程序的时候
你或许没有必要把所有的形式都知道
你只要把最常规的形式掌握就好
二维数组的引用是通过数组名
有两个下标就是行下标和列下标这样的方式来引用的
同一维数组一样
也一定要注意
它不能越界
就是行下标和列下标都是从0开始的
下面我们一个具体的二维数组程序的例子
来更好的理解一下二维数组
这个例子是这样的
就是将一个二维数组的行和列的元素互换
存到另一个二维数组当中
我们前面的这个二维数组是两行三列
它存到另外一个二维数组当中以后应该是三行两列
我们看看这个程序
程序是这样的
在最开始的时候
我们就定义了这样的一个二维数组a[2][3]
就是两行三列
然后给它初始化了
初始化的值是第一行1,2,3
第二行4,5,6
然后我们下面定义了另外一个数组b
它是三行两列的
另外定义了两个变量i和j
后面我们用了一个双重for循环然后来处理这个问题
双重循环当中的外层for循环
处理a中一行当中的各个元素
第二个内层的for循环
就是j=0开始的这个是处理a中某一列的元素
大家可以在纸上画或者是心里面来看一下这个i和j变量的变化
就是从i等于0一直到后面
j=0到后面
看看它的变化
就能够理解这个程序是怎么做的
我们在前面讲过
你看程序的时候
有些时候你需要拿张纸
然后把这个变量的变化在那画一下
这样整个程序就更容易理解
那么整个程序设计数组一部分需要注意的
就是数组的定义
初始化
还有引用这三种形式
你掌握了以后
那么数组其它的使用基本上使用的是以前的知识
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-循环类型
-作业
-程序结构
-函数基础
-作业
-数组基础
-作业
-作业
-作业
-作业
-程序调试
- 文件(上)
- 编程训练

