C++ 面向对象- -一些习题(一)

mac2022-06-30  32

这一篇呢主要是一些之前学习时候老师给的作业,或者自己私下去做的练习,整理整理在这里记着,大家也可以随便看一看,我把题和代码都放上来,想自主练习的可以练练手,至于我写的不一定对,当个参考算了。

1、定义一个图书类(Book),在该类定义中包括以下数据成员和成员函数:1)、 数据成员: bookname(书名)、 author(作者), price(价格)和number(存书数量)。2)、成员函数: display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。3)、在main函数中,创建某一种图书对象(例如:C++程序设计),并对该图书进行简单的显示、借阅和归还管理。

要求: 1)、 用构造函数初始化,书名,作者,价格和存书数量, 其中作者为你自己的名字,存书数量为100。2)、借阅管理使用while循环结构,且当输入字母"b"时,借阅图书,即调用borrow()成员函数; 当输入字母"r"时 归还图书,即调用restore()成员函数;当输入字母"s",显示当前存书数量,即调用display(); 当输入字母"e"时,退出程序。

#include <iostream> #include <string.h> using namespace std; class Book{ private : string bookname ; string author ; double price ; int num ; public : Book(){ bookname = "Java" ; author = "xxs" ; price = 66.66 ; num = 100 ; } Book(string b,string a,double p,int n):bookname(b),author(a),price(p),num(n){} void display() ; void borrow() ; void restore() ; }; void Book::display(){ cout << "当前存书数量为: " << num << endl; } void Book::borrow(){ num = num-1 ; cout << "书已借出,此时存书数量为: " << num << endl; } void Book::restore(){ num = num+1 ; cout << "书已归还,此时存书数量为: " << num << endl; } int main() { cout << "输入 b 表示借阅图书 ;输入 r 表示归还图书 ; 输入 s 表示显示当前图书数量 ; 输入 e 表示退出程序。" <<endl; cout << endl; Book b("C++","好先生",88.0,20.0) ; b.display() ; char o ; while(1){ cin >> o ; if(o == 'b') b.borrow() ; if(o == 'r') b.restore() ; if(o == 's') b.display() ; if(o == 'e') return -1; } return 0; }

其运行结果如下:


2、商店销售某一商品,商店每天公布统一的折扣(discount),同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购 10 件以上者,还可以享受 98 折优待,现已知当天 3 个销货员销售情况为:

销售员号(num)销售件数(quantity)销货单价(price)101523.51021224.5610310021.5

编写程序,计算出当日此商品的总销售款 sum 以及每件商品的平均售价。要求用静态数据成员和静态成员函数。提示:将折扣 discount ,总销售款 sum 和商品销售总件数 n 声明为静态数据成员,再定义静态成员函数 average (平均售价) 和 display(输出结果)。

#include <iostream> using namespace std; class shop{ private : int num ; int quantity ; float price ; static float discount ; static float sum ; static int n ; public : shop(int p,int q, float o):num(p),quantity(q),price(o){} ; void total(); static float average() ; static void display() ; }; void shop::total(){ float cost=1.0 ; if(quantity>10) cost=cost*discount ; sum = sum+quantity*price*cost ; n = n+quantity ; } void shop::display(){ cout << "该日商品的总销售款为:"<<sum <<endl; cout << "每件商品的平均售价为:"<<average() <<endl; } float shop::average(){ return(sum/n); } float shop::discount = 0.98 ; float shop::sum = 0 ; int shop::n = 0 ; int main() { shop s[3]{ shop(101,5,23.5), shop(102,12,24.56), shop(103,100,21.5), }; for(int i=0 ;i<3 ;i++) s[i].total(); shop::display(); return 0; }

其运行结果如下:


3、有一个日期(Date)类的对象和一个时间(Time)类的对象,要求将 Time类声明为 Date 类的友元类,通过 Time 类中的 display函数引用 Date 类对象的私有数据,一次输出年、月、日和时、分、秒。

#include <iostream> using namespace std; class Date; class Time{ int hour ; int minute ; int sec ; public : Time(int ,int ,int) ; void display(Date &) ; }; class Date{ int year ; int month ; int day ; public : Date(int ,int ,int); friend Time; }; Time::Time(int h,int m,int s) { hour=h ; minute=m; sec=s; } void Time::display(Date &d) { cout << d.year << "/" << d.month << "/" << d.day <<endl; cout << hour << ":" << minute << ":" << sec << endl; } Date::Date(int d,int m,int y){ year=y ; month=m ; day=d ; } int main() { Time t1(23,59,59) ; Date d1(5,11,2018) ; t1.display(d1); return 0; }

其运行结果如下:


3、定义一个复数类 Complex,重载运算符“+”,使之能用于复数的加法运算。参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意。例如:c1+c2,i+c1,c1+i均合法(设i为整数,c1,c2位复数)。编程序,分别求两个复数之和、整数和复数之和。

#include <iostream> using namespace std; class Complex{ double real ; double imag ; public : Complex(double r=0 ,double i=0):real(r),imag(i){} void set(){ cout << "这个复数是: (" << real << "," << imag << "i)" << endl; } void sum() ; Complex operator+(Complex a); friend void display(Complex ); }; Complex Complex::operator+(Complex a){ Complex b ; b.real = real+a.real; b.imag = imag+a.imag; return b ; } void Complex::sum(){ cout << "(" <<real << "," << imag << "i)" <<endl; } void display(Complex c4){ Complex c9 ; int c5 ; c4.set() ; cout << "输入一个整数: " ; cin >> c5 ; cout << "整数和复数相加得(整数在前): " << endl; Complex c8(c5,0) ; c9=c8+c4 ; c9.sum(); } int main() { Complex c1(1,1) , c2(2,2) , c3; c1.set() ; c2.set() ; cout << "这两个复数相加得: "<<endl; c3=c1+c2 ; c3.sum() ; cout << endl; Complex c4(6,6) , c6 , c7; int c5 ; c4.set() ; cout << "输入一个整数: " ; cin >> c5 ; cout << "整数和复数相加得(整数在后): " << endl; c6=c4+c5 ; c6.sum() ; cout<< endl; display(c4); }

其运行结果如下:


4、定义一个点类point, 重载运算符“+”,使之能计算点类的距离运算,编程求两点之间的距离。(例如:定义点a(1,2)和 点b(3,4), 当使用“+“”运算时, double c=a+b,  则c为a和b两点之间的距离√8 ).注意:开平方可以用sqrt()函数,用此函数需包含头文件#include <math.h> ,pow函数可用求次方运算,如 pow(10,2)表示10的2次方(即平方)。

#include <iostream> #include <math.h> using namespace std; class Point{ double x1 , x2 ; public: Point(double a=0, double b=0):x1(a),x2(b){} void show(){ cout << "这个点是: " << "(" << x1 << "," << x2 << ")" << endl; } double operator+(Point); }; double Point::operator+(Point a){ return (sqrt(pow(a.x1-this->x1,2)+pow(a.x2-this->x2,2)) ); } int main() { double x1,y1,x2,y2,c; cout << "输入两个点: "; cin >> x1 >> y1 ; Point a(x1,y1); a.show(); cin >> x2 >> y2 ; Point b(x2,y2); b.show(); c=a+b ; cout << "这两点间距离是:" << c <<endl; }

其运行结果如下:


5、设计一个日期类Date,该类包含数据成员 year(年),month(月),day(日),定义构造函数。要求:1)、重载日期加上天数的加法运算符+ (例如 给一个日期加上10天)。2)、重载日期的自增运算符++ ;(需要满30进一天)。

#include <iostream> using namespace std; class Date{ int year ; int month ; int day ; public : Date(int y=0,int m=0,int d=0):year(y),month(m),day(d){} Date operator+(int i); Date operator++(); void display(){ cout <<year << "/" << month << "/" << day << endl ; } }; Date Date::operator+(int i){ return Date(year,month,day+i) ; } Date Date::operator++(){ if(++day>=30){ day-=29 ; month++ ; } if(month>12){ month-=12; year++ ; } return *this ; } int main(){ Date d(2018,12,19) ,d1 ; cout << "初始日期是: " ; d.display(); cout << "日期上加10后得到新日期: " ; d1=d+10 ; d1.display(); cout <<"日期滚动: " <<endl; for(int i ;i<=15;i++){ ++d ; d.display(); } }

其运行结果如下:


6、设计一个分数类 CFraction,该类中数据成员包含分子(nume)、分母(deno)。重载流插入运算符“<<”和流提取运算符“>>”,使之能用于分数的输入和输出。

#include <iostream> using namespace std; class CFraction{ int nume ; int deno ; public : CFraction(int n=0,int d=0):nume(n),deno(d){} friend ostream& operator << (ostream& , CFraction&) ; friend istream& operator >> (istream& , CFraction&) ; }; ostream& operator << (ostream& output , CFraction& c) { output << c.nume << "/" << c.deno ; return output ; } istream& operator >> (istream& input, CFraction& c) { cout << "分别输入一个分数的分子和分母: " <<endl; input >> c.nume>> c.deno ; return input ; } int main(){ CFraction c ; cin >> c ; cout << "该分数: " << c << endl; }

其运行结果如下:

 

最新回复(0)