admin 管理员组文章数量: 1086019
2024年1月11日发(作者:微信个人主页背景图片)
第六章 数组
本章要求
1. 一维数组和多维数组的定义,初始化和引用 .
2. 字符串与字符数组
数组
一维数组
二维数组
字符数组
字符串
引言:
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。
一. 一维数组的定义
定义: 数组是有序数据(必须是相同的数据类型结构)的集合.
格式: 类型说明符 数组名[常量表达式]
例如: int a[10] ; 表示数组名为a,有10个元素,并且每个元素的类型都是int型的.
float b[10],c[5]; 说明实型数组b有10个元素,实型数组有5个元素;
注意:
1. 数组名的命名规则和标示符的命名规则相同。
2.常量表达式要有方括号括起来,不能用圆括号,int a(10);
这是非法的!
3.常量表达式表示数组元素的个数,即数组长度.并且数组的
第一个元素是从下标0开始的!
4.常量表达式可以是常量也可以是符号常量,不能包含变量。C语言绝对不允许对数组的大小作动态定义;
例如:下面是非法的
int n;
scanf(“%d”,&n);
int a[n];
5.数组的类型实际上就是指数组元素的取值类型,对于同一数组,它所有元素的数据类型都是相同的;
6.数组名不能与其他变量名相同;例如:
main()
{
int a;
float a[10];
………..
} 是非法的!
7.允许在同一个类型说明中,说明多个数组和多个变量;
例如: int a,b,c,d[10],e[5];
二. 一维数组元素的初始化
有下列方法初始化:
1)在定义数组时,对数组元素赋初值;
例如: int a[10]={0,1,2,3,4,5,6,7,8,9};
上面的语句等价于
a[0]=0,a[1]=1,
2)可以只给一部分元素赋初值,例如:
int a[10]={0,1,2,3,4};
表示只给数组的前5个元素赋初值,后5 个元素的值,系统自动默认为0
3)在对全部数组元素赋初值时,可以不指定数组长度;例如:
int a[5]={0,1,2,3,4};
可以改写为: int a[]={0,1,2,3,4};
但是,int a[10] ={0,1,2,3,4};
不能改写为: int a[]={0,1,2,3,4};
三. 一维数组的引用
数组必须先定义,后使用!
C语言规定: 只能逐个引用数组元素,而不能一次引用整个数组!
数组的引用形式为: 数组名[下标] 其中,下标可以是整型常量也可以是整型表达式.
例如: a[0]=a[5]+a[7]+a[2*3]
四. 一维数组的程序举例
1.读10个数存入数组中,输出数组中的所有数据.
main()
{
int i,a[10];
for(i=0;i<=9;i++)
a[i]=i; /*顺序给数组元素赋初*/
for(i=0;i<=9;i++)
printf(“%d”,a[i]); /*顺序输出数组元素*/
}
2.读10个整数存入数组中,输出平均值.
#include
#define size 10
main()
{
int x[size],i;
float s=0,ave;
for(i=0;i scanf(“%d”,&x[i]); for(i=0;i s+=x[i]; ave=s/size; printf(“%dn”,ave); } 五. 二维数组的定义 定义格式: 类型说明符 数组名[常量表达式1][常量表达式2] 其中表达式1表示第一维下标的长度; 表达式2表示第二维下标的长度; 例如: int a[2][3]; 说明了一个2行3列的数组,数组名为a,数组元素的类型为整型,该数组共有2*3个元素; 即: a[0][0],a[0][1],a[0][2] a[1][0],a[1][1],a[1][2] 注意的是: 二维数组在概念上是二维的,就是说其下标在两个方向上变化,数组元素在数组中的位置也处于一个平面中,并不向一维数组,所有的元素是线性的,但是,二维数组中的元素和一维数组中的元素一样,也是按线性存储的; 如何存储呢? 首先,它和一维数组一样,也是按线性存储的. 在C语言中,二维数组是按行排列的,即存完一行后,顺序存入第二行; 还是上面那个例子: int a[2][3]; 由于数组a说明为int型,所以数组的每个元素在内存中占两个字节的存储空间, 0 1 2 3 4 5 六. 二维数组的引用 引用形式:数组名[下标][下标] 其中下标应该为整型常量或整型表达式; 例如: int a[3][4]; a[2][3] 表示数组a的第三行第四列的元素. 注意:下标变量和数组说明在形式上有些相似,但这两者具有完全不同的含义; 数组说明的方括号中给出的是某一维的长度;而数组元素中的下标是该元素在数组中的位置标识;数组说明中的方括号内只能是常量,而数组元素中方括号中的下标可以是常量,变量或表达式. 七. 二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值.二维数组可以按行分段赋值,也可以按行连续赋值 1. 按行分段赋值 int a[2][3]={{1,2,3}, {4,5,6}}; 2. 按行连续赋值 int a[2][3]={1,2,3,4,5,6}; 这两种赋值的结果是完全相同的; 说明: 1. 可以只对部分元素赋值,未赋值的元素自动取0; 例如: int a[3][3]={{1},{2},{3}}; 是对每行的第一列元素赋值,未赋值的元素自动取0 2. 如果对所有的元素赋初值,则第一维的长度可以不给出; 例如: int a[3][3]={1,2,3,4,5,6,7,8,9}; 可以改为: int a[][3]={1,2,3,4,5,6,7,8,9}; 3.数组是一种构造类型的数据,二维数组可以看作是一维数组的嵌套,设一维数组的每个元素又都是一个数组,就组成了一个二维数组,当然,前提是每个元素的类型必须一致;同理,一个二维数组也可以分解为多个一维数组,例如: a[3][4],可分解为3个一维数组,其数组名分别是: a[0],a[1],a[2];对这三个一维数组不需另作说明即可使用,这三个一维数组都有4个元素,例如: 一维数组a[0]的元素是a[0][0],a[0][1],a[0][2],a[0][3];必须强调的是,a[0],a[1],a[2]不 能当作下标变量使用,因为它们是数组名,不是一个单纯的下标变量; 对于一个数组,例如: a[3][4]可以通过循环语句来赋值; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%d”,&a[i][j]); 八. 二维数组的使用举例 1. 将一个二维数组的行和列元素互换,存到另一个二维数组中. a={{1,2,3}, b={{1,4}, {4,5,6}}; {2,5} {3,6}}; 分析: 首先,给a赋值; 然后,通过a给b赋值,b[i][j]=a[j][i]; 最后,输出b的值; #include main() { int a[2][3]= {{1,2,3},{4,5,6}}; int b[3][2],i,j; for(i=0;i<=1;i++) { for(j=0;j<=2;j++) { printf(“%d”,a[i][j]); b[j][i]=a[i][j]; } printf(“n”); } for(i=0;i<=2;i++) { for(j=0;j<=1;j++) printf(“%d”,b[i][j]); printf(“n”); } } 九. 字符型数组 定义: 每个数组元素的数据类型是字符型的一维数组. 字符数组的引用,存储,初始化的方法和一维数组相同 例如: 字符型数组的定义 char c[10]; 定义了字符型数组c,它的数组元素有10个,由于字符型和整型是相通的,因此,上面的定义也可以改为: int c[10]; 例如: 字符型数组的初始化 char c[3]={‘a’,’b’,’c’}; 注意: 如果花括号提供的数组元素个数大于数组长度,则作语法错误处理; 如果初值个数小于数组长度,则只将这些字符赋给前面的元素,其余的元素自动定为空字符(‘0’); 比如: char c[5]={‘a’,’b’,’c’}; a 如果提供的初值个数和预定的数组长度相同,在定义时可以省掉数组长度,系统自动根据初值个数确定数组长度. 例如: char a[]={‘a’,’b’,’c’,’d’,’e’}; b c 0 0 也可以用字符串常量赋值;如: char ch[6]={“hello”} char ch[6]=”hello”; char ch[]=”hello”; h e l l o 0 十. 字符型数组的引用 可以引用字符数组中的一个元素即得到一个字符! 例如: 输出一个字符串 Main() { char a[5]={‘a’,’b’,’c’,’d’,’e’ }; int i; for(i=0;i<5;i++) printf(“%c”,a[i];) printf(“n”); } 十一. 字符串 定义: C语言中用双引号括起来的任意字符序列就是字符串! C语言中没有字符串变量,对程序中的字符串,系统用字符数组方式保存,连续,顺序的存放每一个字符,最后加上一个空字符”0”作为结束标志! 十二. 字符串的输入输出 1. 通过逐个字符输入和输出: 使用%c; 2. 通过整个字符串输入和输出:使用%s; 注意: 在使用字符串方式输入输出时: 输入时: 1. 用字符数组名,不要加& 2. 输入串长度要小于数组维数; 3. 遇空格或回车结束; 4. 自动加’0’; 输出时: 用字符数组名,遇’0’结束; 十二. 字符串数组 字符串数组就是数组中的每个元素又都是存放字符串的数组! 例如: 可以将一个二维字符数组看成是一个字符串数组; char line[10][80]; 数组line共有10个元素,每个元素可以存放80个字符(79个普通字符,一个结束字符),第一个下标决定字符串的个数,第二个下标决定字符串的最大长度,line是有十个字符串的数组,这些字符串的最大长度是79。 字符串的初始化方法: 例如: char str[3][5]={“a”,”ab”,”abc”}; /*根据定义的大小初始化*/ char str[][5]={“a”,”ab”,”abc”}; /*根据右边字符串的个数,定义数组大小*/ 该数组的存储示意图为: a a a 0 b b 0 c 0 字符串函数 C标准函数库中提供了很多相关的函数,它们的原型说明在两个头文件中,ctype.h说明了一组字符类型判断函数;string.h说明了许多字符串处理函数; 1. 字符串输入输出--------要加头文件stdio.h scanf的s格式串可以实现字符串的整体输入; printf的s格式串可以实现字符串的输出; gets从终端输入字符串行;gets(str) 例如:char st[15]; printf(“inputstring:n”); gets(st); puts(st); 其中st是存放字符串的起始地址,可以是字符数组名,字符数组元素地址或字符指针, char c[]={“abc”}; put(c); 2. 字符串处理函数------要加头文件string.h 字符串复制函数strcpy(字符数组名1,字符数组名2);功能: 把字符数组2中的字符串拷贝到字符数组1中,串结束标志”0”也一同拷贝;字符数组名2,也可以是一个字符串常量;这时相当于把一个字符串赋予一个字符数组;调用形式如下: strcpy(s1,s2) 例如: char st1[15],st2[]=”clanguage”; strcpy(st1,st2); puts(st1);printf(“n”); 本例要求0字符数组1有足够的长度,否则不能装入所拷贝的字符串; 字符串连接函数strcat(字符数组1,字符数组2); 功能是: 把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志”0”,本函数返回值是字符数组1的首地址,调用形式如下: strcat(s1,s2) 例如: char st1[30]=”mynameis”; int st2[10]; gets(st2); strcat(st1,st2); 本例是把字符数组1与动态赋值的字符串连接起来,注意的是: 字符数组1应有足够的长度,否则不能全部装入被连接的 字符串; 求字符串长度函数strlen(字符数组名) 功能是: 测字符串的实际长度(不含字符串的结束标志”0”)并作为函数返回值. 调用形式: strlen(s) 字符串比较函数strcmp(字符数组名1,字符数组名2) 功能: 按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果; 字符串1=字符串2 返回值=0 字符串1>字符串2 返回值>0 字符串1<字符串2 返回值<0 注意: 本函数也可以用来比较两个字符串常量,或比较数组和字符串常量 调用形式: strcmp(s1,s2) 3. 字符判断函数--------要加头文件ctype.h 字符判断函数大部分是用宏实现的,返回值都是真和假; 如: isalpha(c)-------判断c是否为字母; isdigit(c)---------判断c是否为数字; isupper(c)--------判断c是否为大写字母;
版权声明:本文标题:第6章 C语言数组 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1704958547a468045.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论