C++程序设计基础课后答案第四章Word下载.docx

上传人:b****5 文档编号:18671361 上传时间:2022-12-31 格式:DOCX 页数:16 大小:27.16KB
下载 相关 举报
C++程序设计基础课后答案第四章Word下载.docx_第1页
第1页 / 共16页
C++程序设计基础课后答案第四章Word下载.docx_第2页
第2页 / 共16页
C++程序设计基础课后答案第四章Word下载.docx_第3页
第3页 / 共16页
C++程序设计基础课后答案第四章Word下载.docx_第4页
第4页 / 共16页
C++程序设计基础课后答案第四章Word下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

C++程序设计基础课后答案第四章Word下载.docx

《C++程序设计基础课后答案第四章Word下载.docx》由会员分享,可在线阅读,更多相关《C++程序设计基础课后答案第四章Word下载.docx(16页珍藏版)》请在冰豆网上搜索。

C++程序设计基础课后答案第四章Word下载.docx

=0;

j--,k++)

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

for(i=0;

{for(j=0;

j<

j++)

setw(3)<

a[i][j];

}

4.intf(int[],int);

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

cout<

f(a,6)<

intf(inta[],intsize)

{inti,t=1;

for(i=0;

size;

i++)

if(a[i]>

0)t*=a[i];

returnt;

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

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

f(a,3,3)<

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

{inti,j,t=1;

for(i=0;

row;

for(j=0;

col;

{a[i][j]++;

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

returnt;

6.#include<

voidtest1(int*a1)

{a1=newint(5);

*a1="

*a1<

voidtest2(int*&

a2)

{a2=newint(5);

*a2="

*a2<

{int*p=newint

(1);

test1(p);

test1:

*p1="

*p<

test2(p);

test2:

*p2="

7.#include<

{chars[]="

abccda"

;

inti;

charc;

for(i=1;

(c=s[i])!

='

\0'

;

{switch(c)

{case'

a'

:

%'

continue;

case'

b'

$'

break;

c'

*'

d'

#'

8.#include<

{char*str[]={"

c++"

"

basic"

pascal"

};

char**p;

p=str;

3;

*(p+i)<

9.#include<

{chars1[]="

Fortran"

s2[]="

Foxpro"

char*p,*q;

p=s1;

q=s2;

while(*p&

&

*q)

{if(*p==*q)

*p;

p++;

q++;

10.#include<

string.h>

voidmain()

{charstr[][10]={"

vb"

},s[10];

strcpy(s,(strcmp(str[0],str[1])<

0str[0]:

str[1]));

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

0)strcpy(s,str[2]);

s<

4.2思考题

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

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

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

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

有说明

intaa[3],*pa=aa;

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

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

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

写出k->

i,j的下标变换公式,并用程序验证之。

4.有以下函数

voidquery()

{int*p;

p=newint[3];

//……

delete[]p;

p=newdouble[5];

//……

出现了编译错误。

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

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

该程序运行后,主函数不能返回期望值。

请分析程序的错误原因并修改之。

#include<

voidcreate(int*,int);

{int*a,len;

cin>

>

len;

create(a,len);

for(inti=0;

i++)cout<

a[i]<

endl;

delete[]a;

voidcreate(int*ap,intn)

{ap=newint[n];

for(inti=0;

n;

i++)ap[i]=i;

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

【答案】

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

一维数组说明语句为:

类型数组名[表达式]

二维数组说明语句为:

类型数组名[表达式1][表达式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];

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

 【答案】

 转换公式i=k/nj=k%n

 验证程序:

  #include<

iostream>

  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:

endl;

   for(k=0;

k<

M*N;

k++)

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

k++)cout<

a[k]<

'

**Afterconvert**"

arrayb:

   for(i=0;

i<

M;

i++)

     {for(j=0;

j<

N;

j++)cout<

b[i][j]<

      cout<

     }

    }

 voidquery()

 {int*p;

  p=newint[3];

   //……

  delete[]p;

  p=newdouble[5];

 }

  在语句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。

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

  voidcreate(int*,int);

  {int*a=NULL,len;

   cin>

   create(a,len);

   for(inti=0;

len;

   cout<

   delete[]a;

   a=NULL;

  voidcreate(int*ap,intn)

  {ap=newint[n];

   for(inti=0;

   }

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

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

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

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

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

  voidcreate(int*&

int);

//函数原型声明,使用引用参数

ap,intn)//函数定义

i++)ap[i]=i;

4.3编程题

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

,其中n为学生人数,

为第i个学生成绩。

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

答案4.3-1

math.h>

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

doublesum1=0,sum2=0,ave,dev;

intn,i;

n=sizeof(s)/sizeof(double);

//求数组元素的个数

sum1+=s[i];

ave=sum1/n;

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

dev=sqrt(sum2/n);

rve="

ave<

dev="

dev<

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

答案4.3-2

stdlib.h>

time.h>

{inta[10],i,j;

longm;

srand(time(0));

//为随机数生成器设置种子值

{l:

a[i]=rand();

//产生随机数存放到数组中

if(a[i]<

10||a[i]>

=100)gotol;

for(j=0;

i;

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

{doublem=sqrt(a[i]);

for(j=2;

=m;

j++)

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

if(j>

m)

是素数!

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

答案4.3-3 

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

intindex[10];

inti,j,temp;

index[i]=i;

=8;

for(j=i+1;

=9;

if(a[i]<

a[j])

{temp=a[i];

a[i]=a[j];

a[j]=temp;

temp=index[i];

index[i]=index[j];

index[j]=temp;

index[i]<

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

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

例如,123321是回文数。

答案4.3-4

在程序中,首先拆分整数的每位数字按顺序存放到一个一维数组中。

然后用两个变量记录数组元素最大和最小的下标值,它们是两个高端和低端指针。

在循环中,比较这两个下标指示对称位置的元素,并使两个指针同时向中间移动(i++,j--)。

只要发现一个不相等的元素,表示该整数不是回文数。

如果直至i==j,都没有发现不相等的元素,则该整数是回文数。

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

longnum,n;

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<

j)

if(b[i++]!

=b[j--]) 

//对称位置元素不相等

{flag=0;

break;

if(flag)cout<

num<

是回文数!

elsecout<

不是回文数!

本题判断一个整数是否为回文数,可以不用数组拆分数字,直接用高位与低位数字比较。

还可以把程序写成递归方式。

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

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

答案4.3-5

把两个长度为m和n的有序数组a、b归并为长度m+n的有序数组c,可以利用原数组a、b的有序性,分别用指针i和j指示数组a和b的当前元素下标,当a[i]<

b[j],把a[i]写入数组c,否则把b[j]写入数组c。

若其中一个数组的元素读完,则应把另一个数组的剩余元素全部写入数组c。

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

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

intc[12],i,j,k;

i=j=k=0;

while(i<

4&

8)

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];

i++;

while(i<

4)

{c[k]=a[i];

//把数组a的剩余元素写入数组c

while(j<

{c[k]=b[j];

//把数组b的剩余元素写入数组c

k;

c[i]<

6.输入一个星期几号,输出相应的英文单词。

要求使用指针数组实现。

答案4.3-6

{char*weekday[7]={"

sunday"

monday"

tuesday"

wednesday"

thursday"

friday"

saturday"

};

intd;

pleaseinputweekday:

d;

if(d>

=0&

d<

=6)cout<

d<

---"

*(weekday+d)<

elsecout<

inputerror!

7.编写函数:

(1)在一个二维数组中形成如以下形式的n阶矩阵:

(2)去掉靠边元素,生成新的n-2阶矩阵;

(3)求矩阵主对角线下元素之和;

(4)以方阵形式输出数组。

在main函数中调用以上函数进行测试。

答案4.3-7

由于本题没有给定矩阵的阶数n,从而应按输入的要求建立动态数组。

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

当前位置:首页 > 医药卫生 > 基础医学

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

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