C++程序设计基础(第4版)习题解答(10)

2019-08-30 18:12

【解答】

For 10.

#include #include using namespace std; int main() {

char str[][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; } 【解答】

C++

4.3 思考题

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

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

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

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

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

int aa [3], ?pa=aa;

请使用aa或pa,写出3个以上与aa[2] 等价的表达式。

【解答】

数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;而数组元素是下标变量,性质相当于普通变量。

对一维数组aa第i个元素的地址可以表示为: &aa[i] 对一维数组aa第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 using namespace std;

a[i]

aa+i; *(a+i);

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<<\ for( k=0; k

cout<

cout<<\ cout<<\ for(i=0;i

for(j=0;j

4.有以下函数:

void query() { int ?p; p=new int[3]; //… delete []p; p=new double[5]; //… delete []p;

}

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

【解答】

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

error C2440: ―=‖: 无法从―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 using namespace std; void create(int ?, int); int main() {

int ?a = NULL, len; cin>>len; create(a,len);

for( int i = 0; i

void create(int ?ap, int n) {

ap=new int[n];

for(int i=0; i

【解答】

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

void create(int *&,int); {

ap=new int[n]; for(int i=0;i

//函数原型声明,使用引用参数 //函数定义

void create(int *&ap,int n)

4.4 编程题

?1.已知求成绩的平均值和均方差公式:ave?i?1nsi?(si?ave)2, dev?i?1nnn,其中,n为学生人数,si

为第i个学生成绩。求某班学生的平均成绩和均方差。

【解答】

#include #include 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

aveMsd( s, n, ave, msd );

cout << \平均值:\均方差值:\}

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

double sum1=0, sum2=0; for( i=0; i

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

#include #include #include #include using namespace std; int main() {

int a[10],i,j;

srand( int( time(0)) ); for( i=0; i<10; i++ ) {

l: a[i] = rand();

goto l;

for( j=0; j

goto l;

}

//排除相同数据

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

//产生随机数存放到数组中

//获取指定范围数据

if ( a[i]<10 || a[i]>=100 )

//为随机数生成器设置种子值

//求均方差

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

//求平均值

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 << \是素数!\

}

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

#include 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 using namespace std; int main() {

int b[10], i, j, k, flag ; long num, n ;

cout << \ cin >> num; k = 0;

//记录下标的数组


C++程序设计基础(第4版)习题解答(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:1336吴镇烽:晋公盘与晋公盆铭文对读 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: