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 ]

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>
using namespace std;
int main()
{
	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()
{  int a[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()
{  int ary[N][N], k;
   inputAry(ary, N);
   cout<<"输入行号,k = ";
   cin>>k;
   outputAry(ary, N, k-1);
}

【解答】

#include<iostream>
using namespace std;
const int N=5;
void inputAry(int ary[N][N], int n );
void outputAry(const int ary[N][N], int n, int line);
int main()
{
	int ary[N][N], k;
	inputAry(ary, N);
	cout<<"输入行号,k = ";
	cin>>k;
	outputAry(ary, N, k-1);
}
void inputAry(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];
}
void outputAry(const int ary[N][N], int n, int k)
{
	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()
{  
    int a[][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()
{  int m[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],int n )		//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= new int( 5);
   cout<<*p << endl;
   p= new int[5];
   cout << "test2: \n";
   for(int i=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 = new int( 5 );
   cout << "*a1 = " << *a1 << endl;
}
void test2(int * & a2)
{  
   a2 = new int( 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=new int[n*n];
   inputAry(pa, n);
   cout<<"输入行号,k = ";
   cin>>k;
   outputAry(pa, n, k-1);
}

【解答】

#include<iostream>
using namespace std;
void inputAry(int *ary, int n );
void outputAry(const int *ary, int n, int k);
int main()
{
	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);
}
void inputAry(int *ary, int n)
{
	cout<<"输入"<<n<<"*"<<n<<"个矩阵元素\n";
	for(int i=0; i<n*n; i++)
		cin>>ary[i];
}
void outputAry(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";
   int i;  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()
{  
   char str[][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 namespace std;
void insertStr(char *t, char *s,int n);
void deleteStr(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;
      }
   }
}

【解答】

void insertStr(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];
}

void deleteStr(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 namespace std;
int main()
{ 
const int M=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<<"**After convert**"<<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=new int[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=new int[n];
   for(int i=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=new int[n];
    for(int i=0;i<n;i++) 
    ap[i]=i;
}

二、程序设计

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

 

【解答】

#include<iostream>
#include<cmath>	
using namespace std;
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>
using namespace std;
int main()
{ 
    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>
using namespace std;
int main()
{ 
  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 namespace std;
void merge(const int 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(const int 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>
using namespace std;
int main()
{ 
  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>
using namespace 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.设某城市三个百货公司某个季度销售电视机的情况和价格如下所示。编写程序,将表数据用数组存放,求各百货公司的电视机营业额。

 

【解答】

#include<iostream>
using namespace std;
int main()
{ 
  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>
using namespace 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>
using namespace 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, unsigned char *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(int i=0; i<n; i++)
	{
	   p[i] = unsigned char(a[i]);
	}
}
void unpack( unsigned char *p, int *a, int n )
{
	for(int i=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>
using namespace 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>
using namespace std;
int main()
{ 
  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>
using namespace std;
int main()
{
   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>
using namespace 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++课后习题及答案 一、 选择填空 1. 下列各种高级语言中,( )是面向对象的程序设计语言。 A.BASIC; B.PASCAL; C.C++ D.Ada 2. 下列各种高级语言中,( )是最早提出了对象的概念。 A.Algol 60; B.Simula 67; C.Smalltalk; D.C++ 3. 下述面向对象抽象的原理中,( )是不对的。 A. 数据抽象; B. 行为共享; C.进化; D. 兼容; 4. ( )不是面向对象系统所包含的要数。 A. 重载; B. 对象; C. 类; D. 继承; 5. 关于C++与C语言的关系的描述中,( )是错误的。 A. C语言是C++的一个子集; B. C语言与C++是兼容的; C. C++对C语言进行了一些改进; D. C++和C语言都是面向对象的; 6. 下面关于对象概念的描述中,( )是错误的。 A.对象就是C语言中的结构变量; B.对象代表着正在创建的系统中的一个实体; C. 对象是一个状态和操作(或方法)的封装体; D.对象之间的信息传递是通过消息进行的; 7. 下面关于类概念的描述中,( )是错误的。 A.类是抽象数据类型的实现; B.类是具有共同行为的若干对象的统一描述体; C.类是创建对象的样板; D.类就是C语言中的结构类型; 8. C++对C语言作了很多改进,下列描述中( )使得C语言发生了质变,即从面向过程变成为面向对象。 A.增加了一些新的运算符; B.允许函数重载,并允许设置缺省参数; C.规定函数说明必须用原型; D.引进了类和对象的概念; 9. 按照标识符的要求,( )符号不能组成标识符。 A.连接符; B. 下划线; C.大小写字母; D.数字字符; 10. 下列符号中,( )不可作为分隔符。 A.,; B.:;C.?; D.;
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值