第四章习题及其解答.docx

上传人:b****4 文档编号:12397252 上传时间:2023-04-18 格式:DOCX 页数:30 大小:31.15KB
下载 相关 举报
第四章习题及其解答.docx_第1页
第1页 / 共30页
第四章习题及其解答.docx_第2页
第2页 / 共30页
第四章习题及其解答.docx_第3页
第3页 / 共30页
第四章习题及其解答.docx_第4页
第4页 / 共30页
第四章习题及其解答.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

第四章习题及其解答.docx

《第四章习题及其解答.docx》由会员分享,可在线阅读,更多相关《第四章习题及其解答.docx(30页珍藏版)》请在冰豆网上搜索。

第四章习题及其解答.docx

第四章习题及其解答

习题4及其解答

4.1选择题

1.以下对一维数组a的正确定义是(c)。

(a)intn=5,a[n];(b)inta(5);

(c)constintN=5;inta[N];(d)intn;cin>>n;inta[n];

2.下列数组定义语句中,不合法的是(a)。

(a)inta[3]={0,1,2,3};(b)inta[]={0,1,2};

(c)inta[3]={0,1,2};(d)inta[3]={0};

3.已知inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则不能表示数组a中元素的式子是(c)。

(a)*a(b)*p(c)a(d)a[p-a]

4.已知inta[]={0,2,4,6,8,10},*p=a+1;其值等于0的表达式是(d)。

(a)*(p++)(b)*(++p)(c)*(p--)(d)*(--p)

5.以下不能对二维数组a进行正确初始化的语句是(c)。

(a)inta[2][3]={0};

(b)inta[][3]={{0,1},{0}};

(c)inta[2][3]={{0,1},{2,3},{4,5}};

(d)inta[][3]={0,1,2,3,4,5};

6.已知inta[][3]={{0,1},{2,3,4},{5,6},{7}};则a[2][1]的值是(c)。

(a)0(b)2(c)6(d)7

7.已知inta[3][3]={1,2,3,4,5,6,7,8,9};则不能表示数组元素a[2][1]的地址是(b)。

(a)&a[2][1](b)*(a[2]+1)(c)a[2]+1(d)*(a+2)+1

8.已知char*a[]={"fortran","basic","pascal","java","c++"};则cout<

(a)t(b)一个地址值(c)java(d)javac++

9.若用数组名作为调用函数的实参,则传递给形参的是(a)。

(a)数组存贮首地址(b)数组的第一个元素值

(c)数组中全部元素的值(d)数组元素的个数

10.设有char*s1=”ABCDE”,*s2=”ABCDE”,*s3=s1;下列表达式中值等于true的是(d)。

(a)s1==s2(b)s1==s3(c)s2==s3(d)strcmp(s1,s3)==0

11.设char*s1,*s2;分别指向两个字符串。

判断字符串s1和s2是否相等的表达式为(d)。

(a)s1=s2(b)s1==s2

(c)strcpy(s1,s2)==0(d)strcmp(s1,s2)==0

12.设char*s1,*s2;分别指向两个字符串,判断字符串s1是否大于字符串s2的表达式为(c)。

(a)s1>s2(b)strcmp(s1,s2)==0

(c)strcmp(s1,s2)>0(d)strcmp(s2,s1)>0

4.2阅读下列程序,写出执行结果

1.

#include

usingnamespacestd;

intmain()

{inti,count=0,sum=0;

doubleaverage;

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

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

{if(a[i]%2==0)

continue;

sum+=a[i];

count++;

}

average=sum/count;

cout<<"count="<

}

【解答】

conut=5average=5

2.

#include

usingnamespacestd;

intmain()

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

int*p=a,sum=0;

for(;p

if(*p%2==0)sum+=*p;

cout<<"sum="<

}

【解答】

sum=20

3.

#include

#include

usingnamespacestd;

constintN=5;

intmain()

{inta[N][N]={0},i,j,k;

for(k=1,i=0;i

for(j=i;j>=0;j--,k++)

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

for(i=0;i

{for(j=0;j

cout<

cout<

}

}

【解答】

1361015

259140

481300

712000

110000

4.

#include

usingnamespacestd;

intf(int[],int);

intmain()

{inta[]={-1,3,5,-7,9,-11};

cout<

}

intf(inta[],intsize)

{inti,t=1;

for(i=0;i

if(a[i]>0)t*=a[i];

returnt;

}

【解答】

135

5.

#include

usingnamespacestd;

intf(int[][3],int,int);

intmain()

{inta[][3]={0,1,2,3,4,5,6,7,8};

cout<

}

intf(inta[][3],introw,intcol)

{inti,j,t=1;

for(i=0;i

for(j=0;j

{a[i][j]++;

if(i==j)t*=a[i][j];

}

returnt;

}

【解答】

45

6.

#include

usingnamespacestd;

voidtest1(int*a1)

{a1=newint(5);

cout<<"*a1="<<*a1<

}

voidtest2(int*&a2)

{a2=newint(5);

cout<<"*a2="<<*a2<

}

intmain()

{int*p=newint

(1);

test1(p);

cout<<"test1:

*p1="<<*p<

test2(p);

cout<<"test2:

*p2="<<*p<

}

【解答】

*a1=5

test1:

*p1=1

*a2=5

test2:

*p2=5

7.

#include

usingnamespacestd;

intmain()

{chars[]="abccda";

inti;charc;

for(i=1;(c=s[i])!

='\0';i++)

{switch(c)

{case'a':

cout<<'%';continue;

case'b':

cout<<'$';break;

case'c':

cout<<'*';break;

case'd':

continue;

}

cout<<'#'<

}

}

【解答】

$#

*#

*#

%

8.

#include

usingnamespacestd;

intmain()

{char*str[]={"c++","basic","pascal"};

char**p;

inti;

p=str;

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

cout<<*(p+i)<

}

【解答】

c++

basic

pascal

9.

#include

usingnamespacestd;

intmain()

{chars1[]="Fortran",s2[]="Foxpro";

char*p,*q;

p=s1;q=s2;

while(*p&&*q)

{if(*p==*q)

cout<<*p;

p++;

q++;

}

cout<

}

【解答】

For

10.

#include

#include

usingnamespacestd;

intmain()

{charstr[][10]={"vb","pascal","c++"},s[10];

strcpy_s(s,(strcmp(str[0],str[1])<0?

str[0]:

str[1]));

if(strcmp(str[2],s)<0)

strcpy_s(s,str[2]);

cout<

}

【解答】

C++

4.3思考题

1.数组说明语句要向编译器提供什么信息?

请写出一维数组、二维数组说明语句的形式。

【解答】

数组说明语句要向编译器提供数组名(标识符),数组元素的类型、数组维数、数组长度(元素的个数)等信息。

一维数组说明语句为:

类型数组名[表达式]

二维数组说明语句为:

类型数组名[表达式1][表达式2]

2.数组名、数组元素的区别是什么?

归纳一维数组元素地址、元素值不同的表示形式。

若有说明

intaa[3],*pa=aa;

请使用aa或pa,写出3个以上与aa[2]等价的表达式。

【解答】

数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;而数组元素是下标变量,性质相当于普通变量。

对一维数组aa第i个元素的地址可以表示为:

&aa[i]aa+i;

对一维数组aa第i个元素的值可以表示为:

a[i]*(a+i);

与aa[2]等价的表达式:

*(aa+2)*(&a[2])*(pa+2)pa[2]

3.要把一维数组inta[m*n]的元素传送到二维数组intb[m][n]中,即在程序中要执行

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

请写出ki,j的下标变换公式,并用程序验证。

【解答】

转换公式:

i=k/nj=k%n

验证程序:

#include

usingnamespacestd;

intmain()

{constintM=3,N=4;

intk,a[M*N]={1,2,3,4,5,6,7,8,9,10,11,12},b[M][N];

inti,j;

cout<<"arraya:

"<

for(k=0;k

b[k/N][k%N]=a[k];

for(k=0;k

cout<

cout<

cout<<"**Afterconvert**"<

cout<<"arrayb:

"<

for(i=0;i

{for(j=0;j

cout<

}

}

4.有以下函数

voidquery()

{int*p;

p=newint[3];

//……

delete[]p;

p=newdouble[5];

//……

delete[]p;

}

出现了编译错误。

请分析错误的原因,并把上述程序补充完整,上机验证你的判断。

【解答】

在语句p=newdouble[5];中企图把动态浮点型数组的地址写入整型指针p,造成错误。

错误为errorC2440:

“=”:

无法从“double*”转换为“int*”。

改正方法:

增加一个double*q指针。

voidquery()

{int*p;

p=newint[3];

delete[]p;

//……

double*q;

q=newdouble[5];

//……

delete[]q;

}

5.有以下程序根据输入值,设计功能是调用函数create建立并初始化动态数组,令a[i]=i。

但该程序运行后不能得到期望结果,请分析程序的错误原因并修改之。

#include

usingnamespacestd;

voidcreate(int*,int);

intmain()

{int*a=NULL,len;

cin>>len;

create(a,len);

for(inti=0;i

cout<

cout<

delete[]a;

a=NULL;

}

voidcreate(int*ap,intn)

{ap=newint[n];

for(inti=0;i

}

【解答】

函数create中,指针参数int*ap是传地址值的参数。

调用函数时接受实际参数a的值(地址值)作为初始值。

ap仅是局部变量,ap=newint[n]获得新的地址值,函数执行完毕返回,ap被释放,完全与实际参数a无关。

程序没有编译错误,但main不能获得动态数组。

修改方法是把ap改为指针引用参数。

voidcreate(int*&,int);//函数原型声明,使用引用参数

voidcreate(int*&ap,intn)//函数定义

{ap=newint[n];

for(inti=0;i

ap[i]=i;

}

4.4编程题

1.已知求成绩的平均值和均方差公式:

,其中n为学生人数,s

为第i个学生成绩。

求某班学生的平均成绩和均方差。

【解答】

#include

#include

usingnamespacestd;

voidaveMsd(double[],int,double&,double&);//求平均值和均方差值函数

intmain()

{doubles[]={76,85,54,77,93,83,90,67,81,65};

doubleave,msd;

inti,n;

n=sizeof(s)/sizeof(double);//求数组元素的个数

cout<<"学生成绩:

";

for(i=0;i

cout<

cout<

aveMsd(s,n,ave,msd);

cout<<"平均值:

"<

"<

}

voidaveMsd(doubles[],intn,double&ave,double&msd)

{inti;

doublesum1=0,sum2=0;

for(i=0;i

sum1+=s[i];

ave=sum1/n;

for(i=0;i

sum2+=pow(s[i]-ave,2);

msd=sqrt(sum2/n);

}

2.用随机函数产生10个互不相同的两位整数存放到一维数组中,并输出其中的素数。

【解答】

#include

#include

#include

#include

usingnamespacestd;

intmain()

{inta[10],i,j;

srand(int(time(0)));//为随机数生成器设置种子值

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

{l:

a[i]=rand();//产生随机数存放到数组中

if(a[i]<10||a[i]>=100)//获取指定范围数据

gotol;

for(j=0;j

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

gotol;

}

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

cout<

cout<

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

{doublem=sqrt(double(a[i]));

for(j=2;j<=m;j++)

if(a[i]%j==0)break;

if(j>m)

cout<

}

cout<<"是素数!

"<

}

3.将一组数据从大到小排列后输出,要求显示每个元素及它们在原数组中的下标。

【解答】

#include

usingnamespacestd;

intmain()

{inta[]={38,6,29,1,25,20,6,32,78,10};

intindex[10];//记录下标的数组

inti,j,temp;

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

index[i]=i;

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

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

if(a[i]

{temp=a[i];a[i]=a[j];a[j]=temp;

temp=index[i];index[i]=index[j];index[j]=temp;

}

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

cout<

}

4.从键盘上输入一个正整数,判别它是否为回文数。

所谓回文数是指正读和反读都一样的数。

例如,123321是回文数。

【解答】

#include

usingnamespacestd;

intmain()

{intb[10],i,j,k,flag;

longnum,n;

cout<<"num=";cin>>num;

k=0;

n=num;

do//拆分整数,把各数字放入数组b

{b[k++]=n%10;

n=n/10;

}while(n!

=0);

flag=1;//判断标志

i=0;j=k-1;//设置指示下标的指针

while(i

if(b[i++]!

=b[j--])//对称位置元素不相等

{flag=0;

break;

}

if(flag)cout<

"<

elsecout<

"<

}

5.把两个升序排列的整型数组合并为一个升序数组。

设计好你的算法,以得到较高的运行效率。

【解答】

#include

usingnamespacestd;

voidmerge(constinta[],intna,constintb[],intnb,intc[],intnc);

intmain()

{inta[4]={1,2,5,7};

intb[8]={3,4,8,8,9,10,11,12};

intc[12];

inti;

merge(a,4,b,8,c,12);

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

cout<

cout<

}

voidmerge(constinta[],intna,constintb[],intnb,intc[],intnc)

{inti,j,k;

i=j=k=0;

while(i

if(a[i]>b[j])//当a[i]>b[j],把b[i]写入数组c

{c[k]=b[j];k++;j++;}

else//当a[i]<=b[j],把a[i]写入数组c

{c[k]=a[i];k++;i++;}

while(i

{c[k]=a[i];i++;k++;}//把数组a的剩余元素写入数组c

while(j

{c[k]=b[

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1