C/C++教程

C++ DLUT 上机作业(三)

本文主要是介绍C++ DLUT 上机作业(三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

C++ DLUT 上机作业(三)

我又来了

1、Myset运算符重载

/定义一个整型集合类MySet,最多存放10个不重复的整数
class MySet{
int s[10]; //整数集合
int size;
pu blic:
MySet( int num =0);

};
定义如下成员函数实现集合的相关操作:
1)增加某个整型元素,保证集合中没有重复元素data, 成功添加返回true: bool add(int data)
2) 删除指定的元素,查找该元素data在集合中则从集合中删除该元素,否则返回false;bool del(int data)
3)重载运算符“+”,实现两个集合对象的合并操作, 合并后集合不存在重复的数据 , 使表达式s1= s2+s3成立;
4)重载运算符“
”,求两个集合对象的交集操作,新集合中的元素是两个集合中相同的元素, 使表达式s1= s2s3成立;/

#include <iostream>

using namespace std;

class Myset
{
private:
    int s[10];
    int size;
public:
    Myset();
    Myset(int num);
    bool add(int data);
    bool del(int data);
    Myset operator+(Myset& p);
    Myset operator*(Myset& p);
    void show();
};
Myset::Myset(int num)
{
    int i;
    for(i=0;i<10;i++)
    {
        s[i]=num;
    }
    size=1;
}
Myset::Myset()
{
    int i;
    for(i=0;i<10;i++)
    {
        s[i]=-1;
    }
    size=1;
}
bool Myset::add(int data)
{  
    int i; 
    for(i=0;i<10;i++)
    {
        if(s[i]==data)
        return false;
    }
    s[size++]=data;
    return true;
}
bool Myset::del(int data)
{
    int k,i,j;
    for(i=0;i<size;i++)
    {
        if(data==s[i])
        {
            k=i;
            break;
        }
    }
    if(i>=size)
    {
        return false;
    }
    else
    {		
        for(j=k;j<size-1;j++)
        {
            s[j]=s[j+1];
        }
        size--;
        return true;
    }
}
Myset Myset::operator+(Myset& p)
{
    Myset temp;
    int i,j;
    temp.size=size;
    for(i=0;i<size;i++)
        temp.s[i]=s[i];
    for(i=0;i<p.size;i++)
    {
        for(j=0;j<size;j++)
        {
            if(p.s[i]==s[j])
            break;
        }
        if(j==size)
        {
		    temp.s[temp.size]=p.s[i];
            temp.size++;
        }
    }
    return temp;
}
Myset Myset::operator*(Myset& p)
{
    int i,j=0,k;
    Myset temp;
    for(i=0;i<size;i++)
    {
        for(k=0;k<p.size;k++)
        {
            if(s[i]==p.s[k])
                break;
        }
        if(k<p.size)
        {
            temp.s[j++]=s[i];
        }
    }
    temp.size=j;
    return temp;
}
void Myset::show()
{
	int i;
    cout<<"有效元素个数:"<<size<<endl;
    cout<<"有效元素:";
    for(i=0;i<size;i++)
    {
        cout<<s[i]<<" ";
    }
    cout<<endl;
}
int main()
{
    Myset s1(1),s2(5);
    for(int i=2;i<8;i++)
    {
    	s1.add(i);
	}
    s1.show();
    s2.add(7);
    s2.show();
    Myset s3=s1+s2;
    cout<<"并集:"<<endl;
    s3.show();
    Myset s4=s1*s2;
    cout<<"交集:"<<endl;
    s4.show();
}

2、Mystring运算符重载

/完善上一章设计的字符串类MyString,私有数据成员包括char p, int size; //字符串长度
定义相关的构造函数、拷贝构造、析构函数及成员函数,重载运算符实现如下功能:
1)重载“+”实现字符串连接功能,使表达式s1= s2+s3成立;
2)重载“==”判断两个字符串是否相等,根据字符串内容的字典顺序返回true/false;
3)重载“<<”与“>>”,实现字符串的输入与输出操作,如cin>>s3; cout<<s2<<endl;
4)重载运算符“()”,从字符串对象中返回一个子串。如s1(2,4)表示返回从子串,即从s2开始的子串(包括s1[2]、s1[3]和s1[4]三个字符)。
5) 重载“=”,使表达式s1= s2成立;*/

#include<iostream>
#include<cstring>

using namespace std;

class Mystring{
	private:
		char* p;
		int size;//字符串长度
	public:
		Mystring();
		Mystring(const char* n);
		Mystring(const Mystring& s);
		~Mystring();
		Mystring operator()(int a,int b);
		Mystring operator+(const Mystring &s);
		bool operator==(const Mystring &s);
		friend ostream& operator<<(ostream& out,Mystring &s);
		friend istream& operator>>(istream& in,Mystring &s);
		Mystring &operator=(const Mystring &s);
};
Mystring::Mystring()
{
	p=new char[1];
	p[0]='\0';
//	strcpy(p,'\0');
    size=0;
} 
Mystring::Mystring(const char *n)
{
	size=strlen(n);
	p=new char[size+1];
	strcpy(p,n);
	p[size]='\0';
}
Mystring::Mystring(const Mystring& s)
{
	size=strlen(s.p);
	p=new char[size+1];
	strcpy(p,s.p);
	p[size]='\0';
}
Mystring::~Mystring()
{
	if(p)
	delete [] p;
	size=0;
}
Mystring Mystring::operator+(const Mystring& s)
{
	int length=size+s.size;
	char* newp=new char[length+1];
	strcpy(newp,p);
	strcat(newp,s.p);
	newp[length+1]='\0';
	return Mystring(newp);
}
bool Mystring::operator==(const Mystring &s)
{
	if(strcmp(p,s.p))
	return true;
	return false;
}
ostream& operator<<(ostream& out,Mystring &s)
{
	out<<s.p<<endl;
	return out;
}
istream& operator>>(istream& in,Mystring &s)
{
	in>>s.p;
	s.size=strlen(s.p);
	return in;
}
Mystring &Mystring::operator=(const Mystring& s)
{
	strcpy(p,s.p);
	size=s.size;
}
Mystring Mystring::operator()(int a,int b)
{
	Mystring r1;
	r1.p = new char[b-a+1];
	strncpy(r1.p,p+a,b-a+1);
	return r1;
	/*char *q=NULL;
	int i,j=0;
	for(i=a;i<=b;i++)
	{
		q[j++]=p[i];
	}
	q[j]='\0';
	return Mystring(q);*/
}
int main()
{
	Mystring s1,s2;
    cin>>s1;
    cin>>s2;
    Mystring s3=s1+s2;
    cout<<s3;
    Mystring s4;
    cin>>s4;
    if(s3==s4)
    cout<<"s3和s4不等"<<endl;
    else
    cout<<"s3和s4相等"<<endl;
    Mystring s5;
    s5=s1;
    cout<<s5;
    Mystring s6;
	s6=s1(2,4);
	cout<<"字符串1(2,4)"<<endl;
	cout<<s6<<endl;
}

3、时间运算符重载

/定义描述时间的Time类,包括数据成员小时hour、分钟minute和秒second,定义相关函数实现如下操作:
1)重载运算符“+”与“-”,能够实现时间对象与整数秒的加减操作。
2)重载运算符“<<”输出时间对象,能够按照“小时:分钟:秒”的方式显示时间。
3)重载运算符“++”与“–”,要求能够实现时间的合理自增自减功能(秒数的增减)
/

#include<iostream>

using namespace std;

class Time{
	private:
		int hour;
		int minute;
		int second;
	public:
	    Time(int h=0,int m=0,int s=0);
	    Time operator+(int);//时间加法
		Time operator-(int);//时间减法 
        friend ostream& operator<<(ostream&, Time&);//输出时间对象
        Time &operator++();//自增
        Time &operator--();//自减
}; 
Time::Time(int h,int m,int s)
{
	hour=h;
	minute=m;
	second=s;
}
Time Time::operator+(int x)
{
	second+=x;
	int m=second/60;
	second%=60;
	minute+=m;
	int h=minute/60;
	minute%=60;
	hour+=h;
	hour%=24;
	return *this;
}
Time Time::operator-(int n)
{
	int i,j,k;
	i=second-n%60;
	if(i>=0)
	{
		second=i;
	} 
	else
	{
		second=i+60;
		minute--;
	}
	j=minute-n/60;
	if(j>=0)
	{
		minute=j;
	}
	else
	{
		minute=j+60;
		hour--;
	}
	k=hour-n/60/60;
	if(k>=0)
	{
		hour=k;
	}
	else
	{
		hour=k+24;
	}
	return *this;
}
ostream& operator<<(ostream&out,Time &a)
{
    out <<a.hour<<" "<<a.minute<<" "<<a.second<<endl;
    return out;
}
Time &Time::operator++()
{
	second++;
	if(second==60)
	{
		minute++;
		second=0;
		if(minute==60)
		{
			hour++;
			minute=0;
			if(hour==24)
			{
				hour=0;
			}
		}
	} 
	return *this;
}
Time &Time::operator--()
{
	second--;
	if(second==-1)
	{
		second=59;
		minute--;
		if(minute==-1)
		{
			minute=59;
			hour--;
			if(hour==-1)
			{
				hour=23;
			}
		}
	}
	return *this;
}
int main()
{
    Time s(23,59,59);
    ++s;
    cout<<s<<endl;
    --s;
    cout<<s<<endl;
    Time s1=s+3;
    cout<<s1<<endl;
    s1=s-3;
    cout<<s1<<endl;
}

4、重载符号分数类

/定义描述有理数的Rational类
class Rational{
int m; // 分母
int n; // 分子
double d; // n/m
void simple(); //约分
public:
Rational(int nn=1,int mm=1);
……
};
请给出重载以下运算符的函数的定义形式
1)重载算术运算符“
”,实现分数的乘法操作
2)重载比较运算符“>”"<",实现分数的比较操作
3)重载单目运算符“-”,实现分数的取反操作
4)重载双目运算符“-”,实现一个double数据与分数的减法, 两个分数的减法*/

#include<iostream>

using namespace std;
 
class Rational{
	private:
		int m;//分母
		int n;//分子
		double d; //n/m
		void simple();
		//约分
	public:
	    Rational(int nn=1,int mm=1);
		bool setM(int);
		void setN(int);
		double setD();
		Rational operator*(const Rational &A);//重载*,实现乘法 
		bool operator>(const Rational &A);
		bool operator<(const Rational &A);//分数比较 
		Rational operator-();//	分数取反
		void print();
};
int flag=0;
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
void Rational::simple()
{
	int GCD=gcd(n,m);
	m/=GCD;
    n/=GCD;
}
Rational::Rational(int nn,int mm)
{
	setN(nn);
	flag=setM(mm);
}
bool Rational::setM(int mm)
{
	if(mm!=0)
	{
		m=mm;
		return true;
	}
	return false;
}
void Rational::setN(int nn)
{
	n=nn;
}
double Rational::setD()
{
	return (double)n/(double)m;
}
Rational Rational::operator*(const Rational& A)
{
	Rational c;
	c.n=A.n*n;
	c.m=A.m*m;
	c.simple();
	return c;
} 
Rational Rational::operator-()
{
	Rational c;
	c.m=n;
	c.n=m;
	c.simple();
	return c;
}
bool Rational::operator>(const Rational& A)
{
	if(n*A.m-m*A.n>0)
	return true;
	return false;
}
bool Rational::operator<(const Rational& A)
{
	if(n*A.m-m*A.n>0)
	return false;
	return true;
}
void Rational::print()
{
	cout<<"计算结果为:"<<endl;
	if(n%m!=0)
	cout<<n<<"/"<<m<<endl;
	else
	cout<<n/m<<endl; 
}
double operator-(double &dou,Rational &A)
{
	return dou-A.setD();
}
int main()
{
	int nn,mm;
	double d;
	cout<<"输入分子:"<<endl;
	cin>>nn;
	cout<<"输入分母:"<<endl;
	cin>>mm;
	if(flag==1)
	{
		cout<<"分母为零错误"<<endl;
		return 0;
	}
	Rational a,b(2,5),c;
	a.setN(nn);
	if(!a.setM(mm))
	{
		cout<<"分母为零,错误"<<endl;
		return 0;
	}
	c=a*b;
	c.print();
	c=-a;
	c.print();
	if(a>b)
	{
		cout<<"分数a大于b"<<endl; 
	}
	else
	{
		cout<<"分数a小于b"<<endl;
	}
	if(c>b)
	{
		cout<<"分数a取反大于b"<<endl; 
	}
	else
	{
		cout<<"分数a取反小于b"<<endl;
	}
	double dd;
	cout<<"输入double数据:"<<endl;
	cin>>dd;
	cout<<"double数据与分数类a的减法结果为:"<<endl;
	cout<<dd-a;
}

写的不好,请多指正。
溜了溜了。。。。。。

这篇关于C++ DLUT 上机作业(三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!