类的创建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;
}