第六章 数组
- 格式:doc
- 大小:94.00 KB
- 文档页数:9
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.对数值型的二维数组,也只能一个元素一个元素的使用,这时一定要二个下标,表示那一行那一列的元素。
第六章数组一、选择题1.在C语言中,引用数组元素时,其数组下标的数据类型允许是。
(0级)A)整型常量B)整型常量或整型表达式C)整型表达式D)任何类型的表达式2.以下对一维整型数组a的正确说明是。
(0级)A)int a(10); B)int n=10,a[n];C)int n; scanf(“%d”,&n); int a[n];D ) #define SIZE 10 int a[SIZE];以下能对一维数组a进行正确初始化的语句是。
(0级)A)int a[10]=(0,0,0,0,0);B)int a[10]={ };C)int a[ ]={0};D)int a[10]={10*1};4.不是给数组的第一个元素赋值的语句是。
(0级)A)int a[2]={1}; B) int a[2]={1*2};C)int a[2];scanf (“%d”,a);D)a[1]=1;5.下面程序的运行结果是。
(1级)main(){int a[6],i;for(i=1;i<6;i++){ a[i]=9*(i-2+4*(i>3))%5;printf("%2d",a[i]);}}A)-4 0 4 0 4 B)-4 0 4 0 3 C)-4 0 4 4 3 D)-4 0 4 4 06.下列定义正确的是。
(1级)A)static int a[]={1,2,3,4,5} B) int b[]={2,5}C) int a(10) D) int 4e[4]7.若有说明int a[][4]={0,0};则下列叙述不正确的是。
(0级)A) 数组a的每个元素都可以得到初值0B) 二维数组a的第一维的大小为1C) 因为对二维数组a的第二维大小的值除以初值个数的商为1,故数组a的行数为1D) 只有元素a[0][0]和a[0][1]可得到初值0,其余元素均得不到初值8.设有char str[10],下列语句正确的是。
(1级)A) scanf("%s",&str); B) printf("%c",str);C) printf("%s",str[0]); D) printf("%s",str);9.下列说法正确的是。
(0级)A) 在C语言中,可以使用动态内存分配技术定义元素个数可变的数组B) 在C语言中,数组元素的个数可以不确定,允许随机变动C) 在C语言中,数组元素的数据类型可以不一致D) 在C语言中,定义了一个数组后,就确定了它所容纳的具有相同数据类型元素的个数10.假设array是一个有10个元素的整型数组,则下列写法中正确的是。
(1级)A) array[0]=10 B) array=0C) array[10]=0 D) array[-1]=011.执行以下程序段后,a的值是。
(1级)static int a[]={5,3,7,2,1,5,4,10};int a=0;k;for(k=0;k<8;k+=2)a+=*(a+k);A) 17 B) 27 C) 13 D) 有语法错误,无法确定12.分析下列程序main(){int n[3],i,j,k;for(i=0;i<3;i++)n[i]=0;k=2;for(i=0;i<k;i++)for(j=0;j<k;j++)n[j]=n[i]+1;printf("%d\n",n[1]);}上述程序运行后,输出的结果是。
(1级)A)2 B)1 C)0 D)313. 若有以下定义:int a[5]={ 5, 4, ,3, 2, 1 } ;char b= …a‟, c, d, e;则下面表达式中数值为2的是。
(02~03第一学期试题)A)a [3] B)a [e – c] C)a [d-b] D)a [ e-b ]14.下面几个字符串处理表达式中能用来把字符串str2连接到字符串str1后的一个是:。
(01~02第二学期试题)A)strcat(str1,str2) ; B)strcat(str2,str1);C)strcpy(str1,str2) ; D)strcmp(str1,str2);15.设有两字符串“Beijing”、“China”分别存放在字符数组str1[10],str2[10]中,下面语句中能把“China”连接到“Beijing”之后的为:。
(03试题)A)strcpy(str1,str2); B)strcpy(str1, “China”);C)strcat(str1,“China”);D)strcat(“Beijing”,str2);16.若有二维数组a[m][n],则数组中a[I][j]之前的元素的个数为。
(03试题)A)j*m+I B)I*n+jC)I*m+j+1 D)I*n+j+117.若有如下定义:int a[3][3]={1,2,3,4,5,6,7,8,9},i ;则下列语句的输出结果是:。
(03试题)for (i=0;i<=2;i++) printf(“%d”,a[i][2-i]);A)3 5 7 B)3 6 9C)1 5 9 D)1 4 718.下列字符串赋值语句中,不能正确把字符串 C program赋给数组的语句是:。
(往届试题)A)char a[]={…C‟,…‟,…p‟,…r‟,…o‟,…g‟,…r‟,…a‟,…m‟};B)char a[10]; strcpy(a2, “C program”);C)char a[10]; a= “C program”;D)char a[10]={ “C program”};19. 以下不能对二维数组a 进行正确初始化的语句是。
(04~05第二学期试题)A)int a[2] [3] = {0}; B)int a[ ] [3]={{1,2},{0}};C)int a[2][3]={{1,2},{3,4},{5,6}}; D)int a[ ][3]={1,2,3,4,5,6};20. 下面程序的运行结果是。
(04~05第二学期试题)char c[5]={‘a’,‘b’,‘\0’,‘c’,‘\0’};printf(“%s”,c); }A)‘a’‘b’B)ab\0c\0C)ab c D)ab21. 判断字符串a和b是否相等,应当使用。
(04~05第二学期试题)A)if (a= =b) B)if (a=b)C)if (strcpy(a,b)) D)if(strcmp(a,b))22. 有字符数组a[80]和b[80],则正确的输出语句是。
(04~05第二学期试题)A)puts (a,b); B)printf(“%s,%s”,a[],b[]);C)putchar(a,b); D)puts(a),puts(b);23.若有如下定义和语句:char s[12]= “a book!”;printf(“%d”,strlen(s) );则输出结果是:。
(往届试题)A)12 B)10 C)7 D)624.以下能对二维数组a进行正确说明和初始化的语句是:。
(往届试题)A)int a( )(3)={ ( 1, 0, 1 ), ( 2, 4, 5 ) };B)int a[2][]={ { 3, 2, 1 }, { 5, 6, 7 } };C)int a[][3]={ { 3, 2, 1 }, { 5, 6, 7 } };D)int a(2)( )={ ( 1, 0, 1 ), ( 2, 4, 5 ) };25.若有说明:int a[3][4] = {0};则下面正确的叙述是:。
(往届试题)A)只有元素a[0][0]可以得到初值0B)此说明语句不正确C)数组a中每个元素均可得到初值0D)数组a每个元素均可得到初值,但值不一定为0二、填空题1.数组名定名规则和变量名相同,遵循定名规则。
(0级)2.对于一维数组的定义“类型说明符数组名[常量表达式]”,其中常量表达式可以包括和,不能包含。
(0级)3.在C语言中,引用数组只能通过数组元素来实现,而不能通过整体引用来实现。
(0级)4.在定义数组时对数组元素赋以初值,需要在数组的类型说明符前加关键字。
(0级)5.如果要使一个内部数组在定义时每个元素初始化值为0,但不进行逐个赋值,将其说明成存储类型即可。
6.C语言规定,只有定义为存储类型和存储类型的数组才能初始化。
(0级)7.定义变量时,如果对数组元素全部赋初值,则数组长度。
(0级)8.在C语言中,二维数组中元素排列的顺序是。
(0级)9.对与数组a[m][n]来说,使用数组的某个元素时,行下标的最大值是,列下标的最大值是。
(0级)10.在C语言中,将字符串作为处理。
(0级)11.在C语言中,数组的首地址是。
(0级)三、程序填空题1.以下程序可求出所有水仙花数(指3位正整数中各位数字立方和等于该数本身,如153=13+53+33),请填空。
(往届试题)main( ){ int x, y ,z, a[10], m, i=0;printf(“shui xian huan shu :\n”);for(___(1)____;m<1000;m++){ x=m/100;y=____(2)____;z=m%10;if(m==x*x*x+y*y*y*y+z*z*z){____(3)_____; i ++; } }for( x=0;x<i ; x++)printf(“%6d”,a[x] ) ; }2. 打印以下杨辉三角形.(要求打印出10行) (01~02第二学期试题)main( ){ int a[10][10],i, j ; 1for( i=0;i<10;i++) 1 1{__(1)___ ___(2)___ } 1 2 1for( i=2; i<10; i++ ) 1 3 3 1for(j=1; j<i ; j++ ) 1 4 6 4 1a[i][j] =___(3)___; ………for(i=0; i<10; i++){ for( j=1; j<=i; j++)printf(“%5d”,a[i][j]);printf(“\n”);}}3. 用起泡法对十个数由大到小排序。
(01~02第二学期试题)main( ){ int a[11], i, j, t;printf(“input 10 numbers: \n”);for(i=1;i<11;i++)scanf(“%d”,&a[i]);printf(“\n”);for (j=1;j<=9;j++)for(i=1; _(1)__; i++)if (__(2)___){___(3)___ a[i]=a[i+1]; __(4)__ }printf(“the sorted numbers: \n”);for ( i=1; i<11; i++)printf(“%d”,a[i]);}4.下面程序中的数组a包括10个整数元素,从a中第二个元素起,分别将后项减前项之差存入数组b,并按每行3个元素输出数组b。