C++作业2

来源:互联网 发布:u盘在mac上文件不显示 编辑:程序博客网 时间:2024/06/06 07:30

一、阅读、运行程序后,按要求增加类的功能(此题不用写实验报告)

[cpp] view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. class Time  
  4. {  
  5. public:  
  6.     void set_time( );     
  7.     void show_time( );    
  8. private:   
  9.     bool is_time(intintint);   //这个成员函数设置为私有的,是合适的,请品味  
  10.     int hour;  
  11.     int minute;  
  12.     int sec;  
  13. };  
  14. void Time::set_time( )   
  15. {  
  16.     char c1,c2;  
  17.     cout<<"请输入时间(格式hh:mm:ss)";  
  18.     while(1)  
  19.     {   cin>>hour>>c1>>minute>>c2>>sec;  
  20.         if(c1!=':'||c2!=':')  
  21.             cout<<"格式不正确,请重新输入"<<endl;  
  22.         else if (!is_time(hour,minute,sec))  
  23.             cout<<"时间非法,请重新输入"<<endl;  
  24.         else   
  25.             break;  
  26.     }  
  27. }  
  28. void Time::show_time( )        
  29. {  
  30.     cout<<hour<<":"<<minute<<":"<<sec<<endl;  
  31. }  
  32. bool Time::is_time(int h,int m, int s)  
  33. {  
  34.     if (h<0 ||h>24 || m<0 ||m>60 || s<0 ||s>60)  
  35.         return false;  
  36.     return true;  
  37. }  
  38. int main( )  
  39. {  
  40.     Time t1;    
  41.     t1.set_time( );     
  42.     T1.show_time( );  
  43.     return 0;  
  44. }  
要求:请在原类基础上,增加下列成员函数,要求前三个在类内定义,后三个在类内声明,类外定义。在main()数中增加适当的调用以展示扩充类定义后的功能。
add_a_sec()  //增加1秒钟
add_a_minute() //增加1分钟
add_an_hour() //增加1小时
add_seconds(int) //增加n秒钟
add_minutes(int) //增加n分钟
add_hours(int) //增加n小时
提示:(1)要考虑增加后超出取值范围的情形;(2)增加n秒后,秒数可能会超过60,调整秒数,并可以调用增加分钟数的成员函数,使时间合法;同理,增加分钟数也有类似问题。

#include <iostream>  using namespace std;  class Time  {  public:      void set_time( );         void show_time( );    void add_a_sec();      void add_a_minute();      void add_an_hour();      void add_seconds(int);      void add_minutes(int);      void add_hours(int);  private:       bool is_time(int, int, int);   //这个成员函数设置为私有的,是合适的,请品味      int hour;      int minute;      int sec;int t1,t2,t3;};  void Time::add_a_sec()  {      t1=sec;      sec=sec+1;      t2=minute;      t3=hour;      if(sec==60)      {          minute=minute+1;          sec=00;          if(minute==60)          {              hour=hour+1;              minute=00;              if(hour==24)              {                  cout<<"<add_a_sec>无法显示"<<endl;              }              else cout<<"<add_a_sec>:"<<hour<<":"<<minute<<":"<<sec<<endl;          }      }      else cout<<"<add_a_sec>:"<<hour<<":"<<minute<<":"<<sec<<endl;  }  void Time::add_a_minute()  {      sec=t1;      minute=t2;      hour=t3;      minute=minute+1;      if(minute==60)      {          hour=hour+1;          minute=0;          if(hour==24)          {              cout<<"<add_a_minute>无法显示"<<endl;          }          else cout<<"<add_a_minute>:"<<hour<<":"<<minute<<":"<<sec<<endl;      }      else cout<<"<add_a_minute>:"<<hour<<":"<<minute<<":"<<sec<<endl;  }  void Time::add_an_hour()  {      sec=t1;      minute=t2;      hour=t3;      hour=hour+1;      if(hour==24)      {          cout<<"<add_an_hour>无法显示"<<endl;      }      else cout<<"<add_an_hour>:"<<hour<<":"<<minute<<":"<<sec<<endl;  }  void Time::add_seconds(int n)  {      sec=t1;      sec=sec+n;      minute=t2;      hour=t3;      if(sec>59)      {          minute=minute+sec/60;          sec=sec%60;          if(minute>59)          {              hour=hour+minute/60;              minute=minute%60;              if(hour==24)              {                  cout<<"<add_secs>无法显示"<<endl;              }              else cout<<"<add_secs>:"<<hour<<":"<<minute<<":"<<sec<<endl;          }          else cout<<"<add_secs>:"<<hour<<":"<<minute<<":"<<sec<<endl;      }      else cout<<"<add_secs>:"<<hour<<":"<<minute<<":"<<sec<<endl;  }  void Time::add_minutes(int n)  {      sec=t1;      minute=t2;      hour=t3;      minute=minute+n;      if(minute>=60)      {          hour=hour+minute/60;          minute=minute%60;          if(hour==24)          {              cout<<"<add_minutes>无法显示"<<endl;          }          else cout<<"<add_minutes>:"<<hour<<":"<<minute<<":"<<sec<<endl;      }      else cout<<"<add_minutes>:"<<hour<<":"<<minute<<":"<<sec<<endl;  }  void Time::add_hours(int n)  {      sec=t1;      minute=t2;      hour=t3;      hour=hour+n;      if(hour==24)      {          cout<<"<add_hours>无法显示"<<endl;      }      else cout<<"<add_hours>:"<<hour<<":"<<minute<<":"<<sec<<endl;  }  void Time::set_time( )  {      char c1,c2;      cout<<"请输入时间(格式hh:mm:ss)";      while(1)      {   cin>>hour>>c1>>minute>>c2>>sec;          if(c1!=':'||c2!=':')              cout<<"格式不正确,请重新输入"<<endl;          else if (!is_time(hour,minute,sec))              cout<<"时间非法,请重新输入"<<endl;          else              break;      }  }  void Time::show_time( )  {      cout<<hour<<":"<<minute<<":"<<sec<<endl;  }  bool Time::is_time(int h,int m, int s)  {      if (h<0 ||h>24 || m<0 ||m>60 || s<0 ||s>60)          return false;      return true;  }  int main()  {      Time t1;      t1.set_time();      t1.show_time();      t1.add_a_sec();      t1.add_a_minute();      t1.add_an_hour();      t1.add_seconds(40);      t1.add_minutes(40);      t1.add_hours(5);      return 0;  }  

二、

项目名称:正整数类

设计一个“正整数”类,并通过一系列的成员函数对其性质进行做出判断或列出相关联的数值。下面给出类声明,请实现各成员函数。另外,模仿已经给出的main()函数,完成你所设计的各个成员函数的测试。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. class NaturalNumber  
  4. {private:  
  5.     int n;   
  6. public:  
  7.     void setValue (int x);//置数据成员n的值,要求判断是否是正整数  
  8.     int getValue();  //返回私有数据成员n的值  
  9.     bool isPrime();  //判断数据成员n是否为素数,是返回true,否则返回false  
  10.     void printFactor();  //输出数据成员n的所有因子,包括1和n自身  
  11.     bool isPerfect(); //判断数据成员n是否为完全数。若一个正整数n的所有小于n的因子之和等于n, 则称n为完全数, 如6=1+2+3是完全数。  
  12.     bool isReverse(int x);//判断形式参数x是否为数据成员n的逆向数(例321是123的逆向数)。  
  13.     bool isDaffodil(int x); //判断形式参数x是否是水仙花数。水仙花数的各位数字立方和等于该数,如153=1*1*1+5*5*5+3*3*3  
  14.     void print Daffodils(); //显示所有大于1,且小于数据成员n的水仙花数;  
  15. };  
  16.   
  17. void main(void)  
  18. {  
  19.     NaturalNumber nn;   //定义类的一个实例(对象)  
  20.     nn.setValue (6);  
  21.     cout<<nn.getValue()<<(nn.isPrime()?”是”:”不是”)<<”素数” <<endl;  
  22.   
  23.     nn.setValue (37);   
  24.     cout<<nn.getValue()<<(nn.isPrime()?”是”:”不是”)<<”素数” <<endl;  
  25.   
  26.     nn.setValue (84);   
  27.     cout<<nn.getValue()<<”的因子有:”;  
  28.     printFactor();  
  29.   
  30.     //随着成员函数的实现,增加代码以完成相关的测试。注意判断类的成员函数需要测试是或否两种情况……      
  31. }  
  32. //请在下面定义类中的各个成员函数  

#include<iostream>  #include<cmath>  using namespace std;  class NaturalNumber  {private:      int n;  public:      void setValue (int x);//置数据成员n的值,要求判断是否是正整数      int getValue();  //返回私有数据成员n的值      bool isPrime();  //判断数据成员n是否为素数,是返回true,否则返回false      void printFactor();  //输出数据成员n的所有因子,包括1和n自身      bool isPerfect(); //判断数据成员n是否为完全数。若一个正整数n的所有小于n的因子之和等于n, 则称n为完全数, 如6=1+2+3是完全数。      bool isReverse(int x);//判断形式参数x是否为数据成员n的逆向数(例321是123的逆向数)。      bool isDaffodil(int x); //判断形式参数x是否是水仙花数。水仙花数的各位数字立方和等于该数,如153=1*1*1+5*5*5+3*3*3      void Daffodils(); //显示所有大于1,且小于数据成员n的水仙花数;  };  void NaturalNumber::setValue(int x)  {      n=x;      if(x>0)      {          cout<<n<<"是正整数"<<endl;      }      else cout<<n<<"不是正整数"<<endl;  }  int NaturalNumber::getValue()  {      return n;  }  bool NaturalNumber::isPrime()  {      int a,b;      for(a=2;a<n;a++)      {          b=n%a;          if(b==0)          break;      }      if(b==0)      return false;      else      return true;  }  void NaturalNumber::printFactor()  {      int a,b;      for(a=1;a<=n;a++)      {          b=n%a;          if(b==0)          cout<<a<<" ";      }      cout<<endl;  }  bool NaturalNumber::isPerfect()  {      int a,b,sum(0);      for(a=1;a<n;a++)      {          b=n%a;          if(b==0)          sum=sum+a;      }      if(sum==n)      return true;      else      return false;  }  bool NaturalNumber::isReverse(int x)  {      int a[80],i,j=0,sum=0;      for(i=0;n!=0;i++)      {          a[i]=n%10;          n=n/10;          j++;      }      for(i=0;i<j;i++)      {          sum=sum+pow(10,j-1-i)*a[i];      }      if(sum==x)      return true;      else      return false;  }  bool NaturalNumber::isDaffodil(int x)  {      int a[80],i,sum=0,t;      t=x;      for(i=0;x!=0;i++)      {          a[i]=x%10;          x=x/10;          sum=sum+a[i]*a[i]*a[i];      }      if(sum==t)      return true;      else      return false;  }  void NaturalNumber::Daffodils()  {      int j,t;      for(j=2;j<n;j++)      {          t=j;          int a[80],i,sum=0;          for(i=0;j!=0;i++)          {              a[i]=j%10;              j=j/10;              sum=sum+a[i]*a[i]*a[i];          }          j=t;          if(sum==t)          cout<<sum<<" ";      }  }  int main(void)  {      NaturalNumber nn;   //定义类的一个实例(对象)      nn.setValue (6);      cout<<nn.getValue()<<(nn.isPrime()?"是":"不是")<<"素数" <<endl;        nn.setValue (37);      cout<<nn.getValue()<<(nn.isPrime()?"是":"不是")<<"素数" <<endl;        nn.setValue (84);      cout<<nn.getValue()<<"的因子有:";      nn.printFactor();        nn.setValue(6);      cout<<nn.getValue()<<(nn.isPerfect()?"是":"不是")<<"完全数" <<endl;        nn.setValue(15);      cout<<nn.getValue()<<(nn.isPerfect()?"是":"不是")<<"完全数" <<endl;        nn.setValue(4321);      cout<<"1234"<<(nn.isReverse(1234)?"是":"不是")<<nn.getValue()<<"的逆向数" <<endl;        nn.setValue(4321);      cout<<"1111"<<(nn.isReverse(1111)?"是":"不是")<<nn.getValue()<<"的逆向数" <<endl;        cout<<"153"<<(nn.isDaffodil(153)?"是":"不是")<<"水仙花数" <<endl;      cout<<"244"<<(nn.isDaffodil(244)?"是":"不是")<<"水仙花数" <<endl;        nn.setValue(2048);      cout<<nn.getValue()<<"之内的水仙花数有:";      nn.Daffodils();  }  


三、项目名称:Book类

编写一个Book类,包含name(书名)、writer(作者)、publicer(出版社)、price(价格)、number(数量)、NO(书号)等数据成员。定义成员函数setBook,用来给书籍的数据成员赋值,定义成员函数borrow和restore,分别办理借书和还书(借、还书时,暂时只完成数量的增1减1)业务,定义成员函数print用于输出—有关书的信息,定义set_NO与get_NO来实现修改类对象的书号与获得类对象的书号。自己写main函数,用来测试你编写的类。

#include <iostream> #include <string> using namespace std; class Book { public:  Book(string bn, string au, int n, string ph, double pc);  ~Book();   void setBookName(string bn);  void setAuthors(string au);  void setPages(int n);   void setPublishing_House(string ph);  void setPrice(double pc);  string getBookName();  string getAuthors();  int getPages();   string getPublishing_House();  double getPrice();  void print();    private:   string bookname;     string authors;  int pages;   string publishing_house;  double price;  };  Book::Book(string bn, string au, int n, string ph, double pc) {  bookname = bn;  authors = au;  pages = n;   publishing_house = ph;  price = pc;   cout << "对象被创建!" << endl;  }  Book::~Book() {  cout << "对象被析构!" << endl; }  void Book::setBookName(string bn) {  bookname = bn;  }  void Book::setAuthors(string au) {  authors = au; }  void Book::setPages(int n) {  pages = n; }  void Book::setPublishing_House(string ph) {  publishing_house = ph; }  void Book::setPrice(double pc) {  price = pc;  }  string Book::getBookName() {  return bookname; }  string Book::getAuthors()    {  return authors;  }  int Book::getPages() {  return pages; }  string Book::getPublishing_House() {  return publishing_house; }  double Book::getPrice() {  return price;  }  void Book::print() {  cout << "书名: " << bookname << endl;  cout << "作者: " << authors << endl;  cout << "页数: " << pages << endl;   cout << "出版社: " << publishing_house << endl;  cout << "价格: " << price << endl; }   int main() {  Book bk1("C++程序设计", "谭浩强", 485, "清华大学出版社", 36.00);  Book bk2("吹牛大王历险记", "拉斯伯等", 149, "天津人民出版社", 12.80);  bk1.print();  cout << endl;  bk2.print();  return 0;  }


四、分数类

    C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如分数。我们可以自定义类支持这些数据类型。
  本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,二则也为运算符重载等积累些感性认识。
  分数类的声明为:

[cpp] view plain copy
  1. class CFraction  {  private:      int nume;  // 分子      int deno;  // 分母  public:      CFraction(int nu=0,int de=1);   //构造函数,初始化用      void set(int nu=0,int de=1);    //置值,改变值时用      void input();               //按照"nu/de"的格式,如"5/2"的形式输入      void simplify();            //化简(使分子分母没有公因子)      void amplify(int n);        //放大n倍,如2/3放大5倍为10/3      void output(int style=0);   //输出:以8/6为例,style为0时,原样输出8/6;                              //style为1时,输出化简后形式4/3;                          //style为2时,输出1(1/3)形式,表示一又三分之一;                              //style为3时,用小数形式输出,如1.3333;                              //默认方式0  };  CFraction::CFraction(int nu,int de){    if (de!=0)    {        nume=nu;        deno=de;    }    else    {        cerr<<"初始化中发生错误,程序退出\n";        exit(0);    }}void CFraction::set(int nu,int de){    if (de!=0)    {        nume=nu;        deno=de;    }}void CFraction::input(){    int nu,de;    char c;    while(1)    {        cout<<"输入分数(m/n): ";        cin>>nu>>c>>de;        if(c!='/')            cout<<"输入格式错误!\n ";        else if (de==0)            cout<<"分母不能为零!\n ";        else            break;    }    nume=nu;    deno=de;}void CFraction::simplify(){    int n=gcd(deno, nume);    deno/=n;    nume/=n;}int gcd(int m, int n){    int r;    if (m<n)    {        r=m;        m=n;        n=r;    }    while(r=m%n)    {        m=n;        n=r;    }    return n;}void CFraction::amplify(int n){    nume*=n;}void CFraction::output(int style){    int n;    switch(style)    {    case 0:        cout<<"原样:" <<nume<<'/'<<deno<<endl;        break;    case 1:        n=gcd(deno, nume);        cout<<"化简形式: "<<nume/n<<'/'<<deno/n<<endl;        break;    case 2:        cout<<"带分数形式:" <<nume/deno<<'('<<nume%deno<<'/'<<deno<<')'<<endl;        break;    case 3:        cout<<"近似值:" <<nume/double(deno)<<endl;        break;    default:        cout<<"默认原样:" <<nume<<'/'<<deno<<endl;    }}int main(){    CFraction c1,c2(8,6);    cout<<"关于c1: "<<endl;    c1.output(0);    cout<<"改变c1: "<<endl;    c1.set(2,7);    c1.output();    cout<<"输入c1: "<<endl;    c1.input();    c1.output(0);    cout<<"关于c2: "<<endl;    c2.output(0);    c2.output(1);    c2.output(3);    c2.output(3);    c2.output();    cout<<"将c2化简: "<<endl;    c2.simplify();    c2.output(0);    cout<<"将c2放大倍: "<<endl;    c2.amplify(5);    c2.output(0);    c2.output(1);    return 0;}


项目要求:完成分数类的设计,并在main()函数中自行定义对象,调用各成员函数,完成基本的测试。
实践策略:
(1)不建议一次实现所有成员函数后再调试,而是实现一个,测试一个;
(2)本项目的实现及测试顺序可以是:先构造函数和输出output函数(可以先只实现一种输出方式),再set函数,再input函数,等等。

参考结果




0 0