我的C++之旅--------王世弘 c++课本学习心得(1)

类的创建1.
今天通过学习分数的相关计算来实现c++语言中的对象编程的基础操作
首先,创建一个分数的类,此类包含:构造函数、自我计算(取最小公倍数等操作)、加法计算、减法计算、乘方等。(我似乎好像发现了一个bug,为如果g为负数,那么在程序结果中,会出现错误,因为此前定义 denum 为unsigned int 类型,所以负数是不会显示的)
类的创建2.
通过delete new 以及~,了解c++中关于析构函数,内存释放创建的用法,详见程序Cirbuf

其中包含课本的部分习题

欢迎大家前来探讨与交流~~~~

 ///分数

#include <iostream>
using namespace std;
class Fraction{
    public :
    Fraction() {}//构造函数
    Fraction(int n,int d);//构函数造
    Fraction operator-();//非操作
    Fraction operator-(Fraction& y);//做差
    Fraction operator+(Fraction& y);//求和
    void display();
    bool operator ==(Fraction& y)
    {
        return (num==y.num&&denum==y.denum);
    }//成员函数的操作
    bool operator>(Fraction& y);
    inline bool Iszero()
    {
       return (denum==1&&num==0);
    }
    inline bool Isone()
    {

         return (denum==1&&num==1);
    }
    inline bool IsInt()
    {
        return (denum==1);
    }
    int floor();
    int ceiling();
    bool isProper();
    private:
     Fraction makefraction(int n,unsigned int d)
     {
          Fraction ans;
          ans.num=n;
          ans.denum=d;
          return ans;
     }
     int num;
     unsigned int denum;

};//类编制完成
/*下面写下具体的成员函数,以及相应的实现方法*/
int gcd(int a,int b)
{

    if(a%b==0)return b;
    else return gcd(b,a%b);
}
inline int round(double d)
{
    return static_cast<int>(d);//c++格式下的转换方式;
}
Fraction Fraction::operator-()
{

     return makefraction(-num,denum);
}
inline void Fraction::display()//成员函数的写入,这里利用了内联函数。
{    if(num&&!IsInt())
     cout<<num<<"/"<<denum<<endl;
     else if(IsInt())cout<<num<<endl;
     else cout<<num<<endl;
}
Fraction::Fraction(int n,int d)
{
     if(n==0){num=0,denum=1;return;}
     if(d<0){n=-n,d=-d;}
     int g;
     g=gcd(n,d);
     if(g<0)g=-g;
     if(g!=1)
     {
        num=n/g;
        denum=d/g;
     }
    else
       {
            num=n;
            denum=d;
       }
}//函数的重载
//重载(2)
Fraction Fraction::operator -(Fraction& y)
{
    if(num==0)
    {
        return makefraction(-y.num,y.denum);
    }
    if(y.num==0)return *this;
    else return (Fraction(num*y.denum-denum*y.num,denum*y.denum));
}
//重载(3)
Fraction Fraction::operator +(Fraction& y)
{
     if(num==0)
     {
          return makefraction(y.num,y.denum);
     }
     if(y.num==0)return *this;
     else return (Fraction(num*y.denum+denum*y.num,denum*y.denum));
}
int Fraction::floor()//习题5 解答
{   double s;
    int s1;
    s=num*1.0/denum;
    //cout<<s<<endl;
    s1=round(s);
    if(num<0&&!IsInt())s1-=1;
    return s1;
}
//如何获得任意个数的lcm,见数论。。。。。。
bool Fraction:: isProper()//习题7 解答
{
    int s;
    s=floor();
    if((s==-1||s==0)&&!IsInt())return true;
    return false;

}
int main()
{
    int n,d;
    int T;
    cin>>T;
    while(T--)
    { Fraction temp;
      cin>>n>>d;
      Fraction x(n,d);
      x.display();
      cout<<x.floor()<<endl;
      if(x.isProper())cout<<"yes"<<endl;
      else cout<<"no"<<endl;
      cin>>n>>d;
      Fraction y(n,d);
      y.display();
      cout<<y.floor()<<endl;
      temp=x-y;
      temp.display();
      temp=x+y;
      temp.display();

    }
    return 0;
}


//利用循环缓冲区实现单词计数

#include <iostream> using namespace std; class Cirbuf { public: enum {D_size=16};//枚举变量 explicit Cirbuf(int size=D_size);//消除类型转换语义 int produce(char c); int consume(); bool Isempty(){return length==0;} bool Isfull() {return length==size;} ~Cirbuf(); //析构函数。。。。我也不知道干什么用。。。。好像是需要撤销初始化操作 private: int head; int tail; int length; int size; char *cb;//指向缓冲区 void incr(int& x) { if(++x==size)x=0;//索引反转 } }; class Wordcount { public: Wordcount() { buf=new Cirbuf(128); wcnt=0; word=false; } ~Wordcount(){delete buf;} bool readin(); void count(); int getcount(){return wcnt;} private: int wcnt; bool word; Cirbuf* buf; }; Cirbuf ::Cirbuf(int s/*=D_size*/) { head=tail=length=0; size=s; cb=new char[s]; } Cirbuf::~Cirbuf() { delete[]cb; } int Cirbuf::produce(char c) { cb[tail]=c; length++; incr(tail); return 0; } int Cirbuf::consume() { char c; c=cb[head]; length--; incr(head); return c; } bool Wordcount::readin() { char c; while(!buf->Isfull()) if(cin.get(c)) { buf->produce(c); } else return false;//ÊäÈë¹Ø±Õ return true; } void Wordcount::count() { int c; while(!buf->Isempty()) switch(c=buf->consume()) { case' ': case'\t': case'\n': if(word)wcnt++; word=false; break; default: word=true; } } int main() { Wordcount counter; while(1) if(counter.readin())counter.count(); else { counter.count();break; } cout<<"total "<<counter.getcount()<<"words"<<endl; return 0; }


 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值