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

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

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

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

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

C++程序设计基础课后答案第四章

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

1.#include

  voidmain()

   {inti,conut=0,sum=0;

     floataverage;

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

        conut++;

      }

      average=sum/conut;

      cout<<"conut="<

   }

2.#include

 voidmain()

 {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="<

 }

3.constintn=5;

  #include

  #include

  voidmain()

   {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<

        }

   }

4.intf(int[],int);

 #include

 voidmain()

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

  }

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

  #include

  voidmain()

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

  }

6.#include

  voidtest1(int*a1)

  {a1=newint(5);

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

  }

  voidtest2(int*&a2)

  {a2=newint(5);

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

  }

  voidmain()

  {int*p=newint

(1);

    test1(p);

    cout<<"test1:

*p1="<<*p<

    test2(p);

    cout<<"test2:

*p2="<<*p<

  }

7.#include

  voidmain()

  {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

  voidmain()

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

    char**p;

    inti;

    p=str;

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

        cout<<*(p+i)<

  }

9.#include

  voidmain()

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

    char*p,*q;

    p=s1;q=s2;

    while(*p&&*q)

      {if(*p==*q)

       cout<<*p;

       p++;

       q++;

      }

    cout<

  }

10.#include

  #include

   voidmain()

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

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

str[1]));

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

     cout<

   }

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

   //……

 delete[]p;

}

出现了编译错误。

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

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

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

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

#include

voidcreate(int*,int);

voidmain()

{int*a,len;

 cin>>len;

 create(a,len);

 for(inti=0;i

 cout<

 delete[]a;

}

voidcreate(int*ap,intn)

{ap=newint[n];

 for(inti=0;i

}

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

请写出k→i,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<<"**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<

   delete[]a;

   a=NULL;

  }

  voidcreate(int*ap,intn)

  {ap=newint[n];

   for(inti=0;i

   }

  【答案】

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

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

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

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

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

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

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

  {ap=newint[n];

   for(inti=0;i

  }

4.3编程题

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

,其中n为学生人数,

为第i个学生成绩。

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

答案4.3-1

#include

#include

voidmain()

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

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

 intn,i;

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

 for(i=0;i

   sum1+=s[i];

  ave=sum1/n;

 for(i=0;i

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

  dev=sqrt(sum2/n);

  cout<<"rve="<

 }

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

答案4.3-2

#include

#include

#include

#include

voidmain()

{inta[10],i,j;longm;

 srand(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(a[i]);

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

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

 if(j>m)

     cout<

 }

 cout<<"是素数!

"<

}

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

答案4.3-3 

#include

voidmain()

{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是回文数。

答案4.3-4

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

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

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

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

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

#include

 voidmain()

 {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.把两个升序的整型数组合并为一个升序数组。

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

答案4.3-5

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

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

#include

voidmain()

{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&&j<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];k++;i++;}

  while(i<4)

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

  while(j<8)

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

  for(i=0;i

   cout<

   cout<

}

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

要求使用指针数组实现。

答案4.3-6

#include

voidmain()

{char*weekday[7]={"sunday","monday","tuesday",

                    "wednesday","thursday","friday","saturday"};

  intd;

  cout<<"pleaseinputweekday:

";

  cin>>d;

  if(d>=0&&d<=6)cout<

      elsecout<<"inputerror!

"<

}

7.编写函数:

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

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

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

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

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

答案4.3-7

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

  需

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

当前位置:首页 > 高等教育 > 文学

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

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