C++实验6 拷贝构造函数与复合类

1-Point&Circle

#include <iostream>
using namespace std;
#include <math.h>
class Point
{
    double x, y;

public:
    Point()
    {
        x = 0;
        y = 0;
    }
    Point(double x_value, double y_value)
    {
        x = x_value;
        y = y_value;
    }
    void setXY(double xx,double yy){x=xx;y=yy;}
    double getX(double x) { return x; }
    double getY(double y) { return y; }
    double getDisTo(Point &p)
    {
        double dis;
        dis = sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
        return dis;
    }
    ~Point() {}
};
class Circle
{
    Point centre;
    double radius;

public:
    Circle() {}
    Circle(double x, double y, double r)
    {
        centre.getX(x);
        centre.getY(y);
        radius = r;
    }
    void moveCentreTo(double x1, double y1)
    {
        centre.setXY(x1,y1);
    }
    int contain(Point &p)
    {
        if (radius >= centre.getDisTo(p))
            return 1;
        else
            return 0;
    }
};
int main()
{
    int x, y, r, t, a[100], b[100];
    cin >> x >> y >> r;
    cin >> t;
    Circle C0(x, y, r);
    for (int i = 0; i < t; i++)
    {
        int x1, y1;
        cin >> x1 >> y1;
        a[i] = x1;
        b[i] = y1;
        Point P(x1, y1);
        if (C0.contain(P))
            cout << "inside" << endl;
        else
            cout << "outside" << endl;
    }
    cout << "after move the centre of circle:" << endl;
    cin >> x >> y;
    C0.moveCentreTo(x, y);
    for (int i = 0; i < t; i++)
    {
        Point P(a[i], b[i]);
        if (C0.contain(P))
            cout << "inside" << endl;
        else
            cout << "outside" << endl;
    }
}

2-complex

#include <iostream>
using namespace std;
class complex
{
    int real;
    int xu;

public:
    complex()
    {
        real = 1;
        xu = 1;
    }
    complex(int a, int b)
    {
        real = a;
        xu = b;
    }
    complex add(const complex &c)
    {
        complex sum;
        sum.real = c.real + real;
        sum.xu = c.xu + xu;
        return sum;
    }
    complex substract(const complex &c)
    {
        complex sum;
        sum.real = real - c.real;
        sum.xu = xu - c.xu;
        return sum;
    }
    void print()
    {
        if (!real)
            cout << real;
        if (xu == 1)
            cout << "i" << endl;
        else if (xu == 0)
            cout << endl;
        else if (xu > 0)
            cout << "+" << xu << "i" << endl;
        else
            cout << xu << "i" << endl;
    };
};
int main()
{
    int t;
    cin>>t;
    while (t--)
    {
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        complex c0(a, b);
        complex c1(c, d);
        c0.add(c1);
        cout << "sum:";
        c0.print();
        complex c2(a, b);
        complex c3(c, d);
        c2.substract(c3);
        cout << "remainder:";
        c2.print();
    }
}

3-电话号码升位

//找不到这几道的代码了,看最后的老师的代码了orz

4-身份证设定

5-软件备份

 6-购物车

//老师的代码
#include<iostream>
#include<cmath>
using namespace std;

const double pi=3.1415;

class Point
{
    double x,y;
    public:
        Point():x(0),y(0){}
        Point(double x_value,double y_value):x(x_value),y(y_value){}
        double getX(){return x;}
        double getY(){return y;}
        void setXY(double x1,double y1){x=x1;y=y1;}
        void setX(double x_value){x=x_value;}
        void setY(double y_value){y=y_value;}
        double getDisTo(Point &p){return sqrt(pow((x-p.x),2)+pow((y-p.y),2));}
};

class Circle{
  Point centre;
  double radius;
  public:
      Circle():centre(0,0),radius(1){}
      Circle(double x,double y,double r):centre(x,y),radius(r){}
      double getArea(){return pow(radius,2)*pi;}
      void moveCentreTo(double x1,double y1){centre.setXY(x1,y1);}
      void contain(Point &p){
         double d=centre.getDisTo(p);
         if(d<=radius)
            cout<<"inside"<<endl;
         else
            cout<<"outside"<<endl;
      }
};

int main(){
  double x,y,r;
  cin>>x>>y>>r;
  Circle c(x,y,r);
  int n;
  cin>>n;
  Point *p=new Point[n];
  for(int i=0;i<n;i++){
    cin>>x>>y;
    p[i].setXY(x,y);
    c.contain(p[i]);
  }
  cin>>x>>y;
  c.moveCentreTo(x,y);
  cout<<"after move the centre of circle:"<<endl;

  for(int i=0;i<n;i++)
    c.contain(p[i]);

 delete[] p;
}
=================================================
#include<iostream>
#include<cmath>
using namespace std;

class CComp
{
        double a, b;
    public:
        CComp(): a(1), b(1) {}
        CComp(double _a, double _b): a(_a), b(_b) {}
        void add(CComp& c);
        void sub(CComp& c);
        void print();
};

void CComp::add(CComp& c)
{
    CComp ret(a+c.a, b+c.b);
    cout<<"sum:";
    ret.print();
}

void CComp::sub(CComp& c)
{
    CComp ret(a-c.a, b-c.b);
    cout<<"remainder:";
    ret.print();
}

void CComp::print()
{
    if(a)
    {
        cout<<a;
        if(b>0)
            cout<<"+";
    }
    if(b)
    {
        if(abs(b)!=1)
            cout<<b;
        if(b==-1)
            cout<<"-";
        cout<<"i";
    }
    if(!a && !b)
        cout<<0;
    cout<<endl;
}

int main()
{
    int t, a, b, c, d;
    cin>>t;
    while(t--)
    {
        cin>>a>>b>>c>>d;
        CComp c1(a, b), c2(c, d);
        c1.add(c2);
        c1.sub(c2);
    }

    return 0;
}
====================================
///用字符指针表示字符串

#include<iostream>
#include<cstring>
using namespace std;

class CTelNumber{
    char *s;
  public:
    CTelNumber(char *s1){
        s=new char [strlen(s1)+1];
        strcpy(s,s1);
    }

    CTelNumber (CTelNumber &n){
           if(judge(n.s)){
              s=new char[strlen(n.s)+2];
              char c=n.s[0];

              if(c>='2' && c<='4')
                   s[0]='8';
              else if(c>='5' && c<='8')
                   s[0]='2';
              for(int i=0;i<7;i++)
                   s[i+1]=n.s[i];
              s[8]='\0';

             cout<<s<<endl;
           }
         else{
            s=0;
            cout<<"Illegal phone number"<<endl;
           }
    }

    bool judge(char* s){
        if(strlen(s)!=7)
            return false;
        else if(s[0]<'2' || s[0]>'8')
            return false;
        else{
            for(int i=0;i<7;i++){
              if(!isdigit(s[i]))
                return false;
            }
            return true;
        }
    }

    ~CTelNumber(){
        if(s)
          delete[] s;
    }
};

int main()
{
    int t;
    char s[10];
    cin>>t;
    while(t--)
    {
        cin>>s;
        CTelNumber t1(s);
        CTelNumber t2(t1);
    }
    return 0;
}


///
用string表示电话号码

#include<iostream>
#include<cstring>
using namespace std;

class CTelNumber{
    string s;
  public:
    CTelNumber(string s1){
        s=s1;
    }

    CTelNumber (CTelNumber &n){
        if(judge(n.s)){
           char c=n.s[0],k;
           if(c>='2' && c<='4')
              k='8';
           if(c>='5' && c<='8')
              k='2';
           s=k+n.s;
           cout<<s<<endl;
        }
        else
           cout<<"Illegal phone number"<<endl;
    }

    bool judge(string s){
        if(s.length()!=7)
            return false;
        else if(s[0]<'2' || s[0]>'8')
            return false;
        else{
            for(int i=0;i<7;i++){
              if(!isdigit(s[i]))
                return false;
            }
        }
        return true;
    }
};

int main()
{
    int t;
    string s;
    cin>>t;
    while(t--)
    {
        cin>>s;
        CTelNumber  t1(s);
        CTelNumber t2(t1);
    }
    return 0;
}
=============================================
/用string
#include <bits/stdc++.h>
using namespace std;

class date
{
	int y,d,m;
public:
                date(){}
	date(int y1,int m1,int d1):y(y1),m(m1),d(d1){}
	int getyear(){return y;}
	int getmonth(){return m;}
	int getday(){return d;}
};

class PID
{
	int type;
	string id;
	date cdate;
public:
     PID(int t,string _id,int _y,int _m,int _d):type(t),id(_id),cdate(_y,_m,_d){}

     PID(PID& p):type(p.type),id(p.id),cdate(p.cdate){
        if(type==1){
          type=2;

        if(cdate.getyear()>=2000)
             id.insert(6,"20");
        else
             id.insert(6,"19");
        /*
          stringstream sstr;      //年份也可以这样处理,通用性更强一点,需要万能头文件。
          string s;
          sstr << cdate.getyear();
          sstr>>s;
          id.replace(6,2,s);
        */
          int i,n=0;
          for(i=0;i<17;i++)
                n+=(id[i]-'0');
          n=n%10;
          if(n==0)
               id+='X';
          else
             {n+='0';id+=n;}
        }
    }

    void print()
   {
        cout << "type=2 birth=" <<cdate.getyear() << "."
        << setw(2)  << setfill('0')<<cdate.getmonth() << "."
        << setw(2)  << setfill('0')<< cdate.getday() << endl;
        cout << "ID=" << id << endl;
    }
};

int main()
{
	int type;
	string id;
	int y,m,d,i,t;
	cin >> t;
	while(t--)
	{
		cin >> type>>id>>y>>m>>d;
		PID p1(type,id,y,m,d);
                               PID p2(p1);
                               p2.print();
	}
	return 0;
}


//
//用字符数组

#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;
class date
{
	int y,d,m;
public:
    date(){}
	date(int y1,int m1,int d1):y(y1),m(m1),d(d1){}
	int getyear(){return y;}
	int getmonth(){return m;}
	int getday(){return d;}
};

class PID
{
	int type;
	char id[19];
	date cdate;
public:
    PID(int t,char _id[],int _y,int _m,int _d):type(t),cdate(_y,_m,_d)
    {
         strcpy(id,_id);
    }
   PID(PID& p):type(p.type),cdate(p.cdate){
         strcpy(id,p.id);
         int i,n=0;

        if(type==1){
           type=2;
           for(i=16;i>7;i--)
              id[i]=id[i-2];
           if(cdate.getyear()>=2000)
             {
                id[6]=2+'0';
                id[7]=0+'0';
             }
           else
            {
                id[6]=1+'0';
                id[7]=9+'0';
           }

           for(i=0;i<17;i++)
	 n+=(id[i]-'0');
           n=n%10;
           if(n==0)
               id[17]='X';
          else
              id[17]=n+'0';

           id[18]='\0';
          }
    }

    void print()
   {
        cout << "type=2 birth=" <<cdate.getyear() << "."
        << setw(2)  << setfill('0')<<cdate.getmonth() << "."
        << setw(2)  << setfill('0')<< cdate.getday() << endl;
	    cout << "ID=" << id << endl;
    }
};

int main()
{
	int type;
	char id[19];
	int y,m,d,i,t;
	cin >> t;
	while(t--)
	{
	       cin >> type>>id>>y>>m>>d;
	       PID p1(type,id,y,m,d);
                       PID p2(p1);
                       p2.print();
	}
	return 0;
}
=========================================
#include<iostream>
using namespace std;

class CDate
{
    int year, month, day;
public:
    CDate(int y, int m, int d):year(y),month(m),day(d) { }
    bool isLeapYear(int y) { return (y%4 == 0 && y%100 != 0) || y%400 == 0; }
    double getDayofYear()
    {
        double sum=0;
        if(cmp()){   //若日期大于2015-4-7日
           int i;
           int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

           //计算距离2015-1-1之间有多少天
           sum+=day;
           if (isLeapYear(year))
               a[2]=29;

           for(i=1; i<month; i++)
               sum+=a[i];

           for(i=2015;i<year;i++){
               if (isLeapYear(i))
                   sum+=366;
               else
                  sum+=365;
           }
        }
        return sum;
    }
    bool cmp(){  //判断日期是否>2015-4-7
       if(year!=2015) return year>2015;
       if(month!=4) return month>4;
       return day>7;
    }
    bool isZero(){  //判断日期是否等于0-0-0
       return (year==0 && month==0 && day==0);
    }
};

class CSoft
{
    char type, store;
    string name;
    CDate ED;
public:
    CSoft(string n, char t ,char s, int y,int m,int d):name(n),type(t),store(s),ED(y,m,d){}
    CSoft(CSoft &x):name(x.name), type('B'),store('H'), ED(x.ED) {}
    void print()
    {
        cout<<"name:"<<name<<endl;
        cout<<"type:";
        switch(type)
        {
            case 'O': cout<<"original"<<endl; break;
            case 'T': cout<<"trial"<<endl; break;
            case 'B': cout<<"backup"<<endl; break;
        }
        cout<<"media:";
        switch(store)
        {
            case 'D': cout<<"optical disk"<<endl; break;
            case 'H': cout<<"hard disk"<<endl; break;
            case 'U': cout<<"USB disk"<<endl; break;
        }
        cout<<"this software ";
        if(ED.isZero())  //若日期为0-0-0
            cout<<"has unlimited use"<<endl;
        else
        {
            double d=ED.getDayofYear();  //返回的是距离2015-1-1有多少天,2015-4-7距离2015-1-1是97天。当日期小于2015-4-7时返回0
            if(d==0)  
                cout<<"has expired"<<endl;
            else
                cout<<"is going to be expired in "<<d-97<<" days"<<endl;
        }
        cout<<endl;
    }
};

int main()
{
    int t, y, m, d;
    char ty, s;
    string n;
    cin>>t;
    while(t--)
    {
        cin>>n>>ty>>s>>y>>m>>d;
        CSoft s1(n,ty,s,y,m,d), s2(s1);
        s1.print();
        s2.print();
    }
    return 0;
}
============================================
一、使用链表结构:
#include<iostream>
using namespace std;
#include<iomanip>
class good{
    string id,name,color,size;
    double danjia;
    int num;
    public:
        good(){};
        good(string id1,string name1,string color1,string size1,double danjia1,int num1)
        {id=id1;name=name1;color=color1;size=size1;danjia=danjia1;num=num1;}
        void display()
        {cout<<name<<","<<color<<","<<size<<","<<fixed<<setprecision(2)<<danjia<<","<<num<<","<<fixed<<setprecision(2)<<getsum()<<endl;}
        string getid(){return id;}
        int getnum(){return num;}
        double getsum(){return danjia*num;}
        void numplus(){
            num++;
        }
        void numsub(){
            num--;
        }
        void numplus1(int _num){
            num+=_num;
        }
};

struct Node{
  good data;
  Node* next;
};

class car{
    Node* head;
    public:
        car(){head=new Node;head->next=NULL;}
        void insertNode(good value){
            Node* s=new Node;
            s->data=value;
            s->next=head->next;
            head->next=s;
        }
        Node* findNode(string id){
           Node* p=head->next;
           while(p){
             if(p->data.getid()==id)
                return p;
             p=p->next;
           }
           return NULL;
        }
         void deleteNode(string id){
            Node* p=head;
            while(p->next){
             if(p->next->data.getid()==id){
                p->next=p->next->next;
                break;
             }
             p=p->next;
            }
        }

        void add(string _id,string _name,string _color,string _size,double _danjia,int _num)
        {  Node* p=findNode(_id);
           if(!p){
                 good value(_id,_name,_color,_size,_danjia,_num);
                 insertNode(value);
           }
           else
                 p->data.numplus1(_num);
       }

        void up(string _id){
            Node* p=findNode(_id);
            if(p)
              p->data.numplus();
        }

        void down(string _id){
            Node* p=findNode(_id);
            if(p){
              if(p->data.getnum()>1){
                   p->data.numsub();
              }
            }
          }

          void display(){
              double sum=0;
              int count=0;
              Node* p=head->next;

              cout<<"商品清单:"<<endl;
              cout<<"商品,颜色,尺码,单价,数量,小计"<<endl;

              while(p){
                p->data.display();
                count+=p->data.getnum();
                sum+=p->data.getsum();
                p=p->next;
              }
              cout<<"----------"<<endl;
              cout<<count<<"件商品,总商品金额"<<fixed<<setprecision(2)<<sum<<endl;
            }
};

int main() {
    int t;
    cin>>t;
    while(t--){
       int n;
       cin>>n;
       string operate,id,name,color,size;
       int num;
       double danjia;
       car c;
       while(n--){
          cin>>operate;
          if(operate=="ADD"){
             cin>>id>>name>>color>>size>>danjia>>num;
             c.add(id,name,color,size,danjia,num);
          }
          else if(operate=="UP"){
              cin>>id;
              c.up(id);
          }
          else if(operate=="DOWN"){
               cin>>id;
               c.down(id);
          }
          else if(operate=="DELETE"){
                cin>>id;
                c.deleteNode(id);
           }
        }
        c.display();
    }
    return 0;
}


//
二、使用数组:
#include<iostream>
using namespace std;
#include<iomanip>

class good{
    string id,name,color,size;
    double danjia;
    int num;
    public:
       good(){}
        void set(string id1,string name1,string color1,string size1,double danjia1,int num1)
        {id=id1;name=name1;color=color1;size=size1;danjia=danjia1;num=num1;}
        void display()
        {cout<<name<<","<<color<<","<<size<<","<<fixed<<setprecision(2)<<danjia<<","<<num<<","<<fixed<<setprecision(2)<<getsum()<<endl;}
        string getid(){return id;}
        int getnum(){return num;}
        double getsum(){return danjia*num;}
        void numplus(){
            num++;
        }
        void numsub(){
            num--;
        }
        void numplus1(int _num){
            num+=_num;
        }
};

class car{
    good g[100];
    int i;//记录有效数据个数

    public:
        car():i(0){}
        void add(string _id,string _name,string _color,string _size,double _danjia,int _num)//商品若存在,改数量;否则加到数组最前面
        {  int j,k;
           for(j=0;j<i;j++){
              if(_id==g[j].getid()){
                  g[j].numplus1(_num);
                  return ;
                 }
           }
           if(j==i){
              for(k=i-1;k>=0;k--)
                  g[k+1]=g[k];
              g[0].set(_id,_name,_color,_size,_danjia,_num);
              i++;
           }
       }
       void ddelete(string _id){
           int j,k;
           for(j=0;j<i;j++){
                if(_id==g[j].getid()){
                    for(k=j;k<i-1;k++)
                       g[k]=g[k+1];
                    i--;
                    break;
                }
            }
        }
        void up(string _id){
            int j;
            for(j=0;j<i;j++){
               if(_id==g[j].getid()){
                   g[j].numplus();
                   break;
                }
            }
        }
        void down(string _id){
            int j;
            for(j=0;j<i;j++){
              if(_id==g[j].getid()){
                 if(g[j].getnum()>1){
                     g[j].numsub();
                     break;
                  }
               }
             }
          }

          void display(){
              double sum1=0;
              int num1=0;
              int j;
              cout<<"商品清单:"<<endl;
              cout<<"商品,颜色,尺码,单价,数量,小计"<<endl;
              for(j=0;j<i;j++){
                 sum1+=g[j].getsum();
                 num1+=g[j].getnum();
                 g[j].display();
              }
              cout<<"----------"<<endl;
              cout<<num1<<"件商品,总商品金额"<<fixed<<setprecision(2)<<sum1<<endl;
            }
};

int main() {
    int t;
    cin>>t;
    while(t--){
       int n;
       cin>>n;
       string operate,id,name,color,size;
       int num;
       double danjia;
       car c;
       while(n--){
          cin>>operate;
          if(operate=="ADD"){
             cin>>id>>name>>color>>size>>danjia>>num;
             c.add(id,name,color,size,danjia,num);
          }
          else if(operate=="UP"){
              cin>>id;
              c.up(id);
          }
          else if(operate=="DOWN"){
               cin>>id;
               c.down(id);
          }
          else if(operate=="DELETE"){
                cin>>id;
                c.ddelete(id);
           }
        }
        c.display();
    }
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值