计算机程序设计基础
第6讲数组
沈瑜(010-********)
shenyu@https://www.wendangku.net/doc/903919271.html,
清华大学电机系
2015.10.28
主要内容
?数组C 程序设计举例?一维数组
–一维数组的定义与初始化–一维数组的引用与基本操作
?字符数组与字符串
–字符数组的定义与初始化–字符数组的输入输出–常用字符串函数
<2>
《C 程序设计(第四版)》参考教材第6章《C 语言程序设计: 现代方法(第2版)》第8章
l 例1:幸运字母程序(采用数组实现)
<3>
7.1数组C 程序设计举例
需要用到字符串函数
l 例2:成绩分级程序(采用数组实现)
<4>
长度为4整数数组长度为5
的字符数组
l 例3:统计阶乘(采用数组实现)
<5>
长度为11的整数数组
思考:
若不检查输入数据,当输入-1时会怎样?当输入100时又会怎样?
要点:数组下标一定不能越界!
l例4:翻译月份(采用数组实现)
<6>
6.2 一维数组
p数组的定义
按序排列的同类数据元素的集合称为数组array
p数组的分类
?按数组的类型分,有数值数组、字符数组等
?按数组的维数分,有一维数组、二维数组等
只有一个下标变量的数组,称为一维数组
<7>
1.一维数组定义
一般形式为:
类型符数组名[常量表达式],……;
?类型符可为任意基本数据类型
?数组名是用户定义的数组标识符
?常量表达式表示数据元素的个数,也称数组长度
例如:
int a[10];//定义整型数组a,有10个元素
float b[10],c[20];//定义实型数组b和c
char c[20];//定义字符数组c
<8>
说明:
(1)对同一个数组,其所有元素的数据类型相同(2)数组名不能与同一函数中其它变量同名
例如:
int a;
float a[10];//是错误的
(3)C语言中规定数组的下标从0开始
例如:
int a[5];//5个元素分别为a[0],a[1],a[2],a[3],a[4]
<9>
(4)不能在方括号中用变量来表示元素的个数,但
是可以是符号常数或常量表达式。
合法的定义方式:
#define N5
int a[3+2],b[N+7];
错误的定义方式:
int n=5;
int a[n];
(5)数组中各元素在内存中按下标顺序连续存储
<10>
思考:
?数组定义与变量定义有何区别?
?形式上
?数组定义除指明变量类型和变量名外,还需指明长度
?int var;
?int a[10];
?作用上
?变量定义:为单个数据分配空间
?数组定义:为多个数据分配空间
<11>
2.一维数组的初始化
(1)数组的初始化是指在数组定义时给数组元素赋初值(2)数组初始化的一般形式为:
类型符数组名[常量表达式]={值,值……值};
其中:在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。
例如:
int a[10]={0,1,2,3,4,5,6,7,8,9};
相当于
a[0]=0; a[1]=1;... a[9]=9;
<12>
C语言对数组初始化的几点规定:
(1)可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给前面部分元素赋值。
例如:int a[10]={0,1,2,3,4};
//表示给前5个元素赋值,后5个元素自动赋0值
(2)只能给元素逐个赋值,不能给数组整体赋值。
例如:将数组的10个元素全部赋值为1
int a[10]={1,1,1,1,1,1,1,1,1,1};//正确
int a[10]=1;//错误
<13>
(3)若给全部元素赋值,则可不写明数组长度例如:
int a[5]={1,2,3,4,5};也可写为:
int a[]={1,2,3,4,5};不写明长度则必须初始化:
int a[];
(4){}中值的个数不可多于元素个数
例如:
int a[5]={1,2,3,4,5,1 };
×
<14>
×
√
3.数组元素的引用
数组元素一般引用形式为:数组名[下标]
其中的下标只能为整型常量或整型表达式
例如:
int a[5],b[5];
int i=2,int j=3;
下标为整型常量或整型表达式:
a[i]=b[j]; //将数组b的第4个元素赋值给a的第3个元素
a[i+1]=b[j]; /将数组b的第4元素赋值给数组b的第4元素
<15>
注意:
(1)数组的定义和数组元素中下标的差异
?数组定义中的下标表示数组长度,即元素个数;
?数组元素中的下标表示该元素在数组中的索引
?前者只能是常量,后者可以是常量,变量或表达式例如:
int a[3];//定义一个长度为3的数组
a[2]=1;//将数组a的第3个元素赋值为1
a[3]=1;//越界错误,数组a最后一个元素为a[2]
<16>
(2)只能通过下标变量引用数组元素,而不能一次引用整个数组
例如:将数组b的各元素值依次赋给数组a的对应元素可以用for循环逐一赋值
int a[10],b[10];
for(i=0;i<10;i++)
a[i]=b[i];
不能写成如下形式:
a=b×
<17>
6.3字符数组与字符串
1.字符数组的定义和初始化
p字符数组的定义:与数值数组相似,只是类型不同例如:char c[10]; //定义有10个字符元素的数组
p字符数组的初始化:与数值数组相似,但当初始化数据少于数组长度时,其余的元素为“空”('\0')
例如:char c[10]={‘C’,‘’,‘P’,‘r’,‘o’,‘g’,‘R’,‘a’,‘m’};
c[9],由系统自动初始化为空字符’\0’
<18>
说明:
(1)字符数组可以用字符串来初始化
例如:
char c[]={'C','',‘P','r','o','g',‘r','a','m','\0'};
可写为:
char c[]={"C Program"};
或去掉{}写为:
char c[]="C Program";
<19>
(2)字符串在存储时,系统自动在其后加上结束标志‘\0’(占1字节),但字符数组最后一个元素不一定是'\0’
例如:#include"stdio.h"
int main()
{
char c1[5]={'G','o','o','d','!'};
char c2[]={"Good!"};
printf("%s\n",c1);
printf("%s\n",c2);
Good!烫烫烫烫
return0;
}
c1与c2并不等价,字符数组c1不能当字符串使用,因为其最后一个元素不是结束标志'\0’。
<20>