مشکل در پیاده سازی کلاس - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مشکل در پیاده سازی کلاس

–2 امتیاز

سلام

من کلا در پیاده سازی این کلاس مشکل دارم

نمیدونم مشکل از چیه ..

#include "BigNumber.h"

BigNumber::BigNumber(const string& other):
	data_(other)
{
}

BigNumber::BigNumber(string other)
{
	data_ = other ;
}
BigNumber::BigNumber( BigNumber const &other )
{
	this->data_ = other.data_;
}

BigNumber::~BigNumber()
{
}

const string BigNumber::GetNum()
{
	return data_;
}

void BigNumber::Tipper(string &Num)
{
	int i;
	char ch;

	for( i=0; i< ( int(Num.size()/2)); i++)
	{
		ch = Num.at(i);
		Num.at(i) = Num.at( ( Num.size()- 1)-i);
		Num.at( ( Num.size()- 1)-i) = ch;
	}
}

BigNumber& BigNumber::operator+=( const BigNumber& other )
{
	int i;
	int MaxLen;
	int sum=0;
	int r=0;
	char ch;
	string Num3;
	string Num1 = this->data_;
	string Num2 = other.data_;
	Tipper(Num1);
	Tipper(Num2);

	if(Num1.size() < Num1.size())
	{
		MaxLen=Num2.size();
	}
	else
	{
		MaxLen=Num1.size();
	}

	for( i=0; i<MaxLen; i++)
	{
		sum=0;
		if( i< int(Num1.size()))
		{
			sum += Num1.at(i)-48;
		}
		if( i< int(Num2.size()))
		{
			sum += Num2.at(i)-48;
		}

		ch = ( (sum+r) % 10) + 48;
		Num3.push_back(ch);

		r = (sum+r) / 10;
	}

	if(r != 0)
	{
		ch = r + 48;
		Num3.push_back(ch);
	}

	Num1=Num3;
	Tipper(Num1);
	return *this;
}

BigNumber& BigNumber::operator*=( const BigNumber& other )
{
	int i;
	int j;
	int t;
	int r = 0;
	int mult=0;
	char ch;
	string Num3;
	string Sum = "0";

	string Num1 = this->data_;
	string Num2 = other.data_;

	Tipper(Num1);
	Tipper(Num2);

	if( Num1.size() > Num1.size())
	{
		Num1.swap(Num2);    
	}

	for ( i = 0; i < int(Num1.size()); i++)
	{
		r=0;

		for ( t = 0; t < i; t++)
		{
			Num3.push_back( '0');
		}

		for ( j = 0; j < int(Num2.size()); j++)
		{
			mult = ( Num1.at(i)-48) * ( Num2.at(j)-48);
			ch = ( ( mult + r) % 10) + 48;
			Num3.push_back( ch);
			r = ( mult + r) / 10;
		}

		if( r != 0)
		{
			ch = r + 48;
			Num3.push_back( ch);
		}

		Tipper(Num3);

		Sum = sum(Sum,Num3);

		Num3.clear();
	}
	Num1 = Sum;
	return *this;
}

BigNumber& BigNumber::operator-=( const BigNumber& other)
{
	
	int i;
	int MaxLen;
	int sum=0;
	int r=0;
	char ch;
	string Num3;

	string Num1 = this->data_;
	string Num2 = other.data_;

	Tipper(Num1);
	Tipper(Num2);

	if(Num1.size() < Num2.size())
	{
		MaxLen=Num2.size();
	}
	else
	{
		MaxLen=Num1.size();
	}
    if(Num1.compare(Num2)>=0)
    {
		for( i=0; i<MaxLen; i++)
	{
		sum=0;
		if( i< int(Num1.size()))
		{
			sum += Num1.at(i)-48;
		}
		if( i< int(Num2.size()))
		{
			sum -= Num2.at(i)-48;
		}

		if((sum+r)<0)
		{
			ch = ((sum+r)+10)+48;
			Num3.push_back(ch);
			r=-1;
		}
		else
		{
			ch = (sum+r)+48;
			Num3.push_back(ch);
			r=0;
		}
	}
		 Num1 = Num3;
		Tipper(Num1);
		return *this;
    }
    else
    {
        for( i=0; i<MaxLen; i++)
	{
		sum=0;
		if( i< int(Num2.size()))
		{
			sum += Num2.at(i)-48;
		}
		if( i< int(Num1.size()))
		{
			sum -= Num1.at(i)-48;
		}

		if((sum+r)<0)
		{
			ch = ((sum+r)+10)+48;
			Num3.push_back(ch);
			r=-1;
		}
		else
		{
			ch = (sum+r)+48;
			Num3.push_back(ch);
			r=0;
		}
	}	
        Tipper(Num3);
        Num3.insert(0,"-");
		Num1 = Num3;
        return *this;

    }
}

BigNumber BigNumber:: operator ++()
{
	return data_+ One();
}

BigNumber operator+(BigNumber Num1 , const BigNumber& NUm2)
{
	return Num1+=NUm2;
}

BigNumber operator*(BigNumber Num1 , const BigNumber& NUm2)
{
	return Num1*=NUm2;
}

BigNumber operator-(BigNumber Num1 , const BigNumber& NUm2)
{
	return Num1-=NUm2;
}

ostream& operator<<(ostream& os, const BigNumber& number)
{
	os<<number.data_;
	return os;
}

BigNumber& BigNumber::operator=(const BigNumber& other)
{
	if(this== &other)
		return *this;
	data_ = other.data_;
	return *this;
}

string BigNumber::sum( string Num1 , string Num2)
{
	
	int i;
	int MaxLen;
	int sum=0;
	int r=0;
	char ch;
	string Num3;

	Tipper(Num1);
	Tipper(Num2);

	if(Num1.size() < Num2.size())
	{
		MaxLen=Num2.size();
	}
	else
	{
		MaxLen=Num1.size();
	}

	for( i=0; i<MaxLen; i++)
	{
		sum=0;
		if( i< int(Num1.size()))
		{
			sum += Num1.at(i)-48;
		}
		if( i< int(Num2.size()))
		{
			sum += Num2.at(i)-48;
		}

		ch = ( (sum+r) % 10) + 48;
		Num3.push_back(ch);

		r = (sum+r) / 10;
	}

	if(r != 0)
	{
		ch = r + 48;
		Num3.push_back(ch);
	}

	Tipper(Num3);
	return Num3;
}

const BigNumber& BigNumber::One()
{
    static const BigNumber one(1);
    return one;
}

///////////////////////////////////////////////

#pragma once
#include<string>

using namespace std;
class BigNumber
{
private:
	string data_;
public:
	BigNumber(const string& other );
	BigNumber(string other);
	BigNumber(const int other);
	BigNumber( BigNumber const &other );
	~BigNumber();
	const string GetNum();
	BigNumber& operator+=( const BigNumber& other );
	BigNumber operator++();
	BigNumber& operator-=( const BigNumber& other );
	BigNumber& operator*=( const BigNumber& other );
	BigNumber& operator/=( const BigNumber& other );
	BigNumber& operator=( const BigNumber& other);

	int operator[](const int i);
	string& operator()(const int i,const int j);
	void Tipper (string  & Num);
	string sum( string Num1 , string Num2);
	const BigNumber& One();

	friend ostream& operator<<(ostream& os,const BigNumber& number);
	friend BigNumber operator+(BigNumber Num1 , const BigNumber& Num2);
	friend BigNumber operator*(BigNumber Num1 , const BigNumber& Num2);
	friend BigNumber operator-(BigNumber Num1 , const BigNumber& Num2);
};

 

سوال شده فروردین 14, 1393  بوسیله ی Azar (امتیاز 628)   29 43 61
دوباره تگ گذاری شد مهر 9, 1393 بوسیله ی BlueBlade
وقتی ۲ تا نمونه از کلاس ساختم ۲۰۰ تا error داد :))
:)))) .
:(( خدایا
همین کدی که بالا نوشتی رو باید اینطوری تغییرش بدی .
یه سازنده خالی بهش اضافه کن.
سازنده ( string& other) رو به (const string& other ) تغییر بده .
سازنده ( const int other ) رو هم پیاده سازی کن .
حداقل اینطوری کامپایل میشه . اینکه باگ داشته باشه رو خودت باید درستش کنی.
چراااااااا هیچکی جواب منو نمیده :(
وقتی سوال خوب نمیکنی چیجوری میخوای جواب بدست بیاری ؟!

1 پاسخ

+3 امتیاز

 

BigNumber BigNumber:: operator ++()
{
    return (this->data_+this->data_);
}

اپراتور ++ که نباید به این شکل کار کنه این جوری باید باشه

BigNumber BigNumber:: operator ++()
{
    return (this->data_+1);
}

و اکثر operator هایی که نوشتی const لازم دارن .

مثلا

friend BigNumber operator+(BigNumber Num1 ,const BigNumber& Num2);
    friend BigNumber operator*(BigNumber Num1 ,const  BigNumber& Num2);

ضمنا برای نوشتن این برنامه ساده ترین و بدون باگ ترین  راه اینه که  + رو بنویسی کامل تست کنی  بعد تمام operator ها رو برحسب اون بنویسی مثلا تفریق میشه

a+ (-b)

تقسیم میشه این :

http://www.7khatcode.com/2711/%D8%A7%D8%B4%DA%A9%D8%A7%D9%84-%D8%AF%D8%B1-%D8%A7%D9%BE%D8%B1%D8%A7%D8%AA%D9%88%D8%B1

ادیت


 

داخل operator+= اون Num1 رو به این شکل تعریف کن

    string& Num1 = this->data_;

++ رو هم به این شکل بنویس نیاز به One نداری

BigNumber& BigNumber:: operator ++()
{
    this->operator +=(BigNumber("1"));
    return  *this;
}

این 3 خطی هم که comment کردم کد هاشو از تو فایل cpp و .h پاک کن

class BigNumber
{
private:
    string data_;
public:
    BigNumber(const string& other );
 //   BigNumber(string other);
    BigNumber(const int other);
    BigNumber( BigNumber const &other );
  //  ~BigNumber();
    const string GetNum();
    BigNumber& operator+=( const BigNumber& other );
    BigNumber operator++();
    BigNumber& operator-=( const BigNumber& other );
    BigNumber& operator*=( const BigNumber& other );
    BigNumber& operator/=( const BigNumber& other );
    BigNumber& operator=( const BigNumber& other);
 
    int operator[](const int i);
    string& operator()(const int i,const int j);
    void Tipper (string  & Num);
    string sum( string Num1 , string Num2);
 //   const BigNumber& One();
 
    friend ostream& operator<<(ostream& os,const BigNumber& number);
    friend BigNumber operator+(BigNumber Num1 , const BigNumber& Num2);
    friend BigNumber operator*(BigNumber Num1 , const BigNumber& Num2);
    friend BigNumber operator-(BigNumber Num1 , const BigNumber& Num2);
};

 

پاسخ داده شده فروردین 14, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده فروردین 15, 1393 بوسیله ی BlueBlade
من الان کدمو دوباره ویرایش کردم
الان توی constructor مشکل داره
تو ++ هم درست نشد
من خود اپرتورهامو با دیباگ چک کردم مشکل وقتیه که از توی اپراتور میاد بیرون نمیدونم چرا مقدارشو از دست میده
ویرایش کردم
...