C++课本的练习题及答案(第四章)

第4章练习题

同步练习4.1

一、选择题

1.有数组定义  double d[10];  以下叙述不正确的是(    )。

(A)数组d有10个元素                            (B)数组d的最后一个元素是d[10]

(C)数组d的第一个元素*d                      (D)数组d的字节数是sizeof(double)*10

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

(A)int n = 5, a[n];                                       (B)int a(5);

(C)const int N = 5; int a[N];                       (D)int n;  cin>>n; int a[n];   

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

(A)int a[3] = { 0, 1,2, 3 };                         (B)int a[] = { 0, 1,2 };

(C)int a[3] = { 0, 1,2 };                    (D)int a[3] = { 0 };

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

(A)*a                    (B)*p                       (C)a                         (D)a[ p-a ]

扫描二维码关注公众号,回复: 11108609 查看本文章

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

(A)* (p++)            (B)*(++p)               (C)*(p--)               (D)*(--p)

【解答】     B       C       A      C       D

二、程序练习

1.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

int main()

{ int i, count=0, sum=0;

double average;

int a[] = { 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 = " <<count << '\t' << "average = " << average <<endl;

}

【解答】

        

2.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

int main()

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

int *p = a, sum =0;

for(; p<a+9; p++ )

   if(*p % 2 == 0 )

  sum+= *p;

cout << "sum = " << sum << endl;

}

【解答】

 
 

3.设计一个程序,要求有以下功能:

(1)声明一个长度为10的整型数组;

(2)输入数组元素;

(3)寻找数组中的最大值元素和这个元素的下标;

(4)输出最大值元素的值和它的下标值。

【解答】

#include<iostream>

#include<cstdlib>

using namespace std;

int main()

{

    int a[10],max,i,j;

    cout<<"请输入10个数:";

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

    {

        cin>>a[i];   

    }

    max=0;                 //记录最大元素的下标

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

    {

        if(a[j]>=a[max])              //用当前最大元素与遍历元素比较

        max=j;                         //修改最大下标值

    }

    cout<<"最大值为:"<<a[max]<<endl;

         cout<<"它的下标为:"<<max<<endl;

}

同步练习4.2

一、选择题

1. 说明一个长度为10的数组,元素类型为整型指针的正确语句是(    )。

(A)int *pary[10];                                       (B)int (*pary)[10]  

(C)int *pary(10);                                        (D)int **pary[10]

2. 有以下语句,则能够输出a+b+c的值的语句是(    )。

int a=1, b=2, c=3; int*pary[3]={&a, &b, &c};

(A)cout<<(pary[0]+pary[1]+pary[2]);       (B)cout<<(*pary[0]+*pary[1]+*pary[2]);

(C)cout<<(pary[1]+pary[2]+pary[3]);       (D)cout<<(*pary[1]+*pary[2]+*pary[3]);

【解答】    A      B

二、程序练习

使用以下语句:

const int n=20;

int a[n]; int *pa[n];  int i;

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

   a[i]=i+1;

编写完整的程序,通过pa数组修改数组a元素的值,使其元素值自增10,然后通过pa数组遍历a数组,输出全部元素值,要求每行输出10个元素。

【解答】

#include<iostream>

usingnamespace std;

intmain()

{

         const int n=20;

         int a[n];

         int *pa[n];

         int i;

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

         {

                   a[i]=i+1;

                   pa[i]=a+i;                               //对指针数组元素赋值

                   *pa[i]+=10;                            //数组元素值自增10

                   cout<<*pa[i]<<"  ";             //输出数组元素

                   if((i+1)%10==0)                    //格式控制

                            cout<<endl;

         }

}

同步练习4.3

一、选择题

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

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

(B)int a[][3] = { {0,1 }, { 0 } };

(C)int a[2][3] = { {0, 1 }, { 2, 3 }, { 4, 5 } };

(D)int a[][3] = { 0,1, 2, 3, 4, 5 };

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

(A)0                      (B)2                        (C)6                         (D)7

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

(A)&a[2][1] (B)*(a[2]+1)        (C)a[2]+1           (D)*(a+2)+1

4. 有以下说明语句,则正确的赋值语句是(    )。

int a[5][5];  int*p, **q;

(A)p=a;                 (B)p=*a;                 (C)q=a;                   (D)q=*a;

5. 有以下说明语句,则正确的赋值语句是(    )。

int a[5][5];  int*p, **q;

(A)p=a[0];             (B)p=&a[0];            (C)q=a[0];               (D)q=&a[0][0];

【解答】      C     C       B       B       A

二、程序练习

1.阅读程序,写出运行结果。

#include <iostream>

#include <iomanip>

using namespace std;

const int N = 5;

int main()

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

   for( k=1,i=0; i<N; i++ )

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

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

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

   {  for( j=0; j<N; j++ )

         cout<< setw( 3 ) << a[i][j];

      cout << endl;

   }

}

【解答】

 
 

        

2.以下程序用于输入一个矩阵的元素,并输出指定行的元素。请补充inputAry函数和outputAry函数。

#include<iostream>

using namespace std;

const int N=5;

int main()

{  intary[N][N], k;

   inputAry(ary,N);

   cout<<"输入行号,k = ";

   cin>>k;

   outputAry(ary,N, k-1);

}

【解答】

#include<iostream>

usingnamespace std;

constint N=5;

voidinputAry(int ary[N][N], int n );

voidoutputAry(const intary[N][N], int n, intline);

intmain()

{

         intary[N][N], k;

         inputAry(ary, N);

         cout<<"输入行号,k = ";

         cin>>k;

         outputAry(ary, N, k-1);

}

voidinputAry(int ary[N][N], int n)

{

         cout<<"输入"<<n<<"*"<<n<<"个矩阵元素\n";

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

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

                   cin>>ary[i][j];

}

voidoutputAry(const intary[N][N], int n, intk)

{

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

                   cout<<ary[k][i]<<";

         cout<<endl;

}

同步练习4.4

一、选择题

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

(A)数组存储首地址                                 (B)数组的第一个元素值

(C)数组中全部元素的值                          (D)数组元素的个数

2.有说明语句:int a[10];

及函数:int fun(int x[10], int n)  {  returnsizeof(x);  }

则语句  cout<<fun(a,10)<<endl;  的显示结果是(    )。

(A)40                              (B)10                      (C)4                                 (D)0

3.有以下说明语句,则调用函数的正确语句是(    )。

int a[10];

void fun( int * ,int n);

(A)fun(a, 10);                 (B)fun(a[0], 10);     (C)fun(*a, 10);                 (D)fun(&a, 10);

4.有以下说明语句,则调用函数的正确语句是(    )。

int b[4][5];

void fun( int * ,int n);

(A)fun(b, 20);                 (B)fun(b[0], 20);     (C)fun(b[0][0], 20); (D)fun(&b, 20);

5. 有以下说明语句,则调用函数的正确语句是(    )。

int x[4][5];

void fun( int y[4][5] , int m, int n);

(A)fun(x, 4,5);                (B)fun(*x, 4,5);       (C)fun(x[0], 4,5);             (D)fun(&x, 4,5);

【解答】      A      C       A      B       A

二、程序练习

1.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

int f(int [],int);

int main()

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

   cout<< f( a, 6 ) << endl;

}

int f( int a[], int size )

{  int i,t=1;

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

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

   return t;

}

【解答】

2.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

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

int main()

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

   cout<< f( a, 3, 3 ) << endl;

}

int f( int a[][3], int row, int col )

{  int i, j,t=1;

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

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

      {  a[i][j]++;

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

      }

   return t;

}

【解答】

3.本程序的main函数定义了一个用二维数组m表示的6×6方阵。程序中:

(1)调用setMatrix函数,对方阵元素赋不大于100的随机整数;

(2)调用diagonal函数,依次把m阵的主对角线、次对角线放在数组a中。

请补充定义setMatrix函数和diagonal函数,使其成为完整程序。

#include<iostream>

#include <cstdlib>

#include<ctime>

using namespace std;

const int N=6;

int main()

{  intm[N][N],a[2*N],i,j;

   setMatrix( m, N*N );                //调用函数,对方阵元素赋不大于100的随机整数

   cout<<N<<"*"<<N<<"方阵:\n";

   for(i=0; i<N; i++ )         //输出方阵元素

   { for(j=0;j<N; j++) 

         cout<<m[i][j]<< '\t';

      cout<<endl;

   }

   diagonal( m, a, N );                  //调用函数,依次把m阵的主对角线、次对角线放在数组a中

   cout<<"对角线元素:\n";

   for(i=0; i<2*N; i++ )              //输出对角线元素

      cout<<a[i]<<"  ";

   cout<<endl;

}

【解答】

void setMatrix( int matrix[][N],intn )              //matrix是二维数组参数

{ int i,*p;                                //p是一级指针变量

 p=*matrix;                         //二维数组作降维处理

 srand(unsigned(time(0)));

 for( i=0; i<n; i++,p++ )

     *p= rand()%100;                   //对数组元素赋随机数

 }

void diagonal( int matrix[][N],int *ary, int n)

{ int i;

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

 {   ary[i]= matrix[i][i];                //主对角线

         ary[i+n]=matrix[i][n-i-1];               //次对角线

 } 

}

同步练习4.5

一、选择题

1. 以下建立动态存储的语句正确的是(    )。

(A)int p=new int;                              (B)int p=new (10); 

(C)int *p(10);                                    (D)int *p=newint(10);

2. 以下建立动态存储的语句正确的是(    )。

(A)int p=new int[];                            (B)int p=new [10]; 

(C)int *p=newint[10];                      (D)int *p[10]=newint;

3. 有说明语句,则释放动态数组的正确语句是(    )。

int *p=new int[10];

(A)delete []p;                                    (B)delete p[]

(C)delete int[]p                                  (D)delete p int[10]

4. 有说明语句,则访问动态数组元素的正确语句是(    )。

int *p=new int[10];

(A)int a=p;                                         (B)int a=&p;

(C)int* a=p[1]                                  (D)int a=p[1];

【解答】      D      C       A      C

二、程序练习

1.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

int main()

{  int *p;

   cout<< "test1: \n" ;

   p= newint( 5);

   cout<<*p<< endl;

   p= newint[5];

   cout<< "test2: \n";

   for(inti=0; i<5; i++)

   {  *(p+i)=i+1;

      cout <<*(p+i) << "\t";

   }

   cout<<endl;

}

【解答】

2.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

void test1( int *a1 )

{  a1 = newint( 5 );

   cout<< "*a1 = " << *a1 << endl;

}

void test2(int * & a2)

{  a2 = newint( 5 );

   cout<< "*a2 = " << *a2 << endl;

}

int main()

{  int *p =new int( 1 );

   test1( p);

   cout<< "test1: *p1 = " << *p << endl;

   test2( p);

   cout<< "test2: *p2 = " << *p << endl;

}

【解答】

 
 

3.以下程序修改了同步练习4.3程序练习第2题中程序的主函数,请补充inputAry函数和outputAry函数,使程序完成相同的功能。

#include<iostream>

using namespace std;

int main()

{  int *pa,n, k;

   cout<<"输入矩阵的阶,n = ";

   cin>>n;

   pa=newint[n*n];

   inputAry(pa,n);

   cout<<"输入行号,k = ";

   cin>>k;

   outputAry(pa,n, k-1);

}

【解答】

#include<iostream>

usingnamespace std;

voidinputAry(int *ary, int n );

voidoutputAry(const int *ary, int n, int k);

intmain()

{

         int *pa, n, k;

         cout<<"输入矩阵的阶,n = ";

         cin>>n;

         pa=new int[n*n];

         inputAry(pa, n);

         cout<<"输入行号,k= ";

         cin>>k;

         outputAry(pa, n, k-1);

}

voidinputAry(int *ary, int n)

{

         cout<<"输入"<<n<<"*"<<n<<"个矩阵元素\n";

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

                   cin>>ary[i];

}

voidoutputAry(const int *ary, int n, int k)

{

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

                   cout<<ary[n*k+i]<<"  ";

         cout<<endl;

}

同步练习4.6

一、选择题

1.已知  char *a[]={ "fortran", " basic", "pascal","java", "c++" };  则 cout<<a[3];的显示结果是(    )。

(A)t                       (B)一个地址值       (C)java                    (D)javac++

2.设有  char *s="ABCDE"; cout<<*(s+1)<<endl;  输出结果是(    )。

(A)A                     (B)B                        (C)ABCD               (D)BCD

3.设有  char *s="ABCDE"; cout<<(s+1)<<endl;  输出结果是(    )。

(A)A                     (B)B                        (C)ABCD               (D)BCDE

4.设有  char *s="ABCDE"; cout<<strlen(s)<<endl;  输出结果是(    )。

(A)6                      (B)5                        (C)4                        (D)1

5.设  char *s1, *s2;  分别指向两个字符串,可以判断字符串s1和s2是否相等的表达式为(    )。

(A)s1=s2                                           (B)s1==s2

(C)strcpy(s1,s2)==0                         (D)strcmp(s1,s2)==0

【解答】      C       B       D      B       D

二、程序练习

1.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

int main()

{  char s[]= "abccda";

   inti;  char c;

   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<< '#' << endl;

   }

}

         【解答】

2.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

int main()

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

   char**p;  int i;

   p =str;

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

      cout<< * ( p+i ) << endl;

}

【解答】

 
 

3.阅读程序,写出运行结果。

#include <iostream>

using namespace std;

int main()

{  char s1[]= "Fortran", s2[] = "Foxpro";

   char*p, *q;

   p =s1;  q = s2;

   while(*p && *q )

   {  if (*p == *q )

         cout << *p;

      p++;

      q++;

   }

   cout<< endl;

}

【解答】

4.阅读程序,写出运行结果。

#include <cstring>

#include <iostream>

using namespace std;

int main()

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

}

【解答】

 
 

5.本程序可以完成对字符串text的插入和删除操作。其中:

insertStr(text,s,n);                  //在text串的第n个字符后插入s串

deleteStr(text,start,n);             //删除text串中从第start 个字符开始,连续n个字符的串

请补充定义insertStr函数和deleteStr函数(不使用标准库函数)。函数不需要考虑字符串的允许长度。

#include<iostream>

using namespacestd;

voidinsertStr(char *t, char *s,int n);

voiddeleteStr(char *t, int start, int n);

void main()

{  char text[256]="\0";

   char s[128]="\0";

   int k,n,start;

   while(1)

   {  cout<<"当前字符串:"<<text<<endl;

      cout<<"请选择:1—插入字符串    2—删除字符串    0—退出\n";

      cin>>k;

      switch(k)

      { case 1:

            {  cout<<"请输入字符串:";

               cin>>s;

               cout<<"插入位置?";

               cin>>n;

               insertStr(text,s,n);

               break;

            }

         case 2:

            {  cout<<"请输入删除字符串开始位置:";

               cin>>start;

               cout<<"被删串长?";

               cin>>n;

               deleteStr(text,start,n);

               break;

            }

         case 0: return;

      }

   }

}

【解答】

voidinsertStr(char *t, char *s,int n)

{

  int i,k;

  int lens=strlen(s);

  int lent=strlen(t);

  if(lent==0)

          n=0;

  for(i=lent;i>=n;i--)

    t[i+lens]=t[i];

  for(k=0;k<lens;k++)

    t[++i]=s[k];

}

voiddeleteStr(char *t,int start, int n)

   int i=start-1;

   while(t[i+n])

         { t[i]=t[i+n];

          i++;

         }

         t[i]='\0';

}

综合练习

一、思考题

1.数组说明语句要向编译器提供什么信息?请写出一维数组、二维数组说明语句的形式。

【解答】

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

一维数组说明语句为: 类型 数组名[表达式]

二维数组说明语句为: 类型 数组名[表达式1] [表达式2]

2.数组名、数组元素的区别是什么?归纳一维数组元素地址、元素值不同的表示形式。若有说明:

int aa [3], *pa=aa;

请使用aa或pa,写出三个以上与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.要把一维数组int a[m*n] 的元素传送到二维数组int b[m][n]中,即在程序中要执行:

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

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

【解答】

转换公式:  i=k/n  j=k%n

验证程序:

#include<iostream>

using namespacestd;

int main()

{

const intM=3,N=4;

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

  int i,j;

  cout<<"array a:"<<endl;

  for( k=0; k<M*N; k++ )

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

  for( k=0; k<M*N; k++ )

 cout<<a[k]<<'\t';

  cout<<endl;

cout<<"**Afterconvert**"<<endl;

  cout<<"array b:"<<endl;

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

  {

for(j=0;j<N;j++)cout<<b[i][j]<<'\t';

       cout<<endl;

  }

}

4.有以下函数:

void query()

{  int *p;

   p=newint[3];

   //…

   delete []p;

   p=new double[5];

   //…

  delete []p;

}

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

【解答】

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

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

改正方法:增加一个double*q指针。

void query()

{

int *p;

  p=new int[3];

  delete [] p;

  //……

  double *q;

  q=new double[5];

//……

  delete []q;

}

5.有以下程序,设计功能是调用函数create建立并初始化动态数组,令a[i]=i。但该程序运行后不能得到期望结果,请分析程序的错误原因并进行修改。

#include <iostream>

using namespace std;

void create(int *, int);

int main()

{  int *a =NULL, len;

   cin>>len;

   create(a,len);

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

   cout<< a[i] << "   ";

   cout<< endl;

   delete[]a;

   a =NULL;

}

void create(int *ap, int n)

{  ap=newint[n];

   for(inti=0; i<n; i++) ap[i]=i;

}

   【解答】

函数create中,指针参数int*ap是传地址值的参数。调用函数时接受实际参数a的值(地址值)作为初始值。ap仅是局部变量,ap=newint[n]获得新的地址值,函数执行完毕返回,ap被释放,完全与实际参数a无关。程序没有编译错误,但main不能获得动态数组。修改方法是把ap改为指针引用参数。

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

void create(int*&ap,int n)           //函数定义

{

ap=newint[n];

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

ap[i]=i;

}

二、程序设计

1.已知求成绩的平均值和均方差公式:, ,其中,n为学生人数,si为第i个学生成绩。求某班学生的平均成绩和均方差。

【解答】

#include<iostream>

#include<cmath> 

using namespacestd;

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

int main()

{

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

double ave, msd;

int i,n;

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

cout<<"学生成绩:";

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

  cout<<s[i]<<"  ";

cout<<endl;

aveMsd( s, n,ave, msd );

cout <<"平均值:" <<ave << endl << "均方差值:"<< msd << endl;

}

void aveMsd(double s[], int n, double &ave, double &msd )

{

int i;

double sum1=0,sum2=0;

for( i=0; i<n;i++ )             //求平均值

   sum1 += s[i];

ave = sum1/n;

for( i=0; i<n;i++ )             //求均方差

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

msd = sqrt(sum2/n );

}

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

【解答】

#include<iostream>

#include<cmath>        

#include <cstdlib>

#include<ctime>

using namespace std;

int main()

{

int a[10],i,j;

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

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

  {

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

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

goto l;

           for( j=0; j<i;j++ )                              //排除相同数据

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

goto l;

  }

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

     cout << a[i] << "   ";

  cout << endl;

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

  {

double m=sqrt( double(a[i]) );

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

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

     if( j>m )

       cout << a[i] << "   ";

  }

  cout << "是素数!" << endl;

}

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

【解答】

#include<iostream>

usingnamespace std;

intmain()

{

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

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

 int i,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] < a[j] )

      {

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 << a[i] << '\t' << index[i] << endl;

}

4.从键盘输入一个正整数,判别它是否为回文数。所谓回文数,是指正读和反读都一样的数。例如,123321是回文数。

【解答】

#include<iostream>

usingnamespace std;

intmain()

{

int b[10], i, j, k, flag ;

 long num, 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<j)

   if( b[i++] != b[j--] )                           //对称位置元素不相等

    {

 flag = 0;           

      break ;

    }

 if( flag )  cout << num<< "是回文数!" << endl;

 else  cout << num <<"不是回文数!" << endl;

}

5.把两个升序排列的整型数组合并为一个升序数组。设计好算法,以得到较高的运行效率。

【解答】

#include<iostream>

using namespacestd;

void merge(constint a[],int na, const int b[],int nb, int c[],int nc);

int main()

{

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

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

  int c[12];

  int i;

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

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

    cout << c[i] << "   ";

  cout << endl;

}

void merge(constint a[],int na, const int b[],int nb, int c[],int nc)

{

int i,j,k;

  i = j = k = 0;

  while( i<na && j<nb )

  {

    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<na )

  {

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

}    

  while( j<nb )

  {

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

}    

}

6.输入一个表示星期几的数,然后输出相应的英文单词。要求:使用指针数组实现。

【解答】

#include<iostream>

usingnamespace std;

intmain()

{

char *weekday[7]

= { "sunday","monday", "tuesday","wednesday","thursday", "friday", "saturday" };

 int d;

 cout << "please input week day: ";

 cin >> d;

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

cout << d << "---"<< *( weekday + d ) <<endl;

 else

 cout << "input error!"<< endl;

}

7.编写以下函数:

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

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

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

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

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

【解答】

#include<iostream>

usingnamespace std;

void create( int *&app, int n );

void del( int *&app, int *&bpp,int n );

int maindiagonal( int *&app, int n );

void output( int *&app, int );

int main()

{

int *ap = NULL, *bp = NULL, n;

 cout << "输入矩阵的阶:";

 cin >> n;

 create( ap,n );

 cout << "\n形成矩阵:\n";

 output( ap, n );

 cout << "去掉靠边元素生成的矩阵:\n";

 del( ap,bp,n );

  output(bp,n-2 );

 cout << "主对角线元素之和:"<< maindiagonal( ap, n ) <<endl;

}

//形成n阶矩阵函数

void create( int * &app, int n )

{

app = new int[ n*n ];

 int i,j,k = 0;

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

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

    {

 if( i<=j )

app[k] = 1;

       else

 app[k] = i-j+1;

       k++;

    }

}

//去掉靠边元素生成n-2阶矩阵函数

void del( int *&app, int *&bpp,int n )

{

 int i,j,k = 0;

 bpp = new int[ ( n-2 )*( n-2 ) ];

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

  {

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

          if ( i && j && i<n-1&& j <n-1 )

          {

 bpp[k]= *( app + i*n + j );   

             k++;

        }

  }

}

//求主对角线元素之和函数

int maindiagonal( int *&app, int n )

{

int i,j,k = 0,sum = 0;

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

  {

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

          if( i==j )

            sum += *( app + i*n + j);

  }

 return sum;

}

//以方阵的形式输出数组函数

void output( int *&app, int n )

{

 int i,j;

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

  {

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

           cout << *( app + i*n + j)<<  '\t';

   cout<<endl;

  } 

 cout<<endl;

}

8.设某城市三个百货公司某个季度销售电视机的情况和价格如下所示。编写程序,将表数据用数组存放,求各百货公司的电视机营业额。

牌号

价格

康佳

3500

TCL

3300

长虹

3800

 

          牌号

 公司

康佳

TCL

长虹

第一百货公司

300

250

150

第二百货公司

200

240

200

第三百货公司

280

210

180

【解答】

#include<iostream>

usingnamespace std;

intmain()

{

long s[][3] = { { 300, 250, 150 }, { 200,240, 200},{ 280, 210, 180 } };

 long p[] = { 3500, 3300, 3800 };

 int i,j;

 double sum;

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

  {

sum=0;

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

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

   cout << "第"<< i+1 << "百货公司的电视机营业额:  " << sum << endl;

  }

}

9.设计函数求一整型数组的最小元素及其下标。在主函数中定义和初始化该整型数组,调用该函数,并显示最小元素值和下标值。

【解答】

#include<iostream>

usingnamespace std;

int fmin(int [], int);

int main()

{

int a[ ] = { 73, 85, 62, 95, 77, 56, 81,66, 90, 80 };

 int index;

 index = fmin( a, sizeof(a)/sizeof(int) );

 cout << "The minnum number is : " << a[index]<< endl;

 cout << "The index is : " << index << endl;

}

int fmin( int a[], int size )

{

int i,min = a[0], index = 0;

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

   if( a[i]<min )

{

 min = a[i];

index = i;

};

 return index;

}

10.假设有从小到大排列的一组数据存放在一个数组中,在主函数中从键盘输入一个在该数组的最小值和最大值之间的数,并调用一个函数把输入的数插入到原有的数组中,保持从小到大的顺序,并把最大数挤出。然后在主函数中输出改变后的数组。

【解答】

#include<iostream>

usingnamespace std;

void insert( int a[],int,int );

int main()

{

 int a[] = { 10, 12, 23, 25, 48, 48, 53, 58,60, 78 };

 int x,n,i;

 cout << "please input insert data: ";

 cin >> x;

  n= sizeof(a)/sizeof(int);                //求数组长度

 insert( a, n, x );                         //插入元素

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

   cout << a[i] << "  ";

cout << endl;

}

void insert( int a[],int n,int x )

{

 int i,p,j;

  if( x<a[n-1] )

  {

 for( i=1; i<n; i++ )      //查找插入位置

     if( x<a[i] )

{

 p=i; break;

}

     for( j=n-1; j>=p; j-- )                //后移元素,挤出最大值

        a[j] = a[j-1];

     a[p] = x;                                              //插入元素

  }

}

11.一个整型数组的每个元素占4字节。编写一个压缩函数pack,把一个无符号小整数(0~255)数组进行压缩存储,只存放低8位;再编写一个解压函数unpack,把压缩数组展开,以整数形式存放。主函数用随机函数生成数据初始化数组,测试pack和unpack函数。

【解答】

#include<iostream>

#include <cstdlib>

#include<ctime>

using namespace std;

void pack( int *a, unsignedchar *p,int n );

void unpack( unsigned char *p, int *a, int n );

int main()

{

   int*ary, n, i;

   unsigned char *packary;

   cout<<"请输入数组长度:";

   cin>>n;

   ary= new int [n];                                     //建立动态数组

   packary= new unsigned char[n];             //压缩数组

   srand(int(time(0)));

   for(i=0;i<n;i++)                                        //产生随机数并存放到动态数组中

      ary[i]=rand()%256;

   pack(ary, packary, n );

   cout<<"\n输出压缩数组:";

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

   {

      if (i %10 == 0)  cout<<endl;            //控制一行输出10个数据

      cout << int( packary[i] )<<"  ";

   }

   unpack(packary, ary, n);

   cout<<"\n输出解压数组:";

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

   {

      if (i %10 == 0)  cout<<endl; 

      cout<<ary[i]<<"  ";

   }

}

void pack( int *a, unsigned char *p, int n )

{

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

   {

      p[i] =unsignedchar(a[i]);

   }

}

void unpack( unsigned char *p, int *a, int n )

{

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

   {

      a[i] = int(p[i]);

   }

}

12.编写程序,按照指定长度生成动态数组,用随机数对数组元素进行赋值,然后逆置该数组元素。例如,数组A的初值为{6, 3, 7, 8, 2},逆置后的值为{2, 8, 7, 3, 6}。要求:输出逆置前、后的数组元素序列。

【解答】

#include<iostream>

#include <cstdlib>

#include<ctime>

usingnamespace std;

void printarray(int *p,int n);

void adverse(int *p,int n);

int main()

{

int *p,n,i;

 cout<<"请输入数组长度:";

 cin>>n;

 p=new int [n];            //建立动态数组

 srand(int(time(0)));

 for(i=0;i<n;i++)          //产生随机数并存放到动态数组中

   *(p+i)=rand()%1000;

 cout<<"动态数组:";

 printarray(p,n);            // 输出动态数组

 adverse(p,n);              // 对数组逆置

 cout<<"逆置数组:"; 

 printarray(p,n);            // 输出逆置数组

}

 //输出数组函数

void printarray(int *p,int n)

{

int i;

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

  {

 if(i % 5==0) cout<<endl;   // 控制一行输出5个数据

        cout<<"ary["<<i<<"]="<<*(p+i)<<"\t";

}

 cout<<endl;   

 }

// 对数组逆置函数

void adverse(int *p,int n)

{

 int i,t;

for (i=0;i<n/2;i++)

  {

 t=*(p+i);

   *(p+i)=*(p+n-i-1);

   *(p+n-i-1)=t;

}

}

13.把某班学生的姓名和学号分别存放到两个数组中,从键盘输入某位学生的学号,查找该学生是否在该班,若找到该学生,则显示出相应的姓名。

【解答】

#include<iostream>

usingnamespace std;

intmain()

{

char name[5][20] = { "li ming","zhang qing", "liu xiao ping", "wang ying","lu pei" };

 long num[5] = { 20030001, 20030002, 20030005, 20030007, 20030010 };

 int i;

 long snumber;

 cout << "please input studentnumber:";

 cin >> snumber;

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

  {

 if( num[i] == snumber )

    {

 cout << "Found! The name is :"<< name[i] << endl;

         break;

}

  }

 if( i==5 )  cout <<"Can\'t found!" << endl;

}

14.将一组C++关键字存放到一个二维数组中,并找出这些关键字中的最小者。

【解答】

#include<iostream>

#include<cstring>

usingnamespace std;

intmain()

{

 char string[10];

 char str[][10]={ "while", "break", "if","extern", "void", "auto", "long","static", "do", "const" };

 int i;

 strcpy_s( string, str[0] );

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

   if( strcmp(str[i],string)<0 ) strcpy_s( string, str[i] );

 cout << "The minimum string is:" << string<< endl;

}

15.使用指针函数编写程序,把两个字符串连接起来。

【解答】

#include<iostream>

usingnamespace std;

char *strcat( char *str1,char *str2 )

{

 char*p = str1;

 while( *p != '\0' ) p++;

 *p = *str2;

 do

p++;

   str2++;

   *p = *str2;

} while( *str2 != '\0' );

 return( str1 );

}

int main()

{

 char str1[80], str2[80];

 cout << "input str1:";

cin >> str1;

 cout << "input str2:"; 

cin >> str2;

 cout << "str1+str2=" << strcat( str1, str2 )<< endl;

}

16.使用string类,编写一个简单的文本编辑程序,能够实现基本的插入、删除、查找、替换等功能。

【解答】

略。

推荐阅读
全部习题章节:
C++课本的练习题及答案(第四章)
C++课本的练习题及答案(第五章)
C++课本的练习题及答案(第六章)
C++课本的练习题及答案(第七章)
C++课本的练习题及答案(第八章)
发布了109 篇原创文章 · 获赞 40 · 访问量 6162

猜你喜欢

转载自blog.csdn.net/qq_15719613/article/details/105368882