【解答】
For 10.
#include
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
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 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 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 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 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 int b[10], i, j, k, flag ; long num, n ; cout << \ cin >> num; k = 0; //记录下标的数组