文档视界 最新最全的文档下载
当前位置:文档视界 › 第8章数组类型习题及答案

第8章数组类型习题及答案

8-1 编写程序,将10个数34,3,29,63,70,16,85,82,90,93存放于一组数组中,求出这十个数的和及平均值。

解:#include "stdio.h"

void main()

{

int a[10]={34,3,29,63,70,16,85.82,90,93};

int i ,sum=0;

float average ;

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

{

sum=sum+a[i] ;

}

average=sum/10.0;

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

}

运行结果:sum=565,average=56.5000

思考:数组有何特点?此问题如果不用数组进行处理将会怎样?

8-2 编写程序,求存放于上题数组中10个数的最大值,最小值及所在的位置。

解:#include "stdio.h"

void main()

{

int a[10]={34,3,29,63,70,16,85,82,90,93};

int i,sum,max,min,d_max,d_min;

max=min=a[0];

d_max=d_min=0;

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

{

if(a[i]>max) {max=a[i];d_max=i;}

if(a[i]

}

printf("max=%d,a[%d]\n",max,d_max);

printf("min=%d,a[%d]\n",min,d_min);

}

运行结果:max=93,a[9]

Min=3,a[1]

思考:数组a[i]中i的变化意味着什么?

8-3 编写程序,从键盘读入50个数存放于一数组中,求出该数组中最大值、最小值及所在位置。

解:#include "stdio.h"

void main()

{

float a[50],max,min;

int i,d_max,d_min;

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

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

max=min=a[0];

d_max=d_min=0;

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

{

if(a[i]>max) {max=a[i];d_max=i;}

if(a[i]

}

printf("max=%d,a[%d]\n",max,d_max);

printf("min=%d,a[%d]\n",min,d_min);

}

思考:此题中不用数组也可以处理吗?如果可以,区别之处在哪里?8-4将存放于上题数组中的50个数分别按升序,降序排序。

解:#include "stdio.h"

#define N 3

void main()

{

float a[N] ,t;

int i,j;

for(i=0;i

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

/*按升序排序*/

for(i=0;i

{

for(j=i;j

if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}

printf("%8.2f ",a[i]);

}

printf("\n");

/*按降序排序*/

for(i=0;i

{

for(j=i;j

if(a[i]

printf("%8.2f ",a[i]);

}

printf("\n");

}

思考:此题中可以不用数组进行处理吗?(进一步理解数组的特点。)8-5 编写程序,从键盘输入某班学生C语言课程考试成绩,评定每个学生C语言成绩等级。如果高于平均分10分,则等级为优秀;如果低于平均分10分,则等级为一般;否则等级为中等。

解:#include "stdio.h"

#define N 3

void main()

{

int i ,j;

float average,a[N],sum=0;

for(i=0;i

{

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

sum=sum+a[i];

}

average=sum/N;

for(i=0;i

{

if(a[i]>average+10) printf("a[%d]优秀\n",i);

else if(a[i]

else printf("a[%d]中等\n",i);

}

}

思考:表示数组元素的a[i]一般称为什么变量?它与一般变量有何区别?

8-6 某班期终考试有六门课程,编写程序计算每门课程的平均成绩。进一步考虑全年级10个班的情况。

解:#include "stdio.h"

#define N 30

#define M 6

void main()

{

int i,j;

float average[M],a[N][M],sum=0;

for(i=0;i

for(j=0;j

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

for(j=0;j

{

sum=0;

for(i=0;i

sum=sum+s[i][j] ;

average[j]=sum/N;

}

printf("6门课程的平均成绩分别为:\n");

for(i=0;i

{

printf("%f ",average[i]);

}

printf("\n") ;

}

思考:在此题中定义的数组a[N][M]中,N表示什么?M 表示什么?若考虑全年级10个班的情况,程序应做哪些改进?

8-7 编写程序,将一个一维数组进行逆置。例如,原来顺序为1,3,5,7,则逆置后的顺序为7,3,5,1.

解:#include "stdio.h"

#define N 4

void fun(int a[])

{

int i,t ;

for(i=0;i

{

t=a[i] ;

a[i]=a[N-1-i];

a[N-1-i]=t;

}

for(i=0;i

{

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

}

}

void main()

{

int i ,a[N] ;

printf("请输入一维数组各元素的值:\n");

for(i=0;i

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

fun(a);

printf("\n");

}

思考:如果要对7个元素的数组进行逆置操作,只需要修改什么地方?数组元素的下标可以是算术表达式吗?有何要求?

8-8 编写程序,打印如下的杨辉三角形。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

解:#include "stdio.h"

#define N 6

void main()

{

int i,j,a[N][N]={1},k;

for(i=1;i

{

for(j=1;j

if(j==1||i==j) a[i][j]=a[0][0] ;

else a[i][j]=a[i-1][j-1]+a[i-1][j] ;

}

for(i=1;i

{

for(k=1;k<=N-i;k++) /* 每行前面的空格*/

printf(" ") ;

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

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

printf("\n") ;

}

}

思考:在此题中定义一个a[N][N]的方阵数组显然有些浪费(有些元素闲置,却占用存储空间),可否考虑用一维数组进行处理?

8-9 编写程序,用筛选法求100-1000之间的素数。

解:#include "stdio.h"

#define N 1000

void main()

{

int i,a[N],n=0,db ;

for(i=1;i

a[i]=1 ;

for(i=2;i

{

if(a[i]==0) continue ;

db=i*2;

while(db

{

a[db]=0;

db=db+i;

}

}

for(i=100;i

if(a[i]==1)

{

printf("%d",i);

n++ ;

if(n%18==0) printf("\n") ;

}

printf("\n") ;

}

思考:在程序实际已求出了什么范围之间的所有素数?在while循环中的“a[db]=0;”语句的作用是什么了?

8-10 编写程序,利用数组实现大整数的加减运算。假定大整数不超过10位数字。

解:#include "stdio.h"

#include "string.h"

#define N 10

int a[N],b[N],c[N],d[N],jw=0;

int flag=1 ;/*标志两个大整数的大小关系*/

void chag0(int a[],int n)

{

for(int i=0;i<=n;i++)

a[i]=0;

}

void add() /*求两个大整数的和*/

{

int i ;

for(i=0;i

{

c[i]=(a[i]+b[i]+jw)%10 ;

jw=(a[i]+b[i]+jw)/10 ;//计算进位}

jw=0 ;

printf("两数和为:");

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

if(!c[i]&&!jw)

continue ;

else

{

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

jw=1 ;

}

printf("\n") ;

}

void mus() /*求两个大整数的差*/ {

int i ;

jw=0;

for(i=0;i

{

if(a[i]-jw>=b[i])

{

d[i]=a[i]-b[i]-jw ;

jw=0 ;//表示无借位

}

else

{

d[i]=a[i]-b[i]-jw ;

jw=1 ;//表示有借位

}

}

jw=0;

printf("两数差为:");

if(!flag) printf("-") ;

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

if(!d[i]&&!jw) continue ;

else {printf("%d",d[i]);jw=1;}

}

void main()

{

int i,n1,n2;

chg0(a,N);

chg0(b,N);

chg0(c,N);

chg0(d,N);

char s1[N],s2[N];

printf("请输入加数(减数):\n") ;

scanf("%s",s1) ;

printf("请输入被加数(被减数):\n") ; scanf("%s",s2) ;

n1=strlen(s1);

n2=strlen(s2);

if(n1>n2||(n1==n2&&strcmp(s1,s2)>=0)) {

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

a[i]=s1[n1-i-1]-48 ;

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

b[i]=s2[n2-i-1]-48 ;

}

else

{

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

b[i]=s1[n1-i-1]-48 ;

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

b[i]=s2[n2-i-1]-48 ;

flag=0;

}

add();

mus();

printf("\n") ;

}

思考:此程序中变量的jw的作用什么?他在函数add()与mus()中的作用一样吗?判断式“if(!d[i]&&!jw)”为真时是什么情况?将大整数以字符串的形式进行输入的好处是什么?

8-11 编写程序,从键盘输入两个4×4的矩阵A和B,求出它们的和、差、积,并按矩阵的形式输出。

解:#include "stdio.h"

void main()

{

int a[4][4],b[4][4],c[4][4],i,j;

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

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

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

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

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

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

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

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

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

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

{

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

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

printf("\n") ;

}

}

思考:此程序只完成了矩阵A与B的求和计算过程(求差的过程略),求A与B的乘积应对上面四个二重循环中哪个进行处理?二重循环是否能满足矩阵乘积计算过程的需要?

8-12 编写程序,将一个二维数组的行列互换,并考虑用函数实现。

解:#include "stdio.h"

#define N 3

#define M 4

void main()

{

int a[M][N],at[N][M],i,j;

printf("请输入二维数组(%d行%d列):\n",M,N);

for(i=0;i

{

for(j=0;j

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

}

for(i=0;i

{

for(j=0;j

at[i][j]=a[j][i];

}

printf("输出行列互换后的二维数组(%d行%d列):\n",N,M);

for(i=0;i

{

printf("\n") ;

for(j=0;j

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

}

printf("\n") ;

}

思考:此程序中的关键语句是什么?若考虑用函数实现,哪些内容放到函数中的通用性比较好?

8-13 编写程序,找出一个二维数组中的鞍点,即该位置上的元素在该行上的最大、在该列上最小。

解:#include "stdio.h"

#define N 3 /*设二维数组为3行3列*/

#define M 3

void main()

{

int i ,j,a[N][M],max_min,k,flag=0;

printf("请输入数组的各元素值:\n") ;

for(i=0;i

for(j=0;j

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

for(i=0;i

{

printf("\n") ;

for(j=0;j

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

}

for(i=0;i

{

k=0;

max_min=a[i][0] ;

for(j=0;j

if(max_min

for(j=0;j

if(max_min>a[j][k]) break ;

if(j==M)

{

flag=1 ;

printf("\n满足条件的元素为第%d行第%d列的:%d\n",i+1,k+1,max_min);

}

}

if(flag!=1) printf("\n没有满足条件的元素!");

}

思考:此题是否会出现两个以上同时满足条件的元素?为什么?8-14 编写程序,输入一行字符,统计其中共有多少个单词,单词之间用空格分隔开。

解:#include "stdio.h"

#define N 100

void main()

{

char a[N],i,num=0 ;

printf("请输入一行字符串(不超过100个):\n") ;

gets(a) ;

for(i=0;a[i]!='\0';i++)

if(a[i]==' ')

{

num++;

while(a[i++]==' ');/*处理连续空格的情况*/

}

printf("该行字符串有%d个单词:\n",num+1) ;

}

思考:对语句“while(a[i++]==' ');”你是如何理解的?它的循环体是什么?是否还可以出其它形式?

8-15 有一篇文章,共10行,每行有80个字符。编写程序,统计其中大写字母、小写字母、数字、空格及其它字符各有多少个。

解:#include "stdio.h"

void main()

{

char a[10][80],i,j,num[5]={0,0,0,0,0};

printf("请输入各行字符(每行不超过80个):\n");

for(i=0;i<10;gets(a[i++])) ;

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

for(j=0;a[i][j]!='\0';j++)

{

if(a[i][j]>='A'&&a[i][j]<='Z') num[0]++ ;

else if(a[i][j]>='a'&&a[i][j]<='z') num[1]++ ;

else if(a[i][j]>='0'&&a[i][j]<='9') num[2]++ ;

else if(a[i][j]==' ') num[3]++ ;

else num[4]++ ;

}

printf("该文有大写字母%d个\n",num[0]) ;

printf("该文有小写字母%d个\n",num[1]) ;

printf("该文有数字字符%d个\n",num[2]) ;

printf("该文有空格%d个\n",num[3]) ;

printf("其它字符有%d个\n",num[4]) ;

}

思考:在循环结构中嵌套if结构时应该注意哪些问题?if结构中是否也可以嵌套循环结构。

8-16 编写程序,分别实现字符串复制函数strcpy()、字符串比较函数strcmp()的功能。

解:#include "stdio.h"

#define N 100

void My_strcpy(char x[],char y[])

{

int i=0 ;

while(x[i]!='\0')

{

y[i]=x[i] ;

i++ ;

}

y[i]='\0' ;

}

int My_strcmp(char x[],char y[])

{

int i=0;

while(x[i]!='\0'||y[i]!='\0')

{

if(y[i]!=x[i]) return 0 ;

i++;

}

if(x[i]!='\0'||y[i]!='\0') return 0 ;

return 1 ;

}

void main()

{

char a[N] ,b[N];

printf("请输入源字符串a(<100个字符):");

gets(a);

My_strcpy(a,b);

printf("目标字符串b为:%s\n",b);

printf("请输入比较字符串a(<100个字符):");

gets(a) ;

printf("请输入比较字符串a(<100个字符):");

gets(b);

if(My_strcmp(a,b)) printf("a,b两字符串相等!\n");

else printf("a,b两字符串不相等!\n");

}

思考:C语言在字符串的处理过程中,“\0”的作用是什么?是如何“输入”的?

8-17 有一行电文,已按下面的规律译成密码:

A→Z a→z ,B→Y b→y,C→X c→x, .....

即第一个字母变成第26个字母,第i个字母变成第26-i+1个字母。非字母字符不变。编写程序将密码译回原文,并输出密码和原文。解:#include "stdio.h"

#include"string.h"

#define N 100

void main()

{

int i =0;

char ch[N], tran[N];

printf(“请输入密码电文字符串(<100): ”);

getch(ch);

while(ch[i]!=‟\0‟)

{

if(ch[i]>=‟A‟&&ch[i]<=‟Z‟)

tran[i]=(90-ch[i])+65;

else if(ch[i]>=‟a‟&&ch[i]<=‟z‟)

tran[i]=(122-ch[i])+97;

else tran[i]=ch[i];

i++;

}

tran[i]=‟\0‟;

printf(“\n 电文密码:%s”,ch);

printf(“\n 原文是:%s\n”,tran);

}

思考:在C语言中,对字符的比较是如何进行的?其基本比较规则是什么?

8-18 编写程序,读入若干国家的名称,按字典顺序排序输出。

解:#include "stdio.h"

#include"string.h"

#define N 50

#define M 20

void main()

{

int i ,j ,n=0;

char cname[N][M],tran[N] ;

printf("请输入国家名称(<50个且每个名称不超过20个字符,当第一个字符为空格是结束):\n");

for(i=0;i

{

gets(cname[i]) ;

if(cname[i][0]==' ') break ;

n++ ;

}

for(i=0;i

for(j=i+1;j

if((strmp(cname[i],cname[j]))>0)

{

strcpy(tran,cname[i]);

strcpy(cname[i],cname[j]);

strcpy(cname[j],tran);

}

printf("按字典顺序排序后为:\n");

for(i=0;i

puts(cname[i]) ;

}

思考:语句“if(cname[i][0]==…‟)break ;”的作用是什么?若无此语句,程序运行将会出现什么状况。

8-19 若A为n×n对称方阵,将A压缩存放到一维数组B中,使B具有n(n+1)/2个元素,且A中信息可全部在B中找到。

解:#include "stdio.h"

#define N 5

#define M N*(N+1)/2 /*用宏处理一维数组的动态下标,内容参见第12章*/

void main()

{

int a[N][N],b[M],i,j,k;

printf("请输入方阵A的值:\n");

for(i=1;i

for(j=1;j

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

}

for(i=1;i

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

{

k=i*(i-1)/2+j;

b[k]=a[i][j];

}

printf("利用一维的b数组输出方阵的值:\n");

for(i=1;i

{

for(j=1;j

{

if(i>=j) k=i*(i-1)/2+j ;

else k=j*(j-1)/2+i;

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

}

printf("\n") ;

}

}

思考:如果在一个方阵中有大量的0元素(称为稀疏矩阵),如何进行一维的压缩存储?

8-20 某单位用现金发放工资,编写程序计算各种面值的最佳张数,以保证发给职工工资时不需找零。职工工资与各种面值的张数均要求用数组描述。

解:#include "stdio.h"

#define N 30

void main()

{

int i ,j ;

float salary[N] ;

int s ,money[10]={1000,500,200,100,50,20,10,5,2,1};

int sum[10] ;/*存放各种面值的张数*/

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

sum[j]=0 ;

printf("请输入每个职工的工资(精确到角):\n");

for( i=0;i

scanf("%f",salary+i) ;

for(i=0;i

{

s=int(10*salary[i]);/*取出第i个工人的工资并转化为角*/

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

{

sum[j]+=s/money[j];

s=s%money[j] ;

}

}

/*输出结果*/

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

{

if(i<7) printf("%d元",money[i]/10);

else printf("%3.1f元",money[i]/10.0);

}

printf("\n") ;

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

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

printf("\n") ;

}

思考:s/money[j],s%money[j]这两个表达式是用来求什么的?如果不用角为单位,程序应如何设计?

8-21编写n个学生、m门课程的成绩处理程序:

(1)实际学生人数、课程门数由键盘输入。

(2)n个学生、m门课程的成绩用二维实型数组描述,同时考虑学生

姓名、学号数据。

(3)求出每个学生的总成绩、平均成绩、并按总成绩排序。

(4)求出每门课程的平均成绩和不及格的人数。

解:#include "stdio.h"

#include"string.h"

#define N 100 //假定学生人数不超过100

#define M 8 //假定课程门数不超过8

void main()

{

int n,m,i,j,k,lo,t;

int no[N],sc[N][M],sum[N],csum[M] ,dave[M];

float rave[N] ,cave[M],ave;

char name[N][10],nam[10] ;

printf("请输入(学生人数,课程门数):");

scanf("%d,%d",&n,&m) ;

for(i=0;i

{

printf("\n请输入第%d个学生的学号、姓名:",i+1);

scanf("%d",&no[i]);gets(name[i]) ;

printf("各门课的考试成绩:");

for(j=0;j

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

}

for(i=0;i

{

sum[i]=0 ;

for(j=0;j

sum[i]+=sc[i][j];

rave[i]=sum[i]/m ;

}

for(j=0;j

{

csum[j]=0;dave[j]=0;

for(i=0;i

{

if(sc[i][j]<60) dave[j]++;

csum[j]+=sc[i][j] ;

}

cave[j]=csum[j]/n;

}

for(i=0;i

{

k=i ;

for(j=i+1;j

if(sum[k]

lo=no[i];no[i]=no[k];no[k]=lo;

strcpy(nam,name[i]);strcpy(name[i],name[k]);strcpy(name[k],nam); t=sum[i];sum[i]=sum[k];sum[k]=t;

ave=rave[i];rave[i]=rave[k];rave[k]=ave;

for(j=0;j

{

t=sc[i][j];sc[i][j]=sc[k][j];sc[k][j]=t;

}

}

/*输入显示过程*/

printf("名次学号姓名");

第六~八章 概念练习题-附参考答案

第六~第八章基本概念练习题 第6章数组 一、选择题。 1. 以下对一维数组a的正确定义是: A)char a(10);B) int a[]; C)int k=5,a[k];D)char a[3]={‘a’,’b’,’c’}; 2.以下能对一维数组a进行初始化的语句是: ( ) A. int a[5]=(0,1,2,3,4,) B. int a(5)={} C. int a[3]={0,1,2} D. int a{5}={10*1} ; 3.在C语言中对一维整型数组的正确定义为。 A)int a(10); B)int n=10,a[n]; C)int n;a[n]; D)#define N 10 int a[N]; 4. 若二维数组a有m列,则在a[i][j]之前的元素个数为 A. j*m+i B. i*m+j C. i*m+j-1 D. i*m+j+1 *5. 下列说法中错误的是 A 构成数组的所有元素的数据类型必须是相同的 B 用指针法引用数组元素允许数组元素的下标越界 C 一维数组元素的下标依次是1、2、3…… · D 定义数组时的长度可以是整型常量表达式 6. 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在 内存中所占字节数是 A) 3 B) 6 C) 10 D) 20 7.若有说明:int a[][3]={{1,2,3},{4,5},{6,7}}; 则数组a的第一维的大小为: ( ) A. 2 B. 3 C. 4 D.无确定值 8.以下定义语句中,错误的是( ) A) int a[]={1,2}; B) char *a; C) char s[10]=“test”; D) int n=5,a[n]; 9.下面程序段的输出结果是: ( ) int i; 、 int x[3][3]={1,2,3,4,5,6,7,8,9}; for (i=0;i<3;i++) printf("%d ",x[i][2-i]); A) 1 5 9 B) 1 4 7 C) 3 5 7 D) 3 6 9

C语言第8章习题及答案

第八章 用一个数组存放图书信息,每本书是一个结构,包括下列几项信息:书名、作者、出版年月、借出否,试写出描述这些信息的说明,并编写一个程序,读入若干本书的信息,然后打印出以上信息。#include <> typedef struct { char Name[20]; char Author[20]; int Date_Year; int Date_Month; int loaned; } BOOK; #define N 10 void main() { BOOK books[N]; int i; for (i=0;i #include <> typedef struct { char s[20];

C语言数组练习及答案

第四部分数组 4.1 选择题 1. 以下关于数组的描述正确的是(c )。 A. 数组的大小是固定的,但可以有不同的类型的数组元素 B. 数组的大小是可变的,但所有数组元素的类型必须相同 C. 数组的大小是固定的,所有数组元素的类型必须相同 D. 数组的大小是可变的,可以有不同的类型的数组元素 2. 以下对一维整型数组a的正确说明是(d )。 A.int a(10); B. int n=10,a[n]; C.int n; D. #define SIZE 10 scanf("%d",&n); int a[SIZE]; int a[n]; 3. 在C语言中,引用数组元素时,其数组下标的数据类型允许是(c )。 A. 整型常量 B. 整型表达式 C. 整型常量或整型表达式 D. 任何类型的表达式 4. 以下对一维数组m进行正确初始化的是(c )。 A. int m[10]=(0,0,0,0) ; B. int m[10]={ }; C. int m[ ]={0}; D. int m[10]={10*2}; 5. 若有定义:int bb[ 8];。则以下表达式中不能代表数组元bb[1]的地址的是(c )。 A. &bb[0]+1 B. &bb[1] C. &bb[0]++ D. bb+1 6. 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是(d )。 A. 3 B. 6 C. 10 D. 20 7. 若有以下说明: int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c='a',d,g; 则数值为4的表达式是(d ) A. a[g-c] B. a[4] C. a['d'-'c'] D. a['d'-c] 8. 以下程序段给数组所有的元素输入数据,请选择正确答案填入(a )。 #include main() { int a[10],i=0; while(i<10) scanf("%d",________ ); ┇ }

中国石油大学(华东)C语言在线测评答案 第8章数组(2013级亲测正确)

8.7 求最大值 问题描述要求从键盘输入10个整型数据,找出其中的最大值并显示出来。 输入范例 3 0 54 -710 27 32767 10 1 500 2 输出范例 32767 提示先假定第一个元素时最大值,然后和其他的元素一个一个的进行比较,直到找到最大值。 #include int main() { int a[10],max,i; for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=0;i<10;i++) if(a[i]>max) max=a[i]; printf("%d\n",max); return 0; } 8.6 数组逆序输出 问题描述 从键盘上输入一个数组(10个元素),将原数组逆序重新排列后输出。要求输出每个元素时以一个空格隔开。 提示:用第一个与最后一个交换。 #include int main() { int a[10],i; for(i=0;i<10;i++) scanf("%d",&a[i]);

for(i=9;i>=0;i--) printf("%d ",a[i]); printf("\n"); return 0; } 8.1 谁能出线 背景:电视台举办“超级学生”才艺大赛,由于报名人数狂多,所以要先进行分组预赛。按规定,每10名学生为一个预赛小组,评委打出分数(0~100分),各小组第一名可以进 入下一轮;如果有多名学生得分相同都是第一名,则可同时进入下一轮。 输入:按顺序给出一个小组10个人的最后得分(int)。 输出:能够出线的学生序号(0~9)。 #include int main() { int a[10],i,max; for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=0;i<10;i++) if(a[i]>max) max=a[i]; for(i=0;i<10;i++) if(a[i]==max) printf("%d\n",i); return 0;

吉林省专升本数据结构习题及答案——第八章

吉林省专升本考试数据结构分章习题及参考答案———选择题 (第八章) 1、若数据元素序列{11,12,13,78,9,23,4,5}是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是( ) A、冒泡排序 B、插入排序 C、选择排序 D、归并排序 2、若将两个各有n个元素的有序表归并成一个有序表,则最少比较次数是()。 A、 n B、 2*n-1 C、 2n D、 n-1 3、已知数据表中每个元素距其最终位置不远,则采用()方法最节省时间 A、堆排序 B、插入排序 C、快速排序 D、直接选择排序 4、下列排序算法中,()算法可能会出现下面情况:在后一趟开始之前,所有元素都不在其终的位置上。 A、堆排序 B、冒泡排序 C、快速排序 D、插入排序 5、下述几种排序方法中,要求内存量最大的是()。 A、插入排序 B、快速排序 C、归并排序 D、选择排序 6、就排序算法所用的辅助空间而言,堆排序,快速排序,归并排序的关系是() A、堆排序<快速排序<归并排序 B、堆排序<归并排序<快速排序 C、堆排序>归并排序>快速排序 D、堆排序>快速排序>归并排序 7、快速排序方法在( )情况下最不利于发挥其长处。 A、要排序的数据量太大 B、要排序的数据中含有多个相同值 C、要排序的数据已基本有序 D、要排序的数据个数为奇数 8、对关键字由大到小进行冒泡排序,在下列()情况下比较的次数最多。 A、从小到大排序 B、从大到小排序 C、元素无序

D、元素基本有序 9、对5个不同的数据元素进行直接插入排序,最多需要进行()次比较。 A、 8 B、 10 C、 15 D、 25 10、如果只想得到1000个元素组成的序列中第5个小元素之前的部分排序的序列,用()方法快。 A、起泡排序 B、快速排列 C、堆排序 D、简单选择排序 11、设有1000个无序的元素,希望用最快的速度挑选出其中前十个最大的元素,在以下的排序方法中采用哪一种最好?() A、快速排序 B、归并排序 C、堆排序 D、基数排序 12、下列排序算法中,()可能会出现下面情况:在最后一趟开始之前,所有元素都不在最终位置上。 A、起泡排序 B、插入排序 C、快速排序 D、堆排序 13、对以下数据序列利用快速排序进行排序,速度最快的是() A、21,25,5,17,9,23,30 B、25,23,30,17,21,5,9 C、21,9,17,30,25,23,5 D、5,9,17,21,23,25,30 14、快速排序在下列( )情况下最易发挥其长处。 A、被排序的数据中含有多个相同排序码 B、被排序的数据已基本有序 C、被排序的数据完全无序 D、被排序的数据中的最大值和最小值相差悬殊 15、在含有n个关键字的小根堆(堆顶元素小)中,关键字最大的记录有可能存储在()位置上。 A、⎣n/2⎦ B、⎣n/2⎦-1 C、1 D、⎣n/2⎦+2 16、堆排序是()类排序. A、插入 B、交换 C、归并

第八章习题及答案

第八章习题及答案 第八章习题 一、选择题 1、若x为整型变量,p是指向整型数据的指针变量,则正确的赋值表达式 是( )。 A)p=&x B)p=x C)*p=&x D)*p=*x 2、已知:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示数组a中 元素的表达式是()。 A)*p B)a[10] C)*a D)a[p-a] 3、已知:int a[3][4],*p=a;则p表示()。 A) 数组a的0行0列元素 B) 数组a的0行0的地址 C) 数组a的0行首地址 D) 以上均不对 4、设有说明int (*ptr)[M];其中的标识符ptr是()。 A) M个指向整型变量的指针 B) 指向M个整型变量的函数指针 C) 一个指向M个整型元素的一维数组的指针 D) 具有M个指针元素的一维指针数组,每个元素都只能指向整型变量 5、已知:char str[]="OK!";对指针变量ps的说明和初始化是()。 A) char ps=str; B) char *ps=str; C) char ps=&str; D) char *ps=&str; 6、若有以下调用语句,则不正确的fun函数的首部是( )。 A) void fun(int m, int x[]) B) void fun(int s, int h[41]) C) void fun(int p, int *s) D) void fun(int n, int a) main() { … int a[50],n;

… fun(n, &a[9]); … } 7、有以下程序 void fun(char *a, char *b) { a=b; (*a)++; } main () { char c1="A", c2="a", *p1, *p2; p1=&c1; p2=&c2; fun(p1,p2); printf(“&c&c\n”,c1,c2); } 程序运行后的输出结果是( ) 。 A) Ab B) aa C) Aa D) Bb 8、下列程序段的输出结果是( ) 。 A) 2 1 4 3 B) 1 2 1 2 C) 1 2 3 4 D) 2 1 1 2 void fun(int *x, int *y) { printf(“%d ,%d”, *x, *y); *x=3; *y=4;} main() { int x=1,y=2; fun(&x,&y); printf(“%d %d”,x, y); } 9、有如下说明 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; 则数值为9的表达式是( )。 A) *P+9 B) *(P+8) C) *P+=9 D) P+8 10、有以下程序 main() { int x[8]={8,7,6,5,0,0},*s;

数据结构第八章习题及答案

习题八查找 一、单项选择题 1.顺序查找法适合于存储结构为()的线性表。 A. 散列存储B. 顺序存储或链式存储 C. 压缩存储 D. 索引存储 2.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。 A. (n-1)/2 B. n/2 C. (n+1)/2 D. n 3.适用于折半查找的表的存储方式及元素排列要求为( ) A.链接方式存储,元素无序 B.链接方式存储,元素有序 C.顺序方式存储,元素无序 D.顺序方式存储,元素有序 4.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度( ) A.必定快 B.不一定 C. 在大部分情况下要快 D.取决于表递增还是递减 5.当采用分块查找时,数据的组织方式为 ( ) A.数据分成若干块,每块内数据有序 B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数 据组成索引块 C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块 D.数据分成若干块,每块(除最后一块外)中数据个数需相同 6.二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值。这种说法()。 A.正确 B. 错误 7. 二叉查找树的查找效率与二叉树的((1) )有关,在((2) )时其查找效率最低。 (1): A. 高度 B. 结点的多少 C. 树型 D.结点的位置 (2): A. 结点太多B. 完全二叉树C.呈单枝树D. 结点太复杂。 8.如果要求一个线性表既能较快的查找,又能适应动态变化的要求,则可采用( )查找法。 A. 分快查找B. 顺序查找 C. 折半查找D.基于属性9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( )。 A.(100,80,90, 60, 120,110,130) B.(100,120,110,130,80, 60, 90) C.(100,60, 80, 90, 120,110,130) D. (100,80,60, 90, 120,130,110) 10.下图所示的4棵二叉树,( )是平衡二叉树。 (A) (B)(C)(D) 11.散列表的平均查找长度()。

第8章数组类型习题及答案

8-1 编写程序,将10个数34,3,29,63,70,16,85,82,90,93存放于一组数组中,求出这十个数的和及平均值。 解:#include "stdio.h" void main() { int a[10]={34,3,29,63,70,16,85.82,90,93}; int i ,sum=0; float average ; for(i=0;i<10;i++) { sum=sum+a[i] ; } average=sum/10.0; printf("sum=%d,average=%f\n",sum,average); } 运行结果:sum=565,average=56.5000 思考:数组有何特点?此问题如果不用数组进行处理将会怎样? 8-2 编写程序,求存放于上题数组中10个数的最大值,最小值及所在的位置。 解:#include "stdio.h" void main() { int a[10]={34,3,29,63,70,16,85,82,90,93}; int i,sum,max,min,d_max,d_min; max=min=a[0]; d_max=d_min=0; for(i=1;i<10;i++) { if(a[i]>max) {max=a[i];d_max=i;} if(a[i]

运行结果:max=93,a[9] Min=3,a[1] 思考:数组a[i]中i的变化意味着什么? 8-3 编写程序,从键盘读入50个数存放于一数组中,求出该数组中最大值、最小值及所在位置。 解:#include "stdio.h" void main() { float a[50],max,min; int i,d_max,d_min; for(i=0;i<50;i++) scanf("%f",&a[i]); max=min=a[0]; d_max=d_min=0; for(i=1;i<50;i++) { if(a[i]>max) {max=a[i];d_max=i;} if(a[i]

第8章++排序+课后习题答案

第8章排序 1.选择题 (1)从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为()。 A.归并排序B.冒泡排序C.插入排序D.选择排序(2)从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为()。 A.归并排序B.冒泡排序C.插入排序D.选择排序(3)对n个不同的关键字由小到大进行冒泡排序,在下列()情况下比较的次数最多。 A.从小到大排列好的B.从大到小排列好的 C.元素无序D.元素基本有序 (4)对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为()。 A.n+1 B.n C.n-1 D.n(n-1)/2 (5)快速排序在下列()情况下最易发挥其长处。 A.被排序的数据中含有多个相同排序码 B.被排序的数据已基本有序 C.被排序的数据完全无序 D.被排序的数据中的最大值和最小值相差悬殊 (6)对n个关键字作快速排序,在最坏情况下,算法的时间复杂度是()。 A.O(n) B.O(n2)C.O(nlog2n) D.O(n3)(7)若一组记录的排序码为(46, 79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。 A.38,40,46,56,79,84 B.40,38,46,79,56,84 C.40,38,46,56,79,84D.40,38,46,84,56,79 (8)下列关键字序列中,()是堆。 A.16,72,31,23,94,53 B.94,23,31,72,16,53 C.16,53,23,94,31,72 D.16,23,53,31,94,72 (9)堆是一种()排序。 A.插入B.选择C.交换D.归并 (10)堆的形状是一棵()。 A.二叉排序树B.满二叉树C.完全二叉树D.平衡二叉树 (11)若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。 A.79,46,56,38,40,84 B.84,79,56,38,40,46 C.84,79,56,46,40,38 D.84,56,79,40,46,38 (12)下述几种排序方法中,要求内存最大的是()。 A.希尔排序B.快速排序C.归并排序D.堆排序

数据结构第8章作业参考答案

第8章内部排序 一、单项选择题 1.在下列排序算法中,(D )算法的时间复杂度与初始顺序无关。 A. 直接插入排序 B. 冒泡排序 C. 快速排序 D. 直接选择排序 2.已知原始关键字序列(56,23,78,92,88,67,19,34),若一趟排序之后序列是 (19,23,67,56,34,78,92,88),则选用的排序方法是进行的结果为( B )。 A.简单选择排序 B. 增量为3的一趟希尔排序 C..冒泡排序 D. 快速排序 3.快速排序的平均时间复杂度为(D )。 A. O(n) B. O(log2n) C. O(n2) D. O(nlog2n) 4.用直接插入排序法对下面四个序列进行升序排序,元素比较次数最少的是(C )。 A. 94,32,40,90,80,46,21,69 B. 32,40,21,46,69,94,90,80 C. 21,32,46,40,80,69,90,94 D. 90,69,80,46,21,32,94,40 5.下列排序算法中,不稳定的是(B )。 A. 直接插入排序 B. 简单选择排序 C. 起泡排序 D. 归并排序 6.下列排序算法中,第一趟排序结束后,其最大或最小元素一定在其最终位置上的算法是 ( D )。 A. 归并排序 B. 直接插入排序 C. 快速排序 D. 冒泡排序 7.当待排序序列中记录数较多时,速度最快的排序方法是(A )。 A. 快速排序法 B. 冒泡排序法 C. 堆排序法 D. 归并排序法 8.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是(C )排序。 A. 冒泡 B. 希尔 C. 快速 D. 堆 9.对于键值序列{72,73,71,23,94,16,5,68,76,103},用筛选法建堆,必须从键值为(D )的 结点开始。 A. 23 B. 103 C. 72 D. 94 10.下列排序算法中,在最好情况下,时间复杂度为O(n)的算法是(B )。 A. 简单选择排序 B. 起泡排序 C. 快速排序 D. 归并排序 11.对序列(22,86,19,49,12,30,65,35,18)进行一趟排序后得到的结果为 (18,12,19,22,49,30,65,35,86),则使用的排序方法是(D )。 A. 选择排序 B. 冒泡排序 C. 插入排序 D. 快速排序 12.下列排序方法中,最好与最坏时间复杂度不相同的排序方法是( A )。 A.冒泡排序 B.简单选择排序 C.堆排序 D.归并排序 13.用快速排序方法对含有n个关键字的序列进行排序,最坏情况下的时间复杂度为( B )。 A. O(n) B. O(n2) C. O(nlog2n) D. O(log2n) 14.对关键字序列(50,34,92,19,11,68,56,41,79)进行直接插入排序,当将第7个关键字56插 入到当前的有序子表中时,为寻找插入位置需进行(A)次关键字之间的比较。

第8章习题解答

第8章习题解答 一. 选择题 1. 关于类和对象,不正确的说法是() A. 类是一种数据类型,它封装了数据和函数 B. 类是对某一类对象的抽象 C. 可以基于类这种数据类型定义类的引用 D. 一个类的对象只有一个 【答案】D 【解析】类是一种数据类型,可以基于“类”这种数据类型定义多个称为“对象”的变量。 2. 类定义的外部,可以被访问的类的成员有() A. public 的类成员 B. public或private的类成员 C. private或protected的类成员 D. public或private 的类成员 【答案】A 【解析】类的成员数据或成员函数的访问属性分为三种情况:private、public和protected,即私有访问属性、公有访问属性和保护访问属性,类定义的外部只能访问公有访问属性的成员。 3 关于this 指针,说法错误的是() A. this指针必须显式说明 B. 当创建一个对象后,this 指针就指向该对象 C. 成员函数拥有this指针 D. 静态成员函数拥有this指针 【答案】D 【解析】this指针是一种特殊的指针,它指向成员函数当前操作的数据所属的对象。不同的对象调用相同的成员函数时,this指针将指向不同的对象,也就可以访问不同对象的成员数据。而静态成员函数是一个类的所有对象共享的成员,而不仅仅是某一对象的成员。因此,可以在没有任何对象存在的情况下,可以使用静态成员函数,而使用this指针必须有明确的对象所指。 4. 调用形式参数为普通对象的函数时,系统会自动调用相应类的() A. 名字不同于类名的一般成员函数 B. 构造函数 C. 析构函数 D. 拷贝构造函数 【答案】D 【解析】若函数的形参为类的对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数实现拷贝赋值。 5. 定义某类的对象后,再删除该对象,系统会自动调用() A. 名字不同于类名的一般成员函数

《C语言程序设计》课后习题答案第八章

8.1 编写两个函数,分别求两个证书的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果,两个整数由键盘输入。 void main() { int Mgy(int x,int y); int Mgb(int z); int a,b,mgy,mgb; printf("请输入两个数:\n"); scanf("%d,%d",&a,&b); mgy=Mgy(a,b); mgb=Mgb(a,b,mgy); printf("两个数的最大公约数为%d,最小公倍数为%d\n",mgy,mgb);} int Mgy(int x,int y) { int r,temp; if(x

8.3编写一个判素数的函数,在主函数输入一个整数,输出是否是素数的信息。#include void main() { int Isprime(int a); int m,temp=0; printf("请输入一个数:\n"); scanf("%d",&m); temp=Isprime(m); if(temp==0) printf("%d不是素数。\n",m); else printf("%d是素数。\n",m);} int Isprime(int a) { int i,k,flag; if(a==0||a==1) flag=0; else{ k=sqrt(a); for(i=2;i<=k;i++) if(a%i==0) flag=0; } return flag; }

C语言程序设计应用第八章习题答案

练习与思考 8 8.1 选择题 (1)有以下定义及语句,则对数组a元素的不正确引用的表达式是()。 int a[4][5];*p[2],j; for (j = 0 ; j <4 ; j++) p[j]=a[j]; A)p[0][0] B)*(a+3)[4] C)*(p[1]+2) D)*(&a[0][0]+3) (2) 有以下程序 #include struct tt {int x;struct tt *y;} *p; struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a}; main() { int i; p=a; for(i=1;i<=2;i++) {printf("%d,",p->x); p=p->y;} } 程序的运行结果是()。 A)20,30, B)30,17 C)15,30, D)20,15, 8.2 填空题 (1) 以下程序段的输出结果是()。 #include #define F(a,b) printf("%d,%d\n",a,b) void main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; F(a,a[0]); F(*a,*(a+0)); F(a[1],*(a+1)); F(*a[1],**(a+1)); F(*(a[1]+1),*(*(a+1)+1)); F(*a,**a); } (2) 以下程序的运行时,输入i=1,j=2(回车)结果是()。 #include void main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

程序设计基础(C)第6--8章复习题答案

第6--8章复习题 一、判断题 (√)1.数组元素在内存中是按顺序、连续存放的。 (×)2.组成数组的数据可以是若干个不同的类型。 (√)3.字符数组可以存放字符串,也可以存放若干字符。 (×)4.多维数组中各维的大小必须相同。 (×)5.数组定义后没有被初始化也有一个确定的默认值。 (×)6.字符串的结束标志是‘\n’。 (√)7.定义数组时必须有数据类型说明,而不必有存储类型说明。 (×)8.数组在赋初值时允许越界。 (×)9.一维字符数组中可以存放多个字符串。 (√)10.定义函数时必须指出该函数的类型。 (×)11.函数说明必须放在函数体内,不可放在函数体外。 (√)12.定义函数时给出的参数是形参,调用函数时给出的参数是实参。 (√)13.函数调用时要求形参与实参个数相等、对应类型相同。 (√)14.函数的调用方式既可以传值也可以传地址。 (×)15.函数可以嵌套调用,也可以嵌套定义。 (√)16.函数的函数体可以是空的,也可以有若干条语句。 (√)17.预处理命令的前面必须加一个“#”。 (√)18.一条文件包含命令只能包含一个文件,若要包含多个文件时,可使用多条文件包含命令。 (×)19.带参数宏定义的参数个数不得超过2个。 (×)20.预处理命令的处理是在程序运行前进行的。 二、单选题 1.数组赋初值的初始值表中的数据项个数与数组元素个数的关系,错误的是( D )。 A.大于B.小于C.等于D.小于等于 2.设int a[2][3]; 下列数组元素的表示中错误的是( C )。 A.a[0][0] B.a[1][1] C.a[2][2] D.a[1][2] 3.下列数组带初始化的定义中,错误的是(B )。 A.int m[5]={3}; B.char s[5]= “ab123”; C.int n[]={6,6,4,3,2,1}; D.int p[3]={1,3,5}; 4.已知一个一维数组,有10个int元素,其中后面3个元素的值分别为3、2、1,其余元素为默认值。在下面的实现方法中,正确的是( C )。 A.int a[10]={3,2,1};

数据结构习题课第8、7、6章(网上的答案有些有问题的)

第8章图 对于如图所示的无向图,试给出: (1)图中每个顶点的度; (2)该图的邻接矩阵; (3)该图的邻接表; (4)该图的连通分量。 (1)D(V0)=2;D(V1)=2;D(V2)=3;D(V3)=3;D(V4)=2;D(V5)=1;D(V6)=1. (2) 0101000 1010000 0101100 1010100 0011000 0000001 0000010 v V ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ∈ 邻接矩阵 0101000 1010000 0101100 1010100 0011000 0000001 0000010 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? (3)邻接表

(4)连通分量 1: 2: 图所示的是某个无向图的邻接表,试:(1)画出此图; (2)写出从顶点A 开始的DFS 遍历结果;(3)写出从顶点A 开始的BFS 遍历结果。 (1)图邻接表对应的无向图如图所示

(2) 从顶点A 开始的DFS 遍历,深度优先遍历的基本思想:对于给定的图 G=(V,E),首先将V中每一个顶点都标记为未被访问,然后,选取一个源点v V 将v标记为被访问,再递归地用深度优先搜索方法,依次搜索v的所有邻接点w.若w未曾访问过,则以w为新的出发点继续深度优先搜索遍历,如果从v出发所有路的顶点都已被访问过,则结束。 A,B,C,F,E,G,D 从顶点A 开始的BFS 遍历,基本思想:对于给定的图G=(V,E),从图中某未访问过的顶点vi出发: 1)访问顶点vi; 2)访问vi 的所有未被访问的邻接点w1 ,w2 , …wk ; 3)依次从这些邻接点出发,访问它们的所有未被访问的邻接点; 依此类推,直到图中所有访问过的顶点的邻接点都被访问; A,B,C,D,F,E,G 对如图所示的连通图,分别用Prim 和Kruskal算法构造其最小生成树。 解:(1)Prime 算法的基本思路、步骤P167 Prim算法的基本步骤如下: (1)初始化:U={u0},TREE={}; (2)如果U=V(G),则输出最小生成树T,并结束算法; (3)在所有两栖边中找一条权最小的边(u,v)(若候选两栖边中的最小边不止一条,可任选其中的一条),将边(u,v)加入到边集TREE中,并将顶点v并入集合U中。 (4)由于新顶点的加入,U的状态发生变化,需要对U与V-U之间的两栖边进行调整。 (5)转步骤(2) Prim算法构造最小生成树过程:

数组习题及答案

构造数据对象——数组 一、填空题 1.数组是一组相同的集合。 2.数组名代表数组的。 3.数组元素在数组中的位置序号称为它是从开始整数。 4.有int a[ ]={4,6,2,12,435,-9,76,0,0};该数组元素值最大的下标为。 5.定义数组tw,其能存储23个长整形数的语句为。 6.有说明语句int a[10]={1,2,3,4,5,6};则元素a[9]的值为。 7.数组char c[ ]=”abcd”中有个元素,最后一个元素是。 8.”a”在内存中占个存储单元。 9.定义一个能存放下字符串Vocation的字符数组enm的语句为。 10.定义一个可保存100个整型数的数组pn,并把每个元素初值设为0的语句是。 11.与puts(ss)等价的printf函数调用是。 二、选择题 1.下面关于数组的说法,不正确的是() A.数组总为一个整体,可以参加算术运算 B.数组中的数组元素相当于一个简单变量 C.数组可以用来保存字符串 D.数组是一组连续的,类型相同的数据集合 2.下列说法不是数组特性的是() A.数组元素类型相同 B.数组长度固定

C.数组占用连续的内存空间 D.数组可作为一个整体参与运算 3.定义一个具有8个元素的整形数组,应使用语句() A.int a[8]; B.int a[2,4]; C.int a[ ]; D.int *a[8]; 4. 以下能正确定义一维数组的选项是() A.int num[ ]; B.#define N 100 int num[N]; C.int num[0..100]; D.int N=100; 5.下面对s的初始化,不正确的是() A.char s[5]={“abcd”}; B.char s[5]={‘a’,’b’,’c’}; C.char s[5]=””; D.char s[5]=”abcd”; 6.对以下说明语句正确的理解是() int a[10]={6,7,8,9,10,12}; A.将6个初值依次赋值给a[1]至a[5]; B.将6个初值依次赋值给a[0]至a[5]; C.将6个初值依次赋值给a[5]至a[10]; D.因数组长度和初值的个数不同,所以此语句不正确 7.用scanf语句为数组a中的第二个数组元素输入数据,格式正确的是()

《C语言程序设计》教材习题答案第8章

一、选择题 1.以下数组定义中,错误的是:C)int a[3]={1,2,3,4}; 2.以下数组定义中,正确的是:B) int a[][2]={1,2,3,4}; 3.设有定义“int a[8][10];”,在VC中一个整数占用4字节,设a的起始地址为1000,则a[1][1]的地址是:D)1044 4.已知有数组定义“int a[][3]={1,2,3,4,5,6,7,8,9};”,则a[1][2]的值是:C)6 5.在以下字符串定义、初始化和赋值运算中,错误的是:A) char str[10];str=”String”; 6.设有以下字符串定义, char s1[]={‘S’,’t’,’r’,’i’,’n’,’g’}; char s2[]=”String”; 则s1和s2:C)长度不同,但内容相同。 7.设有定义“int a[10]={0};”,则说法正确的是:A)数组a有10个元素,各元素的值为0. 8.设已定义“char str[6]={‘a’,’b’,’\0’,’c’,’d’,’\0’};”,执行语句“printf(“%s”,str)”后,输出结果为:B)ab 9.引用数组元素时,数组元素下标不可以是:C)字符串 10.已定义字符串S1和S2,以下错误的输入语句是:C)gets(s1,s2); 11.下面程序段的运行结果是:A)123 void main() { char a[]=”abcd”,b[]=”123”; strcpy(a,b); printf(“%s\n”,a); } 12.下面程序段的运行结果是:A)123 void main() { char a[]=”123”,b[]=”abcd”; if(a>b)printf(“%s\n”,a); else printf(“%s\n”,b); } 二、编程题 1.一维数字a的值已经,请把数组中的值按逆序存放,然后输出数组。例如数组中原来的值为3,4,2,1,6,颠倒后变成6,1,2,4,3. #include main() { int i,a[5]={2,3,45,12,5},t; printf("转换前:"); for(i=0;i<5;i++) printf("%d\t",a[i]); for(i=0;i<5/2;i++) { t=a[i];

第8章参考答案08

一、选择题 1.在待排序的元素序列基本有序的前提下,效率最高的排序方法是(A)。 A.插入排序 B.选择排序 C.快速排序 D.归并排序 2.设有1000个无序的元素,希望用最快的速度挑选出其中煎10个最大的元素,最好选用(C)法。 A.冒泡排序 B.快速排序 C.堆排序 D.基数排序 3.具有12个记录的序列,采用冒泡排序最少的比较次数是(C)。 A. 1 B. 144 C. 11 D. 66 4.下列4种排序方法中,要求内存容量最大的是(D)。 A.插入排序 B.选择排序 C.快速排序 D.归并排序 5.初始序列已经按键值有序时,用直接插人算法进行排序,需要比较的次数为(D). A. n2 B. nlog2n C. log2n D. n-1 6.下列4种排序方法,在排序过程中,关键码比较的次数与记录的初始排列顺序无关的是(C)。 A.直接插人排序和快速排序 B.快速排序和归并排序 C.直接选择排序和归并排序 D.直接插人排序和归并排序 7.一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为(B)。 A. 79,46,56,38,40,84 B. 84,79,56,38,40,46 C. 84,79,56,46,40,38 D. 84,56,79,40,46,38 8.一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第1个记录为基准得到的一次划分的结果为(C)。 A. 38,40,46,56,79,84 B. 40,38,46,79,56,84 C. 40,38,46,56,79,84 D. 40,38,46,84,56,79 9.用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,元素序列的变化情况如下: 25,84,21,47,15,27,68,35,20 20,15,21,25,47,27,68,35,84 15,20,21,25,35,27,47,68,84 15,20,21,25,27,35,47,68,84 则采用的排序方法是(D)。 A.选择排序 B.希尔排序 C.归并排序 D.快速排序 10.快速排序方法在(C)情况下最不利于发挥其长处。 A.要排序的数据量太大 B.要排序的数据中含有多个相同值 C.要排序的数据已基本有序 D.要排序的数据个数为奇数 二、判断题 1.插人排序是稳定的,选择排序是不稳定的。(√) 2.不稳定的排序算法是没有实用价值的。(×) 3.当待排序的元素很多时,为了交换元素的位置,移动元素要占较多的时间,这是影响时间复杂度的主要原因。(√) 4.对有n个记录的集合进行归并排序,所需要的辅助空间数与初始记录的排列状况有关。(x) 5.对n个记录的集合进行快速排序,所需要的附加空间数是O(n)。(x) 6.堆排序所需要的附加空间数与待排序的记录个数无关。(√)

相关文档
相关文档 最新文档