第六章数组解析
- 格式:doc
- 大小:81.50 KB
- 文档页数:8
C++程序设计第6章数组单个变量只能存放一个数据值。
当程序中要处理一组相同类型、彼此相关的一组数据时,单个变量就不适合了,就需要一种特殊的数据结构来处理,这就是数组。
数组(array)是一种派生类型。
一个数组能同时存放多个数据值,并能对每个数据进行访问。
本章将介绍一维数组、二维数组和字符数组的定义及使用。
6.1 一维数组一个数组(array)是由相同类型的一组变量组成的一个有序集合。
数组中的每个变量称为一个元素(element),所有元素共用一个变量名,就是数组的名字。
数组中的每个元素都有一个序号,称为下标(index)。
访问一个元素就可以用数组名加下标来实现。
数组必须先定义后使用。
6.1.1 一维数组的定义一维数组就是具有一个下标的数组。
定义一个数组有3个要素:类型、名称与大小。
语法格式为:<数据类型> <数组名> [<常量表达式>]其中,<数据类型>确定了该数组的元素的类型,可以是一种基本数据类型,也可以是已定义的某种数据类型。
<数组名>是一个标识符,作为数组变量的名字。
方括号中的<常量表达式>必须是一个正整型数据,其值为元素的个数,即数组的大小或长度。
注意这里的方括号[]表示数组,而不是表示可缺省内容。
例如,下面定义了三个不同类型的数组:int a[5]; //定义了一个int数组afloat b[20]; //定义了一个float数组bdouble c[5]; //定义了一个double数组c对于上面数组a,元素类型为int,a是数组名,方括号中的10表示数组的长度,即该数组包含了5个元素,分别是a[0]、a[1]、a[2]、a[3]、a[4]。
如果一个数组有n个元素,那么数组中元素的下标从0开始到n-1。
具有相同类型的数组可以在一条说明语句中定义。
例如:int a1[5], a2[4]; //同时定义两个整型数组具有相同类型的单个变量和数组也可以在一条语句中定义。
第六章数组学习和解题要点1.要学习和掌握C语言的数组问题,首先必须形成这么一个观念,当用数组定义语句:[存储类型] 数据类型数组名[长度];定义一个数组时,表明请求计算机在内存开辟一个大的空间,该空间的名字即为数组名,同时数组名也是该空间在内存的起始地址。
空间的大小由“长度”决定,因此“长度”必须是正整常数明确确定。
即使是N,该N也必须在前面的#define N中明确指明是多少。
该空间可放“长度”个同一类型的数据。
放什么样的数据由数据类型指定。
如:int a[10]; 表明内存地址为a 放10个整数,每个小空间为a[0],a[1],……,a[9]a↘2. 有的想用下面的方法定义任意大小的数组:int n;scanf(“%d”,&n);int a[n];认为从键盘输入一多少大整数给n,则就定义多少大的数组。
这也是错误的。
因为C语言规定,执行语句以后,就不能再出现定义语句。
这种根据程序的需要随时申请空间的称为“动态数据结构”,要用以后的结构类型和指针来解决。
3.可在定义数组的同时,马上就赋初值。
也可由初值的个数决定数组的大小。
如:int a[]={1,2,3,4,5,6,7,8,9,10};4.对数值型的数组操作,只能一个元素一个元素的使用,每一的元素的使用都可以看成一个变量的使用,称之为带下标的变量,而决不允许用数组名。
如 a[i] 当i为多少时即为那一个元素。
在程序中要时时注意现在是对那一个元素操作,如在教材中的“冒泡排序法”和“选择排序法”的程序中要注意现在下标是那一个元素。
注意:定义中的int a[10] 表示共10个元素,而程序中的a[10]表示带下标的变量。
5.二维数组的定义与一维一样,必须有二个正整常数明确确定,我们可以看成多少行和多少列个元素,如果在定义数组的同时赋初值,则第一维的长度可以省略。
无论如何,第二维的长度决不能缺省。
6.对数值型的二维数组,也只能一个元素一个元素的使用,这时一定要二个下标,表示那一行那一列的元素。
第六章数组在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。
这些按序排列的同类数据元素的集合称为数组。
在C语言中,数组属于构造数据类型。
一、一维数组1、一维数组的定义定义:数组中的每个元素只带一个下表时,这样的数组称为一维数组。
一般形式:类型名数组名[常量表达式],······;注意:(1)、数组名的命名规则和标识符的命名规则相同。
(2)、常量表达式要有方括号括起来,不能用圆括号。
(3)、常量表达式表示数组元素的个数(只能是整数),即数组长度,并且数组的第一个元素是从下标0开始的!(4)、常量表达式可以是常量也可以是符号常量,不能包含变量。
(5)、允许在同一个类型说明中说明多个数组和变量;例如:int a,b,c,d[10],e[5];2、一维数组元素的初始化通过定义语句定义数组后,系统会根据数组元素的个数在内存中开辟一串连续的存储单元,这是存储单元没有确定的值。
一维数组的初始化方式如下:a、在定义数组时,对数组元素赋初值,例如:int a[10]={0,1,2,3,4,5,6,7,8,9};b、可以只给一部分元素赋初值,例如:int a[10]={0,1,2,3,4},表示只给数组的前5个元素赋初值,后5 个元素的值,系统自动默认为0。
c、在对全部数组元素赋初值时,可以不指定数组长度,例如:int a[]={0,1,2,3,4};注意:(1)、“{}”中的值不能超过数组元素的个数。
(2)、可以用“,”表示对应位置的元素为0,如:int a[100]={1,2,3,,,7,8,18,,,67}。
3、一维数组的引用C语言规定: 数组必须先定义,后使用!并且只能逐个引用数组元素,而不能一次引用整个数组!其引用格式为:数组名[下标];其中,下标可以是整型常量也可以是整型表达式,例如:a[0]=a[5]+a[7]+a[2*3]4、一维数组的输入和输出for (i=0;i<10;i++){ scanf("%d",&a[i]);printf(“%d’,a[i]);}5、一维数组的应用举例:输入10个数,对其进行从小到大排序main(){ int a[10],i,j,t;for(i=0;i<10;i++)/*输入*/scanf("%d",&a[i]);printf("\n");for(j=1;j<=9;j++) /*排序*/for(i=0;i<=9-1 ;i++)if(a[i]>a[i+1]){t=a[i]; a[i]=a[i+1]; a[i+1]=t;}for(i=0;i<10;i++) /*输出*/printf("%d ",a[i]); void main(){ int a[11],i,j,k,x;for(i=1;i<11;i++)scanf("%d",&a[i]);for(i=1;i<10;i++){ k=i;for(j=i+1;j<=10;j++)if(a[j]<a[k]) k=j;if(i!=k){ x=a[i]; a[i]=a[k]; a[k]=x;}}for(i=1;i<11;i++)printf("%d ",a[i]);冒泡法排序法:(1)、比较第一个数与第二个数,若a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。
(2)、对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置。
(3)、重复上述过程,共经过n-1趟冒泡排序后,排序结束。
选择法排序法:(1)、首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换。
第一趟选择排序,结果最小的数被安置在第一个元素位置上。
(2)、再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换。
第二趟选择排序,结果第二小的数被安置在第二个元素位置上。
(3)、重复上述过程,共经过n-1趟排序后,排序结束。
二、二维数组1、二维数组的定义数组中每个元素带有两个下标,这样的数组是二维数组。
通常把二维数组看成由行和列组成的矩阵。
在C语言中,二维数组定义格式如下:类型名数组名[常量表达式1][常量表达式2],······通常把“常量表达式1”看成矩阵的行数,表示第一维下标的长度,把“常量表达式2”看成矩阵的列数,表示第二维下标的长度。
二维数组可以看成一种特殊的一维数组,此一维数组中每个元素又都是一个一维数组。
如二维数组a[2][3]可以看作一个一维数组,它有2个元素:a[0]、a[1],每个元素又有3个元素:a[0][1] a[0][2] a[0][3],a[1][1] a[1][2] a[1][3]二维数组元素在内存中是按行存放的,即先顺序存完第一行的元素,再顺序存放第二行的元素······2、二维数组的引用引用形式:数组名[下标1][下标2]其中下标应该为整型常量或整型表达式,而且不能超过数组定义的上下界。
注意:下标变量和数组说明在形式上有些相似,但这两者具有完全不同的含义。
数组说明的方括号中给出的是某一维的长度,而数组元素中的下标是该元素在数组中的位置标识。
数组说明中的方括号内只能是常量,而数组元素中方括号中的下标可以是常量、变量或表达式。
3、二维数组的初始化二维数组定义时可以对各数组元素赋予初值,二维数组初始化有以下几种情况:(1)、所赋初值个数与数组元素的个数相同将二维数组用一对花括号括起来,其中,再将每一行的元素各用一对花括号括起来,之间用逗号隔开。
如:int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};(2)、每行赋初值个数与数组元素个数不同当花括号内初值个数少于该行元素的个数时,系统会自动在行后面为数组元素补初值0,如:int a[4][3]={{1,2},{4,5},{7},{10}};相当于int a[4][3]={{1,2,0},{4,5,0},{7,0,0},{10,0,0}}; (3)、所赋初值行数少于数组行数当花括号内给每行赋初值的花括号数少于数组的行数时,系统会自动给后面的各行元素补初值0。
如:int a[4][3]={{1,2},{4,5}};相当于:int a[4][3]={{1,2,0},{4,5,0},{0,0,0},{0,0,0}};(4)、赋初值时省略行花括号当花括号内不包含行花括号时,则根据数组元素在内存中的排列顺序依次赋值,若数据不足,则系统会自动给后面的元素补初值0,如:int a[4][3]={1,2,3,4,5,6,7,8};int a[4][3]={{1,2,3},{4,5,6},{7,8,0},{0,0,0}};(5)、只能省略下标1,下标2不可省略当省略下标1时,用赋初值的个数除以下标2的值,刚好除尽时,商便是行数;除不尽时,商+1便是行数。
4、二维数组的输入和输出:int a[2][3],i,j;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(“%d”,a[i][j]);1、字符数组的定义和引用在C语言中,字符串借助字符型一维数组(字符数组)来存放,并规定以“\0”作为字符串结束的标志。
字符数组的定义形式如下:char 数组名[常量表达式];数组元素的引用形式为:数组名[下标]注意:(1)、字符串是字符数组的一种具体应用,字符串存放在字符数组内,并以“\0”为结束标志。
(2)、仅可以在字符数组内存放字符串,而不能通过赋值语句将字符串常量或其它字符数组中的字符串直接赋给字符串变量。
2、字符数组的初始化如果初值个数小于数组长度,则只将这些字符赋给前面的元素,其余的元素自动定为空字符(‘\0’),比如:char c[5]={‘a’,’b’,’c’};结果:a b c \0 \0如果提供的初值个数和预定的数组长度相同,在定义时可以省掉数组长度,系统自动根据初值个数确定数组长度。
例如:char a[]={‘a’,’b’,’c’,’d’,’e’};结果:a b c d e \0也可以用字符串常量赋值,如:char ch[6]={“hello”};char ch[6]=“hello”;char ch[]=“hello”;结果:h e l l o \03、字符数组的输入输出通过逐个字符输入和输出:使用%c;通过整个字符串输入和输出:使用%s;在使用字符串方式输入输出时要注意:输入时:用字符数组名,不要加&;输入串长度要小于数组维数;遇空格或回车结束;自动加’\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”};/*根据右边字符串的个数,定义数组大小*/C标准函数库中提供了很多相关的函数,它们的原型说明在两个头文件中:ctype.h说明了一组字符类型判断函数,string.h说明了许多字符串处理函数;1、字符串输入输出(要加头文件stdio.h)scanf的s格式串可以实现字符串的整体输入;printf的s格式串可以实现字符串的输出;gets(字符数组名):从终端输入字符串行;puts(字符数组名):将字符串输出到终端。
例如:char st[15];printf(“inputstring:\n”);gets(st);puts(st);其中st是存放字符串的起始地址,可以是字符数组名,字符数组元素地址或字符指针,2、字符串处理函数(要加头文件string.h)(1)、字符串复制函数格式:strcpy(字符数组名1,字符数组名2);功能:把字符数组2中的字符串拷贝到字符数组1中,串结束标志“\0”也一同拷贝;字符数组名2也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。