C++练习题及答案(一)

阅读: 评论:0

C++练习题及答案(一)

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;			//数组元素值自增10cout<<*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] ) != ''; 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]="";char s[128]="";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]='';
}

综合练习

一、思考题

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;elsecout << "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;elseapp[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 != '' ) p++;*p = *str2;do {  p++; str2++;*p = *str2; } while( *str2 != '' );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类,编写一个简单的文本编辑程序,能够实现基本的插入、删除、查找、替换等功能。

【解答】

略。

本文发布于:2024-01-28 16:34:27,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064308738763.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:练习题   答案
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23