c++数组、指针与字符串xiti答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.概念填空题
1.1 数组定义时有3个要素:数组名、数组元素的类型和数组元素的个数。

按元素在数组中的位置进行访问,是通过下标进行的,称为直接或索引访问。

1.2 C++中的多维数组是嵌套定义的,即多维数组的基本定义是数组构成的数组,三维数组的元素是二维数组。

1.3 计算机内存是一维编址的,多维数组在内存中的存储必须转换为一维方式,C++多维数组在内存中的排列是行方式,即越低的下标变化快。

设数组a有m行n列,每个元素占内存u个字节,则a[i][j]的首地址为a[0][0]的地址+ (i*n+j)*u。

1.4数组名是整型常量,数组名赋给同类型的指针后,该指针是指向数组首元素的指针。

数组名在表达式中被转换为指向数组首元素的指针常量。

1.5每个对象都有一个指向自身的指针,称为this指针,通过使用它来确定其自身的地址。

该指针只能读,不能写。

1.6在C++中,对象访问成员所用的运算符是.,通过指针访问对象的成员所用的运算符是->。

1.7 当动态分配失败时,系统采用返回NULL来表示发生了异常。

如果new返回的指针丢失,则所分配的自由存储区空间将无法收回,称为内存泄漏。

这部分空间必须在计算机重启才能找回,这是因为无名对象的生命期为整个程序。

1.8默认复制构造函数只能完成对象成员的赋值,可能会造成重复释放,默认的析构函数可能会产生内存泄漏。

“=”运算也会产生对象重复释放。

因此我们需要自定义复制构造函数完成对象的深复制。

1.9 在用new运算符建立一个三维数组int 4*5*6,使用了3 个下标运算符,用delete运算符释放该数组时使用了 1 个下标运算符。

new返回的指针类型是int (*) [5]6]。

2 简答题
2.1 用一维数组名作函数参数和用一维数组元素函数参数的含义是否相同?为什么
2.2 指针变量与整型量的加减运算代表什么意义?
2.3个指向普通变量的指针进行减运算是否有意义?为什么
2.4什么是浅拷贝?什么是深拷贝?二者有何异同?何时必须自定义复制构造函数、析构函数,何时必须自定义=运算符中在函数, 自定义的复制构造函数、析构函数应该怎样设计?
2.5从右往左解释int *(*(*pf)[5])(double *)中4个*的含义。

2.6 为什么动态建立类对象数组时,类的定义中一定要有默认的构造函数?
3.选择题
3.1以下对一维数组a的正确定义是(C )。

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.2己知int a[10]=={0,1,2,3,4,5,6,7,8,9},*p=a;则不能表示数组a中元素的选项是( C )。

A.*a
B.*p
C.a
D.a[ p-a]
3.3 己知int a[]={0,2,4,6,8,10},*p=a+1;其值等于0的表达式是(D )。

A.*(p++)
B.*(++p)
C.*(p--)
D.*(--p)
3.4已知char *a[]=( "fortran",” basic", "pascal", "Java",”c++”;则语句cout<<a[3];的显示结果是( C )。

A.t
B.一个地址值
C.java
D.javac++
3.5 下列关于this指针的叙述中,正确的是(D)。

A.任何与类相关的函数都有this指针
B.类的成员函数都有this指针
C.类的友元函数都有this指针
D.类的非静态成员函数才有this指针
3.6对于类型相同的两个指针变量之间,不能进行的运算是(C )。

A.< B.= C.+ D.-
3.7若有语句int a=4,*point=&a;下面均代表地址的一组选项是(D)。

A.a,point,*&a B.&*a,&a,*point
C.*&point,*point,&a D.&a,&*point,point
3.8 已有定义int k=2;int *ptrl,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是(B )。

A.k=*ptrl+*ptrl2; B.ptr2=k;
B.ptr1=ptr2 D.k=*ptr1*(*ptr2);
3.9设有语句int array[3][4];,则在下面几种引用下标为i和j的数组元素的方法中,不正确的引用方式是(D )。

A.array[i][j]B.*(*(array+i)+j)
C.*(array[i]+j)D.*(array+i*4+j)
3.10 函数原型为fun(int (*p)[3],int),调用形式为fun(a,2),则a的定义应该为(C )。

A.int **aB.int (*a)[ ]
C.int a[ ][3]D.int a[3]
3.11 已知p是一个指向类Sample数据成员m的指针,S是类Sample中的一个对象。

如果要给m赋值为5,正确的是( C )。

A.S.P=5;B.S->P=5;C.S.*P=5;D.*S.P=5;
3.12下面程序段的运行结果是(D )。

char *p=”abcdefgh”;
p+=3;
cout<<strlen(strcpy(p,”ABCD”));
A.8 B.12 C.4 D.出错
3.13 当定义const char *p=”ABC”;时,下列语句正确的是(D )
A.char *q=p;B.p[0]=’B’; C.*p=’\0’;D.p=NULL;
3.14 s0是一个string类串,定义串sl错误的是(A)。

A.string s1(3,”A”);B.string s1(s0,0,3);
C.string s1(“ABC”,0,3);D.string s1=”ABC”;
4.写出程序运行结果
4.1#include<iostream>
using namespace std;
class Location{
int X,Y;
public:
Location(int initX,int initY){
init(initX,initY);}
void init (int initX,int initY){X=initX,Y=initY;}
int GetX(){return X;}
return Y;
}
};
void display(Location& rL){
cout<<rL.GetX( )<<" "<<rL.GetY( )<<"\n";
}
int main(){
Location A[5]={Location(0,0),Location(1,1),Location(2,2),Location(3,3),Location(4,4)}; Location *rA=A;
A[3].init(5,3);
rA->init(7,8);
for(int i=0;i<5;i++)
display(*(rA++));
}
78
11
22
53
44
4.2#include <iostream>
using namespace std;
int main(){
char w[ ][10]={“ABCD”,”EFGH”,”IJKL”,”MNOP”},k;
for(k=1;k<3;k++) cout<<w[k]<<endl;
}
EFGH
IJKL
5. 编程题
5.1已知求成绩的平均值和均方差公式:ave=
n s
n
i i

=1,dev=
n ave
s n
i i
∑=-
1
2
)
(
其中n为学生人
数,
i
s为第i个学生成绩。

求某班学生的平均成绩和均方差。

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//using namespace std;
double ave(int *,int);
double dev(int *,double,int);
void create(int *,int);
const int N=10;
int a[N],i;
double s,d;
srand(time(0));
create(a,N);
for(i=0;i<N;i++)
cout<<a[i]<<", ";
s=ave(a,N);
cout<<"ave= "<<s;
d=dev(a,s,N);
cout<<" dev= "<<d<<endl;
}
double ave(int *a,int N){
double s=0;
int i;
for(i=0;i<N;i++)
s+=a[i];
return s/N;
}
double dev(int *a,double s,int N){
int i;
double d=0;
for(i=0;i<N;i++)
d+=(a[i]-s)*(a[i]-s);
return sqrt(d/N);
}
void create(int *c,int N){
int i;
for(i=0;i<N;i++)
c[i]=rand()%100;
}
5.2用随机函数产生10个互不相同的两位整数,存放至一维数组中,并输出其中的素数。

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//using namespace std;
void create(int *,int);
void prime(int *,int);
const int N=10;
void main(){
int a[N],i;
srand(time(0));
for(i=0;i<N;i++)
cout<<a[i]<<" ";
cout<<endl;
prime(a,N);
}
void prime(int *p,int N){
int i,j,k;
for(i=0;i<N;i++){
if(p[i]<2)continue;
k=sqrt(p[i]);
for(j=2;j<=k;j++)
if(p[i]%j==0)break;
if(j>k)cout<<p[i]<<" ";
}
cout<<endl;
}
void create(int *c,int N){
int i,d;
int f[100]={0};
for(i=0;i<N;i++){
do{
d=rand()%100;
}while(f[d]);
c[i]=d;
f[d]=1;
}
}
5.3设计一个函数,将一个整型数组按升序排序。

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//using namespace std;
void create(int *,int);
void bubblesort1(int *,int);
void print(int *,int);
const int N=10;
void main(){
int a[N];
srand(time(0));
create(a,N);
print(a,N);
bubblesort1(a,N);
print(a,N);
}
void bubblesort1(int r[],int n){
int i,j,temp;
bool changflag;
for(i=n-1;i>0;i--){
changflag=false;
for(j=0;j<i;j++)
if(r[j]>r[j+1]){
temp=r[j];
r[j]=r[j+1];
r[j+1]=temp;
changflag=true;
}
if(!changflag)break;
}
}
void create(int *c,int N){
int i,d;
int f[100]={0};
for(i=0;i<N;i++){
do{
d=rand()%100;
}while(f[d]);
c[i]=d;
f[d]=1;
}
}
void print(int *a,int N){
int i;
for(i=0;i<N;i++)
cout<<a[i]<<" ";
cout<<endl;
}
5.4在一个二维数组中形成如以下形式的n 阶矩阵:
⎪⎪⎪⎪⎪⎪⎭
⎫ ⎝
⎛12345112341112311112
11111 (1)去掉靠边元素,生成新的n-2阶矩阵;
(2)求矩阵主对角线下元素之和;
(3)以方阵形式输出数组。

#include <iostream>
using namespace std;
void main(){
int a[5][5],b[3][3];
int i,j,s=0;
for(i=0;i<5;i++){
for(j=0;j<=i;j++)
a[i][j]=i+1-j;
for(j=i+1;j<5;j++)
a[i][j]=1;
}
for(i=0;i<5;i++){
for(j=0;j<5;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
for(i=1;i<4;i++)
for(j=1;j<4;j++)
b[i-1][j-1]=a[i][j];
for(i=0;i<3;i++){
for(j=0;j<3;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
for(i=1;i<5;i++)
s+=a[i][i-1];
cout<<s<<endl;
}
5.5 输入一个表示星期几的数,然后输出相应的英文单词。

要求使用指针数组实现。

在main 函数中调用以上函数进行测试。

#include<iostream>
using namespace std;
long sum(int,int);
int main(){
char
*weekday[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}; int day;
cout<<"1-7 ";
cin>>day;
cout<<weekday[day-1]<<endl;
return 0;
}
5.6设计一个递归函数,求整型数组的最大元素及小元素。

在主函数中定义和初始化该整型
数组,调用递归函数,并显示结果。

#include<iostream>
using namespace std;
const int N=10;
int Max(int *,int,int);
int Min(int *,int,int);
int main(){
int a[N]={4,12,9,10,0,-4,3,20,8,-10};
int max,min;
max=Max(a,0,9);
min=Min(a,0,9);
cout<<"Max= "<<max<<", Min= "<<min<<endl;
return 0;
}
int Max(int *a,int n,int m){
int t;
if(n==m)return a[n];
else{
t=Max(a,n+1,m);
return a[n]>t? a[n]:t;
}
}
int Min(int *a,int n,int m){
int t;
if(n==m)return a[n];
else{
t=Min(a,n+1,m);
return a[n]<t? a[n]:t;
}
}
5.7编写程序,按照指定长度生成动态数组,用随机数对数组元素赋值,然后逆置该数组元素。

输出逆置前、后的数组元素序列。

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
//using namespace std;
const int N=10;
int main(){
int *pi=new int[N];
int i,j;
srand(time(0));
for(i=0;i<N;i++){
pi[i]=rand();
cout<<pi[i]<<" ";
}
cout<<endl;
for(i=0;i<N/2;i++){
j=pi[i];pi[i]=pi[N-1-i];pi[N-1-i]=j;
}
for(i=0;i<N;i++)
cout<<pi[i]<<" ";
cout<<endl;
delete [] pi;
return 0;
}
5.8定义函数void insert(char *str1,char* str2, int pos),将字符串str1插入到字符串str2中pos 指定的位置处。

#include <iostream>
using namespace std;
void insert(char *str1,char* str2, int pos);
int main(){
char str1[10]="C++";
char str2[30]="This is program";
cout<<str2<<endl;
insert(str1,str2,8);
cout<<str2<<endl;
return 0;
}
void insert(char *str1,char* str2, int pos){
char *p1=str1;
char *p2=str2+pos;
char *p3=p2,*p;
while(*p3)p3++;//找到str2结束笔标志
while(*p1){
p=p3;
do{
*(p+1)=*p--;//str2字符后移
}while(p>=p2);
*(p2++)=*p1++;//str1的字符逐个插入
p3++;
}
}
5.9将一组C++关键字存放到一个二维数组中,并找出这些关键字的最小者。

#include <iostream>
#include <cstring>
using namespace std;
int main(){
char *s[10]={"char","do","bool","return","long","double","auto","extern","int","public"};
int i;
char **p=s;
for(i=1;i<10;i++)
if(strcmp(*p,*(s+i))>=0)p=s+i;
cout<<*p<<endl;
return 0;
}

#include <iostream>
#include <cstring>
using namespace std;
int main(){
char s[][10]={"char","do","bool","return","long","double","auto","extern","int","public"};
int i;
char (*p)[10]=s;
for(i=1;i<10;i++)
if(strcmp(*p,*(s+i))>=0)p=s+i;
cout<<*p<<endl;
return 0;
}
5.10 定义函数int find(char *seareched,char* search, int pos)。

函数的功能是从字符串search 第pos位置开始寻找子串seareched,找到返回seareched在search的位置,找不到返回-1。

#include <iostream>
using namespace std;
//在s的pos位置开始寻找t
int find(char* s,char* t,int pos){
char* pshead=s+pos,*pthead=t;
while(*pshead){
while(*pshead==*pthead && *pshead && *pthead){
pshead++;pthead++;
}
if(*pthead==0) return pshead-s-strlen(t);
if(*pshead==0) return -1;
pshead=pshead-(pthead-t)+1;pthead=t;
}
return -1;
}
int main(){
char s[100]="This is C++ program";
char t[100]="is";
int pi=find(s,t,3);
if(pi==-1)cout<<"No such substring!"<<endl;
else cout<<pi<<endl;
return 0;
}
5.11把某班学生的姓名和学号分别存放到两个数组中,从键盘上输入某一学生学号,查找该学生是否在该班;若找到该学生,则显示出相应的姓名。

#include <iostream>
#include <cstring>
using namespace std;
int main(){
char Name[][10]={"Zhang","Li","Wang","Qian","Zhao","Wu","Xu","Tang","Shen","Liang"}; char No[][10]={"08144201","08144204","08144209","08144212","08144215","08144219" ,"08144222","08144227","08144230","08144234"};
char no[9];
int i;
cout<<"NO= ";
cin>>no;
for(i=0;i<10;i++)
if(strcmp(no,No[i])==0){
cout<<Name[i]<<endl;
break;
}
if(i>=10)cout<<"NO such student"<<endl;
return 0;
}
5.12学生类的定义如下,为学生类定义复制构造函数,完成深复制,并定义析构函数和=运算符重载函数。

#include <iostream>
#include <cstring>
using namespace std;
class student{
char *pName;
public:
student();
student(char *pname);
student(student &s);
~student();
student& operator=(student &s);
void showname(){
if(pName)cout<<pName<<endl;
}
};
student::student(){
pName=NULL;
}
student::student(char *pname){
pName=new char[strlen(pname)+1];
strcpy(pName,pname);
}
student::student(student &s){
pName=new char[strlen(s.pName)+1]; strcpy(pName,s.pName);
}
student::~student(){
if(pName)delete []pName;
}
student& student::operator=(student &s){ if(pName!=s.pName){
delete [] pName;
pName=new char[strlen(s.pName)+1]; strcpy(pName,s.pName);
}
return *this;
}
int main(){
student st1("zhang"),st2,st3(st1);
st2=st1;
st1.showname();
st2.showname();
st3.showname();
return 0;
}。

相关文档
最新文档