当前位置:文档之家› C++课堂练习题

C++课堂练习题

C++的练习题

【课堂练习题1】以下程序不可能通过编译,为什么?

main()

{int a,b,c;

cin>>a>>b;

c=sum(a,b);

cout<

return 0;

}

sum(int a,int b)

{ return a+b;

}

【课堂练习题2】

用动态分配空间的方法计算Fibonacci数列的前20项,并存储到动态分配的空间中。

#include

main()

{int i;

int *p,f1=1,f2=1,f;

p=new int[20];

if(!p){cout<<”申请没有成功!\n”; return 1; }

p[0]=1;p[1]=1;

for(i=2;1<20;i++)

{f=f1+f2;

p[i]=f;

f1=f2;f2=f;}

for(i=0;i<20;i++)

cout<

delete []p;

return 0;}

【课堂练习题3】

编写C++风格的程序,解决百钱问题:将一元人民币兑换成1,2,5分的硬币,有多少种换法。#include

int main()

{int a1,a2,a5,n=0;

for(a1=1;a1<100;a1++)

for(a2=1;a2<50;a2++)

if((a1+a2*2)<=95)

{a5=100-a1-a2*2;

if(a5%5==0) {a5=a5/5; n++;

cout<<”n=”<

}

}

cout<<”n=”<

return 0;

}

【课堂练习题4】

不使用C语言库函数,完成以下功能,输入一个正整数n(n < 10),输出下面的图形,其中层数由n来确定。

*

* *

* * *

* * * *

..........

【课堂练习题5】撰写一个程序,使之能够询问用户的姓名,并读取用户输入的内容.请确保用户输入的名字长度大于两个字符.如果用户输入了有效的名称,就显示该名字,否则给出相应的错误提示信息。分别使用以下两种方式实现操作,第一种,使用C-style(风格)字符处理方法,第二种,使用string对象类型。

【课堂练习题6】一个班级有n个学生,n由用户输入,每个学生有学号1-n,有三门成绩(语、数、外)成绩由随机数生成(0到100之间),每个学生的成绩由动态数组保存。

要求:

(1). 取得总分最高的学生的学号。

(2). 提示用户输入1,2,3来获得语、数、外的平均分。

【7】实现重载max的函数,让它接受以下参数

(a) 两个整数

(b) 两个浮点数

(c) 两个字符串

(d) 一个整数数组,以及一个表示数组大小的整数值

最后撰写main()测试这些函数。

【课堂练习题8】撰写一个程序,从键盘读取一串整数,并将读入的整数依次存入array(数组)及vector(向量),然后遍历这两种容器,求取数值总和,将总和及平均值输出至显示器。

【课堂练习题9】撰写一个程序,实现时钟的设置与管理,设计合适的结构体(注意设计与算法分离)。

【课堂练习题10】定义一个时间类,提供设定时间、显示时间和秒数增加1的功能,其中设定时间的方法需要校验数据的正确性,并在main函数中验证。

【课堂练习题11】设计一个矩形类,完成计算矩形面积和显示矩形属性的功能。

【课堂练习题12】需要求3个长方柱的体积。

数据成员包括长(length)宽(width)高(height)。要求用成员函数实现以下功能:

1)由键盘分别输入3个长方柱的长、宽、高。

2)计算长方柱的体积。

3)输出3个长方柱的体积。

【课堂练习题13】定义一个描述圆柱体的类Cylinder,定义圆柱体的底面半径与高,计算圆

柱体体积并显示圆柱体的半径、高和体积。然后动态创建一个圆柱体对象。

【课堂练习题14】设计一个学生类(CStudent),它具有私有数据成员是:学号、姓名、数学、外语和计算机课程的成绩。要求能实现求三门课总成绩和平均成绩,并能设置和显示学生信息 (类声明和成员函数定义分离)。

【课堂练习题15】扩展练习13(学生类设计).设计一个友元函数,按照成绩从高到低的顺序输出姓名、学号和成绩信息。

【课堂练习题16】设计一个圆类型,设计之后,输入圆半径,计算圆周长、面积,并显示圆的半径、周长和面积(要求定义该类的构造函数和拷贝构造函数)。

【课堂练习题17】设计BOOK 类,包括ISBN 号(string),书名(string),作者(string)以及单价信息,还能根据数量确定折扣率并计算应付款项, 折扣率五本以上90%,十本以上 80%,二十本以上70%。设计借书还书的函数,提示:只设计一个种类的书,设计适当的构造及析构函数(类声明和成员函数定义分离)。

【课堂练习题18】写一个Rectangle 类,抽象自己的数据和成员函数. 要求:(1) 写出构造函数和析构函数

(2) 用一个静态数据成员记录所创建的矩形的个数 (3) 写出GetArea()获得矩形的面积

(4) 明确哪些函数需要被设计为const 成员函数 (5) 写出一个全局函数获得N 个矩形的面积

int GetAllRectArea( Rectangle* pRectArray, int count );

【课堂练习题12】需要求3个长方柱的体积。

数据成员包括长(length)宽(width)高(height)。要求用成员函数实现以下功能: 1)由键盘分别输入3个长方柱的长、宽、高。

2)计算长方柱的体积。

3)输出3个长方柱的体积。

//类名:Box //输入数据成员函数: value () //计算体积成员函数: volume ()

//输出结果成员函数: display () #include class Box

{private:

int length; //长

int width; //宽 int height; //高 public:

void value(); //输入数据成员函数 double volume(); //计算体积成员函数

void display(); //输出结果成员函数

int main()

{ Box t1,t2,t3; t1. value();

cout<<” t1的体积为:”; t1. display(); t2. value();

cout<<” t2的体积为:”; t2. display(); t3. value();

cout<<” t3的体积为:”;

t3. display();

}

也可以将volume()函数定义为void 类型,它不返回计算后的体积,而是另设一个数据成员,用来存放体积的值。请考虑如何修改程序? 【课堂练习题2】类和对象的定义及访问属性

定义一个描述“钟表”的类及该类的对象,并用对象访问其成员。可以设置时间,也可以显示时间。

#include //使用setw(6)函数的头文件 #include

class watch//定义“钟表”类 {public:

void settime(int h,int m,int s); //设置时间成员函数的说明 void showtime();//显示时间成员函数的说明 private:

int hour, minute, second; //定义类的数据成员 };

void watch::settime(int h,int m,int s)//设置时间成员函数的定义 { hour=h; minute=m; second=s; }

inline void watch::showtime()//显示时间成员函数的定义

{cout<

{watch w1,w2; //

定义两个

watch 类的对象 w1.settime(12,30,20); //对w1对象设置时间

cout<

w2.showtime();//调用w2对象的显示时间成员函数 }

【课堂练习题15】

【课堂练习题3】带有成员初始化表的构造函数

定义一个描述“点“的类及该类的对象,使用成员初始化表初始化数据成员。 #include #include class point

{int xval,yval; //定义两个坐标变量 public:

point(int x=0,int y=0); //构造函数 point(double,double); //构造函数 void showpoint(); };

point::point(int x,int y):xval(x),yval(y)// xval 被x 初始化,yval 被y 初始化。 {};

point::point(double len,double angle):yval((int)(len*sin(angle))) //yval 被(int)(len*sin(angle))初始化 { xval=(int)(len*cos(angle)); }//xval 被(int)(len*cos(angle))初始化 void point::showpoint() //显示坐标点

{cout<<"("<

{ point pt1(30,50); //笛卡尔坐标 point pt2(26.3,3.14/3);//极坐标 point pt3; //原点 cout<<"pt1="; pt1.showpoint();

cout<<"pt2="; pt2.showpoint(); cout<<"pt3="; pt3.showpoint(); }

【课堂练习题4】带有参数的构造函数

//创建一个日期类,包含年、月、日三个私有数据成员。可以在创建对象时利用构造函数初始化对象年、月、日的值,也可以利用成员函数重新设置年、月、日的值。并能够显示日期。 #include class Date //定义日期类 { public:

Date(int y, int m, int d);//带参数的构造函数说明

void setDate(int y, int m, int d);//可以设置日期的函数说明 void showDate();//可以显示日期的函数说明 private:

int year; //表示年的数据成员 int month; //表示月的数据成员 int day; //表示日的数据成员

}; //

Date::Date(int y, int m, int d)//在类外部定义构造函数

cout<<"构造函数初始化"<

year=y; month=m; day=d;

}

void Date::setDate(int y, int m, int d)//在类外部定义设置日期的函数

{

year=y; month=m; day=d;

}

inline void Date::showDate()//在类外部定义显示日期的函数

{

cout<

}

void main()

{ Date date1(1984,4,28);//定义对象date1,并带有初始化数据

cout<<"对象date1的第一次输出:"<

date1.showDate();//调用显示日期的函数

date1. setDate(2002,11,24);//调用设置日期的函数

cout<<" 对象date1的第二次输出:"<

date1.showDate();//调用显示日期的函数

}

【课堂练习题5】构造函数的应用

某商店出售商品,如果购买量大,超过一定的数量,超过的数量将给予折扣。

假设商品单价为25.8。

设计一个<商品折扣类>Tase,包括购买数量(Shua)、折扣起始数量(Base)和折扣金额(Meor)三项数据信息。

编写C++程序能够初始化购买数量和折扣起始数量(默认值为100),并可以输入购买数量和折扣起始数量,输出有关信息。

折扣率计算公式:

购买数量在扣除起始数量后的部分折扣率

1~50 5%

51~100 10%

101以上 15%

#include

class Tase

{ int Shua,Base;// Shua购买数量, Base折扣起始数量

double Meor;// Meor折扣金额

public:

Tase(int,int); //构造函数说明

void input();//输入函数说明

void print();//输出函数说明

void wekou();//计算折扣金额函数

};

Tase::Tase (int shua, int base=100) //构造函数,第二个参数折扣起始数量(默认值为100){ Shua=shua; Base=base; wekou (); }//在构造函数中调用wekou ()函数,目的是计算在折

扣起始数量为100时,折扣率是多少,折扣金额是多少void Tase::wekou()//计算折扣金额函数

{double tex; int x;

x=Shua-Base;

if(x<0) tex=0;

else if(x<51) tex=0.05;

else if(x<101) tex=0.10;

else tex=0.15;

cout<<”折扣率=”<

Meor=25.8*x*tex;

}

void Tase::input() //输入函数可以输入购买数量、折扣起始数量

{cin>>Shua>>Base; wekou();}

void Tase::print() //输出函数,可以计算总金额:单价×购买数量-折扣金额

{cout<<”购买数量”<

void main()

{ Tase t1(40);//定义对象t1,给出购买数量40,折扣起始数量(默认值为100)

t1. print();//输出相关信息

t1. input();//输入新的购买数量、折扣起始数量

t1. print();//输出相关信息

}

【课堂练习题18】

【课堂练习题6】静态数据成员的应用

在产品类(包括:产品名称、产品单价、库存量)中,计算产品的销售总额,总数量和购买产品的人数。利用静态成员函数输出产品的销售总额,总数量和购买产品的人数。

说明:产品的销售总额,总数量和购买产品的人数应该是每个产品对象共享的数据,因此在程序中将其说明为静态数据成员。

#include

#include

class product

{public:

product(char *name, int p, int n);//构造函数声明,参数name是产品名称,p单价,n库存剩余台数

~ product(); //析构函数声明

void buy(int money); //购买产品的统计与计算

void get_const(); //输出目前产品名称、单价、库存剩余台数。

static void show_sum(); //输出销售总额、销售总数量、购买的顾客总数

private: //定义私有数据成员

char *pname; //产品名称

int price; //单价

int quantity; //库存数量

static int sum; //记录销售总台数

static int count; //记录购买顾客的总人数

static int total; //卖出产品的总金额

}; //类定义结束

product::product(char *name,int p,int n) //构造函数,*name是指向产品名称的指针,p是单价,

//n库存数量

{pname=new char[strlen(name)+1]; //产生一个商品名称的数组空间,

//让指针pname指向这个数组

strcpy(pname, name); //将商品名称送入数组

price=p; //写入单价

quantity=n; //写入库存数量

count++; //购买顾客的总人数加1

}

product::~product() //析构函数

{delete []pname; }//释放数组空间

void product::buy(int money) //购买产品的统计与计算,money是顾客交了多少钱

{int n, r; // n记录购买的数量,r记录顾客的余额

n= money/price; //金额/单价,得出购买的数量

if(n> quantity) cout<<"数量不够!"<库存数量

else

{ cout<<”产品名称:”<

//输出产品名称、单价、库存

quantity-=n; //库存数量减去购买数量

r= money%price; //计算顾客的余额

sum+=n;//记录卖出的总台数

total+=n* price; //记录卖出的总金额

cout<<”顾客付:“<< money<<“元,购买了:”<

//输出顾客付了多少钱,购买了多少台产品,余额是多少

}

}

void product::get_const() //输出目前产品名称、单价、库存剩余台数。

{ cout<<"产品:"<

void product::show_sum() //输出销售总额、销售总数量、购买的顾客总数

{cout<<"销售总额:"<

cout<<"共售出产品数量:"<

cout<<"共有:"<

}

int product::sum=0; //静态变量初始化在函数体外部进行

int product::count=0; //

int product::total=0; //

void main()

{ product p1("打印机",1010,30); //定义对象p1,并且带有构造函数的初始化参数

p1.buy(6500); //

【课堂练习题19】p1. get_const();

product p2("打印机",1020,20); //定义对象p2,并且带有构造函数的初始化参数

p2.buy(3100);

p2. get_const();

product p3("打印机",1200,15);

p3.buy(6000); //定义对象p3,并且带有构造函数的初始化参数

p3. get_const();

product::show_sum();

}

【课堂练习题7】派生类公有继承的应用

首先定义一个基类(学生类),私有数据成员包括:学号num、姓名name、性别sex。定义一个成员函数:能够从键盘上输入学生的学号、姓名、性别。定义一个显示函数:能够显示学号、姓名、性别。

再定义一个派生类(学生类1), 私有数据成员包括:年龄age、住址addr。定义一个成员函数:能够从键盘上输入学生的年龄、住址。在主函数中输出学生的学号、姓名、性别、年龄、住址。

class Student //声明基类

{public: //基类公用成员

void get_value( )

{cin>>num>>name>>sex;}

void display( )

{cout<<″num: ″<

cout<<″name: ″<

cout<<″sex: ″<

private : //基类私有成员

int num;

char name[10];

char sex;

};

class Student1:public Student //声明派生类

{ public:

void get_value_1( )

{ get_value(); //调用基类中的get_value()函数,输入num,name,sex

cin>>age>>addr; //输入age,addr

}

void display_1( ) //输出age,addr

{cout<<”age:”<

cout<<”address:”<

}

private :

int age;

char addr[30];

};

main()

{ Student1 stud1;

stud1.get_value_1();//调用派生类中的输入函数

stud1.display(); //调用基类中的display()函数输出num,name,sex

stud1.display_1();//调用派生类中的display_1()函数输出addr,endl;

}

【课堂练习题8】

建立一个简单的大学管理系统,其中有学生和职工,职工中有教师。类的继承关系如图。

Data_rec 虚基类

它包含了所有派生类共有的数据成员

Employee 职工类

为虚基类Data_rec的派生类

Student 学生类

为虚基类Data_rec的派生类

Teacher 教师类

为Employee 职工类的派生类

E_Student 在职大学生类

为Employee 职工类和tudent 学生类的共同派生类

程序功能:能输入\输出不同类型人员的相关信息,

#include

#include

using namespace std;

const char null='\0';

static char *strsave(char *s)

{char *p;

p=new char[strlen(s)+1];

strcpy(p,s);

return p;

}

class Data_rec //定义虚基类

{protected:

char *name; //姓名

char *id_number; //编号

public:

Data_rec() //虚基类的构造函数,默认指针为空

{name=null;

id_number=null;

}

Data_rec(char *name1, char * id_number1 ) //虚基类的构造函数,{name=strsave(name1); // strsave(name1)是什么函数?

id_number= strsave(id_number1);

}

~Data_rec()

{delete []name;

delete []id_number;

}

void print()

{cout<<"\n"<<" name:"<< name <

cout<<" id_number:"<< id_number <

}

};

class Student:virtual public Data_rec//定义类学生,从虚基类继承派生出学生类{ protected:

char *major; //专业

long int stu_no; //学号

int level; //年级

public:

Student(char *name,char *id_number1,char *major1, long int stu_no1,int level1 ):

Data_rec(name, id_number1)//学生类的构造函数

{ major= strsave(major1);

stu_no= stu_no1;

level= level1;

}

~Student(){delete []major;}

void print();

};

void Student:: print()

{ Data_rec:: print(); //调用上级的打印函数

cout<< "major:"<< major<

cout<< "stu_no:"<< stu_no <

cout<< " level"<< level <

}

class Employee: virtual public Data_rec//定义职工类

{ protected:

char *dept;//部门

double salary;工资

public:

Employee(char *name1,char *id_number1,char *dept1, float salary1 ):

Data_rec(name1, id_number1)

{ dept=strsave(dept1); salary= salary1; }

~Employee()

{delete []dept;}

void print();

};

void Employee:: print()

{ Data_rec:: print();

cout<<"Department"<

cout<<" salary:"<< salary <

}

class Teacher:virtual public Employee//定义教师类

{ protected:

char *title;//职称

public:

Teacher(char *name1,char *id_number1,char *dept1, float salary1 ,char *title1): Data_rec(name1, id_number1), Employee(name1, id_number1,dept1,salary1) {title=strsave(title1);}

~Teacher()

{delete []title;}

void print();

};

void Teacher ::print()

{ Employee:: print();

cout<<" title:"<< title;

}

class E_Student: public Employee, public Student//定义在职大学生类

{ public:

E_Student(char *name1,char *id_number1,char *major1, long int stu_no1,int level1,char *dept1,float salary1): Data_rec(name1, id_number1), Employee(name1, id_number1,dept1,salary1), Student(name1, id_number1, major1,stu_no1,level1){}

void print();

};

void E_Student::print()

{ Student::print();

cout<<" Department::"<< dept<

cout<<" salary"<< salary << endl;

}

main()

{ Student my_student("zhangming","01012345","Computer",1234,4);//学生信息Employee my_Employee("chanping","1012356","Electricsal",7.2); //职工信息Teacher my_Teacher("liping","01012367"," Computer Scie",12.34,"professor"); E_Student my_E_Student("zhangping","01012378","Computer Scie",203478,3,"professor",7.20);//教师信息

cout<<"\n\n";

my_E_Student.print();

return 0;

}

【课堂练习题9】利用类表示一个堆栈(stack),并为此堆栈建立push(),pop()及显示堆栈内容

的showstack()函数。

整个程序分为3个独立的文件:

stack.h是类声明文件

stack.cpp是类实现文件

stackmain.cpp是类的使用文件

C++程序的多文件组成

一个源程序按结构可以划分为3个文件:类声明文件(*.h文件)、类实现文件(*.cpp)和类的使用文件(*.cpp,主函数文件)。

将类的声明部分放在类声明文件(头文件)中,这就形成了类的public接口,向用户提供调用类成员函数所需的函数原型。

将类成员函数的定义放在类实现文件中,这样就形成了类的实现方法。实现文件中必须包含类的声明文件。

将类的使用部分(通常是主程序)放在类使用文件中,这样可以清晰地表示出本程序所要完成的工作。

由多个文件组成的程序的编辑、编译、连接和执行方法:

1.把编辑好的源文件存放到指定的目录下。如D:\C++

2.选择“文件/新建”,打开“新建”对话框。在对话框中选“工作区”,在右部输入“工作

空间名称”和“位置”。单击“确定”,回到C++主窗口。

3.选择“文件/新建”,打开“新建”对话框。选择“工程”选项卡,在右部的列表中选择

“Win32 Console Application”项,并在右部位置框中,输入源文件的路径和工程名称。

然后选择“添加到当前工作空间”单选按钮。单击“确定”

4.弹出一个对话框,选择“一个空白工程”单选按钮。单击“完成”。弹出一个“新建工

程信息”对话框,单击“确定”,回到C++主窗口。看到右侧项目文件已经加到项目工作区中。

5.在C++主窗口中,选择菜单命令“工程/增加到工程/文件”,弹出一个“插入文件到工

程”对话框,在该对话框中找到文件,单击“确定”将文件添加到工程中。

6.回到C++主窗口,编译程序,执行程序即可。

程序代码

//文件1 stack..h

#include

#include

#include

const int SIZE=10;

class stack

{int stck[SIZE];

int tos;

public:

stack();

void push(int ch);

int pop();

void ShowStack();

};

//文件2 stack.cpp

#include

#include”stack.h”

stack::stack()

{tos=0;}

void stack::push(int ch)

{ if(tos=SIZE){cout<<”Stack 是个满栈”;return;}

stck[tos]=ch;

tos++;

cout<<”你已经把一个数据放入栈内\n”;

}

void stack::pop()

{ if(tos==0)_ {cout<<”Stack 是空栈”;return 0;}

tos--;

return stck[tos];

}

void stack::ShowStack()

{cout<<”这个栈内的数据:\n”;

if(tos==0){cout<<”\n这个栈里没有数据\n”;return; }

for(int i=tos-1;i>=0;i--)

cout<

cout <<”\n\n”;

}

//文件3 stackmain.cpp

#include

#include”stack.h”

main()

{ cout<

stack ss;

int x;

char ch;

cout<<”-------------数据进栈\n”;

cout<<”-------------数据出栈\n”;

cout<<”-------------显示栈里的数据\n”;

cout<<”-------------退出\n”;

while(1)

{cout<<”请选择一项:”;

cin>>ch;

ch=toupper(ch);

switch(ch)

{case …I?:cout<<”\n输入进栈的数据”; cin>>x; ss.push(x); break; case?O?:x=ss.pop(); cout<<”从栈里已经出数据存入变量x\n”; break; case?S?: ss.ShowStack();break;

case?Q?: return;

defult: cout<<”你选择了错误项,请重新选择!\n”; continue;

}

}

}

【课堂练习题10】用类Vevctor表示向量,类Vevctor内包含了整型数据成员n及指针*array, n表示向量的成分个数,而array则是指向该向量的内容(为一个动态数组),要求为这种类型的向量建立加法,内积及标度函数,利用这种方法我们可以处理维数不固定的向量运算。

【课堂练习题11】应用C++的多态性,计算三角形、矩形和圆的面积。

【课堂练习题12】应用抽象类,求圆、圆内正方形和圆外正方形的面积和周长。

【课堂练习题13】图形的显示、隐去、放大、缩小和移动

//画图程序

#include

#include

class location

{protected:

int x,y;

public:

location(int initx,int inity);

};

class point :public location

{ public:

point (int initx,int inity);

void show();

void hide();

void moveto(int newx,int y);

};

class circles:point

{ int radius;

public:

circles(int inits,int inity,int initradius);

void show();

void hide();

void expand (int expandby);

void moveto(int nx,int ny);

void contract(int contractby);

};

location::location(int initx, int inity)

{ x=initx; y=inity; }

point::point(int initx, int inity):location( initx, inity)

{}

void point ::show()

{ putpixel(x,y,getcolor()); }

void point::hide()

{ putpixel(x,y,getbkcolor()); }

void point::moveto(int newx, int newy)

{ hide();

x=newx;

y=newy;

show();

}

circles::circles(int initx,int inity,int initradius):point(initx, inity) { radius=initradius; }

void circles::show()

{ circle(x,y,radius); }

void circles::hide()

{ unsigned int tempcolor;

tempcolor=getcolor();

setcolor(getbkcolor());

circle(x,y,radius);

setcolor(tempcolor);

}

void circles ::expand(int expandby)

{ hide();

radius+=expandby;

if(radius<0)

{ radius=0; }

show();

}

void circles::contract(int contractby)

{ expand(-contractby); }

void circles::moveto(int newx, int newy)

{ hide();

x=newx;

y=newy;

show();

}

main()

{ int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"c: ..\\bgi");

circles mycircle(100,200,50);

setcolor(RED);

mycircle.show;

getch();

mycircle.moveto(200,250);

getch();

mycircle.expand(50);

getch();

mycircle.contract(75);

getch();

closegraph();

return 0;

}

【课堂练习题14】

利用纯虚函数建立堆栈与队列的操作。

大作业:模拟网上购书的结账功能

1.问题分析与功能定义

本题是一个非常实用的题目。

我们要解决的问题是:用户在网上购书后,系统根据购书人的不同类型计算出购书人的费用。网上购书的一般过程是:用户先输入他的会员号,然后选择想买的书籍放到购书筐中,选择结束后,用户要求系统结账,系统便计算出费用通知用户。我们把选书的过程略去。假设用户已经选了两本书。

根据实际情况,确定购书人可分为3类:普通人、会员、贵宾。

“普通人”的购书按原价收取。

“会员”购书费用的计算方法是:

五星级会员,按原价的70%收取。

四星级会员,按原价的80%收取。

三星级会员,按原价的85%收取。

二星级会员,按原价的90%收取。

一星级会员,按原价的95%收取。

“贵宾”的购书费用根据特别指定的折扣率计算收取的费用。例如折扣率40%。则按实际书价的60%收取。

2.对象(类)设计

根据以上分析,需要设计一个基类buyer和它的3个派生类layfolk(普通人)、member(会员)和honoured_guset(贵宾)。

基类buyer中包含的数据成员是:姓名、购书人编号、地址、购书金额。

会员类member除了继承基类buyer的数据,还要增加会员级别项。

贵宾类honoured_guset除了继承基类buyer的数据,还要增加折扣率项。

在基类中定义了构造函数的操作,对所有购书人是相同的。

getbuyname()负责取出购书人的姓名。

getaddress()负责取出购书人的地址。

getpay()负责取出购书人的应付的金额。

getid()负责取出购书人的应付的编号。

由于对不同购书人的购书金额的计算方法不同,所以不能在基类中确定计算方法。又由于各类购书人的数据不同,显示的方法也不一样。因此,在基类中将getpay()和display()定义为虚函数。

由于在计算购书金额时要知道用户买了哪些书及书的价格,所以必须建立一个book类帮助完成对书的有关操作。book类中数据成员应该包括:书号、书名、作者、出版社、定价。为了程序简洁,类定义中普遍使用了string类,下面是string类的定义。

class string

{

friend ostream& operator<<( ostream& S, const string& Str);//重载<<

friend istream& operator>>( istream& S, string& Str);// 重载>>

public:

string();

string(const string& Str);

void operator=( const string& Str);

~ string();

string(char *p);

private:

short m_Length;// 字符串长度

char *m_Data;//字符串开始地址

};

3.核心控制设计

在主函数中,我们要做的操作包括:

1)建立继承了基类buyer的3个对象。

2)建立2个book类对象。

3)请用户输入购书人的编号。

4)通过编号查询到相应的对象。

5)用对象的计算金额的方法计算购书金额。此时两个对象的定价作为消息传递给购书人对象。

4.编码与测试

本程序包括了4个文件:buy.h book.h strclass.h buy_book.cpp main()函数在buy_book.cpp文件中。

//buy.h文件

#include

#include

using namespace std;

class buyer

{ protected:

string name; //姓名

int buyerID; //购书人编号

string address; //地址

double pay; //购书金额

public:

buyer(); // buyer类默认构造函数

buyer(string n, int b, string a, double p); // buyer类构造函数

string getbuyname(); //取姓名函数

string getaddress();//取地址函数

double getpay();//取应付金额函数

int getid();//取购书人编号函数

virtual void display()=0;//显示对象函数(纯虚函数)

virtual void setpay(double=0)=0;//计算购书金额函数(纯虚函数)

};

class member: public buyer//定义会员类(派生类)

{ public:

member(string n,int b,int l, string a, double p):buyer(n,b,a,p) //定义会员类构造函数{leaguer_grade=l;}

void display();//显示对象函数

void setpay(double p);//计算购书金额函数

private:

int leaguer_grade;//会员级别(私有成员)

};

class honoured_guest: public buyer//定义贵宾类(派生类)

{ double discount_rate; //折扣率

public:

honoured_guest(string n,int b,double r, string a, double p):buyer(n,b,a,p) //定义贵宾类构造函数

{ discount_rate=r;}//折扣率赋值

void display();//显示对象函数

void setpay(double p);//计算购书金额函数

};

class layfolk: public buyer//定义普通人类(派生类)

{ public:

layfolk(string n,int b, string a, double p):buyer(n,b,a,p)// 定义普通人类构造函数{ }

void display();//显示对象函数

void setpay(double p);// 计算购书金额函数

};

buyer::buyer() //定义基类默认构造函数

{ name=""; //姓名

buyerID=0; //购书人编号

address=""; //地址

pay=0; //购书金额

}

buyer::buyer(string n,int b, string a, double p)//定义基类构造函数

{ name=n; //姓名

buyerID=b; //购书人编号

address=a; //地址

pay=p; //购书金额

}

double buyer::getpay()//取购书金额

{return pay; }

string buyer::getaddress()//取购书人地址

{return address; }

string buyer::getbuyname()//取购书人姓名

{return name; }

int buyer::getid()//取购书人编号

{return buyerID; }

void member::display()//会员类的显示函数

{cout<<"购书人姓名:"<

cout<<"购书人编号:"<

cout<<"购书人为会员,级别:"<

cout<<"地址:"<

}

void member::setpay(double p) //会员类的计算购书金额函数

{if(leaguer_grade==1)

pay=.95*p+pay;

else if(leaguer_grade==2)

pay=.90*p+pay;

else if(leaguer_grade==3)

pay=.85*p+pay;

else if(leaguer_grade==4)

pay=.8*p+pay;

else if(leaguer_grade==5)

pay=.70*p+pay;

else cout<<"级别错误";

}

void honoured_guest::setpay(double p) //贵宾类的计算购书金额函数{pay=pay+(1-discount_rate)*p;}

void honoured_guest::display()//贵宾类的显示函数

{cout<<"购书人姓名:"<

cout<<"购书人编号:"<

cout<<"购书人为贵宾,折扣率为:"<< discount_rate*100 <<"%\n"; cout<<"地址:"<

}

void layfolk:: display()//普通类的显示函数

{cout<<"购书人姓名:"<

cout<<"购书人编号:"<

cout<<"购书人为普通人:"<< "\n";

cout<<"地址:"<

}

void layfolk::setpay(double p) //普通类的据算金额函数

{pay=pay+p;}

//book文件

class book //定义book类

相关主题
文本预览