二、填空题
1.程序文件的编译错误分为__________和__________两类.
2.字符串类型的变量一般用__________和__________类型的变量表示.
3.空字符串的长度是__________.
4.一个指针类型的对象占用内存的__________个字节的存储空间.
5.假设p是一个指针,则a=*p++运算首先__________,然后__________.
6.若指针p所指向的对象的值为10,p+1所指向的对象的值为20,则*++p的值为__________.
7.除了在__________和__________的情况下,定义引用变量必须初始化.
8.下列程序计算由0到9之间的任意3个不相同的数字组成的三位数共有多少种不同的组合方式.请完成下列程序.
#include<iostream.h>
void main()
{
int i,j,k,count=0;
for(i=9;i>=1;i–)
for(j=9;j>=0;j–)
if(______) continue;
else
for(k=0;k<=9;k++)
if(_______) count++;
cout<<count<<endl;
}
9.在C++中, __________函数不需要使用相应的函数原型语句加以声明.
10.函数的调用方式分为两种: __________调用和__________调用.其中, __________调用又根据C++中变量值的不同分为:传递变量本身的调用和__________的__________调用.
11.具有相同函数名但具有不同参数表的函数称为__________.
12.假定一个函数的参数说明为int x[][N](N是常数),则等价的指针参数说明为__________..
13.执行完下列三条语句后,指针变量c指向__________.
int a,b,*c=&a; int *&p=c; p=&b;
14.下面的函数Fun未使用中间变量实现了对两个数的交换,请完成下列函数的定义.
void Fun(int &x,int &y) { x+=y; y= _______; ________;}
15.在C语言中,编程单位是__________,在C++中,编程的单位是__________.
16.类的具体表现是通过定义__________来操作的.
17.一般情况下,按照面向对象的要求,把类中的数据成员(属性)定义为__________权限,而把成员函数(方法)定义为__________权限.
18.在结构定义中,数据和成员函数默认权限是__________.在类定义中,数据和成员函数默认权限是__________..
19.类中构造函数有__________个,析构函数有__________个.
20.要把类FriendClass定义为类MyClass的友元类,则应在类MyClass的定义中加入语句__________.
21.在C++语言中,每个类都有一个隐含的指针叫_____指针.该指针指向_____.
22.重载运算符函数的函数名有关键字_____引出.
23.利用成员函数对二元运算符重载,其左操作数为_____,右操作数为_____.
24.派生类对基类的继承有三种方式: _____. _____. _____.
25.构造函数_____被继承,析构函数_____被继承.
26.对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行_____,再执行_____,最后执行_____.
27.对基类数据成员的初始化必须在派生类构造函数中的_____处执行.
28.当撤销一个含有基类和子对象成员的派生类对象时,将首先完成_____的析构函数定义体的执行,接着完成_____的析构函数定义体的执行,最后完成_____的析构函数定义体的执行.
29.动态联编中直到_____时才能确定调用哪个函数;而静态联编则是在_____时进行的.
30.对虚函数使用对象指针或引用调用,系统使用_____联编;使用对象调用时,系统使用_____联编.
31.C++中_____虚构造函数,但_____虚析构函数.
32.带有_____的类称为抽象类,它只能作为_____来使用.
33.抽象类不能_____,但可以_____作为参数类型,函数返回类型或显式转换类型.
34.如果一个模板声明列出多个参数,则多个参数之间必须使用_____隔开,每个参数都必须重复使用关键字_____.
35.函数模板既可以与_____重载,也可以与_____重载.
36.函数模板的友元函数可以是_____或_____.
三、阅读程序
1.写出下列程序的运行结果.
#include<iostream.h>
void main()
{
int a[2][2]={1,2,3,4},*p;
p=a[0]+1;
cout<<*p<<endl;
}
2.写出下列程序的运行结果.
#include<iostream.h>
void main()
{
int x;
int &p=x;
x=10;
p=x+10;
cout<<x<<”,”<<p<<endl;
}
3.写出下列程序的运行结果
#include<iostream.h>
int a=100;
void fun()
{
int a=0;
a++;
::a=200;
cout<<”The a of fun is”<<a<<endl;
cout<<”::a=”<<::a<<endl;
}
void main()
{
int a=10;
fun();
a++;
::a+=1;
cout<<”The a of main is”<<a<<endl;
cout<<”::a=”<<::a<<endl;
}
4.写出下列程序的运行结果.
#include<iostream.h>
int f(int a)
{
return ++a;
}
int g(int &a)
{
return ++a;
}
void main()
{
int m=0,n=0;
m+=f(g(m));
n+=f(f(n));
cout<<”m=”<<m<<endl;
cout<<”n=”<<n<<endl;
}
5.写出下列程序的运行结果.
#include<iostream.h>
class MyClas
{
public:
MyClass(int a)
{
X=a;
cout<<”This is”<<X<<”‘s constructor.”<<endl;
}
~MyClass()
{
cout<<”This is “<<X<<”‘s destructor.”<<endl;
}
private:
int X;
};
MyClass globalObj(0);
void main()
{
MyClass commonObj(1);
static MyClass staticObj(2);
}
6.写出下列程序的运行结果.
#include<iostream.h>
class CStatic
{
public:
CStatic(){val++;}
static int val;
};
int CStatic::val=0;
void main()
{
cout<<”CStatic::val=”<<CStatic::val<<endl;
CStatic cs1;
cout<<”cs1.val=”<<cs1.val<<endl;
CStatic cs2;
cout<<”cs2.val=”<<cs2.val<<endl;
CStatic cs3,cs4;
cout<<”cs1.val=”<<cs1.val<<endl;
cout<<”cs2.val=”<<cs2.val<<endl;
}
7. 写出下列程序的运行结果.
#include<iostream.h>
class MyClass
{
public:
void SetValue(int val);
MyClass();
~MyClass();
private:
int i;
};
MyClass::MyClass()
{
i=0;
cout<<”This is a constructor!i=”<<i<<endl;
}
void MyClass::SetValue(int val)
{
i=val;
cout<<”i=”<<i<<endl;
}
MyClass::~MyClass()
{
cout<<”This is a destructor!i=”<<i<<endl;
}
void main()
{
MyClass * myl[3];
int k;
for(k=0;k<3;k++)
myl[k]=new MyClass;
for(k=0;k<3;k++)
delete myl[k];
}
8. 写出下列程序的运行结果.
#include<iostream.h>
class Data
{
public:
Data(int x)
{
Data::x=x;
cout<<”Data cons.”<<endl;
}
~Data(){ cout<<”Data des.”<<endl; }
private:
int x;
};
class Base
{
public:
Base(int x)d1(x){cout<<”Base cons.”<<endl;}
~Base(){cout<<”Base des.”<<endl;}
private:
Data d1;
};
class Derived:public Base
{
public:
Derived(int x):Base(x),d2(x){cout<<”Derived cons.”<<endl;}
~Derived(){cout<<”Derived des.”<<endl;}
private:
Data d2;
};
void main()
{
Derived obj(5);
}
9. 写出下列程序的运行结果.
#include<iostream.h>
class Base
{
public:
Base(int i=0):x(i){}
virtual int sum() const{ return x;}
private:
int x;
};
class Derived:public Base
{
public:
Derived(int i=0,int j=0):Base(i),y(j){}
int sum() const { return Base::sum()+y;}
private:
int y;
};
void Call(Base b)
{
cout<<”sum=”<<b.sum()<<endl;
}
void main()
{
Base b(10);
Derived d(10,40);
Call(b);
Call(d);
}
10. 写出下列程序的运行结果.
#include<iostream.h>
template<class T1,class T2>
void fun(T1 &x,T2 &y)
{
if(sizeof(T1)>sizeof(T2))
x=(T1)y;
else
y=(T2)x;
}
void main()
{
double d;
int i;
d=99.99;
i=88;
fun(d,i);
cout<<”d=”<<d<<”i=”<<i<<endl;
d=8.8;
i=9999;
fun(i,d);
cout<<”d=”<<d<<”i=”<<i<<endl;
}
四、编写程序
1.定义一个学生结构student,包括学生的学号、姓名、性别和出生日期。要求出生日期包括年、月、日。
2输入一个自然数,将该自然数的每一位数字按反序输出.例如:输入12345,输出54321.
3.编写程序,计算s=1+(1+2)+(1+2+3)+…..+(1+2+3+…+n)的值.
4.编写一个递归函数完成以下公式的运算:
sum(n)=1-1/2+1/3-1/4+…(其中n>0)
5.用函数指针实现对下面3个函数的调用.
(1)求两个数的最大值: int Max(int x, int y);
(2)求两个数的最小值: int Min(int x, int y);
(3)求两个数的和: int Add(int x, int y);
6.设计一个类CRectangle,要求如下所述.
(1)该类中的私有成员变量存放Rectangle的长和宽,并且设置它们的默认值是1.
(2)通过成员函数设置其长和宽,并确保长和宽都在(0,50)范围之内.
(3)求周长Perimeter.
7.设计一个类CDateInfo,要求其满足下述要求.
(1)要求有一个无参的构造函数,其初始的年.月.日分别为:2000,1,1.
(2)要求有一个带参数的构造函数,其参数分别对应年.月.日.
(3)要求用一个成员函数实现日期的设置.
(4)要求用一个成员函数实现日期的获取.
8.定义Point类,有数据成员X和Y,重载++和—运算符,要求同时重载前缀方式和后缀方式.
9.编写一个程序,其中有一个简单的串类String,包含设置字符串,返回字符串长度及内容等功能.另有一个具有编辑功能的串类EditString,它的基类时String,在其中设置一个光标,使其能支持在光标处的插入,替换和删除等编辑功能.
10.使用模板函数实现swap(x,y),函数功能为交换x和y的值.
11.分别用递归和非递归方式实现(在有效的范围内,考虑最简单的情况即可)
(1)将一个整型数转换为数字字符串
(2)将一个数字字符串转换为整型数
(3)将一个字符串反转
>> 本文固定链接: http://www.vcgood.com/archives/735
1.语法错误 逻辑错误(好像不对)
2.数组 指针
3.0
4.4
5.*p p++
6.20
7.? ?
8.实在看不懂,只好自己重新写了一个
void main()
{
int n[10]={0,1, 2, 3, 4, 5, 6, 7, 8, 9};
int i = 0;
int j = 0;
int k = 0;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
for (k=0; k<10; k++)
{
cout<<n[i]<<n[j]<<n[k];
cout<<endl;
}
}
}
}
9.?
10.? ? ? ? ?
11.重载
12.int *x
13.a
14.x-y x -= y;
15.函数 类
16.对象
17.private public
18.public private
19.多 1
20.friend class friendclass
21.this 当前对象
22.operator
23.第1个参数 第二个参数
24.public protected private
25.可以 不可以
26.基类的构造函数 派生类的构造函数 ?
27.之前
28.派生类 基类 ?
29.运行 编译
30.动态 静态
31.可以 不可以
32.纯虚函数 基类
33.生成对象 ?
34., class
35.普通函数 模版函数
36.? ?
三1.2
2.20,20
3.the a of fun is 1
::a=200
the a of main is 11
::a=201
4.m=3
n=2
5.this is 0′s constructor.
this is 1′s constructor.
this is 2′s constructor.
this is 1′s destructor.
this is 2′s destructor.
this is 0′s destructor.这道题做错了
6.cstatic::val=0
cs1.val=1
cs2.val=2
cs1.val=4
cs2.val=4
7.this is a constructor!i=0
this is a constructor!i=0
this is a constructor!i=0
this is a destructor!i=0
this is a destructor!i=0
this is a destructor!i=0
8.data cons.
base cons.
data cons.
derived cons.
derived des.
data des.
base des.
data des.
9.sum=10
sum=10
10.d=88 i=88
d=9999 i=9999这道也错了.
四
1.
struct BirthDay
{
int year;
int month;
int day;
};
struct student
{
int ID;
char name[10];
int sex;
BirthDay birthday;
};
2.
void main()
{
int i = 0;//用来接收数字
int a[10];//用来存放数字的每一位
int pos = 0;//记录数字有几位
int j = 0;
cin>>i;//没有判断输入是否为字母
while (i != 0)
{
a[pos] = i%10;
i /= 10;
pos ++;
}
//输出逆向数字
for (j=0; j<pos; j++)
{
cout<<a[j];
}
}
3.
void main()
{
int sum = 0;//用来存放结果
int addition = 0;//用来存放每一次的增量
int i = 0;
int n = 0;
cin>>n;
for (i=1; i<=n; i++)
{
addition = i*(1+i) / 2;//用公式,你不会真的蠢到一个数一个数的加吧
sum += addition;
}
cout<<sum<<endl;
}
4.
double sum(int n)
{
if (n == 1)
{
return 1.0;
}
else
{
return (int)pow(-1, n+1) * (1.0/n)
+sum(n-1);
}
}
5.int (* p)(int, int);
p = max;
int i = (* p)(7, 6);
另外两个的用法是一样的.
6.
class crectangle
{
public:
crectangle()
{
length = 1;
width = 1;
}
void set(int len, int wid)
{
if ( (len<0 || len>50)
|| (wid <0 || len>50) )
{
cout<<”error data”<<endl;
return ;
}
else
{
length = len;
width = wid;
}
}
int perimeter(void)
{
return (length + width)*2;
}
private:
int length;
int width;
};
7.
class cdateinfo
{
private:
int year;
int month;
int day;
public:
cdateinfo()
{
year = 2000;
month = 1;
day = 1;
}
cdateinfo(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
void setdate(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
void display()
{
cout<<”year: “<<year
<&l t;” month: “<<month
<<” day: ” <<day
<<endl;
}
};
8.
class point
{
private:
int x;
int y;
public:
point()
{
x = 100;
y = 100;
}
point & operator ++ ( )
{
x ++;
y ++;
return *this;
}
point operator ++ (int)
{
point temp(* this);
x ++;
y ++;
return temp;
}
point & operator — ( )
{
x –;
y –;
return *this;
}
point operator — (int)
{
point temp(* this);
x –;
y –;
return temp;
}
};
太强了,兄弟。。就是不知道是不是全对
9.只写了一个String类出来,EditString还没写出来.
class String
{
protected:
char * str;
public:
~String()
{
delete str;
}
void SetString(char *s)
{
str = new char[strlen(s)+1];
strcpy(str,s);
}
void GetContent()
{
cout<<str<<endl;
}
int GetLength()
{
return strlen(str);
}
};
9.最简单的实现方法,没有判断cursor位置的合法性,cursor是从0开始的
class editstring : public string
{
private:
int cursor;
public:
editstring():string()
{
cursor = 0;
}
void replace(char ch, int cur = 0)
{
str[cur] = ch;
}
void insert(char ch, int cur = 0)
{
int i = 0;//循环变量
char * temp;//存放新字符串
temp = new char[strlen(str)+2];//新生成的字符串比原来的多1个字节
for (i=0; i<cur; i++)
{
temp[i] = str[i];
}
temp[cur] = ch;
for (i=cur+1; i <= (strlen(str)); i++)
{
temp[i] = str[i-1];
}
temp[strlen(str)+1] = ‘\0′;
delete str;//释放原字符串
str = temp;
}
void del(int cur = 0)
{
int i = 0;//循环变量
char * temp;//存放新字符串
temp = new char[strlen(str)];//新生成的字符串比原来的少1个字节
for (i=0; i<cur; i++)
{
temp[i] = str[i];
}
for (i=cur; i < (strlen(str)) -1; i++)
{
temp[i] = str[i+1];
}
temp[strlen(str)-1] = ‘\0′;
delete str;//释放原字符串
str = temp;
}
};
上一个string类有点问题,请多加一个构造函数
string()
{
str = NULL;
}
10.
template <class t>
void swap(t &a, t &b)
{//用异或交换两个变量的值
a ^= b;
b ^= a;
a ^= b;
}
11.将一个整型数转换为数字字符串(非递归)
char * inttostr(int i)
{
char *ch = NULL;//字符指针,存放要返回的字符串
int t = i;
int len = 0;//数字长度
while (t != 0)
{//求数字的长度
t /= 10;
len ++;
}
ch = new char[len+1];//为字符指针分配空间
for (t=(len-1); t>=0; t–)
{
ch[t] = i%10 +48;//数字的ACII码与其表示的值错了48
i /= 10;
}
ch[len] = ‘\0′;
return ch;
}
11.将一个数字字符串转换为整型数(非递归)
int strtoint(const char *ch)
{
int base = 1;//定义基数,个位上乘1,十位上乘10,百位上乘100
int i = 0;//循环变量
int result = 0;//返回值
for (i=(strlen(ch)-1); i>=0; i–)
{
result += (ch[i] – 48) * base;//ascii码错48,所以要减去48
base *= 10;//基数乘10
}
return result;
}
11.将一个字符串反转(非递归)
void turnover(char *ch)
{
int len = strlen(ch) – 1;//字符串最后一位的编号,因为是从0开始的,所以要减1
int pos = strlen(ch) / 2;//将字符串分成两段
int i = 0;
for (i=0; i<pos; i++)
{//用异或交换
ch[i] ^= ch[len-i];
ch[len-i] ^= ch[i];
ch[i] ^= ch[len-i];
}
}
递归实在不会写.
I 服了 U
11.将一个整型数转换为数字字符串(递归)
int intlen(int n)
{//返回数字的位数
int length = 0;
while (n != 0)
{
n /= 10;
length ++;
}
return length;
}
char * inttostr(int n)
{
int i = 0;
char * ch = new char[intlen(n)+1];
i = n%10;//i用来存放数字的最后一位
ch[0] = i + 48;
ch[1] = ‘\0′;
if (n<10)
{
return ch;//如果只有一位,就直接返回
}
else
{//如果有多位,就将数字最后一位去掉,进行递归
return strcat(inttostr(n/10),ch);
}
}
11.将一个数字字符串转换为整型数(递归)
int strtoint(char *ch)
{
int num = 0;//用来存最后1位的值
num = ch[strlen(ch)-1] – 48;
if (strlen(ch) == 1)
{//如果只有一位就返回
return num;
}
else
{//将字符串除最后1位外,复制
char *c = new char[strlen(ch)];
strncpy(c, ch, (strlen(ch) – 1));
c[strlen(ch)-1] = ‘\0′;
return num + 10*strtoint(c);//进行弟归
}
}
11.将一个字符串反转(递归)
void turnover(char * ch, int pos = 0)
{//用异或交换两个变量的值
ch[pos] ^= ch[strlen(ch)-1-pos];
ch[strlen(ch)-1-pos] ^= ch[pos];
ch[pos] ^= ch[strlen(ch)-1-pos];
if (pos == strlen(ch)/2 -1)
{//如果pos是字符串的中间位置,说明已经完成了逆置,可以返回了
return ;
}
else
{//将pos提前一位,递归
turnover(ch, pos+1);
}
}
这个递归用了默认参数.这样做你就可以不用给出位置的参数
char ch[]=”abcd”
turnover(ch);