第6章 数 组 6.1 数组和数组单元的基本概念6.2 一维数组6.3 二维数组6.4 字符数组第六章 数组关键字: 数组 下标变量 某班有60名同学,需要统计每位同学的平均成绩,用简单数据类型就需要分别定义60个变量,分别存放每个同学的平均成绩,显 然这种处理方法十分麻烦。 为了解决这种问题,c语言提供了数组类型。即把具有相同类型的若干变量按有序的形式组织起来,用统一的名字 来表示,这些按序排列的相同类型的数据元素的集合称为数组。或者说,数组是用一个名字代表顺序排列的一组数。简单变量是没有序的,无所谓谁 先谁后,数组中的单元是有排列顺序的。6.1 一维数组的定义与引用 用一个统一的标识符,即数组名来标识一组变量(也称元素),用下 标来指示数组中元素的序号。当数组中每个元素只带有一个下标时,此数组称为一维数组。 6.1.1 一维数组的定义、引用、初始化 1. 一维数组的定义 定义一维数组的格式为: 类型标识符 数 组名[常量表达式] , … ; 2. 一维数组的引用 使用数组必须先定义,后引用。 引用时只能对数组元 素引用,如a[0],a[i],a[i+1]等,而不能引用整个数组。 在引用时应注意以下几点: (1) 由于数组元素本身等价于同一类型的一个变量,因此,对变量的任何操作都适用于数组元素。 (2) 在引用数组元素时,下标可以是整型常数或表达式,表达式内允许变量存在。在定义数组时下标不能使用变量。 (3) 引用数组元素时下标最大值不能出界。 【程序文本6.1 】 随机输入10个数并输出。main() { int a[10] , i ; printf("input 10 numbers:\n"); for(i=0;i<10;i++) sc anf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) printf(" %d",a[i]);} 输入:0 2 4 6 8 10 12 14 16 1结果是:0 2 4 6 8 10 12 14 16 18 3. 一维数组的初始化 前已述及,可利用赋值语句或输入语句给数组元素赋值。C语言还允 许在定义数组时对各数组元素指定初始值——称为数组初始化。 (1) 数组初始化形式1 例如:将括号内整型数据0,1, 2,3,4分别赋给整型数组元素a[0],a[1],a[2],a[3],a[4]。可以写为下面的形式: int a[5]={0, 1, 2, 3, 4} ; 2) 数组初始化形式2 例如:对a数 组中所有元素赋初值0。可以写作下面的形式: int a [10]={0} ; 3) 通过赋初值定义数组大小 例如: int a[ ]={1, 2, 3, 4, 5} ; 等价于:int a[5]={1, 2, 3, 4, 5} ;4 一维数组程序示例 ?【程序文本6.2】 从键盘输入10个数,求其中的最小值并显示出来。 程序如下:#include "stdio.h"main(){ int i ,min ,a[10]; printf("please input 10 number:\n"); for (i=0;i<10 ;i++) scanf("%d",&a[i]); min=a[0]; for(i=0;i<10;i++) if (min> a[i]) min=a[i];printf("min value is %d\n",min);}输入:3 4 5 0 7 8 1 9 6 2结果是: min value is 16.2 二维数组 6.2.1 二维数组的 定义、引用、初始化 1. 二维数组的定义 定义二维数组的一般格式为: 类型说明 符 数组名 [常量表达式1][常量表达式2] 2. 二维数组元素的引用 二维数组中各 个元素可看作具有相同数据类型的一组变量。因此,对变量的引用及一切操作,同样适用于二维数元素。 二维数组元素引 用的格式为: 数组名[下标][下标]【程序文本6.5 】通过键盘输入数据,给具有二行三列的二 维数组赋初值。#include "stdio.h"main(){int i ,j a[2][3];for(i=0;i<2;i++ )for(j=0;j<3;j++)scanf("%d",&a[i][j]);for(i=0;i<2;i++)for(j=0;j<3 ;j++)printf("\na[%;d][%d]=%d",i ,j ,a[i][j]);}输入:1 2 3 4 5 6 结果为:a[0][0]=1a[0][1]=2a[0][2]=3a[1][0]=4a[1][1]=5a[1][2]=6 3. 二维数组的初始化 在定义二维数组的同时,可使用以下几种方法对二维数组初始化。 (1) 将所有数据写在一个大括号内,以逗号分隔,按数组元素在内存中的排列顺序对其赋值。 例如:in t a[2][3]={0 , 1 , 2 , 3 , 4 , 5 } ; (2) 分行对数组元 素赋值。 例如:int a[2][3]={{0 , 1 , 2} , {4 , 5 , 6}} ; (3) 对部分元素赋值。 例如:int a[2][3]={{1} , {4}} ; (4) 若对全部元素赋初值,则定义时第一维长度可缺省。可由第二维长度,即列的数据的个数自动确定第一维长度(即行 的个数)。 例如:int a[ ][3]={0 , 1 , 2 , 3 , 4 , 5} ; 4. 二维数 组应用示例 【程序文本6.6 】有一个3×4的矩阵,求出所有元素最大值以及它所在的行和列。 main(){int i ,j ,r=0,c=0,max;int a[3][4]={{1,3,7,9},{2,4,6,8},{-1,10,-5,-9} };max=a[0][0];for(i=0,i<=2,i++)for(j=0,j<=3;j++)if(a[i][j]>max) { max=a[i][j]; r=i ;c=j; }printf("max=%d,r=%d,c=%d\n",ma x,r,c);}结果为: max=10,r=2,c=16.3 字符数组 字符数组是用来存放字符的数组,字符 数组中的一个元素存放一个字符。6.3.1 字符数组的定义 一维字符数组的定义格式: char 数组名[常量表达式]; 例如:char a[5]; 二维字符数组的定义格式: char 数组名[常量表达式1][常量表达式2]; 例如:char a[2][3]; 6.3.2 字符数组的初始化字符数组初始化有下面两种情况:(1)可以对数组元素逐个初始化。如:char a[10]={ˊiˊ, ˊˊ,ˊaˊ, ˊmˊ, ˊ ˊ, ˊhˊ, ˊaˊ, ˊpˊ, ˊpˊ, ˊyˊ};初值个数可以少于数组长度,多余元素自动为ˊ\ 0ˊ(ˊ\0ˊ是二进制的0)。char a[]={ˊcˊ,ˊˊ,ˊpˊ,ˊrˊ,ˊoˊ,ˊgˊ,ˊrˊ,ˊaˊ,ˊmˊ};A[9] = ˊ\0ˊ,即a[9]=0。指定初值时,若未指定数组长度,则长度等于初值个数。例如:char a[]={ˊiˊ, ˊˊ,ˊaˊ, ˊmˊ, ˊ ˊ, ˊhˊ, ˊaˊ, ˊpˊ, ˊpˊ, ˊyˊ};等价于char a[10]={ˊiˊ, ˊˊ,ˊaˊ, ˊ mˊ, ˊ ˊ, ˊhˊ, ˊaˊ, ˊpˊ, ˊpˊ, ˊyˊ};(2)用字符串常量对数组初始化。例如: char a[]={"i am happy"};字符串在存储时,系统自动在其后加上结束标志ˊ\0ˊ。6.3.3 字符数组元素的引用 用数组的下标指定要引用的数组元素。 一维字符数组的引用格式: 数组名[下标]; 二维字符 数组的引用格式: 数组名[行下标][列下标];【程序文本6.8 】输出一个字符串。main(){ char c[10]={ˊiˊ, ˊˊ,ˊaˊ, ˊmˊ, ˊ ˊ, ˊhˊ, ˊaˊ, ˊpˊ, ˊpˊ, ˊyˊ}; int i ; for(i=0;i<10;i++) printf("%c",c[i]); printf("\n");}结果为: i am happy6.3.4 字符串和字符串结束标志在c语言中,字符串常量是用双引号括起来的一串字符,并用’\0’ (Ascii码值为0)作为字符串的结束标志,它占一个字节的内存空间,但不计入串的长度。在c语言中,没有专门的字符串变量,通常用一个 字符数组来存放一个字符串。并自动在字符串末尾添加''\0''作为该字符串是否结束的标志,不必再用字符数组的长度来判断字符串的长度了。c har a[]={ˊiˊ, ˊˊ,ˊaˊ, ˊmˊ, ˊ ˊ, ˊhˊ, ˊaˊ, ˊpˊ, ˊpˊ, ˊyˊ};可写为:char a[]={"i am happy"};说明:(1)用字符串赋值时,无须指定长度,系统自行处理。(2)以字符串形式对字符数组初始化 ,系统会自动在该字符串最后加字符串结束符标志''\0''。6.3.5 字符数组的输入输出 可以利用字符数组对 单个字符和字符串进行输入输出操作。 1. 逐个字符输入输出 用格式符"%c"输入或输出 一个字符。 2. 字符串—整串输入和输出 用"%s"格式符可输入、输出字符串。由于C语 言中没有专门存放字符串的变量,字符串存放在一个字符型数组中,数组名表示第一个字符的首地址,故在输入或输出字符串时可直接使用数组名。 6.3.6 字符串处理函数 1. 字符串输入、输出函数 1) 输入一个字符串函数gets( ) gets函数一般调用格式为: gets(str) ; gets函数的作用是从终端键盘输入字符串(字符串可以包括空格),直到遇到回车符为止,回车符读入后,不作为字符串 的内容,系统将自动用''\0''代替,作为字符串的结束标志。 2) 输出一个字符串函数puts( ) puts( )函数的一般调用格式为: puts(str) ; 该函数的作用是从str指定的地址开始,依次输出存储单元中的字符,直到遇到字符串结束标志第1个 ''\0'' 字符为止。 2. 字符串处理函数 1) 字符串复制函数strcpy( ) strcp y( )函数一般调用格式为: strcpy(str1 , str2) 功能:把str2所指向的字符串复制到str1所指的字符数组中。 2) 字符串连接函数strcat( ) strcat( )函数一般调用格式为: strcat(str1 , str2) ; 功能:将str2所指的字符串连接到str1所指的字符串的后面,并自动覆盖str1所指的字符串的尾部字符 "\0" 。 3) 求字符串长度函数strlen( ) strlen( )函数一般 调用格式为: strlen(str) ; 功能:计算 str为起始地址的字符串的长度(不包含字符串结束标志''\0''),并作为函数值返回。 4) 字符串比较函数st rcmp( ) strcmp( )函数一般调用格式为: st rcmp(str1 , str2) ; 功能:比较str1和str2所指向的两个字符串,并产生以下结果: str1与str2相等时,函数值为0。 str1>str2时,函数值大于0。 str1<str2时,函数值小于0。 字符串之间比较的方法是:从第一个字符开始,依次对str 1与str2对应位置上的字符按ASCII码值的大小进行比较,直到出现第一个不相同的字符时,即由这两个字符的大小决定所在串的大小。6 .3.7 字符串数组应用举例 【程序文本6.17 】从终端键盘输入一字符串,并复制到另一字符数组后显示出来。 程序如下: # include "stdio.h" main(?) { ch ar str1[30] , str2[30] ; int i ; printf("input a string:") ; scanf("%s" , str1) ; i=0 ; while(str1[i]!=''\0'') { str2 [i]=str1[i] ; i++ ; } str2[i]=''\0'' ; printf("%s" , str2) ; } 运行结果: input a string : ABC AB C 【程序文本6.18 】由终端键盘输入一字符串,要求从该串中删去一字符。 main(?) { char str1[50] , str2[50] ; char ch ; int i=0 , k=0 ; gets(str1) ; printf(" \n delete?") ; scanf("%c" , &ch) ; for(i=0 ; str1[i] !=''\0'' ; i++) { if(str1[i]!=ch) str2[i-k]=str1[i] ; else k=k+1 ; } str2[i-k]=''\0'' ; printf("\n%s\n" , str2) ;} 该程序运行后,从键盘输入字符串: I am a boy 〈回车〉 屏幕显示:delete? 输入:a 输出为:I m boy 本章小结1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。2.数组可以是一维的,二维的或多维的。3.数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。数组元素又称为下标变量。 数组的类型是指下标变量取值的类型。4.对数组的赋值可以用数组初始化赋值,输入函数动态赋值和赋值语句赋值三种方法实现。 对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。 |
|