0
点赞
收藏
分享

微信扫一扫

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

龙驹书房 2022-09-30 阅读 470


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

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];
请写出k→i, 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.设某城市三个百货公司某个季度销售电视机的情况和价格如下所示。编写程序,将表数据用数组存放,求各百货公司的电视机营业额。


牌号
公司
康佳
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类,编写一个简单的文本编辑程序,能够实现基本的插入、删除、查找、替换等功能。

【解答】

略。

 

举报

相关推荐

0 条评论