C++实验5

 1-对象是怎样构造的(拷贝构造函数)

#include<iostream>
using namespace std;
class Afunction
{
    int num;
    public:
    Afunction(){cout<<"Constructed by default, value = 0"<<endl;}
    Afunction(int b){num=b;cout<<"Constructed using one argument constructor, value = "<<num<<endl;}
    Afunction(const Afunction &A){num=A.num;cout<<"Constructed using copy constructor, value = "<<num<<endl;}
};
int main(){
    int t;
    cin>>t;
    while(t--){
        int a,b;
        cin>>a;
        if(a==0) Afunction fun;
        else if(a==1){
            cin>>b;
            Afunction fun(b);
        }
        else if(a==2){
            cin>>b;
            Afunction fun(b);
            Afunction func(fun);
        }
    }
}

2-最胖的加菲

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

class cat
{
private:
    char *cat_name;
    int cat_weight;

public:
    void Set(char *name, int weight)
    {
        int len = strlen(name);
        cat_name = new char[len + 1];
        strcpy(cat_name, name);
        cat_weight = weight;
    }
    void print(cat p)
    {
        cout << p.cat_name << " ";
    }
    char *get_name()
    {
        return cat_name;
    }
    int get_weight()
    {
        return cat_weight;
    }
};
bool comp(cat c1, cat c2)
{
    return c1.get_weight() < c2.get_weight();
}
int main()
{
    int n, i, weight, j;
    char name[100];
    cat *p;
    cin >> n;
    p = new cat[n]; //创建猫猫类的动态数组
    for (i = 0; i < n; i++)
    {
        cin >> name >> weight;
        p[i].Set(name, weight); //依次存入数据
    }
    sort(p, p + n, comp);
    for (i = 0; i < n; i++)
        p->print(p[i]);
    delete p;
}

3-点圆运算

#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;

class Point {
	double x, y;
public:
	Point(double x, double y) :x(x), y(y) { }
	Point() :x(0), y(0) { }  //用于创建动态数组
	void setXY(double x1, double y1) {
		x = x1;
		y = y1;
	}
	double getX() {
		return x;
	}
	double getY() {
		return y;
	}
	~Point() {
		x = 0;
		y = 0;
		cout << "point clear" << endl;
	}

};

class Circle {
	double x, y, r;
public:
	Circle(double x, double y, double r) :x(x), y(y), r(r) { }
	Circle() :x(0), y(0), r(0) { }
	void Contain(Point& p) { //注意:如果参数不是引用,会多创建一个对象,那么释放的时候因为析构函数中有输出语句,结果就不正确。
		double d;
		d = sqrt(pow(p.getX() - x, 2) + pow(p.getY() - y, 2));
		if (d > r)
			cout << "out" << endl;
		else
			cout << "in" << endl;
	}

	~Circle() {
		x = 0;
		y = 0;
		r = 0;
		cout << "circle clear" << endl;
	}

};

int main()
{      //freopen("d:\\a.txt",  "r", stdin);
	int t, i;
	double x, y, r;

	cin >> x >> y;
	Point p(x, y);

	cin >> t;
	Point* po = new Point[t];

	for (i = 0; i < t; i++) {
		cin >> x >> y;
		po[i].setXY(x, y);
	}

	cin >> x >> y >> r;
	Circle c(x, y, r);

	c.Contain(p);

	for (i = 0; i < t; i++)
		c.Contain(po[i]);

	return 0;
}

4-手机取款

#include<iostream>
using namespace std;

class CAccount
{
	int CardNo;
	int MobileNo;
	int PassCode;
	int balance;
public:
	CAccount() {}
	void setData(int c, int m, int p, int a) {
		CardNo = c;
		MobileNo = m;
		PassCode = p;
		balance = a;
	}
	int getCardNo() { return CardNo; }
	int getMobileNo() { return MobileNo; }
	int getPassCode() { return PassCode; }
	void redraw(int amount) {
		if (amount > balance)
			cout << "卡号" << CardNo << "--" << "余额不足" << endl;
		else {
			balance -= amount;
			cout << "卡号" << CardNo << "--" << "余额" << balance << endl;
		}
	}
};

int main()
{
	int CardNo, MobileNo, PassCode;
	int balance, amount;
	int t, i, n, k;

	cin >> t;
	CAccount* account = new CAccount[t];

	for (i = 0; i < t; i++)
	{
		cin >> CardNo >> MobileNo >> PassCode >> balance;
		account[i].setData(CardNo, MobileNo, PassCode, balance);
	}

	cin >> n;
	while (n--)
	{
		k = -1;  //标识未找到的那种情况
		cin >> MobileNo >> PassCode >> amount;
		for (i = 0; i < t; i++) {
			if (account[i].getMobileNo() == MobileNo) {	//判断号码是否存在
				k = i;
				break;
			}
		}
		if (k != -1) {   //若号码存在,继续判断密码是否正确
			if (account[k].getPassCode() == PassCode)
				account[k].redraw(amount);
			else
				cout << "密码错误" << endl;
		}
		else
			cout << "手机号不存在" << endl;
	}

	delete[] account;
	return 0;
}

5-分数类

第一种写法:直接处理输入:比如3 / 4,可以看成是输入整数3,字符 / ,整数4.
#include<iostream>
#include<cmath>
using namespace std;

class CFraction
{
private:
    int fz, fm;
public:
    CFraction(int fz_val, int fm_val);
    CFraction();
    void set(int fz_val, int fm_val);
    CFraction add(const CFraction& r);
    CFraction sub(const CFraction& r);
    CFraction mul(const CFraction& r);
    CFraction div(const CFraction& r);
    int getGCD();   // 求对象的分子和分母的最大公约数
    void print();
};

CFraction::CFraction(int fz_val, int fm_val) {
    fz = fz_val;
    fm = fm_val;
}

CFraction::CFraction() {
    fz = 0;
    fm = 0;
}

void CFraction::set(int fz_val, int fm_val) {
    fz = fz_val;
    fm = fm_val;
}

CFraction CFraction::add(const CFraction& r) {
    int tfm, tfz;
    tfm = fm * r.fm;
    tfz = fz * r.fm + r.fz * fm;

    CFraction c(tfz, tfm);
    int t = c.getGCD();
    c.set(tfz / t, tfm / t);

    return c;
}
CFraction CFraction::sub(const CFraction& r) {
    int tfm, tfz;
    tfm = fm * r.fm;
    tfz = fz * r.fm - r.fz * fm;

    CFraction c(tfz, tfm);
    int t = c.getGCD();
    c.set(tfz / t, tfm / t);

    return c;
}
CFraction CFraction::mul(const CFraction& r) {
    int tfm, tfz;
    tfm = fm * r.fm;
    tfz = fz * r.fz;

    CFraction c(tfz, tfm);
    int t = c.getGCD();
    c.set(tfz / t, tfm / t);

    return c;
}
CFraction CFraction::div(const CFraction& r) {
    int tfm, tfz;
    tfm = fm * r.fz;
    tfz = fz * r.fm;

    CFraction c(tfz, tfm);
    int t = c.getGCD();
    c.set(tfz / t, tfm / t);

    return c;
}
int CFraction::getGCD() {// 求对象的分子和分母的最大公约数
    int a = abs(fz), b = abs(fm), temp, r;
    if (a < b) {
        temp = a;
        a = b;
        b = temp;
    }

    r = a % b;
    while (r) {
        a = b;
        b = r;
        r = a % b;
    }

    return b;
}

void CFraction::print() {
    if (fz * fm < 0)
        cout << "-";
    cout << abs(fz) << "/" << abs(fm) << endl;
}

int main()
{
    int t, i, j, len;
    int fz, fm;
    char ch;
    cin >> t;
    for (i = 0; i < t; i++) {
        CFraction c[2];
        for (j = 0; j < 2; j++) {
            cin >> fz >> ch >> fm;
            c[j].set(fz, fm);
        }

        c[0].add(c[1]).print();
        c[0].sub(c[1]).print();
        c[0].mul(c[1]).print();
        c[0].div(c[1]).print();

        cout << endl;
    }
    return 0;
}

6-找出某个范围内的所有素数

#include<iostream>
using namespace std;
unsigned long n;
class CSieve
{
	char* p_sieve;
	unsigned long num;
public:
	CSieve(unsigned long n);
	void printPrime();
	~CSieve();
};
CSieve::CSieve(unsigned long n) {
	p_sieve = new char[n + 1];
	for (int i = 0; i < n+1; i++)
	{
		p_sieve[i] = 0;
	}
	for (int i = 2;i <= n;i++) {
		if (p_sieve[i]) continue;
		for (int j = i;j <= n / i;j++) {
			p_sieve[i * j] = 1;
		}
	}
}
void CSieve::printPrime() {
	int a[10000], end = 0;
	for (int i = 2;i <= n;i++) {
		if (!p_sieve[i]) {
			a[++end] = i;
		}
	}
	for (int i = 1;i < end;i++) {
		cout << a[i] << " ";
	}
	cout << a[end] << endl;
}
CSieve::~CSieve() {
	delete[]p_sieve;
}
int main() {
	int t;
	cin >> t;
	while (t--) {
		cin >> n;
		CSieve CS(n);
		CS.printPrime();
	}
}
//老师的代码
#include<iostream>
using namespace std;

class A
{       int a;
    public:
        A()
        {cout<<"Constructed by default, value = 0"<<endl;}
        A(int a1): a(a1)
        {cout<<"Constructed using one argument constructor, value = "<<a<<endl;}
        A(const A &a1): a(a1.a)
        {cout<<"Constructed using copy constructor, value = "<<a<<endl;}
};

int main()
{
    int t, a,value;
    cin>>t;
    while(t--)
    {
        cin>>a;
        switch(a)
        {
          case 0:{A a1;break;}
          case 1:{cin>>value;
                      A a2(value);
                      break;}
          case 2:{cin>>value;
                      A a3(value);
                      A a4(a3);
                      break;}
        }
    }
    return 0;
}
==========================================
//第一种,比较函数形参是对象:bool comp(Cat c1, Cat c2)
#include<iostream>
#include<algorithm>
using namespace std;

class Cat
{
    string name;
    double weight;
    public:
        Cat(){ }  //可以缺省,使用编译系统自带的缺省构造函数
        void set(string n,double w){
           name=n;
           weight=w;
        }
        string getName(){return name;}
        double getWeight(){return weight;}

};
bool comp(Cat c1, Cat c2)
{
    return c1.getWeight()<c2.getWeight();
}

int main()
{
    int t,i;
    string name;
    double weight;

    cin>>t;
    Cat *c=new Cat[t];

    for(i=0;i<t;i++){
        cin>>name>>weight;
        c[i].set(name,weight);
    }

    sort(c,c+t,comp);

    for(i=0;i<t-1;i++)
        cout<<c[i].getName()<<" ";
    cout<<c[i].getName()<<endl;

    delete[] c;

}

第二种,比较函数形参是常量对象的引用,bool comp(const Cat& c1, const Cat& c2)
#include<iostream>
#include<algorithm>
using namespace std;

class Cat
{
    string name;
    double weight;
    public:
        Cat(){ }
        void set(string n,double w){
           name=n;
           weight=w;
        }
        string getName(){return name;}
        double getWeight()const{return weight;}   //注意:getWeight()后加了const,表示这个函数是常方法,不能修改数据成员的值。因为比较函数形参定义成常量对象的引用,只能调用常方法

};
bool comp(const Cat& c1, const Cat& c2)
{
    return c1.getWeight()<c2.getWeight();
}

int main()
{
    int t,i;
    string name;
    double weight;

    cin>>t;
    Cat *c=new Cat[t];

    for(i=0;i<t;i++){
        cin>>name>>weight;
        c[i].set(name,weight);
    }

    sort(c,c+t,comp);

    for(i=0;i<t-1;i++)
        cout<<c[i].getName()<<" ";
    cout<<c[i].getName()<<endl;

    delete[] c;

}
===========================
#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;

class Point{
	double x,y;
public:
	Point(double x,double y):x(x),y(y){ }
	Point():x(0),y(0){ }  //用于创建动态数组
	void setXY(double x1,double y1){
	    x=x1;
	    y=y1;
	}
	double getX(){
                    return x;
	}
               double getY(){
                   return y;
	}
	~Point(){
	    x=0;
	    y=0;
	    cout<<"point clear"<<endl;
	}

};

class Circle{
	double x,y,r;
public:
	Circle(double x,double y,double r):x(x),y(y),r(r){ }
	Circle():x(0),y(0),r(0){ }
	void Contain(Point& p){ //注意:如果参数不是引用,会多创建一个对象,那么释放的时候因为析构函数中有输出语句,结果就不正确。
	    double d;
	    d=sqrt(pow(p.getX()-x,2)+pow(p.getY()-y,2));
	    if(d>r)
                       cout<<"out"<<endl;
                   else
                      cout<<"in"<<endl;
	}

	~Circle(){
	    x=0;
	    y=0;
	    r=0;
	    cout<<"circle clear"<<endl;
	}

};

int main()
{      //freopen("d:\\a.txt",  "r", stdin);
     int t,i;
     double x,y,r;

     cin>>x>>y;
     Point p(x,y);

     cin>>t;
     Point* po=new Point[t];

    for(i=0;i<t;i++){
         cin>>x>>y;
         po[i].setXY(x,y);
    }

    cin>>x>>y>>r;
    Circle c(x,y,r);

    c.Contain(p);

    for(i=0;i<t;i++)
        c.Contain(po[i]);

   return 0;
}
=============================================
#include<iostream>
using namespace std;

class CAccount
{
	int CardNo;
	int MobileNo;
	int PassCode;
	int balance;
public:
	CAccount(){}
	void setData(int c,int m,int p,int a){
	      CardNo=c;
	      MobileNo=m;
	      PassCode=p;
	      balance=a;
	}
	int getCardNo(){return CardNo;}
	int getMobileNo(){return MobileNo;}
	int getPassCode(){return PassCode;}
	void redraw(int amount){
	      if(amount>balance)
                             cout<<"卡号"<<CardNo<<"--"<<"余额不足"<<endl;
	     else{
	             balance-=amount;
                             cout<<"卡号"<<CardNo<<"--"<<"余额"<<balance<<endl;
                      }
               }
};

int main()
{
	int CardNo,MobileNo,PassCode;
	int balance,amount;
	int t,i,n,k;

	cin>>t;
	CAccount *account=new CAccount[t];

	for(i=0;i<t;i++)
	{
	        cin>>CardNo>>MobileNo>>PassCode>>balance;
	        account[i].setData(CardNo,MobileNo,PassCode,balance);
	}

	cin>>n;
	while(n--)
	{
		k=-1;  //标识未找到的那种情况
		cin>>MobileNo>>PassCode>>amount;
		for(i=0;i<t;i++){
		     if(account[i].getMobileNo()==MobileNo){	//判断号码是否存在
                                               k=i;
                                               break;
                                    }
                                 }
	                if(k!=-1){   //若号码存在,继续判断密码是否正确
		             if(account[k].getPassCode()==PassCode)
			     account[k].redraw(amount);
		             else
			    cout<<"密码错误"<<endl;
		}
		else
		             cout<<"手机号不存在"<<endl;
	}

	delete[] account;
	return 0;
}


==========================================
第一种写法:直接处理输入:比如3/4,可以看成是输入整数3,字符/,整数4.
#include<iostream>
#include<cmath>
using namespace std;

class CFraction
 {
 private:
      int fz, fm;
 public:
      CFraction(int fz_val, int fm_val) ;
      CFraction();
      void set(int fz_val, int fm_val) ;
      CFraction add(const CFraction &r);
      CFraction sub(const CFraction &r);
      CFraction mul(const CFraction &r);
      CFraction div(const CFraction &r);
      int getGCD();   // 求对象的分子和分母的最大公约数
      void print();
 };

 CFraction::CFraction(int fz_val, int fm_val){
   fz=fz_val;
   fm=fm_val;
 }

  CFraction::CFraction(){
   fz=0;
   fm=0;
 }

  void CFraction::set(int fz_val, int fm_val){
   fz=fz_val;
   fm=fm_val;
 }

 CFraction CFraction::add(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fm;
     tfz=fz*r.fm+r.fz*fm;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 }
 CFraction CFraction::sub(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fm;
     tfz=fz*r.fm-r.fz*fm;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 }
 CFraction CFraction::mul(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fm;
     tfz=fz*r.fz;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 }
 CFraction CFraction::div(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fz;
     tfz=fz*r.fm;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 }
 int CFraction::getGCD(){// 求对象的分子和分母的最大公约数
   int a=abs(fz),b=abs(fm),temp,r;
   if(a<b){
      temp=a;
      a=b;
      b=temp;
   }

   r= a%b;
   while(r){
    a=b;
    b=r;
    r=a%b;
   }

   return b;
 }

 void CFraction::print(){
       if(fz*fm<0)
           cout<<"-";
      cout<<abs(fz)<<"/"<<abs(fm)<<endl;
 }

int main()
{
       int t,i,j,len;
       int fz,fm;
       char ch;
       cin>>t;
       for(i=0;i<t;i++){
           CFraction c[2];
           for(j=0;j<2;j++){
               cin>>fz>>ch>>fm;
               c[j].set(fz,fm);
         }

         c[0].add(c[1]).print();
         c[0].sub(c[1]).print();
         c[0].mul(c[1]).print();
         c[0].div(c[1]).print();

         cout<<endl;
    }
    return 0;
}


///
//使用string来处理输入
#include <bits/stdc++.h>
using namespace std;

class CFraction
 {
 private:
      int fz, fm;
 public:
      CFraction(int fz_val, int fm_val) ;
      CFraction();
      void set(int fz_val, int fm_val) ;
      CFraction add(const CFraction &r);
      CFraction sub(const CFraction &r);
      CFraction mul(const CFraction &r);
      CFraction div(const CFraction &r);
      int getGCD();   // 求对象的分子和分母的最大公约数
      void print();
 };

 CFraction::CFraction(int fz_val, int fm_val){
   fz=fz_val;
   fm=fm_val;
 }

  CFraction::CFraction(){
   fz=0;
   fm=0;
 }

 void CFraction::set(int fz_val, int fm_val){
   fz=fz_val;
   fm=fm_val;
 }

 CFraction CFraction::add(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fm;
     tfz=fz*r.fm+r.fz*fm;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 };
 CFraction CFraction::sub(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fm;
     tfz=fz*r.fm-r.fz*fm;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 };
 CFraction CFraction::mul(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fm;
     tfz=fz*r.fz;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 };
 CFraction CFraction::div(const CFraction &r){
     int tfm,tfz;
     tfm=fm*r.fz;
     tfz=fz*r.fm;

     CFraction c(tfz,tfm);
     int t=c.getGCD();
     c.set(tfz/t,tfm/t);

     return c;
 };
 int CFraction::getGCD(){// 求对象的分子和分母的最大公约数
   int a=abs(fz),b=abs(fm),temp,r;
   if(a<b){
      temp=a;
      a=b;
      b=temp;
   }

   r= a%b;
   while(r){
    a=b;
    b=r;
    r=a%b;
   }

   return b;
 };

 void CFraction::print(){
       if(fz*fm<0)
           cout<<"-";
      cout<<abs(fz)<<"/"<<abs(fm)<<endl;
 };

void finddata(string s,int& fz,int& fm){
  int t=s.find("/");

  stringstream s1(s.substr(0,t));
  s1 >> fz;

  stringstream s2(s.substr(t+1));
  s2 >> fm;
}

int main()
{
	int t,i,j,len;
	int fz,fm;
	string s;
	cin>>t;
	for(i=0;i<t;i++){
         CFraction **c=new CFraction*[2];
         for(j=0;j<2;j++){
            cin>>s;
            finddata(s,fz,fm);
            c[j]=new CFraction(fz,fm);
         }

         c[0]->add(*c[1]).print();
         c[0]->sub(*c[1]).print();
         c[0]->mul(*c[1]).print();
         c[0]->div(*c[1]).print();

         cout<<endl;

         for(j=0;j<2;j++)
            delete c[j];
         delete[] c;
    }
    return 0;
}

===============================================
#include<iostream>
#include<cmath>
using namespace std;
class CSieve {
    private:
        char *p_sieve;
        unsigned long num;
    public:
        CSieve(unsigned long n){
           p_sieve=new char[n+1]; //0号单元浪费不用,数从1开始
           for(int i=1;i<=n;i++)
               p_sieve[i]='1';
           num=n;
        }
        void printPrime(){
          int last;
          Prime();
          last=getLast();  //最后一个元素的下标
          for(int i=2;i<last;i++)
          {
              if(p_sieve[i]=='1')
                 cout<<i<<" ";
          }
          cout<<last<<endl;  //最后一个单独输出
        }
        void Prime(){
           int i,j,k;
             k=sqrt(num);
             for(j=2;j<=k;j++){
                if(p_sieve[j]=='1'){  //找到一个素数j
                   for(i=j*2;i<=num;i=i+j)
                        p_sieve[i]='0';  //将j的倍数处理成非素数
                }
             }
        }
        int getLast(){ //找到最后一个素数,因为它要单独处理,从后往前找
           for(int i=num;i>=2;i--)
           { if(p_sieve[i]=='1')
                  return i;
           }
        }
        ~CSieve(){
            delete[] p_sieve;
        }
};

int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        CSieve myCs(n);
        myCs.printPrime();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值