文档库 最新最全的文档下载
当前位置:文档库 › 第4章 数组_44584

第4章 数组_44584

第4章 数组_44584
第4章 数组_44584

第4章 数组

与指针有关的题目,请主动略过!

4.1内容概述

本章主要介绍了数值数组和字符数组的定义、初始化、元素引用和数组数据的输入与输出,字符数组实现字符串、字符串函数的实现与调用。指针数组与数组指针定义、元素引用。利用一维数组实现如挑数、排序、求和等实际应用问题。利用二维数组实现矩阵的应用问题。利用字符数组实现字符串的各种操作。本章知识结构如图4.1所示。

图4.1 第4章知识结构图

考核要求:掌握一维数组、二维数组、字符数组和 的定义和初始化;掌握数组元素存储地址计算;掌握数组元素的下标法、指针法引用;掌握字符数组与字符串的区别与联系;掌握有关字符串处理函数的使用方法;能利用一维数组、二维数组解决向量、矩阵等实际应用问题。

重点难点:本章的重点是一维数组、二维数组和字符数组的定义、初始化、元素引用,字符串处理函数的使用。本章的难点是字符串与字符数组的区别, 和数组元素的指针法引用。

核心考点:数组的定义、初始化和数组元素的引用方法,一维数组、二维数组和字符数组的实际应用,字符串的处理方法。

4.2 典型题解析

【例4.1】以下对一维数组a 的定义中正确的是( )。

A. char a(10);

B. int a[0..100];

C. int a[5];

D. int k=10;int a[k];

解析:一维数组定义的一般形式为:

类型标识符 数组名[常量表达式]

其中,常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。

答案:C

数组

数值数组 定义 初始化

元素引用 数组元素输入和输出 字符数组 定义 初始化 元素引用 数组元素输入和输出

【例4.2】以下对一维数组的定义中不正确的是()。

A. double x[5]={2.0,4.0,6.0,8.0,10.0};

B. int y[5]={0,1,3,5,7,9};

C. char ch1[ ]={'1', '2', '3', '4', '5'};

D. char ch2[ ]={'\x10', '\xa', '\x8'};

解析:可以对一维数组的全部元素或部分元素赋初值。在对全部数组元素初始化时,数组长度可以省略。若数组长度没有省略,则初始化列表中值的个数不能超过数组的长度。

答案:B

【例4.3】以下对二维数组的定义中正确的是()。

A.int a[4][]={1,2,3,4,5,6}; B. int a[][3];

C.int a[][3]= {1,2,3,4,5,6}; D. int a[][]={{1,2,3},{4,5,6}};

解析:定义二维数组时,若按一维格式初始化,则第一维的长度可以省略,此时,系统可根据初始化列表中值的个数及第二维的长度计算出省略的第一维长度,但无论如何,第二维的长度不能省略。没有初始化时,每一维的长度都不能省略。

答案:C

【例4.4】假定一个int型变量占用两个字节,若有定义:int x[10]={0,2,4}; 则数组x在内存中所占字节数是()。

A. 3

B. 6

C. 10

D. 20

解析:一维数组在内存中所占的字节数为:数组长度×sizeof(元素类型)。

答案:D

【例4.5】以下程序的输出结果是()。

main()

{ int a[4][4]={{1,3,5},{2,4,6},{3,5,7}};

printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]);

}

A. 0650

B. 1470

C. 5430

D. 输出值不定

解析:定义的数组a为4行4列,且前三行三列元素已初始化,根据C语法规定,未初始化的元素值为0。

答案:A

【例4.6】以下程序的输出结果是()。

main()

{ int m[][3]={1,4,7,2,5,8,3,6,9};int i,j,k=2;

for(i=0;i<3;i++){ printf("%d ",m[k][i]);}

}

A. 4 5 6

B. 2 5 8

C. 3 6 9

D. 7 8 9

解析:根据初始化列表中值的个数和第二维的长度,可求得第一维长度为3。第一行的元素值依次为1,4,7;第二行元素值依次为2,5,8;第三行元素值依次为3,6,9。循环执行三次,依次输出行标为2的三个元素,即第三行的3个元素。

答案:C

【例4.7】以下程序的输出结果是()。

main()

{ int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=0;

for(i=0;i<3;i++)

for(j=i;j<=i;j++)

t=t+b[i][b[j][j]];

printf("%d\n",t);

}

A. 3

B. 4

C. 1

D. 9

解析:程序中,引用的b数组元素的行下标为循环变量i,列下标为数组元素b[j][j]。外层循环共进行3次,对于每次外循环,内层循环只执行一次(即j=i),所以变量t 的值为元素b[0][b[0][0]]、b[1][b[1][1]]、b[2][b[2][2]]的和。由于数组元素b[0][0]、b[1][1]、b[2][2]的值分别为0、1、2,所以t的值为:0+0+1+2=3。

答案:A

【例4.8】若有定义:int a[2][4];,则引用数组元素正确的是()。

A. a[0][3]

B. a[0][4]

C. a[2][2]

D. a[2][2+1]

解析:引用二维数组元素时,行下标范围为0~行数-1,列下标范围为0~列数-1。

答案:A

【例4.9】若有定义:int aa[8];,则不能代表数组元素aa[1]地址的是()。

A. &aa[0]+1

B. &aa[1]

C. &aa[0]++

D. aa+1

解析: &aa[1]、&aa[0]+1和aa+1都是数组元素aa[1]的地址。由于&aa[0]是地址值常量,不能进行自加、自减运算,所以选项C不能代表aa[1]地址。

答案:C

【例4.10】下列程序执行后的输出结果是()。

main()

{ int a[3][3], *p,i;p=&a[0][0];

for(i=0;i<9;i++) p[i]=i+1;

printf("%d \n",a[1][2]);

}

A. 3

B. 6

C. 9

D. 随机数

解析:二维数组的物理存储结构为一维,即按行序顺序存储在连续存储空间中。

本题中,p为指向数组元素的指针变量,初始时,p指向a[0][0]。通过指针p实现对对二维数组元素按行依次赋值。a[1][2]即p[5],其值6。

答案:B

【例4.16】若定义一个名为s且初值为"123"的字符数组,则下列定义错误的是()。

A.char s[]={’1','2','3','\0 '}; B.char s[]={"123"};

C.char s[]={"123\n"}; D.char s[4]={'1','2','3'};

解析:字符数组中所存字符中有’\0’时,字符数组才能作为字符串使用。选项A是用字符常量对字符数组初始化,且最后一个元素的值为字符串结束标记(’\0’),所以数组s中存放的就是字符串"123";选项D是用字符常量对部分元素初始化,根据 C语言的规定,系统为第四个元素赋初值为空值,即'\0',所以数组s中存放的也是字符串" 123"。选项B 是直接使用字符串"123"对字符数组初始化;选项C也是使用字符串初始化,但是字符串不是"123",而是"123\n",数组长度为5。

答案:C

【例4.17】下列程序的功能是输入N个实数,然后依次输出前l个实数和、前2个实数和、…、前N个实数和。填写程序中缺少的语句。

#define N 10

main()

{ float f[N],x=0.0;int i;

for(i=0;i

scanf("%f",&f[i]);

for(i=1;i<=N;i++)

{ ① ;

printf("sum of NO %2d---------%f\n",i,x);

}

}

解析:分析程序可知,第一个循环实现数据的输入,第二个循环实现求和并输出,程序中缺少的是计算前i个实数和并存入变量x的语句。由于每次循环的x值都是在前一次循环的基础上作累加,即前i个实数和(x)等于前i-1个实数和(x)加上第i个实数f[i-1],因此,①处应填写:x=x+f[i-1];。

答案:x=x+f[i-l]; 或 x+=f[i-l];

【例4.18】下面程序的功能是检查一个N×N矩阵是否对称(即判断是否所有的a[i][j]等于a[j][i])。请填空。

#define N 4

main()

{ int a[N][N]={1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4};

int i,j,found=0;

for(j=0;j

for( ① ;i

if(a[i][j]!=a[j][i])

{ ② ;

break;

}

if(found) printf("No");

else printf("Yes");

}

解析:设置判断标志found,初始值为0。对于主对角线以上每个元素,分别与对称元素比较,若不相等,则将found置为1并结束比较。循环结束后,根据found的值确定是否对称。

答案:① i=j+1 ② found=1

【例4.19】编写程序,从一整型数组a的第一个元素开始,每三个元素求和并将和值存入到另一数组中(最后一组可以不足3个元素),最后输出所求的所有和值且每行输出5个值。

解析:用于存储和值的数组设为b,所有元素都初始化为0。从数组a的第一个元素开始,进行累加操作b[j]+=a[i],累加过程中,数组a的下标每自加3次,数组b的下标自加1次。重复此操作,直到数组a的所有元素累加完为止。输出时,每输出5个元素输出一次换行符"\n"。

#define N 20

#define M N/3+1

main()

{ int a[N],i,j,b[M]={0};

for(i=0;i

for(i=0,j=0;i

{ b[j]+=a[i];

if((i+1)%3==0) j++;

}

if(N%3==0) j--;

for(i=0;i<=j;i++)

{ printf("%d ",b[i]);

if((i+1)%5==0) printf("\n");

}

}

【例4.21】编写程序,将一维数组x中大于平均值的数据移至数组的前部,小于等于平均值的数据移至数组的后部。

解析:先计算一维数组x的平均值,然后将大于平均值的数据存入数组y的前部,小于等于平均值的数据存入数组y的后部,最后将数组y复制到数组x。

#include

#define N 10

main()

{ int i,j;

float av,y[N],x[N];

for(i=0;i

av=0;

for(i=0;i

av/=N;

for(i=j=0;i

if(x[i]>av)

{ y[j++]=x[i];x[i]=-1;}

for(i=0;i

if(x[i]!=-1) y[j++]=x[i];

for(i=0;i

{ x[i]=y[i];printf("%5.2f ",x[i]);}

}

【例4.22】已知一维整型数组a中的数已按由小到大的顺序排列,编写程序,删去一维数组中所有相同的数,使之只剩一个。

解析:从数组a的第二个元素开始,与前面保留的最后一个元素作比较,若不相等,则前移。重复此操作,直到数组a的最后一个元素为止。

#include

#define N 20

main()

{ int a[N]={ 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10};

int i,j;

printf("The original data :\n");

for(i=0;i

printf("%3d",a[i]);

for(j=1,i=1;i

if(a[j-1]!=a[i]) a[j++]=a[i];

printf("\n\nThe data after deleted :\n");

for(i=0;i

printf("%3d",a[i]);

}

【例4.23】编写程序,把从键盘输入的一个数字字符串转换为一个整数并输出。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。要求:不得调用C 语言提供的将字符串转换为整数的函数。

解析:设存放数字字符串的数组为s ,存放对应整型数的变量为n (初始值为0)。若字符串的第一个字符为’-’,则从第二个字符开始,否则从第一字符开始,利用公式n=n*10+s[i]-‘0’进行转换,直到’\0’为止。

#include

#include

main()

{ char s[10];long n=0;

int i=0;

printf("Enter a string:\n") ;

gets(s);

if(s[0]=='-') i++;

while(s[i])

{ n=n*10+s[i]-'0';i++;}

if(s[0]=='-') n=-n;

printf("%ld\n",n);

}

【例4.25】编写程序,将二维数组a[N][M]中每个元素向右移一列,最右一列换到最左一列,移动后的数组存到另一个二维数组b 中,原数组保持不变。例如:

321654=a 213546=b

解析:将数组a 的最后一列元素存入数组b 的第1列中,再依次将数组a 的第i 列存入数组b 的第i+1列(0=

#define N 3

#define M 3

main()

{ int a[N][M]={4,5,6,1,2,3,6,7,8},b[N][M],i,j;

for(i=0;i

b[i][0]=a[i][M-1];

for(i=0;i

for(j=0;j

b[j][i+1]=a[j][i];

for(i=0;i

{ for(j=0;j

printf("%d ",b[i][j]);

printf("\n");

}

}

4.3 自测试题

1. 单项选择题

(1)以下定义语句中,错误的是( )。

A.int a[]={1,2}; B.char *a[3];

C.char s[10]="test"; D. int n=5,a[n];

(2)以下能正确定义二维数组的是( )。

A.int a[][3]; B.int a[][3]={2*3};

C.int a[][3]={}; D.int a[2][3]={{1},{2},{3,4}};

(3)以下程序的输出结果是( )。

A.1 5 9 B.1 4 7 C.3 5 7 D.3 6 9

main()

{ int i,x[3][3]={1,2,3,4,5,6,7,8,9};

for(i=0;i<3;i++) printf("%d ",x[i][2-i]);

}

(5)若有定义:int a[][3]={1,2,3,4,5,6,7,8}; ,则a数组的行数为( )。

A.3 B.2 C.无确定值 D.1 (6)下列描述中不正确的是 ( )。

A. 字符型数组中可以存放字符串

B. 可以对字符型串进行整体输入、输出

C. 可以对整型数组进行整体输入、输出

D. 不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值

(7)运行下列程序的输出结果是()。

main()

{ int a[]={1,2,3,4,5},i,*p=a+2;

printf("%d", p[1]-p[-1]);

}

A. 出错,因下标不能为负值

B. 2

C. 1

D. 3

(8)以下printf语句的输出结果是( )。

printf("%d\n", strlen("school"));

A. 7

B. 6

C. 存在语法错误

D. 不定值

(9)若有语句:char s1[10], s2[10]="books";,则能将字符串books赋给数组s1的语句是( )。

A. s1="books";

B. strcpy(s1, s2);

C. s1=s2;

D. strcpy(s2, s1);

(10)以下语句或语句组中,能正确进行字符串赋值的是( )。

A. char *sp; *sp="right!";

B. char s[10]; s="right!";

C. char s[10]; *s="right!";

D. char *sp="right!";

2. 程序分析题(阅读程序,写出运行结果)

(1)

main()

{ int x[6],a=0,b,c=14;

do

{ x[a]=c%2;a++;c=c/2;}while(c>=1);

for(b=a-1;b>=0;b--)

printf("%d ", x[b]);

printf("\n");

}

(2)

main()

{ int i,n[6]={0};

for(i=1;i<=4;i++)

{ n[i]=n[i-1]*2+1;

printf("%d ",n[i]);

}

}

(3)

#include

#include

main()

{ char c='a',t[]="you and me";

int n,k,j;

n=strlen(t);

for(k=0;k

if(t[k]==c) {j=k;break;}

else j=-1;

printf("%d", j);

}

(4)

#include

main()

{ char str1[20]="China\0USA", str2[20]="Beijing"; int i, k, num;

i=strlen(str1); k=strlen(str2);

num=i

printf("%d\n", num);

}

(5)

#include

main()

{ static int a[]={1,3,5,7};

int *p[3]={a+2,a+1,a};

int **q=p;

printf("%d\n",*(p[0]+1)+**(q+2));

}

3. 程序填空题

(1)下面程序的功能是将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。请填空。

#include

#include

main()

{ char a[]="clanguage",t;

int i,j,k; k=strlen(a);

for(i=0;i<=k-2;i+=2)

for(j=i+2;j

if( ② )

{t=a[i];a[i]=a[j];a[j]=t;}

puts(a);printf("\n");

}

(3)下面程序的功能是把给定的字符按其矩阵格式读入数组str中,并输出行号与列号之和为3的数组元素。请填空。

main( )

{ char str[4][3]={'A','b','C','d','E','f','G','h','I','j','K','l'};

int x,y,z;

for(x=0;x<4;x++)

for (y=0; ⑤ ;y++)

{ z=x+y;

if( ⑥ )

printf("%c\n",str[x][y]);

}

}

(4)下面程序的功能是输入一个3×3的实数矩阵,求两条对角线元素中各自的最大值。请填空。

main()

{ float s[3][3],max1,max2,x;

int i,j;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{ scanf("%f",&x);s[i][j]=x;}

max1= ⑦ ;

for(i=1;i<3;i++)

if(max1

max2= ⑧ ;

if(max2

if(max2

printf("max1=%f\n",max1);

printf("max2=%f\n",max2);

}

(5)下面程序的功能是利用数组计算并存储Fibonacci序列的前40项,每行输出4项。

请填空

main()

{ long int a[40]={1,1};

int i;

for(i=2;i<40;i++)

a[i]= ⑨ ;

for(i=0;i<40;i++)

{ if( ⑩ ) printf("\n");

printf("%10ld",a[i]);

}

}

4. 程序设计题

(1)给定一维整型数组,输入数据并求第一个值为奇数元素之前的元素和。

(2)给定一维整型数组,输入数据并对前一半元素升序排序,对后一半元素降序排序。

(3)输入字符串并统计各数字字符出现的次数。

(4)给定N×N矩阵,输入矩阵元素并互换主次对角线元素值。

(5)给定二维数组a[M][N],输入数据并将元素按照行序存入到一维数组b中。

4.4 实验题目

(1)数组a中存放N个非0整数,编写程序,将数组a中的所有正数存放在数组的前面,负数存放在数组的后面。

(2)将数组a中的N个元素后移m位,移出的m位顺序存放在数组的前m位。

(4)将整型N×N矩阵主对角线元素进行升序排序。

(5)将4×4阶矩阵的4个最小值按升序存放在主对角线上。

(6)求N×N矩阵每行最大值的和。

(7)由键盘输入一个字符串,按照ASCII码由小到大的顺序排序,要求删除所输入的重复字符。如输入"ad2f3adjfeainzzzzv",则应输出"23adefijnvz"。

4.5 思考题

(1)定义二维数组时是否可以省略第一维长度?省略时系统如何计算长度?

(2)定义一维数组与引用一维数组元素时,“[]”内数据的含义是什么?

(3)若有定义:int a[3][4],(*q)[4]=a;,则如何利用指针变量q引用数组a的元素?

(4)若有如下定义和语句:

int a[3][4],*p[3];

p[0]=&a[0][0];p[1]=&a[1][0];p[2]=&a[2][0];

则如何利用指针数组名p引用数组a的元素?

(5)试说明下列两种定义方式的区别。

char a[3][8]={"gain","much","strong"};

char *a[3]={"gain","much","strong"};

4.6 习题解答

1. 单项选择题(下列每小题有4个备选答案,将其中一个正确答案填到其后的括号内)

(1)设有定义:int a[10],*p=a;,对数组元素的正确引用是()。

① a[p] ② p[a] ③ *(p+2) ④ p+2

解答:a和p是地址,不可以用作数组元素的下标,所以①②错误,选项④为p之后两个元素的地址即等价于&a[2],选项③为元素a[2]。

答案:③

(2)若有如下定义,则不能表示数组a元素的表达式是()。

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

① *p ② a[10] ③ *a ④ a[p-a]

解答:因为p初值为a,所以选项①为元素a[0],选项③也为元素a[0],选项④为a[0],选项②元素下标超出下标界限(0~9)。

答案:②

(3)若有如下定义,则值为3的表达式是()。

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

① p+=2,*(p++) ② p+=2,*++p ③ p+=3,*p++ ④ p+=2,++*p

解答:四个表达式都是逗号表达式,表达式的值为第二个式子的值,选项①的p从指向a[0]改变为指向a[2],因此表达式值为3,选项②的p指向a[2],计算*++p时指针指向a[3],表达式值为4,选项③的p指向a[3],表达式值为4,选项④的p指向a[2],计算++*p后a[2]元素值变为4。

答案:①

(4)设有定义:char a[10]="ABCD",*p=a;,则*(p+4)的值是()。

① "ABCD" ②’D’ ③’\0’ ④不确定

解答:数组所赋初值为串,数组a[4]及其后的六个元素值都为'\0',*(p+4)等价于*(a+4)即a[4]。

答案:③

(5)将p定义为指向含4个元素的一维数组的指针变量,正确语句为()。

① int (*p)[4]; ② int *p[4]; ③ int p[4]; ④ int **p[4];

解答:①定义p为指向含4个整型元素的一维数组的指针变量。②定义了一个有四个元素的指针数组,数组名为p,数组中的每一个元素都是指向整型变量的指针变量。③定义了一个有四个元素的整型数组,数组名为p。④定义了一个有四个元素的二级指针数组,数组名为p,数组中的每一个元素都是指向整型指针变量的指针变量。

答案:①

(6)若有定义int a[3][4];,则输入其3行2列元素的正确语句为()。

① scanf("%d",a[3,2]); ② scanf("%d",*(*(a+2)+1))

③ scanf("%d",*(a+2)+1); ④ scanf("%d",*(a[2]+1));

解答:输入3行2列元素的值,应使用其地址,即&a[2][1],或*(a+2)+1,或a[2]+1,所以③是正确的。

答案:③

(7)下面对指针变量的叙述,正确的是()。

①指针变量可以加上一个指针变量。

②可以把一个整形数赋给指针变量。

③指针变量的值可以赋给指针变量。

④指针变量不可以有空值,即该指针变量必须指向某一变量。

解答:指针变量加上一个指针变量没有意义,所以①是错误的。不能把一个整型数直接

赋给指针变量,因为类型不匹配,所以②是错误的。指针变量可以有空值(NULL),即不指向任何变量,所以④是错误的。指针变量的值可以赋给指针变量,同类型可以直接赋值,不同类型可通过强制类型转换,所以③是正确的。

答案:③

(8)设有定义:int a[10],*p=a+6,*q=a;,则下列运算哪种是错误的()。

① p-q ② p+3 ③ p+q ④ p>q

解答:指向同一个数组的两个指针变量可以相减,其值是两个指针之间的元素个数。指向同一个数组的两个指针变量也可以比较,指向前面元素的指针“小于”指向后面元素的指针。指向数组元素的指针变量可以加减一个整型数c,加c后指向其后面的第c个元素,减c后指向其前面的第c个元素。但指向同一个数组的两个指针变量进行加法运算没有意义。

答案:③

(9)C语言中,数组名代表()。

①数组全部元素的值②数组首地址

③数组第一个元素的值④数组元素的个数

解答:C语言规定,数组名代表数组的首地址。

答案:②

(10)若有如下定义,则值为4的表达式是()。

int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};

char c=’a’,d,g;

① a[g-c] ② a[4] ③a[’d’-’c’] ④a[’d’-c]

解答:值为4的数组元素的下标为3,所以②是错误的,g-c的值不确定,’d’-’c’的值为1,只有’d’-c的值为3,所以④是正确的。

答案:④

(11)设有定义:char s[12]="string";则printf("%d",strlen(s));的输出结果是()。

① 6 ② 7 ③ 11 ④ 12

解答:函数strlen()的功能是返回字符串中第一个’\0’之前的字符个数,所以输出结果为6。

答案:①

(12)语句printf("%d",strlen("abs\no12\1\\"));的输出结果是()。

① 11 ② 10 ③ 9 ④ 8

解答:字符串中的“\n”、“\1”和“\\”都是转义字符,都表示一个字符,所以字符串中的字符个数为9。

答案:③

(13)设有定义:int t[3][2];,能正确表示t数组元素地址的表达式是()。

① &t[3][2] ② t[3] ③ t[1] ④ *t[2]

解答:C语言中,数组元素的下标从0开始,所以①和②是错误的,④表示数组元素a[2][0],③表示第二行的首地址,所以③是正确的。

答案:③

(14)语句strcat(strcpy(str1,str2),str3);的功能是()。

①将字符串str1复制到字符串str2中后再连接到字符串str3之后。

②将字符串str1连接到字符串str2中后再复制到字符串str3之后。

③将字符串str2复制到字符串str1后再将字符串str3连接到字符串str1之后。

④将字符串str2连接到字符串str1后再将字符串str1复制到字符串str3中。

解答:先执行strcpy(str1,str2),即将字符串str2复制到字符串str1中,再执行

strcat(str1,str3),即将字符串str3连接到字符串str1之后。

答案:③

(15)若有如下定义,则正确的叙述为()。

char x[]="abcdefg";

char y[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’};

①数组x和数组y等价②数组x和数组y的长度相同

③数组x的长度大于数组y的长度④数组y的长度大于数组x的长度

解答:char y[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’\0’};等价于:char x[]="abcdefg";,所以③是正确的。

答案:③

2.程序分析题

(1)下列程序的运行结果是

main()

{ int a[3][3]={{1,2},{3,4},{5,6}};

int i,j,s=0;

for(i=0;i<3;i++)

for(j=0;j<=i;j++)

s+=a[i][j];

printf("%d\n",s);

}

解答:此程序完成的功能是计算3×3矩阵的下三角阵(包括主对角线元素)元素和,运行结果是1+3+4+5+6,即19。

答案:19

(2)下列程序的运行结果是

main()

{ int i,j,k,n[3];

for(i=0;i<3;i++) n[i]=0;

k=2;

for(i=0;i

for(j=0;j

n[j]=n[i]+1;

printf("%d\n",n[1]); }

解答:当i=0时,n[0]=n[0]+1=1,n[1]=n[0]+1=2。

当i=1时,n[0]=n[1]+1=3,n[1]=n[1]+1=3。

答案:3

(3)下列程序的运行结果是

main()

{ int a[]={2,4,6,8,10};

int y=1,x,*p;

p=&a[1];

for(x=0;x<3;x++)

y+=*(p+x);

printf("%d\n",y); }

解答:程序的功能是把数组a中下标为1、2和3的元素值累加到变量y上,即:

y=1+4+6+8=19。

答案:19

(4)下列程序的运行结果是

main()

{ int i,c;

char num[][4]={"CDEF","ACBD"};

for(i=0;i<4;i++)

{ c=num[0][i]+num[1][i]-2*’A’;

printf("%3d",c);

}

}

解答:程序的功能是从左向右依次输出两个字符串对应字符的ASCII码之和与130的差值。

答案:2 5 5 8

(5)下列程序的运行结果是

main()

{ char a[]="*****";

int i,j,k;

for(i=0;i<5;i++)

{ printf("\n");

for(j=0;j

for(k=0;k<5;k++) printf("%c",a[k]);

}

}

解答:此程序的功能是输出5行“*”号,每行有5个“*”,且从上到下每行向右挫一列。

答案:

*****

*****

*****

*****

*****

(6)下列程序的功能是

main()

{ int i,a[10],*p=&a[9];

for(i=0;i<10;i++) scanf("%d",&a[i]);

for(;p>=a;p--) printf("%3d",*p);

}

答案:该程序把从键盘输入的10个整型数按相反的顺序输出。

(7)下列程序的运行结果是

main()

{ char ch[2][5]={"6937","8254"},*p[2];

int i,j,s;

for(i=0;i<2;i++) p[i]=ch[i];

for(i=0;i<2;i++)

{ s=0;

for(j=0;ch[i][j]!=’\0’;j++)

s=s*10+ch[i][j]-’0’;

printf("%5d",s);

}

}

解答:程序的功能是把数字串转换成对应的数值。

答案:6937 8254

(8)下列程序的运行结果是

#include "stdio.h"

main()

{ int i,k,a[10],p[3];

k=5;

for ( i=0;i<10;i++)

a[i]=i;

for(i=0;i<3;i++)

p[i]=a[i*(i+1)];

for( i=0;i<3;i++)

k+=p[i]*2;

printf("%d\n",k);

}

解答:由于k=5+(p[0]+p[1]+p[2])*2,且p[i]=a[i*(i+1)]=i*(i+1),所以k的值为5+(0+2+6)*2=21。

答案:21

(9)下列程序的运行结果是

#include "stdio.h"

main( )

{ int a=2,*p,**pp;

pp=&p;

p=&a;

a++;

printf("%d,%d,%d\n",a,*p,**pp);

}

解答:由于p指向a,pp又指向p,所以a、*p和**pp等价,其值都为3。

答案:3,3,3

(10)下列程序的运行结果是

main( )

{ int a[6],i;

for(i=0;i<6;i++)

{ a[i]=9*(i-2+4*(i>3))%5;

printf("%2d",a[i]);

} }

解答:程序的功能是:i的值从0到5,依次输出表达式9*(i-2+4*(i>3))%5的值。答案:-3 –4 0 4 4 3

3. 程序填空题(在下列程序的处填上正确的内容,使程序完整)

(1)下列程序的功能是输出数组s中最大元素的下标。

main()

{ int k,i;

int s[]={3,-8,7,2,-1,4};

for(i=0,k=i;i<6;i++)

if(s[i]>s[k]) ① ;

printf("k=%d\n",k);

}

解答:程序输出的是最大元素的下标,所以,应将i值赋给k,即k=i。

答案:①k=i

(2)下列程序的功能是将一个字符串str的内容颠倒过来。

#include "string.h"

main()

{ int i,j,k;

char str[]="1234567";

for(i=0,j= ② ;i

{ k=str[i];str[i]=str[j];str[j]=k;}

printf("%s\n",str);

}

解答:由于C语言中数组元素的下标从0开始,所以j的值应为字符串长度减1,即strlen(str)-1。

答案:② strlen(str)-1

(3)下列程序的功能是把输入的十进制长整型数以十六进制数的形式输出。

main()

{ char b[]="0123456789ABCDEF";

int c[64],d,i=0,base=16;

long n;

scanf("%ld",&n);

do

{c[i]= ③ ;i++;n=n/base;

}while(n!=0);

for(--i;i>=0;--i)

{ d=c[i];printf("%c",b[d]);}

}

解答:进制转换的算法是除以基数取余,所以应填n%base。

答案:③ n%base

(4)下列程序的功能是从键盘输入若干个字符(以回车键作为结束)组成一个字符串存入一个字符数组,然后输出该数组中的字符串。

#include "stdio.h"

main()

{ char str[81],*ptr;

int i;

for(i=0;i<80;i++)

{ str[i]=getchar();

if(str[i]==’\n’) break;

}

str[i]= ④ ;

ptr=str;

while(*ptr) putchar( ⑤ );

}

解答:根据while(*ptr)可知,字符串末尾应有’\0’,所以第一个空应填’\0’。当ptr 所指向的字符不为’\0’时,将其输出,并且使ptr指向下一个字符,所以第二个空应填*ptr++。

答案:④’\0’⑤ *ptr++

(5)下列程序的功能是将数组a的元素按行求和并存储到数组s中。

main()

{ int s[3]={0};

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int i,j;

for(i=0;i<3;i++)

{ for(j=0;j<4;j++)

⑥ ;

printf("%d\n",s[i]);

}

}

解答:根据题意,应将第i行累加到数组元素s[i]中。程序中的外循环次数是行数,内循环次数是列数,所以应填s[i]+=a[i][j](或s[i]=s[i]+a[i][j])。

答案:⑥ s[i]+=a[i][j](或s[i]=s[i]+a[i][j])

4. 程序改错题(下列每小题有一个错误,找出并改正)

(1)下列程序的功能是输入一个字符串,然后再输出。

main()

{ char a[20];

int i=0;

scanf("%s",&a);

while(a[i]) printf("%c",a[i++]);

}

解答:使用scanf()函数时,输入项是地址,数组名本身就是地址,对数组名进行取地址运算没有意义。

答案:错误行:scanf("%s",&a); 修改为:scanf("%s",a);

(2)下列程序的功能是复制字符串a 到b中。

main()

{ char *str1=a,*str2,a[20]="abcde",b[20];

str2=b;

while(*str2++=*str1++);

}

解答:程序中用数组名a初始化指针变量str1,但此时数组a还没有定义,C语言规定,变量或数组必须先定义后使用,所以,必须先定义数组a,然后再定义指针变量str1,并用a 对其初始化。

错误行:char *str1=a,*str2,a[20]="abcde",b[20];

修改为:char a[20]="abcde",*str1=a,*str2, b[20];

(3)下列程序的功能是统计字符串中空格数。

#include "stdio.h"

main()

{ int num=0;

char a[81],*str=a,ch;

gets(a);

while((ch=*str++)!=’\0’)

if(ch=’’) num++;

printf("num=%d\n",num);

}

解答:“=”是赋值运算符,程序中进行条件判断应使用关系运算符“==”。

答案:错误行:if(ch=’’) num++; 修改为:if(ch==’’) num++;

(4)下列程序的功能是将字符串str中小写字母的个数、大写字母的个数和数字字符的个数分别存入a[0]、a[1]和a[2]中。

#include "stdio.h"

main()

{ char str[80];

int a[3],i=0;

gets(str);

for(;str[i]!=’\0’;i++)

if(str[i]>=’a’&&str[i]<=’z’) a[0]++;

else if(str[i]>=’A’&&str[i]<=’Z’) a[1]++;

else if(str[i]>=’0’&&str[i]<=’9’) a[2]++;

for(i=0;i<3;i++)

printf("%4d\n",a[i]);

}

解答:数组a在定义时没有初始化,所以数组元素的初始值是随机的,因此,得到的统计结果不正确。

答案:错误行:int a[3],i=0; 修改为:int a[3]={0},i=0;

(5)下列程序的功能是计算3×3矩阵的主对角线元素之和。

main()

{ int i,a[3][3]={1,2,3,4,5,6,7,8,9},sum=0;

for(i=1;i<=3;i++) sum+=a[i][i];

printf("sum=%d\n",sum);

}

解答:C语言中数组元素的下标是从0开始的,所以循环变量i的取值应该是0到2。

答案:

错误行:将语句for(i=1;i<=3;i++) sum+=a[i][i];

修改为:for(i=0;i<3;i++) sum+=a[i][i];

5. 程序设计题

(1)输入10个整型数存入一维数组,输出值和下标都为奇数的元素个数。

main()

{ int a[10],i,num=0;

printf("enter array a:\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<10;i++)

if(i%2==1&&a[i]%2==1) num++;

printf("num=%d\n",num);

}

(2)从键盘输入任意10个数并存放到数组中,然后计算它们的平均值,找出其中的最大数和最小数,并显示结果。

解答:

main()

{ float a[10],ave=0,max,min;

int i;

printf("enter array a:\n");

for(i=0;i<10;i++)

scanf("%f",&a[i]);

max=a[0];min=a[0];

for(i=0;i<10;i++)

{ ave+=a[i];

if(max

if(min>a[i]) min=a[i];

}

ave/=10;

printf("ave=%.2f max=%.2f min=%.2f\n",ave,max,min);

}

(3)有5个学生,每个学生有四门课程,将有不及格课程的学生成绩输出。

解答:

main()

{ int a[5][4]={{78,87,93,65},

{66,57,70,86},

{69,99,76,76},

{78,59,87,90},

{90,67,97,87}};

int i,j,k;

for(i=0;i<5;i++)

for(j=0;j<4;j++)

if(a[i][j]<60)

{ printf("%4d",i+1);

for(k=0;k<4;k++)

printf("%4d",a[i][k]);

printf("\n");

break;

}

}

(4)已知两个升序序列,将它们合并成一个升序序列并输出。

解答:用数组a 、b 分别存放两个已知的升序序列,然后用下列方法将数组a 、b 中的元素逐个插入到数组c 中。

???>≤=][][][][][][][j b i a j b j b i a i a k c

其中i 、j 、k 的初值都为0,插入后k 的值加1,i 或j 的值加1。

main()

{ int a[4]={1,3,5,7};

int b[5]={2,4,6,8,10};

int c[20],i=0,j=0,k=0;

while(i<4&&j<5)

if(a[i]

else c[k++]=b[j++];

while(i<4) c[k++]=a[i++];

while(j<5) c[k++]=b[j++];

for(i=0;i

printf("%5d",c[i]);

printf("\n");

}

(5)从键盘上输入一个字符串,统计字符串中的字符个数。不许使用求字符串长度函数strlen()。

解答:

#include "stdio.h"

main()

{ char str[81],*p=str;

int num=0;

printf("input a string:\n");

gets(str);

while(*p++) num++;

printf("length=%d\n",num);

}

(6)输入一个字符串存入数组a ,对字符串中的每个字符用加3的方法加密并存入数组b ,再对b 中的字符串解密存入数组c ,最后依次输出数组a 、b 、c 中的字符串。

解答:

#include "stdio.h"

main()

{ char a[81],b[81],c[81];

char *pa=a,*pb=b,*pc=c;

printf("input array a:\n");

gets(a);

第4章数组练习题

一填空题 1)数组的元素通过索引来访问,数组Array的长度为Array.length 。 2)数组复制时,"="将一个数组的引用传递给另一个数组。 3)没有显式引用变量的数组称为匿名数组。 4)JVM将数组存储在堆(堆或栈)中。 5)数组的二分查找法运用的前提条件是数组已经。 6)矩阵或表格一般用二维数组表示。 7)如果把二维数组看成一维数组,那么数组的元素是一维数组。 8)Java中数组的下标的数据类型是int 。 9)不用下标变量就可以访问数组的方法是foreach循环。 10)数组最小的下标是0 。 11)arraycopy()的最后一个参数指明长度。 12)向方法传递数组参数时,传递的是数组的引用。 13)线性查找法的平均查找长度为。 14)数组初始化包括数组的声明,创建和初始化。 15)数组下标访问超出索引范围时抛出数组索引超出绑定异常 16)浮点型数组的默认值是0.0 f 。 17)对象型数组的默认值是null 。 18)对象类型的数组虽然被默认初始化,但是并没有调用构造函数。 19)二维数组的行的长度可以不同。 20)数组创建后其大小不能改变。 二选择题 1.下面错误的初始化语句是__D_ A. char str[]="hello"; B. char str[100]="hello"; C. char str[]={'h','e','l','l','o'}; D. char str[]={'hello'}; 2.定义了一维int型数组a[10]后,下面错误的引用是_B__ A. a[0]=1; B. a[10]=2; C. a[0]=5*2; D. a[1]=a[2]*a[0]; 3.下面的二维数组初始化语句中,正确的是_B___ A. float b[2][2]={0.1,0.2,0.3,0.4}; B. int a[][]={{1,2},{3,4}}; C. int a[2][]= {{1,2},{3,4}}; D. float a[2][2]={0}; 4.引用数组元素时,数组下标可以是_D___ A. 整型常量 B. 整型变量 C. 整型表达式 D. 以上均可 5.定义了int型二维数组a[6][7]后,数组元素a[3][4]前的数组元素个数为__B__ A. 24 B. 25 C. 18 D. 17 6.下列初始化字符数组的语句中,正确的是_C___ A. char str[5]="hello"; B. char str[]={'h','e','l','l','o','\0'}; C. char str[5]={"hi"}; D. char str[100]=""; 7.数组在Java中储存在 C 中

C语言程序设计习题参考答案第四章(数组)

第四章数组参考答案 一、选择题:1、 B 2、C 3、D 4、C 5、C 6、B 7、D 8、B 9、B 10、A 二、填空题: 1、首地址 2、按行存放 3、一个字符 4、′\0′ 5、字符数组名或字符串 6、9 0 7、6 8、j-1 str[j-1] 9、62 10、s1[i]=s2[i]; 三、改错题 1、错误语句:int a[3][ ]={2,4,6,8,10,12,14,16,18}; 正确语句:int a[ ][3]={2,4,6,8,10,12,14,16,18}; 2、错误语句:if (str[2]>string) string=str[2]; 正确语句:if (strcmp(str[2],string)>0) strcpy(string,str[2]); 3、错误语句:char c[5]={'C','h ','i','n','a '}; 正确语句:char c[6]={'C','h ','i','n','a '};或char c[ ]={“China”}; 4、错误语句:int a[3]={3*0} ; 正确语句:int a[4]; 5、错误语句:scanf(“%d%d%d”,&a); 正确语句:for (i=0; i<3; i++) scanf(“%d”,&a[i]); 或scanf(“%d%d%d”, &a[0], &a[1], &a[2]); 四、编程题 1、用数组来处理,求解Fibonacci数列前40项:1,1,2,3,5,8,13,21…。 #include void main() { int i; int t[40]={1,1}; for(i=2;i<40;i++) t[i]=t[i-2]+t[i-1]; for(i=0;i<40;i++) { if(i%5==0) printf("\n"); printf("%15d",t[i]); } } 2、用选择法对20个整数排序(由大到小)。 #include void main() {int i,j,min,t,x[20]; for(i=0;i<20;i++) scanf("%d",&x[i]); for(i=0;i<19;i++) {min=i; for(j=i+1;j<20;j++) if(x[min]>x[j])min=j; t=x[i];

第4章 数组练习题答案

第4章数组练习题 一、选择题 1.在c语言中,引用数组元素时,其数组下标的数据类型允许是()。 A)整型常量 B)整型表达式C)整型常量或整型表达式 D)任何类型的表达式 2.要说明一个有10个int元素的数组,应当选择语句()。 A) int a[10]; B) int a(10); C) int a[9] D) int a[11] 3.对以下说明语句的正确理解是()。 int a[10]={6,7,8,9,10}; A)将5个初值依次赋给a[1]至a[5] B)将5个初值依次赋给a[0]至a[4] C)将5个初值依次赋给a[6]至a[10] D)因为数组长度与初值的个数不相同,所以此语句不正确 4.已知:int a[10];则对a数组元素的正确引用是()。 A) a[10] B) a[3.5] C) a(5) D) a[10-10] 5.以下对一维整型数组a的正确说明是()。 A) int a(10); B)int n=10,a[n]; C) int n; D)#define SIZE 10; scanf("%",&n); int a[SIZE]; int a[n]; 6.要定义一个int型一维数组art,并使其各元素具有初值89,-23,0,0,0,不正确的定义 语句是()。 A) int art[5]={89,-23}; B) int art[ ]={89,-23}; C) int art[5]={89,-23,0,0,0}; D) int art[ ]={89,-23,0,0,0}; 7.在C语言中,二维数组元素在内存中的存放顺序是()。 A)按行存放 B)按列存放 C)由用户自己定义 D)由编译器决定 8.以下对二维数组a的正确说明是()。 A)int a[3][] B) float a(3,4) C) double a[1][4] D) float a(3)(4) 9.已知:int a[3][4];则对数组元素引用正确的是()。 A)a[2][4] B)a[1,3] C) a[2][0] D) a(2)(1) 10.已知:int a[3][4]={0};则下面正确的叙述是()。 A)只有元素a[0][0]可得到初值0 B)此说明语句是错误的 C)数组a中的每个元素都可得到初值,但其值不一定为0 D)数组a中的每个元素均可得到初值0 11.以下各组选项中,均能正确说明二维实型数组a的是()。 A) float a[3][4]; B) float a(3,4); float a[][4]; float a[3][4]; float a[3][]={{1},{0}}; float a[][]={{0},{0}}; C) f loat a[3][4]; D) float a[3][4]; float a[][4]={{0},{0}}; float a[3][]; float a[][4]={{0},{0},{0}}; float a[][4]; 12.已知:int a[][3]={1,2,3,4,5,6,7};则数组a的第一维的大小是()。 A)2 B)3 C)4 D)无确定值 13.若二维数组a有m列,则在a[i][j]之前的元素个数为()。 A) j*m+i B) i*m+j C) i*m+j-1 D) i*m+j+1 14.要使字符数组str存放一个字符串"ABCDEFGH",正确的定义语句是()。 A) char str[8]={'A','B','C','D','E','F','G','H'};

第四章:数组的定义及使用

数组的定义及使用 数组是一组相关数据的集合,一个数组实际上是一连串的变量,数组按照使用可以分为一维数组,二维数组和多维数组。 一.一维数组 一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的。 要使用Java中的数组,必须经过声明数组和分配内给数组两个步骤。 一般步骤: 数据类型数组名[]=null; 数组名=new 数据类型[长度]; 也可简化为: 数据类型[] 数组名=null; 数组声明格式中,“数据类型”指的是声明数组元素的数据类型,“数组名”是用来统一这一组相同数据类型的元素的名称,其命名规则和变量命名规则相同,建议用有意义的名字来命名。数组声明后实际上是在栈内存中保存了此数组的名称(实际上是保存了对堆内存的引用地址),接下来就要在堆内存中配置数组所需的内存。“长度”是告诉编译器所声明的数组要存放多少个数据,而关键字new则是命令编译器根据括号里的长度在堆内存中开辟一块堆内存供该数组使用。 【例】 int score[]=null;//null表示引用数据类型的默认值。 score=new int[3]; 内存分配的过程: 过程分析:一个数组开辟了堆内存之后,将在堆内存中存储保存数据,并将堆内存的操作地址给了数组的名称score。因为数组是引用数据类型,所以数组变量score所保存的不是数组的实体,而是数组堆内存的参考地址。 二.数组中元素的表示方法 要访问数组中的元素,必须利用索引来完成。Java中的数组索引编号是从0开始的。以score[10],为例,score[0]代表第一个元素,score[1]是第二个元素、、、score[9]是第十个元素。

数据机构第四章——java语言描述 第4章 串与数组 习题参考答案..

习题四参考答案 一、选择题 1.下面关于串的叙述中,哪一个是不正确的?(B ) A.串是字符的有限序列 B.空串是由空格构成的串 C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储 2.串的长度是指( A ) A. 串中包含的字符个数 B. 串中包含的不同字符个数 C. 串中除空格以外的字符个数 D. 串中包含的不同字母个数 3.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为( C )A.求子串B.联接C.模式匹配D.求串长 4.设主串的长度为n,模式串的长度为m,则串匹配的KMP算法时间复杂度是( C )。 A. O(m) B. O(n) C. O(n + m) D. O(n×m) 5. 串也是一种线性表,只不过( A )。 A. 数据元素均为字符 B. 数据元素是子串 C. 数据元素数据类型不受限制 D. 表长受到限制 6.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主进行存储,a11为第一元素, 其存储地址为1,每个元素占一个地址空间,则a85的地址为( B )。 A. 13 B. 33 C. 18 D. 40 7. 有一个二维数组A[1..6, 0..7] ,每个数组元素用相邻的6个字节存储,存储器按字节编址, 那么这个数组占用的存储空间大小是(D )个字节。 A. 48 B. 96 C. 252 D. 288 8.设有数组A[1..8,1..10],数组的每个元素占3字节,数组从内存首地址BA开始以列序 为主序顺序存放,则数组元素 A[5,8]的存储首地址为( B )。 A. BA+141 B. BA+180 C. BA+222 D. BA+225 9. 稀疏矩阵的三元组存储表示方法( B ) A. 实现转置操作很简单,只需将每个三元组中行下标和列下标交换即可 B. 矩阵的非零元素个数和位置在操作过程中变化不大时较有效 C. 是一种链式存储方法 D. 比十字链表更高效 10. 用十字链表表示一个稀疏矩阵,每个非零元素一般用一个含有( A )域的结点表示。 A.5 B.4 C. 3 D. 2 二、填空题 1. 2.串长度为0 3. 4. 5. 模式串t="ababaab"的next[]nextval[]数组值为。 6. 设数组A[1..5,1..6]的基地址为1000,每个元素占5个存储单元,若以行序为主序顺序 存储,则元素A[5,5]

vb第四章数组习题

第一章数组 一、选择题 1.在窗体上画一个命令按钮,然后编写如下程序: Option Base 1 Private Sub Command1_Click(Index As Integer) Dim Arr1(12) As Integer, Arr2(3) As Integer Dim Sum As Integer Sum = 2 For i = 1 To 12 Arr1(i) = i Next i For i = 1 To 3 Arr2(i) = Arr1(i * i) Next i For i = 1 To 3 Sum = Sum + Arr2(i) Next i Print Sum End Sub 程序运行后,单击命令按钮,在窗体上的输出结果是 A.16B.24 C.32 D.36 2.在窗体上画一个文本框,然后编写如下代码: Option Base 1 Private Sub Form_Click() Dim arr Dim Start As Integer, Finish As Integer Dim Sum As Integer arr = Array(12, 4, 8, 16) Start = LBound(arr) Finish = UBound(arr) Sum = 0 For i = Start To Finish Sum = Sum + arr(i) Next i c = Sum / Finish = c End Sub 程序运行后,单击窗体,则在文本框中显示的内容是 A.40 B.10C.12 D.16 3.阅读程序: Option Base 1

PTA第四章串、数组和广义表练习题

B(2.0) D(2.0) D(2.0) D(2.0) D(2.0) A(2.0) B(2.0) B(2.0) D(2.0) C(2.0) D(2.0) D(2.0) 2-1 广义表是一种(B)数据结构。(2分) 1.非递归的 2.递归的 3.树型 4.图状 作者: 严冰 单位: 浙江大学城市学院 2-2 一个广义表为( a, (b, c), d, (), ((f, g), h) ),则该广义表的长度与深度分别为(D)。(2分) 1.4和6 2.6和3 3.3和5 4.5和3 作者: 严冰 单位: 浙江大学城市学院 2-3 稀疏矩阵的快速转置算法的时间复杂度是(D)。(2分) 1.三次方时间 2.二次方时间 3.对数时间 4.线性时间 作者: 严冰

单位: 浙江大学城市学院 2-4 在定义稀疏矩阵的十字链接存储结构时,每个结点结构需包含(D)个域。(2分) 1. 4 2. 3 3. 6 4. 5 作者: 严冰 单位: 浙江大学城市学院 2-5 广义表与稀疏矩阵都是线性表的扩展,它们的共同点为(D)。(2分) 1.都可以用链接结构与顺序结构存储 2.无共同点 3.都是递归结构 4.数据元素本身是一个数据结构 作者: 严冰 单位: 浙江大学城市学院 2-6 (neuDS_C++)以下叙述中正确的是(A )。(2分) 1.串是一种特殊的线性表 2.串的长度必须大于零 3.串中元素只能是字母 4.空串就是空白串 作者: 姚志军 单位: 广东东软学院

2-7 (neuDS_C++)串是一种特殊的线性表,其特殊性体现在(B )。(2分) 1.可以顺序存储 2.数据元素是一个字符 3.可以链接存储 4.数据元素可以是多个字符 作者: 姚志军 单位: 浙江大学 2-8 (neuDS_C++)设有两个串p和q,求q在p中首次出现的位置的运算称作( B)。(2分) 1.连接 2.模式匹配 3.求子串 4.求串长 作者: 姚志军 单位: 广东东软学院 2-9 (neuDS_C++)设串s1=’ABCDEFG’,s2=’PQRST’,函数con (x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con (subs (s1,2,len (s2)), subs (s1,len (s2),2))的结果串是 (D )。(2分) 1.BCDEF 2.BCDEFG 3.BCPQRST 4.BCDEFEF

第四章串和数组习题

第四章串和数组 一.选择题 1.串是一种特殊的线性表,其特殊性体现在() A.可以顺序存储B.数据元素是一个字符 C.可以链式存储D.数据元素可以是多个字符 2.串的长度是() A.串中不同字母的个数B.串中不同字符的个数 C.串中所含字符的个数,且大于0 D.串中所含字符个数 3.若串S=”software”,其子串数目是() A.8 B.37 C.36 D.9 4.数组A[0..5,0..6]的每个元素占5个单元,将其按列优先次序存储在起始地址为1000的连续内存单元中,则元素A[5][5]的地址为() A.1175 B.1180 C.1205 D.1210 5.对矩阵压缩存储是为了() A.方便运算B.节省存储空间C.方便存储D.提高运算速度 6.一个n 阶对称矩阵,如果采用压缩存储方式,则容量为() A.n2B.n2/2 C.n(n+1)/2 D.(n+1)2/2 7.对稀疏矩阵采用压缩存储,其缺点之一是() A.无法判断矩阵有多少行多少列B.无法根据行列号查找某个矩阵元素 C.无法根据行列号计算矩阵元素的存储地址D.使矩阵元素之间的逻辑关系更加复杂二.填空 1.设串s1=”I am a student”,则串长为() 2.设有两个串p和q,其中q是p的子串,求子串q 在p中首次出现位置的算法称为()3.一维数组的逻辑结构是(),存储结构是();对于二维或多维数组,分为按()和()两种不同的存储结构。 4.数组A[1..10,-2..6,2..8]以行优先顺序存储,设第一个元素的首地址为100,每个元素占3个单元的存储空间,则元素A[5][0][7]的存储地址为() 5.三维数组R[C1..D1,C2..D2,C3..D3]共含有()个元素。 三、算法设计 1.编写下列算法(假定下面所用的串均采用顺序存储方式,参数c、c1和c2均为字符型):(1)将串S中所有其值为c1的字符换成c2的字符。 (2)将串S中所有字符逆序 (3)从串S中删除其值等于c的所有字符 (4)从串S中第index个字符起求出首次与字符串S1相同的子串的起始位置 (5)从串S中删除重第i个字符起的j 个字符 (6)从串S中删除所有与串S1相同的子串(允许调用第(4)题和第(5)题的算法)2.设计程序,计算串str中每一个字符出现的次数。 3.采用顺序结构存储串,编写一个算法计算制定子串在一个字符串中出现的次数,如果该子串不出现则为0。 4.如果矩阵A中存在这样一个元素A[i][j]满足条件:A[i][j]是第i行中值最小的元素,且又是第j 列中值最大的元素,则称为该矩阵的一个马鞍点。编写一个算法计算出m×n的矩阵A的所有马鞍点。 5.编写一个算法,计算一个三元组表表示的稀疏矩阵的对角线元素之和。 6.系数矩阵只存放其非零元素的行号、列号和数值,用一维数组顺序存放之,行号-1作为

第4章数组练习题

一填空题 1)数组的元素通过来访问,数组Array的长度为。 2)数组复制时,"="将一个数组的传递给另一个数组。 3)没有显式引用变量的数组称为数组。 4)JVM将数组存储在(堆或栈)中。 5)数组的二分查找法运用的前提条件是数组已经。 6)矩阵或表格一般用维数组表示。 7)如果把二维数组看成一维数组,那么数组的元素是数组。 8)Java中数组的下标的数据类型是。 9)不用下标变量就可以访问数组的方法是。 10)数组最小的下标是。 11)arraycopy()的最后一个参数指明。 12)向方法传递数组参数时,传递的是数组的。 13)线性查找法的平均查找长度为。 14)数组初始化包括。 15)数组下标访问超出索引范围时抛出异常 16)浮点型数组的默认值是。 17)对象型数组的默认值是。 18)对象类型的数组虽然被默认初始化,但是并没有构造函数。 19)二维数组的行的长度不同。 20)数组创建后其大小改变。 二选择题 1.下面错误的初始化语句是___ A. char str[]="hello"; B. char str[100]="hello"; C. char str[]={'h','e','l','l','o'}; D. char str[]={'hello'}; 2.定义了一维int型数组a[10]后,下面错误的引用是___ A. a[0]=1; B. a[10]=2; C. a[0]=5*2; D. a[1]=a[2]*a[0]; 3.下面的二维数组初始化语句中,正确的是____ A. float b[2][2]={0.1,0.2,0.3,0.4}; B. int a[][]={{1,2},{3,4}}; C. int a[2][]= {{1,2},{3,4}}; D. float a[2][2]={0}; 4.引用数组元素时,数组下标可以是____ A. 整型常量 B. 整型变量 C. 整型表达式 D. 以上均可 5.定义了int型二维数组a[6][7]后,数组元素a[3][4]前的数组元素个数为____ A. 24 B. 25 C. 18 D. 17 6.下列初始化字符数组的语句中,正确的是____ A. char str[5]="hello"; B. char str[]={'h','e','l','l','o','\0'}; C. char str[5]={"hi"}; D. char str[100]=""; 7.数组在Java中储存在中

《数据结构》第四章 串 习题

《数据结构》第四章串习题 基本概念题: 4-1 设S1 =“Data Structure Course”,S2 =“Structure”,S3 =“Base”,求:(1)Length(S1);(2)Compare(S2, S3); (3)Insert(S1, 5, S3);(4)Delete(S1, 5, 9); (5)SubString(S1, 5, 9, T);(6)Search(S1, 0, S2); (7)Replace(S1, 0, S2, S3) 4-2 什么叫串?串和字符在存储方法上有什么不同?空串和空格串是否相同,为什么? 4-3 串是由字符组成的,长度为1的串和字符是否相同。为什么? 4-4 串是不定长的,表示串的长度有几种方法?C语言中的串采用哪种方法? 4-5 可以说串是数据类型固定为字符类型的线性表,但是串操作和线性表操作的主要不同之处在哪里? 4-6 可以用几种存储方法存储串? 4-7 分别写出串的静态数组存储结构和串的动态数组存储结构的结构体定义。 4-8 为什么动态数组结构下串的实现要增加撤消函数? 复杂概念题: 4-9 令t1=“aaab”, t2=“abcabaa”, t3=“abcaabbabcabaacba”,试分别求出他们的next[j]值。 4-10 简述模式匹配的Brute-Force算法思想。简述模式匹配的KMP算法思想。 4-11 简述求子串的next[j]值的算法思想。 算法设计题: 4-12 设串采用静态数组存储结构,编写函数实现两个串的比较Compare(S, T)。要求比较结果有等于和不等于两种情况。 4-13 设串采用静态数组存储结构,编写函数实现两个串的比较Compare(S, T)。要求比较结果有大于、等于和小于三种情况。 4-14 设串采用动态数组存储结构,编写函数实现两个串的比较Compare(S, T)。要求比较结果有大于、等于和小于三种情况。对比本题和习题4-13的算法,说明串的静态数组存储结构和串的动态数组存储结构是否对编写串的比较算法有影响。 4-15 设串采用静态数组存储结构,编写函数实现串的替换Replace(S, start, T, V),即要求在主串S中,从位置start开始查找是否存在子串T,若主串S中存在子串T,则用子串V 替换子串T,且函数返回1;若主串S中不存在子串T,则函数返回0。 4-16 设字符串采用静态数组的顺序存储结构, (1)编写算法删除字符串s中值等于ch的一个字符,并分析该算法的时间复杂度; (2)编写算法删除字符串s中值等于ch的所有字符。 4-17 设字符串采用单字符的链式存储结构,编写删除串s从位置i开始长度为k的子串的算法。 *4-18 设字符串采用块链存储结构,编写删除串s从位置i开始长度为k的子串的算法。 上机实习题: 4-19 在4.4.3节例4-6的基础上,编写比较 Brute-Force算法和KMP算法比较次数的程序。 4-20 设串采用静态数组存储结构,编写函数实现串的替换Replace(S, start, T, V),

第四章 数组习题集答案

第四章数组习题 一、选择题 1. 如果char型变量占两个字节的存储单元,则按照如下方式定义的数组x占用的字节数 是【】。 char x[50]={2,4,6,8,10}; A)50 B)100 C)10 D) 5 2. 下面关于数组的定义正确的是【】。 A) int n=10; float a[n]={1.0,2.1,3.2}; B) #define N 10 int a[N]={1,2,3}; C) int n; scanf("%d", &n); int a[n]; D) #define N 10; int a[N]={1,2,3}; 3. 若有说明int a[5][4]; 则对其数组元素的正确引用是【】。 A)a[3+1][2] B)a(2)(3) C)a[0,2]D)a[3][5] 4. 若定义了数组int k[][4]={{1},{1,2,3},{5,6}};则数组共有【】元素。 A)6 B)9 C)10 D)12 5. 要将20,30,40,50 存入数组b中, 下列正确的程序段是【】。 A) int i,b[4]; for(i=0; i<4; i++) b[i]=(i+2)*10; B) int b[4]; b={20,30,40,50}; C) int b[4]; b[1]=20,b[2]=30,b[3]=40,b[4]=50; D) int b[4]; b[4]={20,30,40,50}; 6. 下列二维数组初始化语句中正确且与语句float a[]={0,1,2,0,4,0}等价的是【】。 A)float a[6]={0,1,2,0,4}; B)float a[]={0,1,2,0,4}; C)float a[7]={0,1,2,0,4,0}; D)float a[5]={0,1,2,0,4}; 7. printf("%d \n ", strlen ("ATS\n012\1\\" )) ; 程序段的输出结果是【】。

第4章_数组c++_习题答案解析

习题 4 一、单项选择题 1. 若有说明int a[3][4];则a数组元素的非法引用是【】 A. a[0][2*1] B. a[1][3] C. a[4-2][0] D. a[0][4] 【答案】D 【解析】数组下标从0开始,a[0][4]的列下标越界。 2. 在C++语言中,引用数组元素时,其数组下标的数据类型允许是【】 A. 整型常量 B. 整型表达式 C. 整型常量或整型表达式 D. 任何类型的表达式 【答案】C 3. 以下不正确的定义语句是【】 A. double x[5]={2.0,4.0,6.0,8.0,10.0}; B. int y[5]={0,1,3,5,7,9}; C. char c1[]={′1′,′2′,′3′,′4′,′5′}; D. char c2[]={′\x10′,′\xa′,′\x8′}; 【答案】B 【解析】初始值的个数大于数组的大小,系统会出现编译错误。 4. 对以下说明语句的正确理解是【】 i nt a[10]={6,7,8,9,10}; A. 将5个初值依次赋给a[1]至a[5] B. 将5个初值依次赋给a[0]至a[4] C. 将5个初值依次赋给a[6]至a[10] D. 因为数组长度与初值的个数不相同,所以此语句不正确 【答案】 B 5. 若有说明:int a[ ][4]={0,0};则下面不正确的叙述是【】 A. 数组a的每个元素都可得到初值0 B. 二维数组a的第一维大小为1 C. 当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小 D. 只有元素a[0][0]和a[0][1]可得到初值,其余元素均得不到确定的初值 【答案】D 【解析】二维数组初始化时,行大小可以省略,被省略的大小根据初值的个数系统来确定,本题中,有2个初值说明是1行4列,所以第一维为1。元素a[0][0]和a[0][1]赋初值为0 ,其余元素初值系统默认为0。 6. 以下能对二维数组c进行正确的初始化的语句是【】 A. int c[3][]={{3},{3},{4}}; B. int c[][3]={{3},{3},{4}}; C. int c[3][2]={{3},{3},{4},{5}};

相关文档