二级c语言程序的设计习题及解答ch9数组_第1页
二级c语言程序的设计习题及解答ch9数组_第2页
二级c语言程序的设计习题及解答ch9数组_第3页
二级c语言程序的设计习题及解答ch9数组_第4页
二级c语言程序的设计习题及解答ch9数组_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./第九章数组一、选择题

[9.1]

若已定义:int

a[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;其中0<=i<=9,则对a数组元素的引用不正确的是a[p-a]

B>*<&a[i]>

C>p[i]

D>*<*<a+i>>[解析]A:p开始是数组a首地址,只要p++则再减去a的首地址a[p-a]就能取到所有元素,B:&a[i]循环取其地址,*<&a[i]>

是该地址中所存储的元素C:p就是指针变量,相当于a[i],D:*<a+i>则正确

[9.2]

以下程序段数组所有元素输入数据,应在下划线填入的是A>a+<i++>

B>&a[i+1]

C>

a+i

D>&a[++i]main<>{

int

a[10],i=0;while<i<10>

scanf<"%d",_>;}[解析]因为要遍历,所以排除B.C,因为D先加1再取值,丢了a[0]

[9.3]

以下程序的输出结果是A>3

B>

4

C>1

D>2main<>{

int

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

printf<"%d\n",*<p+2>>;}[解析]*p=a;p指向首地址,*<p+2>>往后移动两个元素,指向3

[9.4]

以下程序的输出结果是A>

不确定的值

B>

3

C>2

D>1main<>{

int

n[2]={0},i,j,k=2;for<i=0;i<k;i++>for<j=0;j<k;j++>

n[j]=n[i]+1;printf<"%d\n",n[k]>;}

[9.5]

以下程序的输出结果是

A>17

B>18

C>19

D>20main<>{inta[]={2,4,6,8,10},y=1,x,*p;p=&a[1]; for<x=0;x<3;x++>y+=*<p+x>; printf<"%d\n",y>;}[解析]p=&a[1]则p指向元素为4,y+=*<p+x>;相当于y=1+4+6+8=19

[9.6]

以下程序的输出结果是A>6

B>8

C>4

D>2main<>{inta[]={2,4,6,8},*p=a,i; for<i=0;i<4;i++>a[i]=*p++; printf<"%d\n",a[2]>;}[解析]p=a,相当于重新把a中的容赋给a本身,所以a[2]=6

[9.7]

以下程序的输出结果是A>720

B>

120

C>24

D>6f<int

b[],int

n>{

int

i,r=1;for<i=0;i<=n;i++>r=r*b[i];returnr;}main<>{

int

x,a[]={2,3,4,5,6,7,8,9};x=f<a,3>;printf<"%d\n",x>;}[解析]调用x=f<a,3>;for循环4次,将前四个元素相乘,即得r=2*3*4*5;

[9.8]

以下程序中若第一个printf语句输出的是194,则第二个printf语句的输出结果是A>212

B>

204

C>

1a4

D>

1a6

12main<>{

int

a[]={1,2,3,4,5,6,7,8,9,0},*p;p=a;printf<"%x\n",p>;printf<"%x\n",p+9>;

}[解析]因为开始p的地址为194,p+9是指指针向后移动9个元素,而不是9个字节,每个int占2个字节,所以共移动18个字节,1个字节占一个存储单位,%x\n"是16进制,将18转化成16进制是12,所以194+12=2a6

[9.9]

以下程序的输出结果是A>0987654321

B>

4321098765

C>5678901234

D>0987651234fun<int

*s,int

n1,intn2>{

int

i,j,t;

i=n1;j=n2;while<i<j>{t=*<s+i>;*<s+i>=*<s+j>;*<s+j>=t;

i++;j--;}}main<>{

int

a[10]={1,2,3,4,5,6,7,8,9,0},i,*p=a;fun<p,0,3>;

fun<p,4,9>;

fun<p,0,9>;for<i=0;i<10;i++>

printf<"%d",*<a+i>>;}[解析]为了使大家清晰地看出fun<int

*s,int

n1,intn2>的作用,我自己完善了程序如下:#include<stdio.h>#include<stdlib.h>fun<int*s,intn1,intn2>{inti,j,t;i=n1;j=n2;while<i<j>{t=*<s+i>;*<s+i>=*<s+j>;*<s+j>=t;i++;j--;}}main<>{inta[10]={1,2,3,4,5,6,7,8,9,0},i,*p=a;fun<p,0,3>;for<i=0;i<10;i++>printf<"%d",*<a+i>>;printf<"\n">;fun<p,4,9>;for<i=0;i<10;i++>printf<"%d",*<a+i>>;printf<"\n">;fun<p,0,9>;for<i=0;i<10;i++>printf<"%d",*<a+i>>;printf<"\n">;}结果如下:其实,fun<p,0,3>;就是将a中的前4个元素倒序,fun<p,4,9>;就是将a中的第5个到第10个倒序,最后fun<p,0,9>;全部元素倒序。

[9.10]

以下程序的输出结果是A>4

4

B>2

2

C>24

D>46main<>{

int

a[5]={2,4,6,8,10},*p,**k;p=a;

k=&p;printf<"%d",*<p++>>;printf<"%d\n",**k>;}[解析]p指向a的第一个元素,printf<"%d",*<p++>>;先输出第一个元素为2,然后p++,所以p的地址就为指向4,k=&p;k是存放p的地址的,*k=p,**k就是p所指的元素为4,所以结果为24

[9.11]

当运行以下程序时输入三行,每行都是在第一列上开始,<CR>代表Enter键;a<CR>b<CR>cdef<CR>则程序的输出结果是A>abcdef

B>a

C>a

D>ab

b

bc

cd

cdef

d

f#include"stdio.h"#define

N

6main<>{charc[N];

int

i=0;for<i=0;i<N;i++>

c[i]=getchar<>;for<i=0;i<N;i++>

putchar<c[i]>;}[解析]回车键也是字符,所以a<CR>b<CR>cd这六个字符输出

[9.12]

若有定义和语句:

int

c[4][5],<*cp>[5];

cp=c;则对C数组元素的引用正确的是

A>cp+1

B>*<cp+3>

C>*<cp+1>+3

D>*<*cp+2>[解析]cp是行指针,只表示行,若要表示元素,则需要配合列A:表示第二行B:表示第四行的容,但是为指出那一列C:*<cp+1>+3只是地址不是元素值,需改为*〔

*<cp+1>+3

[9.13]

若已定义:

int

a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},<*prt>[3]=a,*p=a[0];则能够正确表示数组元素a[1][2]的表达式是A>*<<*prt+1>[2]>

B>*<*<p+5>>

C><*prt+1>+2

D>*<*<a+1>+2>[解析]A:多了外层的*〔,B:p是行地址,加5越界。C:少了外层的*〔

[9.14]

若有定义和语句:int

a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},<*prt>[3]=a,*p[4],i;for<i=0;i<4;i++>

p[i]=a[i];则下能够正确表示a数组元素的表达式是A>a[4][3]

B>p[0][0]

C>

prt[2][2]

D><*<p+1>>[1]

[9.15]

以下程序的输出结果是A>23

B>

26

C>33

D>36main<>{intaa[3][3]={{2},{4},{6}},i,*p=&aa[0][0];for<i=0;i<2;i++>{ if<i==0>aa[i][i+1]=*p+1; else++p; printf<"%d",*p>;} printf<"\n">;}[解析]p指向第一个元素2,if<i==0>aa[i][i+1]=*p+1;给aa[0][1]赋值2+1=3打印出p的容为2,第二次for循环++p,使p指向下一个元素即aa[0][1]=3,输出其容为3

[9.16]

以下程序的输出结果是A>60

B>

68

C>99

D>108main<>{

int

a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int

<*p>[4]=a,i,j,k=0;

for<i=0;i<3;i++>

for<j=0;j<2;j++>

k+=*<*<p+i>+j>;printf<"%d\n",k>;}[解析]k+=*<*<p+i>+j>;即求和:a[0][0]+a[0][1]+a[1][0]+a[1][1]+a[2][0]+a[2][1]=1+3+11+13+17+19=60

[9.17]

以下程序的输出结果是

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]>;}[解析]即输出x[0][2]x[1][1]x[2][0]分别为357

[9.18]

若有定义语句int

<*p>[M];

其中的标识符是

A>M个指向整型变量的指针

B>指向M个整型变量的函数指针C>一个指向具有M个整型元素的一维数组指针D>具有M个指针元素的一维指针数组,每个元素都只能指向整型量二、填空题

[9.19]

若有以下定义:

double

w[10];则数组元素下标的上限是9,下限是0。

[9.20]

以下程序的输出结果是6。main<>{inta[]={2,4,6},*ptr=&a[0],x=8,y,z;for<y=0;y<3;y++>z=<*<ptr+y><x>?*<ptr+y>:x;printf<"%d\n",z>;}[解析]因为a[]中元素永远小于x=8,所以每次For循环都执行z=<*<ptr+y>,循环3次最后输出的z为6〔前几次的z都被覆盖了

[9.21]

以下程序的输出结果是12。main<>{

int

arr[10],i,k=0;for<i=0;i<10;i++>

arr[i]=i;

for<i=0;i<4;i++>

k+=arr[i]+i;printf<"%d\n",k>;}[解析]首先arr[i]=i;使得arr[]中赋值0-9十个数,for循环4次,k+=arr[i]+i;得k=0+0+1+1+2+2+3+3=12

[9.22]

以下程序的输出结果是3

.#defineN5fun<char*s,chara,intn>{ intj; *s=a; j=n; while<a<s[j]>j--; returnj;}main<>{ chars[N+1]; intk,p; for<k=1;k<=N;k++>s[k]='A'+k+1; printf<"%d\n",fun<s,'E',N>>;}

[9.23]

若输入3个整数3、2、1,则以下程序的输出结果是2721。#include<stdio.h>#include<stdlib.h>voidsub<intn,intuu[]>{ intt; t=uu[n--]; t+=3*uu[n]; n++; if<t>=10> { uu[n++]=t/10;uu[n]=t%10; } else uu[n]=t;}main<>{ inti,n,aa[10]={0}; scanf<"%d%d%d",&n,&aa[0],&aa[1]>; for<i=1;i<n;i++>sub<i,aa>; for<i=0;i<=n;i++>printf<"%d",aa[i]>; printf<"\n">;}

[9.24]

以下程序的输出结果是-850,2,0

.main<>{

int

i,j,row,col,m;

int

arr[3][3]={{100,200,300},{28,72,-30},{-850,2,6}};m=arr[0][0];for<i=0;i<3;i++>for<j=0;j<3;j++>if<arr[i][j]<m>{m=arr[i][j];

row=i;

col=j;}printf<"%d,%d,%d\n",m,row,col>;}[解析]本题是为找出数组中的最小值,并输出其下标

[9.25]

以下findmax返回数组s中最大元素的下标,数组中元素的个数由t传入,请填空。findmax<int

s[],int

t>{

int

k,p;

for<p=0,k=p;p<t;p++>

if<s[p]>s[k]>

k=p

;return

k;}

[9.26]

以下程序统计从终端入的字符写字母的个数,中统计字母的个数,其它依次类推。用#号结束输入,请填空。#include

"stdip.h"#include

"ctype.h"main<>{

int

num[26]={0},i;

charc;while<<c=getchar<>>!="#">

if<isupper<c>>

num+=1;for<i=0;i<26;i++>if<num[i]>

printf<"%c:%d\n",i+'A',num[i]>;}

三、编程题

[9.27]

输入一行数字字符,请用数组元素作为计数器来统计每个数字字符的个数。用下标为0元素统计字符"1"的个数,下标为1的元素统计字符"2"的个数,...。[解析]#include<stdio.h>#include<stdlib.h>#include<ctype.h>main<>{ intnum[10]={0},number;charaa; printf<"请输入一串数字,并以#结束:">; while<<aa=getchar<>>!='#'>{ number=<int>aa;//将字符强制转化为数字 number-=48;//由于0的ASCII码为48,所以转换后要减去48 num[number-1]++;//出现一个字符,将记录该字符个数的数组元素相应加1 } for<inti=0;i<9;i++>{ printf<"%d的个数为:%d\t",i+1,num[i]>;//输出结果 } printf<"\n">;}

[9.29]

编写函数把数组中所有奇数放在另一个数组中返回。#include<stdio.h>#defineN10main<>{ intnum1[N]={2,3,56,78,13,45,66,79,80,91},*ptr,count=0,num2[N]={0}; ptr=num1; for<inti=0;i<N;i++>{ if<ptr[i]%2!=0>{ num2[i]=ptr[i]; count++; } }for<i=0;i<N;i++>{ if<num2[i]!=0> printf<"Odds的元素为:%2d\t",num2[i]>; } printf<"\n">;}

[9.30]

编写函数对字符数组中的输入字母,按由大到小的字母顺序进行排序。#include<stdio.h>main<>{ charchr[]={'a','h','c','k','z','c','h','c','y','l','n','w','q','f','b'}; chart;for<inti=0;i<14;i++>{ for<intj=i+1;j<15;j++>{ if<chr[i]>chr[j]>{ t=chr[i];chr[i]=chr[j];chr[j]=t; } } } for<i=0;i<15;i++>{ printf<"chr[%2d]:%c\t",i,chr[i]>; } printf<"\n">;}

[9.31]

输入若干有序数放在数组中。然后输入一个数,插入到此有序数列中,插入后,数组中的数仍然有序。请对以下三种情况运行你的程序,以便验证你的程序是否下确。〔1插在最前〔2插在最后〔3插在中间#include<stdio.h>#include<stdlib.h>#include<ctype.h>#defineN6intjudgePosition<int[],int>;voidexchange<int[],int,int>;main<>{intarr[N]={10,20,30,40,50},insert,posit; printf<"请输入待插入的数:\n">; scanf<"%d",&insert>; posit=judgePosition<arr,insert>; exchange<arr,posit,insert>; printf<"\n">;}intjudgePosition<inttemp[],intinsert>{ inti;for<i=0;i<N-1;i++>{ if<insert<temp[i]>break;}returni;}voidexchange<inttemp[],intposit,intinsert>{ for<inti=N-2;i>=posit;i-->{ temp[i+1]=temp[i]; } temp[posit]=insert; for<i=0;i<N;i++>{ printf<"arr[%2d]=%2d\n",i,temp[i]>; }}

[9.32]

编写函数把任意十进制下整数转换成二进制数。提示:把十进制数不断被2除余数放在一个一维数组中,直到商数为零。在主函数中进行输出,要求不得按逆序输出。#include<stdio.h>#defineN10main<>{ intorigin,result[N],i=0; printf<"请输入一个十进制的数:\n">; scanf<"%d",&origin>; do{ result[i]=origin%2; origin/=2; i++; }while<origin>;printf<"该十进制数转化为二进制数为:">;for<intj=i-1;j>=0;j-->{ printf<"%d",result[j]>;} printf<"\n">;}

[9.33]

编写函数调用随机函数产生0到19之间的随机数,在数组中存入15个互不重复的整数。要求在主函数中输出结果。若已定义为类型,调用随机函数步骤如下:

#include

"stdlib.h"

x=rand<>%20

/*产生0到19的随机数*/#include<stdio.h>#include<stdlib.h>#defineN15voidrandom<>;intcompare<int[],int,int>;main<>{random<>;printf<"\n">;}voidrandom<>{ intrandom[N]={0},tag=0,x=-1,i; for<i=0;i<N;i++>{ x=rand<>%20;/*产生0到19的随机数*/ tag=compare<random,x,i>; while<tag!=1>{ x=rand<>%20;/*产生0到19的随机数*/ tag=compare<random,x,i>; } random[i]=x; } printf<"15个0-19的不同随机数为:">; for<i=0;i<N;i++>{ printf<"%d\t",random[i]>; }}intcompare<intrandom[],intx,inti>{ for<intj=0;j<=i;j++>{if<x==random[j]>{ return0; } } return1;}

[9.34]

编写程序求任意方阵每行、每列、两对角线一元素之和。#include<stdio.h>#defineM3main<>{ intcol[M]={0},ver[M]={0},rec[M][M],xsum=0,x_sum=0; for<inti=0;i<M;i++>{ for<intj=0;j<M;j++>{ printf<"请输入元素:">; scanf<"%d",&rec[i][j]>; } } for<i=0;i<M;i++>{ for<intj=0;j<M;j++>{ printf<"rec[%d][%d]=%d\t",i,j,rec[i][j]>; } printf<"\n">; } printf<"\n">; for<i=0;i<M;i++>{ for<intj=0;j<M;j++>{col[i]=col[i]+rec[i][j]; ver[i]+=rec[j][i]; if<i+j==M-1>{ x_sum+=rec[i][j]; } if<i==j>{ xsum+=rec[i][j]; } } } for<i=0;i<M;i++>{ printf<"各行元素之和分别为:col[%d]=%d\n",i,col[i]>; } printf<"\n">; for<i=0;i<M;i++>{ printf<"各列元素之和分别为:ver[%d]=%d\n",i,ver[i]>; } printf<"\n">; printf<"主对角线上的元素的和为:%d\n\n副对角线上的元素的和为:%d\n",xsum,x_sum>;}若要改变矩阵的维数可以只改变M的大小即可。

[9.35]

编写程序求两个矩阵的和。#include<stdio.h>#defineM4#defineN3voidinput<int[M][N]>; voidoutput<int[M][N]>;voidsumAdd<int[M][

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论