6.7习题
6.7.1 概念题
1.试写出下列程序段中各数组的元素个数和元素的下标范围。
#define QWE 36
const int RTY=50;
…
int a1[QWE+8];
double a2[QWE+RTY];
char a3[‘a’];
答:数组a1有44个元素,元素下标范围为0~43。
数组a2有86个元素,元素下标范围为0~85。
数组a3有97个元素,元素下标范围为0~96。
2.试问下列程序段中,数组a1、a2、a3的声明有没有错?若有,错在何处,为何错?
(1)int n;
cin>>n;
double a1[n];
(2)#define PI 3.14
…
int a2[PI*5];
double a3[int(PI*5)]
答:(1)a1[n] 错!元素个数不能等运行时确定。应该事先就确定好。
(2)a2[PI*5] 错!元素个数不可以是非整数类型。
(3)a3[int(PI*5)] 没有错。(PI*5)被强迫类型转换为int型,故没错。
3.试问下列程序的输出结果如何?
#include
using namespace std;
int main()
{
int a[6]={0,2,4,6};
for(int i=0;i<6;i++)
cout< cout< return 0; } 答:程序运行结果为: 0 2 4 6 0 0 4.试问下列程序的输出结果如何? #include using namespace std; int main() { char *c[3]={"Practice","makes","perfect"}; for(int i=0;i<3;i++) cout< cout< for(i=0;i<3;i++) cout<<*c[i]<<'\t'; cout< return 0; } 答:程序运行结果为: Practice makes perfect P m p 5.一维数组名是指向何变量的指针?一维数组名按何目标走步? 答:一维数组名是指向首元素的指针。所指目标是元素,故按元素走步。 6.若已声明一个数组: double d[20]; 则一维数组名d指向何变量?d+3又指向何变量?*(d+18)是表示什么意思? 答:数组名d指向首元素d[0];d+3指向元素d[3];d+18指向元素d[18]。 *(d+18)是表示指针(d+18)所指存间的内容,简称(d+18)所指。因(d+18)指向元素d[18],故其所指*(d+18)实际就是所指元素d[18]。*(d+18)d[18] 7.下列程序输出结果是怎样的? #include using namespace std; int main() { char c[]={'q','a','z','w','s','x'}; *(c+3)='f'; *(c+5)='v'; for(int i=0;i<6;i++) cout<<*(c+i)<<'\t'; cout< return 0; } 答:程序运行结果为: q a z f s v 8.看图 6.4,试问下面的式子各表示元素的什么(是元素值还是元素地址?是哪个元素?) (1)*(b[1]+2) (2)*(b+2)+4 (3)*(b+1) (4)**(b+2) (5)b[1] (6)(*b)[3] 答:看6.4图,可获解答如下。 (1)*(b[1]+2)是指针(b[1]+2)所指,是元素b[1][2]。 (2)*(b+2)+4是b[2]+4,是元素b[2][4]的地址。 (3)*(b+1)是(b+1)所指,是b[1],是元素b[1][0]的地址。 (4)**(b+2)是(b+2)的二级所指,是元素b[2][0]。 (5)b[1]是元素b[1][0]的地址。 (6)(*b)[3]是b[0][3]元素。 9.要表示数组首元素b[0][0]的地址,除了可用 &b[0][0]表示外,从图6.4看,还可 以有哪些表示法? 答:首元素地址除可表示为 &b[0][0]外,还可以表示为b[0]或*b。 10.如果将例6-24程序中A和B两行语句改为如下(1)或(2)中的语句行不行? (1)char s1[20]; s1="You are a boy."; (2)char *p1="You are a boy."; 答:(1)s1="You are a boy.";此句错!因为数组名s1没有变量存间,不可对它赋值。 (2)char *p1="You are a boy.";此句行!指针变量p1有存间,将字符串首字符地址赋给了它。 11.如果将例6-24程序改为如下程序,行不行?(勿上机免惹祸,请自己思考。) #include using namespace std; int main() { char s1[]="You are a boy."; char *p1=s1; char *p2; for( ;*p2++=*p1++; ) ; cout<<"p2: "< return 0; } 答:不行!因为指针变量p2未给赋值,因而是一个随机值指针,不可对随机值指针所指的存间赋值。 12.请判断下列每个小题中语句有无错误。错在何处? (1)int *pi; pi=new int[8](0,1,2,3,4,5,6,7); (2)double p; p=new double; … delete p; *p=8; (3)double *pf,k; pf=new double; *pf=56.7; pf=&k; delete pf; pf=NULL; 答:(1)不可对动配数组进行初始化,故第二句错。 (2)用以接受动配double型存间地址的p应该是double型指针,故首句错。指针p delete后就成为随机值指针,不可对其所指进行赋值,故末句错! (3)pf=&k;语句使原指向动配double存间的pf转而指向了变量k,致使动配存间的地址丢失,从此以后想delete动配存间就没有门儿了。这时pf所指向的存间不是动配存间,因此不可对它进行double,因此语句delete pf;也错了。 6.7.2程序设计题 1.输入一组整数到一维数组中,设计一程序,找出其中最大的偶数和最大的奇数,输出之。若没有奇数时,输出“没有奇数!”。 #include using namespace std; int main() { int t,n,i=0,a[10]; int jimax=0,oumax=0; cout<<"请输入一组整数,超过十个数或输入0 就结束。"< cin>>t; while((t!=0)&&(i<10)){ a[i]=t; cin>>t; i++; } n=i; for(i=0;i cout< if(a[i]%2==0 && a[i]>oumax) oumax=a[i]; if(a[i]%2==1 && a[i]>jimax) jimax=a[i]; } cout< if(jimax) cout<<"最大奇数为:"< else cout<<"无奇数。"< if(oumax) cout<<"最大偶数为:"< else cout<<"无偶数。"< return 0; } 2.输入一组非0整数(以输入0作为结束标志)到一维数组中。设计一程序,求出数组元素的平均值,并分别统计出这一数组中正数和负数的个数。 #include using namespace std; int main() { int t,n,i=0,a[10]; int s=0,pos=0,neg=0; cout<<"请输入一组整数,超过十个数或输入0 就结束。"< cin>>t; while((t!=0)&&(i<10)){ a[i]=t; s+=t; cin>>t; i++; } n=i; for(i=0;i cout< if(a[i]>0) pos++; if(a[i]<0) neg++; } cout< cout<<"数组元素的平均值为:"< cout<<"正数个数为:"< cout<<"负数个数为:"< return 0; } 3.设计一程序,对数组元素依次输入8个整数,然后按倒序输出之。 #include using namespace std; int main() { int i,a[8]; cout<<"请输入8个整数。"< for(i=0;i<8;i++){ cin>>a[i]; } for(i=7;i>=0;i--) cout< cout< return 0; } 4.将小组8个同学的数学成绩输入一维数组,随输入随按降序插入排序。最后输出小组同学的按降序排好的成绩。 #include using namespace std; int main() { int a[8],n=1,t,k; cout<<"请输入8个同学的分数。"< cin>>a[0]; while(n<8){ cin>>t; for(int i=0;(a[i]>t)&&(i k=i; for(i=n;i>k;i--) a[i]=a[i-1]; a[k]=t; n++; } for(int i=0;i cout< cout< return 0; } 5.已声明一个一维字符数组,并用四位八进制字符初始化如下: char a[4]={'2','4','6','5'}; 试设计一程序,计算这四位八进制字符“2465”所表示的十进制数是多少,输出之。 #include using namespace std; int main() { char a[4]={'2','4','6','5'}; int i,k,s=0; for(i=0;i<4;i++){ k=a[i]-48; s=s*8+k; } cout<<"八进制2465所表示的十进制数是: "< return 0; } 6.设有一个数列,它的头四项是0、0、2、5,以后每项分别是各自前四项之和,试编程求此数列的前20项。用一维数组完成此操作。 #include #include using namespace std; int main() { int a[20]={0,0,2,5}; for(int i=4;i<20;i++) a[i]=a[i-1]+a[i-2]+a[i-3]+a[i-4]; for(i=0;i<20;i++){ cout< if((i+1)%5==0) cout< } return 0; } 7.已知一数组的十个元素值为3、5、2、5、6、4、6、8、9、7。试设计程序,用指针变量求出最小的元素值以及奇下标元素之和。 #include using namespace std; int main() { int s=0,a[10]={3,5,2,5,6,4,6,8,9,7},*p=a; int min=*p; for(int i=0;i<10;i++){ if(*(p+i)%2==1) s+=*(p+i); if(*(p+i) } cout<<"奇下标元素和="< cout<<"最小的元素值="< return 0; } 8.输入10个数到一维数组中,按从大到小排序后输出。分别用三个函数实现数据的输入、排序和输出。 #include using namespace std; #define N 10 void in(int *x){ cout<<"请输入"< for(int i=0;i cin>>*x++; } void paxu(int *x){ for(int i=0;i for(int j=i+1;j if(*(x+j)>*(x+i)){ int t=*(x+i); *(x+i)=*(x+j); *(x+j)=t; } } void out(int *x) { for(int i=0;i cout<<*(x+i)<<' '; cout< } int main() { int a[N]; in(a); paxu(a); out(a); return 0; } 9.已知矩阵如图6.13所示。试设计程序,用下标表示法求该矩阵两对角线元素之和。 #include using namespace std; int main() { int a[4][4]={21,22,23,24,25,26,27,28, 29,30,31,32,33,34,35,36}; int s=0; for(int i=0;i<4;i++) s+=a[i][i]+a[i][3-i]; cout<<"矩阵两对角线元素之和="< return 0; } 10.已知两个二维数组声明如下: int a[][4]={51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66},b[4][4]; 试将数组a的转置矩阵存入数组b。输出数组b。 #include using namespace std; int main() { int a[][4]={51,52,53,54, 55,56,57,58, 59,60,61,62, 63,64,65,66}; int b[4][4]; for(int i=0;i<4;i++) for(int j=0;j<4;j++) b[j][i]=a[i][j]; cout<<"转置矩阵如下:"< for(i=0;i<4;i++) for(int j=0;j<4;j++){ cout< if((j+1)%4==0) cout< } return 0; } 11.设计一程序,声明一个二维数组double b[5][2] 用来存放小组内5个同学的两门课程(数学和物理)的成绩。要求依次输入每个同学的成绩,求出全组的平均成绩和每一门课程的平均成绩。 #include using namespace std; int main() { double s=0,sm=0,sp=0,b[5][2]; cout<<"请依次输入5位同学的数学和物理成绩。"< for(int i=0;i<5;i++){ for(int j=0;j<2;j++){ cin>>b[i][j]; s+=b[i][j]; } sm+=b[i][0]; sp+=b[i][1]; } cout<<"总的平均成绩="< cout<<"数学平均成绩="< cout<<"物理平均成绩="< return 0; } 12.某小组有4个同学,考了三门课程。他们的成绩如表6-5所示。试设计程序,求每位同学的平均成绩,输出之。(用数组名表示形式对元素进行访问) #include using namespace std; int main() { int a[4][4]={98,82,88,0, 76,77,86,0, 69,73,78,0, 83,92,70,0}; for(int i=0;i<4;i++) for(int j=0;j<3;j++) *(*(a+i)+3)+=*(*(a+i)+j); cout<<"同学们的平均成绩分别为:"; for(i=0;i<4;i++) cout< cout< return 0; } 13.设计一程序,用首元素指针表示法求图6.13所示矩阵两对角线元素之和。 表6-5 同学考试成绩表 #include using namespace std; int main() { int a[4][4]={21,22,23,24, 25,26,27,28, 29,30,31,32, 33,34,35,36}; int *p=(int *)(a),s=0; for(int i=0;i<4;i++) s+=*(p+4*i+i)+*(p+4*i+(3-i)); cout<<"矩阵对角元素和="< return 0; } 14.试声明一个二维数组,按图6.14所示矩阵初始化。用一个指向一维数组的指针变量,输出该二维数组各元素。 #include using namespace std; int main() { int a[5][5]={1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7, 4,5,6,7,8, 5,6,7,8,9}; int (*p)[5]=a; for(int i=0;i<5;i++) for(int j=0;j<5;j++){ cout< if((j+1)%5==0) cout< } return 0; } 15.试设计一程序。调用函数求二维数组全部元素的平均值。函数用指向一维数组的指针变量作形参,实现元素平均值的计算。设二维数组如图6.15所示。 #include using namespace std; double ave(int (*p)[5]){ int s=0; for(int i=0;i<3;i++) for(int j=0;j<5;j++) s+=p[i][j]; return s/15.0; } int main() { int a[3][5]={1,2,3,4,5, 3,4,5,6,7, 5,6,7,8,9}; cout<<"数组元素平均值="< return 0; } 16.声明一个二维数组: int b[3][4]; 采用数组名作实参,指向一维数组的指针变量作形参,调用函数实现输入各元素值,求平均值、最大元素值和最小元素值,并输出之。 #include using namespace std; void in(int (*p)[4],int n){ cout<<"请输入"<<4*n<<"个元素值。"< for(int i=0;i for(int j=0;j<4;j++) cin>>*(*(p+i)+j); } void fun(int(*p)[4],int n,double &av,int &mx,int &mi){ mx=mi=**p; av=0; for(int i=0;i for(int j=0;j<4;j++){ av+=*(*(p+i)+j); if(*(*(p+i)+j)>mx) mx=*(*(p+i)+j); if(*(*(p+i)+j) } av/=4.0*n; } void out(double av,int mx,int mi){ cout<<"元素平均值="< cout<<"最大元素值="< cout<<"最小元素值="< } int main() { double ave; int max,min,n=3,b[3][4]; in(b,n); fun(b,n,ave,max,min); out(ave,max,min); return 0; } 17.定义一个未初始化的二维数组,用编程的方法形成图6.16所示的矩阵(数据不准通过键盘输入),并按该矩阵形式输出之。 #include using namespace std; int main() { int b[5][5]; for(int i=0;i<5;i++) for(int j=0;j<5;j++){ if(j<=i) *(*(b+i)+j)=1; else *(*(b+i)+j)=j+1-i; cout<<*(*(b+i)+j)<<" "; if((j+1)%5==0) cout< } return 0; } 18.试设计程序,用cin输入一个无空格字符串。然后按正序和反序输出该字符串。例如输入“abcde”,正序输出得abcde,反序输出得edcba。 #include using namespace std; int main() { char a[50],*p=a; cout<<"请输入一条无空格字符串。"< cin>>a; cout<<"字符串正序输出为:"< for(int i=0;*p;p++,i++); p--; cout<<"字符串反序输出为:"; for(;i;i--) cout<<*p--; cout< return 0; } 19.设计一程序,用cin.getline函数将一条字符串输入到字符数组中,剔除所有大写字母,代之以后续字符,最后输出无大写字母的字符串。 #include using namespace std; int main() { char a[30]; int i,j=0; cout<<"请输入一条字符串。"< cin.getline(a,30); for(i=0;a[i];i++) if((a[i]<'A')||(a[i]>'Z')) a[j++]=a[i]; a[j]=0;