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 {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 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 {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 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<<” cout<<” cout<<” 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类-------------显示栈里的数据\n”;-------------退出\n”;