C++面向对象程序设计习题集

更新时间:2024-04-23 09:40:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C++面向对象程序设计习题集

编程题:用面向对象的程序设计方法编制如下程序。 1.

设计一个Bank类,实现银行某账号的资金往来账管理,包括建账号、存入、取出等。Bank类包括私有数据成员top(当前指针)、date(日期)、money(金额)、rest(余额)和sum(累计余额)。另有一个构造函数和3个成员函数bankinO(处理存入账)、bankout()(处理取出账)和disp( )(出明细账)。 【知识点】:2.2 2.3 【参考分】:25分 【难易度】:B 【答案】:

#include #include #include const int Max=100; class Bank {

int top;

char date[Max][10];//日期 int money[Max];//金额 int rest[Max];//余额

static int sum;//累计余额 public:

Bank(){top=0;}

void bankin(char d[ ],int m) {

strcpy(date[top],d); money[top]=m; sum=sum+m; rest[top]=sum; top++; }

void bankout(char d[],int m) {

strcpy(date[top],d);

money[top]=-m; //取出数用负数表示 sum=sum-m; rest[top]=sum; top++; }

void disp() {

int i;

cout<<\日期 存入 取出余额\

for(i=0;i

cout<

cout<<\ else

cout<

int Bank::sum=0; void main() {

Bank obj;

obj.bankin(\ obj.bankin(\ obj.bankout(\ obj.bankout(\,800); obj.disp(); }

2.

编写一个程序,已有若干个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。 【知识点】:2.2 2.3 【参考分】:20分 【难易度】:B 【答案】:

#include #include #include class Stud {

int no;

char name[10]; int deg;

static int sum; static int num; public:

Stud(int n,char na[],int d) {

no=n;deg=d; strcpy(name,na); sum+=d; num++; }

static double avg() {

return sum/num;

}

void disp() {

cout<

int Stud::sum=0j int Stud::num=O; void main() {

Stud s1(1,\,s2(2,\,s3(3,\ cout:<<\学号 姓名 成绩\ s1.disp(); s2.disp();

s3.disp();

cout<<\平均分=\}

3.

有10个单词存放在一维指针数组words中,编写一个程序,根据用户的输入找出所有与之从前向后匹配的单词和个数。 【知识点】:2.2 【参考分】:25分 【难易度】:B 【答案】:设计一个Word类,包含一个私有数据成员words、一个构造函数和一个公有成员函数lookup(),构造函数用于给words赋初值,lookup()用于找出所有与之从前向后匹配的单词和个数。程序如下:

#include #include C1ass Word {

char words[10][12]; public:

Word() //构造函数给words赋初值

{

strcpy(words[0],\strcpy(words[1],\; strcpy(words[2],\strcpy(words[3],\; strcpy(words[4],\strcpy(words[5],\strcpy(words[6],\; strcpy(words[7],\; strcpy(words[8],\; strcpy(words[9],\;

}

void lookup(char s[ ]); };

void Word::lookup(char s[ ]) {

char *w;

int i,j,n=0; //n记录相匹配的单词个数 cout<<\匹配的单词:\

for(i=0;i<10;i++) //一个单词一个单词地匹配 {

for(w=words[i],j=0;s[j]!='\\0'&&*w!='\\0'&&*w==s[j]; j++,w++); if(s[j]=='\\0') //匹配成功 { n++;

cout<<\ <

cout<<\相匹配的单词个数:\}

void main() {

Word obj; char str[20];

cout<<\输入单词:\ cin>>str;

obj.lookup(str);

} 4.

创建一个Employee类,该类中有字符数组,表示姓名、街道地址、市、省和邮政编码。把表示构造函数、changenameO、display()的函数原型放在类定义中,构造函数初始化每个成员,display()~数把完整的对象数据打印出来。其中的数据成员是保护的,函数是公共的。 【知识点】:2.2 2.3 3.1 【参考分】:20分 【难易度】:B 【答案】:

#include #include class Employee {

protected:

char name[10]; //姓名 char street[20]; //街道地址 char city[10]; //市 char prov[10]; //省

char post[7]; //邮政编码 int no; //记录序号 public:

Employee(char[],char[],char[],char[],char[],int); void changename(char str[]); void display(); };

Employee::Employee(char n[],char s[],char c[],char pl[],char p2[],int num) {

strcpy(name,n); strcpy(Street,s); strcpy(city,c); Strcpy(prov,p1); strcpy(post,p2); no=num; }

void Employee::changename(char n[]) {

strcpy(name,n); }

void Employee::display() {

cout<<\输出记录\; cout<<\姓名:\; cout<<\街道地址:\; cout<<\市:\ tout<<\省:\;

cout<<\邮政编码:\}

void main() {

Employee obj1(\王华\,\中华路15号\武汉市\湖北省\,1); Employee obj2(\杨丽\,\天津路30号\南京市\江苏省\obj1.display(); obj2.display(); }

5.

编写一个程序,已有若干个学生数据,这些数据包括学号、姓名、语文成绩、数学成绩和英语成绩,求各门课程的平均分。要求设计不同的成员函数求各门课程的平均分,并使用成员函数指针调用它们。 【知识点】:2.2 2.3 3.1 【参考分】:20分 【难易度】:C 【答案】:设计一个学生类student,包括no(学号)、name(姓名)、degl(语文成绩)、deg2(数学成绩)、deg3(英语成绩)数据成员和3个静态数据成员suml(累计语文总

分)、sum2(累计数学总分)、sum3(累计英语总分);另外有一个构造函数、3个求三门课程平均分的成员函数和一个disp( )成员函数。程序如下:

#include #include #include const int N=4; class student {

int no;//学号

char name[10];//姓名 int degl;//语文成绩 int deg2;//数学成绩 int deg3;//英语成绩

static int suml;//语文总分 statac int sum2;//数学总分 static int sum3;//英语总分 public:

student(int n,char na[],int dl,int d2,int d3) {

no=n;

strcpy(name,na);

degl=dl;deg2=d2;deg3=d3;

suml+=degl;sum2+=deg2;sum3+=deg3; }

double avgl(){return(suml*1.0)/N;} double avg2(){return(sum2*1.0)/N;} double avg3(){return(sum3*1.0)/N;}} void disp() {

cout<

int student::suml=0; int student::sum2=0; int student::sum3=0; void main() {

double (student::*fp)(); //定义成员函数指针 student s1(1,\student s2(2,\student s3(3,\student s4(4,\; cout<<\输出结果\

cout<<\学号 姓名 语文数学英语\s1.disp(); S2.disp();

S3.disp(); S4.disp();

fp=student::avgl;

cout<<\语文平均分:\; fp=student::avg2;

cout<<\数学平均分:\fp=student::avg3;

cout<<\英语平均分:\ } 6.

编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求只输出成绩在80~89分数段的学生数据。 【知识点】:2.2 2.3 【参考分】:20分 【难易度】:B 【答案】:设计一个学生类Stud,包括no(学号)、name(姓名)和deg(成绩)数据成员,另有两个普通成员函数setdata()和disp(),前者用于设置对象数据,后者用于只输出成绩在80~89分数段的学生数据。在main()函数中定义了一个对象数组用于存储输入的学生数据。

程序如下:

#include #include #include const int N=3; class Stud {

int no;

char name[10]; int deg; publiC:

void setdata(int n,char na[],int d) {

no=n;deg=d;

strcpy(name,na); }

void disp() {

if(deg>=80&°<=89)

cout<

void main() {

Stud st[N]; int i,n,d;

char na[10];

cout<<\输入学号姓名成绩\ for(i=0;i

cout<<\第\个学生:\ cin>>n>>na>>d; St[i].Setdata(n,na,d);

cout<<\输出数据\

cout<<\学号 姓名 成绩\for(i=0;i

7.

编写一个程序统计学生成绩,其功能包括输入学生的姓名和成绩,按成绩从高到低排列打印输出,对前70%的学生定为合格(PASS),而后30%的学生定为不及格(FAIL)。 【知识点】:2.2 2.3 3.1 【参考分】:40分 【难易度】:A 【答案】:设计一个类student,包含学生的姓名和成绩等数据,以及setname()、setdeg()、getname()和 getdeg()等4个成员函数。设计一个类compute,包含两个私有数据成员,即学生人数ns和student类的对象数组na[],另有3个公共成员函数getdata( )、sort( )、disp( ),它们的功能分别用于数据获取、按成绩排序和输出数据。

程序如下:

#include #include #include const int Max=10; class student {

char name[10]; int deg; public:

void setname(char na[]){strcpy(name,na);} char *getname(){return name;} void setdeg(int d){deg=d;} int getdeg(){return deg;} };

class compute {

int ns;

student na[Max]; public:

void getdata();

void sort(); void disp(); };

void compute::getdata() {

int i,tdeg; char tname[10];

cout<<\输入学生人数:\ cin>>ns;

cout<<\输入学生姓名和成绩:\ for(i=O;i

cout<<\第\个学生:\ cin>>tname>>tdeg; na[i].setname(tname); me[i].setdeg(tdeg); } }

void compute::sort() {

int i,j,pick; student temp;

for(i=0;i

pick=i;

for(j=i+1;j

if(na[J].getdeg()>na[pick].getdeg()) pick=j; }

temp=na[i]; na[i]=na[pick]; na[pick]=temp; } }

void compute::disp() {

int cutoff,i;

cout<<\输出结果\

cout<<\ 姓名 成绩合格否\ cout<<” ------- ---- ------”<

cout<

cout<<\ else

cout<<\ } }

void main() {

compute obj; obj.getdata(); obj.sort(); obj.disp() }

8.

编写一个程序,输入用户的姓名和电话号码,按姓名的词典顺序排列后,输出用户的姓名和电话号码。 【知识点】:2.2 2.3 3.1 【参考分】:40分 【难易度】:B 【答案】:设计一个类person,包含学生的姓名和电话号码等数据,以及semame()、setnum()、gemame()和gemum()等4个成员函数。设计一个类compute,包含一个私有数据成员,即person类的对象数组pn[],另有3个公共成员函数getdata()、sort()、disp(),它们的功能分别用于数据获取、按姓名的词典顺序排序和输出数据。程序如下:

#include #include #include const int N=5; class person {

char name[10]; char num[10]; public:

void setname(char na[]){strcpy(name,na);} void setnum(char nu[]){strcpy(num,nu);) char *getname(){return name;} char *getnum(){return num;) };

class compute {

person pn[N]; public:

void getdata(); void getsort(); void outdata(); };

void compute::getdata() {

int i;

char na[10],nu[10];

cout<<\输入姓名和电话号码\ for (i=0; i

cout<<\ 第\个人:\ cin>>na>>nu; pn[i].setname(na); pn[i].setnum(nu); }

void compute::getsort() int i,j,k;

person temp; for(i=0;i

for(j=i+1;j

if(strcmp(pn[k].getname(),pn[j].getname())>0) k=j;

temp=pn[k]; pn[k]=pn[i]; pn[i]=temp; } }

void compute::outdata() {

int i;

cout<<\输出结果:\

cout<<\ 姓名 电话号码\

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

cout<

void main() {

compute obj; obj.getdata(); obj.getsort(); obj.outdata(); }

9.

编写一个程序,输入n个学生的姓名和出生日期,并按年龄从大到小输出。 【知识点】:2.2 2.3 3.1 【参考分】:40分 【难易度】:A 【答案】:设计一个结构体person,包含学生的姓名和出生日期等数据:设计一

个类compute,包含私有数据成员,即person结构体数组st[],另有3个私有成员函数daynum()、count day()、leap()和3个公共成员函数getdam()、sort()、disp(),它们的功能分别用于数据获取、按出生日期排序和输出数据,在实现过程中调用前面的3个私有成员函数。sort()成员函数按结构体数组元素的d成员排序,d存放的是该学生从1900年1月l日到出生日期的天数。程序如下:

#include #include const int N=4;

int count day(int,int,int,int); int leap(int); struct person {

char name[10]; struct dates int year; int month; int day; }date;

int d; //从1900.1.1到出生日的天数 };

class compute {

struct person st[N];

int daynum(int,int,int,int,int,int); int count_day(int,int,int,int); bool leap(int); public:

void getdata(); void sort(); void disp(); };

int compute::daynum(int s_year,int s_month,int s_day,int e_year, int e_month,int e_day) {

int year,day,dayl,day2; if(s year

day=count_day(s_year,s_month,s_day,0); for(year=s_year+l;year

day+=365L;

day+=count_day(e_year,e_month,e_day,1); }

else if(s_year==e_year) {

dayl=count_day(s_year,s_month,s_day,1);

day2=count_day(e_year,e_month,e_day,1); day=day2-dayl; } else day=-1; return day; }

int compute::count_day(int year,int month,int day,int flag) {

staric int day_tab[2][12]={(31,28,31,30,31,30,3l,31,30,31,30,3l}, {31,29,31,30,31,30,31,31,30,31,30,31}};

//使用二维数组存放各月天数,第一行对应非闰年,第二行对应闰年 int p,i,s;

if(leap(year)) p=1; else p=0; if(flag) {

s=day;

for(i=1;i

s=day_tab[p][month]-day; for(i=month+1;i<=12;i++) s+=day_tab[P][i一1]; }

return(s); }

bool compute::leap(int year) {

if(year%4==O&&year0!=O||year@0==O) //是闰年 return true;

else //不是闰年 return false; }

void compute::sort() {

int i,j;

struct person temp; for(i=O;i

if(st[j].d>st[j+1].d) {

temp=st[j];

st[j]=st[j+1]; st[j+1]=temp; } }

void compute::getdata() {

int i;

for(i=0;i

cout<<\输入第\个学生姓名:\ cin>>st[i].name;

cout<<\ 出生日期:\

cin>>st[i].date.year>>st[i].date.month>>st[i].date.day; st[i].d=daynum(1900,1,1,st[i].date.year, st[i].date.month,st[i].date.day); } }

void compute::disp() {

int i;

cout<<\输出结果:\

cout<<\ 姓名 出生日期\ for(i=0;i

cout<

void main() {

compute obj; obj.getdata(); obj.sort(); obj.disp(); }

10.

设计一个集合类Set,包括将集合置空、添加元素、判断元素是否在集合中、输出集合以及将集合中元素逆置,另外还有一个复制构造函数,并使用一些数据进行测试。 【知识点】:2.2 2.3 3.1 【参考分】:40分 【难易度】:B 【答案】:Set类包括私有数据data(存放集合元素)、Bum(集合中元素个数),一个缺省构造函数和复制构造函数Set(Set &s),另有成员函数setempty()(将集合置空)、issetempty()(判断集合是否为空)、ismemberof()(判断元素是否在集合中)、add()(添加元素)、disp()(输出集合)、reverse()(将集合中元素逆置)。其中,issetempty、ismemberof和disp函数设计为常成员函数。程序如下:

#include

const int Max=10; C1ass Set {

int data[Max]; int num; public:

Set(){num=0;}

Set(Set &s); //对象引用作为参数 void setempty(){num=0;} bool issetempty()const;

bool ismemberof(int n) const; int add(int n); void disp() const; void reverse(); };

Set::Set(Set &S) nUm=S.num;

for(int i=0;i

bool Set::issetempty() const {

return(num==0); }

bool Set::ismemberof(int n) const {

for(int i=0;i

int Set::add(int n) {

if (ismemberof(n)) return 1;

else if(num>Max) return 0; else {

data[num++]=n; return 1; } }

void Set::disp() const {

cout<<\

for(int i=0;i0)

float price;

static float discount; static float sum; static int n; };

void Product::total() {float rate=1.0;

if(quantity>10) rate=0.98*rate;

sum=sum+quantity*price*rate*(1-discount); n=n+quantity; }

void Product::display() {cout<

cout<

float Product::average() {return(sum/n);}

float Product::discount=0.05; float Product::sum=0; int Product::n=0;

int main() {

Product Prod[3]={

Product(101,5,23.5),Product(102,12,24.56),Product(103,100,21.5) };

for(int i=0;i<3;i++) Prod[i].total(); Product::display(); return 0; }

16.

有一个学生类student,包括学生姓名、成绩,设计一个友元函数比较两个学生成绩的高低,并求出最高分者和最低分者。 【知识点】:3.6 【参考分】:30分 【难易度】:B 【答案】:

#include #include class student {

char name[10]; int deg; public:

student(char na[],int d) f

strcpy(name,na); deg=d; }

char *getname(){return name;)

friend int compare(student &s1,student &s2) {

if(s1.deg>s2.deg) return 1;

else if(s1.deg==s2.deg) return 0;

else return -1; } };

void main() {

student st[]={student(\王华\李明\ student(\张伟\孙强\ int i,min=0,max=0; for(i=1;i<4;i++) {

if(compare(st[max],st[i])==-1) max=i;

else if(compare(st[min],st[i])==1) min=i; }

cout<<\输出结果:\

cout<<\ 最高分者:\ cout<<\最低分者:\}

17.

有一个学生类Student,包括学生姓名、成绩,设计一个友元函数输出成绩对应的等级:大于等于90为优;80~89为良:70~79为中;60~69为及格;小于60为不及格。 【知识点】:3.6 【参考分】:30分 【难易度】:B 【答案】:

#include #include #include class Student

{

char name(10]; int deg;

char level[7]; public:

Student(char na[],int d) {

strcpy(name,na); deg=d;

char *getname(){return name;} friend void trans(Student &s) {

if(s.deg>=90)

strcpy(s.1evel,\优\ else if(s.deg>=80) strcpy(s.1evel,\良\ else if(s.deg>=70) strcpy(s.level,\中\ else if(s.deg>=60) strcpy(s.1evel,\及格\ else

Strcpy(s.level,\不及格\ }

void disp() {

cout<

void main() {

Student st[]=fStudent(\王华\李明\ Student(\张伟\孙强\ cout<<\输出结果:\

cout<

trans(st[i]); st[i].disp(); } }

18.

设计一个长方体,包含有长、宽和高度私有数据成员,用友元函数的方法求长方体的体积。 【知识点】:3.6

【参考分】:20分 【难易度】:C 【答案】:

#include class Cuboid private:

float Length; //长度 float Width; //宽度 float High; //高度 public:

Cuboid(float l,float w,float h) {

Length=l;Width=w;High=h; }

friend float Volume(Cuboid &); };

float Volume(Cuboid &c)

{ return c.Length *c.Width *c.High; }

void main() {

Cuboid c(2,5,6);

cout<<\长方体积=\}

19.

设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。 【知识点】:3.6 4.2 【参考分】:20分 【难易度】:B 【答案】:在Triangle类中设计一个友元函数operator+(Triangle tl,Triangle t2),它重载运算符“+”,返回tl和t2两个三角形的面积之和。程序如下:

#include #include class Triangle {

int x,y,z; double area; public:

Triangle(int i,int j,int k) {

double s; x=i;y=j;z=k; s=(x+y+z)/2.0;

area=sqrt(s *(s-x)*(s-y)*(s-z)); }

void disparea() {

cout<<\ }

friend double operator+(Triangle t1,Triangle t2) {

return t1.area+t2.area; } };

void main() {

Triangle t1(3,4,5),t2(4,5,6); double s;

cout<<\:\ cout<<\:\ s=t1+t2;

cout<<\总面积=\}

20.

设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求任意多个三角形的面积之和。 【知识点】:3.6 4.2 【参考分】:30分 【难易度】:B 【答案】:对于式子:s=t1+t2+t3,先计算tl+t2,返回一个double数,然后再进行该double数+t3的计算,显然没有这样的重载运算符“+”友元函数,只需添加这样的重载运算符“+”友元函数即可。程序如下:

#include #include class Triangle {

int x,y,z; double area; public:

Triangle(int i,int j,int k) {

double s; x=i;y=j; z=k; s=(x+y+z)/2.0;

area=sqrt(s*(s-x)*(s-y)*(s—z)); }

void disparea() {

cout<<\ }

friend double operator+(Triangle t1,Triangle t2) {

return t1.area+t2.area; }

friend double operator+(double d,Triangle t) {

return d+t.area; } };

void main() {

Triangle tl(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8); double s;

cout<<\ cout<<\ cout<<\ cout<<\ s=t1+t2+t3+t4;

cout<<\总面积=\}

21.

设计一个学生类Student,包括姓名和三门课程成绩,利用重载运算符“+’’将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分。 【知识点】:4.2 【参考分】:30分 【难易度】:B 【答案】:

#include #include #include class Student {

char name[10]; int degl,deg2,deg3; public:

Student() {degl=deg2=deg3=0;} Student(char na[],int dl,int d2,int d3) {

strcpy(name,na);

degl=dl;deg2=d2;deg3=d3; }

friend Student operator+(Student s1,Student s2) {

statiC Student st;

st.degl=sl.degl+s2.degl; st.deg2=sl.deg2+s2.deg2; st.deg3=sl.deg3+s2.deg3;

return st; }

void disp() {

cout<

friend void avg(Student &s,int n) {

tout<

void main() {

Student sl(\ Student s3(\ cout<<\输出结果\ s1.disp(); s2.disp(); s3.disp(); s4.disp();

s=sl+s2+s3+s4; //调用重载运算符 avg(s,4); //友元函数求平均分 } 22.

设计一个时间类Time,包括时、分、秒等私有数据成员。要求实现时间的基本运算,如一时间加上另一时间、一时间减去另一时间等。 【知识点】:4.2 【参考分】:40分 【难易度】:B 【答案】:在Time类中设计如下重载运算符函数:

·Time operator+(Time):返回一时间加上另一时间得到的新时间。 ·Time operator-(Time):返回一时间减去另一时间得到的新时间。 程序如下:

#include class Time {

int hour,minute,second; public:

Time(){};

Time(int h,int m,int s) {

hour=h;minute=m;second=s; }

Time(int h,int m)

{

hour=h;minute=m;second=0; }

Time(int h) {

hour=h;minute=0;second=0; }

void sethour(int h){hour=h;)

void setminute(int m){minute=m;) void setsecond(int s){second=s;} int gethour(){return hour;) int getminute(){return minute;) int getsecond(){return second;) Time operator+(Time); Time operator-(Time); void disp() {

cout<

Time Time::operator+(Time t) {

int carry,hh,mm,ss;

ss=getsecond()+t.getsecond(); if(ss>60) {

SS--=60;

carry=l; //进位标记 }else carry=0;

mm=getminute()+t.getminute()+carry;if(mm>60) {

mm-=60; carry=l; }

else carry=0;

hh=gethour()+t.gethour()+carry; if(hh>24) hh-=24;

static Time result(hh,mm,ss); return result; }

Time Time::operator-(Time t) {

int borrow,hh,mm,ss;

ss=getsecond()-t.getsecond(); if(ss<0)

ss+=60;

\:\

borrow=l; //借位标记 }

else borrow=l;

mm=getminute()-t.getminute()-borrow; if(mm<0) {

mm+=60; borrow=1; }

else borrow=0;

hh=gethour()-t.gethour()-borrow; if(hh<0) hh+=24;

Static Time resuit(hh,mm,ss); return result; }

void main() {

Time now(2,24,39), Time Start(17,55);

Time tl=now-start,t2=now+Start; cout<<\输出结果:\ cout<<\: \ cout<<\:\ cout<<\相差:\cout<<\相加:\}

23.

设计一个点类Point(包含x和y两个私有数据成员),实现点对象之间的加、减、判相同、判不同等各种运算。 【知识点】:2.2 4.2 【参考分】:40分 【难易度】:B 【答案】:

#include Class Point {

int x,y; public:

Point(){x=y=0;)

Point(int i,int j){x=i;y=j;} Point(Point &); ~Point(){}

void offset(int,int); //提供对点的偏移

void offset(Point); //重载,偏移量用Point类对象表示

bool operator==(Point); //运算符重载,判断两个对象是否相同

bool operator!=(Point); //运算符重载,判断两个对象是否不相同 void operator+=(Point); //运算符重载,将两个点对象相加 void operator-(Point); //运算符重载,将两个点对象相减

Point operator+(Point); //运算符重载,相加并将结果放在左操作数中

Point operator-(Point); //运算符重载,相减并将结果放在左操作数中 int getx(){return x;) int gety(){return y;} void disp() {

cout<<”(\ } };

Point::Point(Point &p) x=P.X;y;p.y;

void Point::offset(int i,int j) {

x+=i;y+=j; }

void Point::offset(Point P) {

x+=P.getx();y+=P.gety(); }

bool Point::operator==(Point P) {

if(x==P.getx()&&y==p.gety()) return 1; elee return 0; }

bool Point::operator!=(Point P) {

if(x!=P.getx()||y!=p.gety()) return 1; else return 0; }

void Point::operator+=(Point P) {

x+=P.getx();y+=p.gety(); }

void Point::operator-=(Point P) {

X-=p.getx();y-=p.gety(); }

Point Point::operator+(Point P) {

this->x+=p.x;this->y+=p.y;

return *this; }

Point Point::operator=(Point P) {

this->x-=p.x;this->y-=p.y; return *this; }

void main() {

Point pl(2,3),p2(3,4),p3(p2) cout<<\:p3.disp(); p3.offset(10,10);

cout<<\:\

cout<<\:\ <

cout<<\:\ p3-=p2;

cout<<\:\

p3=pl+p3; //先将pl+p3的结果放在p1中,然后赚给p3,所以pl=p3 cout<<\:\.disp(); p3=pl-p2;

cout<<\}

24.

编写一个对具有n个元素的数组x[]求最大值的程序,要求将求最大值的函数设 计成函数模板。 【知识点】:3.6 【参考分】:20分 【难易度】:C 【答案】:

#include template T max(T x[],int n) {

int 1;

T maxv=x[0]; for(i=1;i

void main() {

int a[]=(4,5,2,8,9,3};

double b[]={3.5,6.7,2,5.2,9.2};

cout<<\数组最大值:\,6)<

25.

编写一个函数模板,它返回两个值中较小者,同时要求能正确处理字符串。 【知识点】:3.6 【参考分】:20分 【难易度】:C 【答案】:设计一个函数模板templateT min(T a,T b),可以进行int、float和char等类型数据的处理,为了能正确处理字符串,添加一个重载函数专门处理字符串比较,即char*min(char *a,char *b)。程序如下:

#include #include template T min(T a,T b) {

return(a

char *min(char *a,char *b) {

return(strcmp(a,b)<0?a:b); }

void main() {

double a=3.56,b=8.23;

char s1[]=\,s2[]=\ cout<<\输出结果:\

cout<< \中较小者:\,b) <

26.

设计一个数组类模板Array,其中包含重载下标运算符函数,并由此产生模板类Array和Array,使用一些测试数据对其进行测试。 【知识点】:3.6 【参考分】:25分 【难易度】:B 【答案】:

#include #include template class Array

T *elems;

int size; public:

Array(int S); //构造函数 ~Array();

T& operator[](int); //重载下标运算符 void operator=(T); //重载等号运算符 };

template Array::Array(int S) {

size=s;

elems=new T[SiZe]; for(int i=0;i

template Array::~Array() {

delete elems; }

template T& Array::operator[](int index) {

return elems[index]; }

template void Array::operator=(T temp) {

for(int i=0;i

void main() {

int 1,n=10;

Array arrl(n); //产生整数型模板类及其对象arrl Array arr2(n); //产生字符型模板类及其对象arr2 for(i=0; i

arr1[i]='a'+i; //调用重载运算符 arr2[i]='a'+i; }

cout<<\ ASCII码 字符\; for(i=O;i

cout< 27.

一个Sample类模板的私有数据成员为T n,在该类模板中设计一个“operator==”重载运算符函数,用于比较各对象的n数据是否相等。 【知识点】:3.6 【参考分】:20分 【难易度】:C 【答案】:

#include template class Sample {

T n; public:

Sample(T i){n=i;}

int operator==(Sample &); };

template int Sample::operator==(Sample &S) {

if(n==s.n)

return 1; else return 0; }

void main()

{ Samples1(2),s2(3);

cout<<\与s2的数据成员\相等\:\不相等\ Samples3(2.5),s4(2.5);

cout<<\与s4的数据成员\相等\不相等\}

28.

设计一个模板类Sample,用于对一个有序数组采用二分法查找元素下标。 【知识点】:3.6 【参考分】:25分 【难易度】:B 【答案】:

#include #define Max 100 template class Sample T A[Max]; int n; public:

Sample(){}

Sample(T a[],int i);

int seek(T c); void disp() {

for (int i=0; itemplate Sample::Sample(T a[],int i) {

n=i;

for(int j=O; j

template int Sample::seek(T c)

int low=0,high=n-l,mid; while(low<=high) {

mid=(low+high)/2; if(A[mid]==c) return mid;

else if (A[mid]

return -1; }

void main() {

char a[]=”acegkmpwxz”; Samples(a,i0);

cout<<\元素序列:\.disp();

cout<<\元素'g'的下标:\.seek('g')<

29.

编写一个程序,设计一个点类Point,并由此派生出一个圆类。 【知识点】:5.1 5.2 【参考分】:20分 【难易度】:B 【答案】:

#include class Point {

int x,y; public:

Clothes Clothes1(\西装\,\黑色'),Clothes2(\运动服\,\蓝色\ Pants Pants1(\西裤\,\黑色\,Pants2(\运动裤\,\蓝色\ Shoe Shoe1(\皮鞋\,\棕色\,Shoe2(\运动鞋\,“黑色\; p1.wear(Clothes1); p1.wear(Pants1); P1.wear(Shoe1); p2.wear(Clothes2); p2.wear(Pants2); p2.wear(Shoe2;;

cout<<\输出结果:\ p1.show(); p2.show(); }

33.

设计一个父亲类Father、母亲类Mother和子女类child,其主要数据是姓名,子 女使用父亲的姓,最后输出子女的姓名和父母姓名。 【知识点】:5.4 【参考分】:30分 【难易度】:B 【答案】:设计好类Father和类Mother,类child是从Father和Mother类公共派生的。程序如下: #include #include class Father {

protected:

char fname[5]; //姓 char sname[10]; //名 public:

Father(){}

Father(char *fn,char *sn) { strcpy(fname,fn); strcpy(shame,sn); } char *getfname() { return fname; } void show(){cout<

class Mother {

protected:

char fname[5]; //姓 char shame[10]; //名 public:

Mother(){}

Mother(char *fn,char *sn){strcpy(fname,fn);strcpy(shame,sn);} char *getfname(){return fname;}

void show() { cout<

class child:public Father,public Mother {

private:

Father *myFather; Mother *myMother; public:

child(Father &fa,Mother &mo,char *na):myFather(&fa),myMother(&mo) {

strcpy(Father::fname,fa.getfname()); //这里的Father::fname是指从 strcpy(Father::shame,na); //Father继承的fname }

void show() {

cout<<\姓名:\::show(); cout<

cout<<\ 父亲:\;myFather->show(); cout<

cout<<\ 母亲:”;myNother->show(); cout<

void main() {

Father fa1(\陈\,\国强\,fa2(\王\,\伟\ Mother mo1(\李\,\丽\,mo2(\许\,\英\

child ch1(fal,mo1,\文化\,ch2(fa2,mo2,\萍\ cout<<\输出结果:\ ch1.show(); ch2.show(); }

34.

编写一个求出租车收费的程序,输入起始站、终止站和路程,计费公式是起价8 元,其中含3公里费用,以后每半公里收费0.7元。 【知识点】:5.4 【参考分】:40分 【难易度】:B 【答案】:设计一个站类Station(用于设置起始站、终止站)和路程类Mile(用于设置路程),由这两个类派生出收费类Price(用于计费)。程序如下:

#include #include #define Max 20 class Station

{

protected:

char from[Max]; char to[Max]; public: Station() {

strcpy(from,\;strcpy(to,\ }

Station(char f[],char t[]) {

strcpy(from,f); strcpy(to,t); }

void getdata() {

cout<<”输入起始站终止站:”; cin>>from>>to ; }

void disp() {

cout<<”从”<

Class Mile {

protected:

double mile; public:

Mile(){mile=0;}

Mile(double m){mile=m;) void getdata() {

cout<<”输入里程:”; cin>>mile; }

void disp() {

cout<<\是\公里\ } };

class Price:public Station,public Mile {

double price; public:

Price():Station(),Mile() {

price=0;

}

Price(char f[],char t[],double m):Station(f,t),Mile(m) {

price=8+(int)((m-3+0.49)*2)*0.7; }

void getdata() {

Station::getdata(); Mile::getdata();

price=8+(int)((mile-3+0.49)*2)*0.7; }

void disp() {

cout<<\ \ Station::disp(); Mile::disp(); cout<<”,价格是”<

void main() {

Price A;

A.getdata(); Price B(”关山口”,”中山公园”,32.6); cout<<”输出结果:”<

35.

设计一个基类Base,包括编号、姓名、住址以及相关的成员函数,由它派生出学生类Student和教师类Teacher,并用一些数据进行测试。 【知识点】:5.4 【参考分】:40分 【难易度】:B 【答案】:

#include #include class Base {

int no; //编号 char *name; //姓名 char *add; //住址 public:

Base(){}

void setno(int n){no=n;} void setname(char na[]) {

name=new char[strlen(na)+1]; strcpy(name,na); }

void setadd(char ad[]) {

add=new char[strlen(ad)+1]; strcpy(add,ad); }

int getno(){ return no;}

char *getname(){return name;} char *getadd(){return add;} };

class Teacher:public Base {

char *prof; //职称 int salary; //工资 public:

Teacher(){)

void setprof(char pr[]) {

prof=new char[strlen(pr)+1]; strcpy(prof,pr); }

void setsalary(int sa1)f salary=sa1;} char *getprof(){return prof;) int getsalary(){return salary;} };

class Student:public Base {

int score; //成绩 char *major; //专业 int level; //年级 public:

Student(){}

void setscore(int s){score=s;} void setmajor(char maj[]) {

major=new char[strlen(maj)+1]; Strcpy(major,maj); }

void setlevel(int 1ev){level=lev;} int getscore(){return score;)

char *getmajor(){return major;) int getlevel(){return level;} };

void main() {

Teacher t; Student s;

t.setno(129543);

t.setname(”李明”); t.setprof(”副教授”);

t.setadd(”12栋东l门302”); t.setsalary(1567); s.setno(9910112); s.setname(”孙华”); s.setadd(”10楼401); s.setscore(86);

s.setmajor(”计算机科学”); s.setlevel(4);

cout<<”输出结果:”<

cout<<\ 教师:\.getname() <<\”<

cout<<\ 学生:\.getname() <<\.getno() <<\ <<\,\.getlevel()<<\年级,住\.getadd()

<<\,专业为\.getmajor()<<\,成绩\.getscore() <<\分\}

36.

定义高度基类High,其数据成员为高h,定义成员函数disp()为虚函数。然后再由High派生出长方体类Cuboid与圆柱体类cylinder。并在两个派生类中定义成员函数disp()为虚函数。在主函数中,用基类High定义指针变量P,然后用指针P动态调用基类与派生类中虚函数disp(),显示长方体与圆柱体的体积。 【知识点】:6.1 6.2 【参考分】:20分 【难易度】:B 【答案】:

#include class High {

protected:

float h; //高度 public:

High(){}

High(float h1){h=h1;}

virtual void disp(){cout<<”高度=”<

class Cuboid:public High //长方体类 {

private:

float len,wid; //长度和宽度 public:

Cuboid(float l=0,float w=0,float h=0):High(h){ len=l; wid=w;} void disp() //虚函数disp() {

cout<<\长方体:\ cout<<\ 长度=\; cout<<\,宽度=\ cout<<\,高度=\

cout<<\,体积=\};

class cylinder:public High //圆柱体类 {

private:

float r; //半径 public:

Cylinder(float r1=0,float h1=O):High(h1) { r=rl; } void disp() //虚函数disp() {

cout<<\圆柱体:\ cout<<\ 半径=\ cout<<\,高度=\

cout<<\,体积=\.1415*h<

void main() {

High *P;

Cuboid cu(10,4,5); Cylinder cy(3,5); p=&cu; P->disp(); p=&cy; P->disp(); }

37.

编写一个程序,设计一个base基类,它有两个私有数据成员x和y以及一个虚函数add(),由它派生出two类和three类,后者添加一个私有数据成员z,在这些派生类中实现add()成员函数。并用数据进行测试。

【知识点】:6.1 6.2 【参考分】:20分 【难易度】:B 【答案】:

#include class base int x,y; public:

base(int i,int j){x=i;y=j ;} virtual int add(){return x+y;} };

class two:public base {

public:

two(int i,int j):base(i,j){} int add(){return base::add();} };

class three:public base {

int z; public:

three(int i,int j,int k):base(i,j) {

z=k; }

int add() {

return(base::add()+z); } };

void disp(base *obj) //动态绑定 {

cout<<\ 参数相加:\void main() {

two *p=new two(1 0,20);

three *q=new three(10,2 0,30); cout<<\输出结果:\; disp(p); disp(q); }

38.

圆和三角形都需要输入三个数据,设计一个类object管理这三个数据,从此类派生出圆类circle和三角形类triangle,并求各自的面积。要求采用虚函数的方法进

行程序设计。 【知识点】:6.1 6.2 【参考分】:30分 【难易度】:B 【答案】:

#include #include class object {

protected:

int x,y,z; public:

void getdata() {

cout<<\ 输入x y z值:\; cin>>x>>y>>z; } };

class triangle:public object {

public:

void getdata() {

cout<<”三角形三边长”<

double area() {

double d=(x+y+z)/2;

double s=sqrt(d*(d-x)*(d-y)*(d-z)); return s; }

void disp() {

cout<<\ 三角形:三边长分别为\,\,\ } };

class circle:public object {

public:

void getdata() {

cout<<\圆=圆心(x,y)半径z\ object::getdata(); }

double area()

{

double s=z*z*3.1 41 5; return s; }

void disp() {

cout<<\ 圆:圆心(\,\半径为\; } };

void main() {

triangle t; circle C; t.getdata(); c.getdata();

cout<<”输出结果”<

t.disp(); cout<<\面积为\ <

39.

编写一个程序,能够一屏一屏简单地浏览指定的文本文件。 【知识点】:7.3 【参考分】:20分 【难易度】:C 【答案】:

#include #include #include #include void main() {

int r; char c; fstream file;

char fn[10],buf[100]; cout<<\输入文件名:\cin>>fn;

file.open(fn,ios::nocreate | ios::in); if(!file) {

cout<<\指定的文件不存在\ abort(); }

while (!file.eof()) {

r=0;

本文来源:https://www.bwwdw.com/article/abap.html

Top