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>
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类,编写一个简单的文本编辑程序,能够实现基本的插入、删除、查找、替换等功能。
【解答】
略。