مقایسه رشته ها (compare string) - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مقایسه رشته ها (compare string)

0 امتیاز

سلام دوستان
الان چرا تابع compare من کار نمیکنه ...
...

      BigNumber& BigNumber::operator/=(const BigNumber& other)
    {
        static BigNumber r = 0;
        string &Num1 = this->data_;
        string Num2 = other.data_;
        while(compare1(Num1,Num2)>0)
        {
            r++;
            Num1 = subtract(Num1,Num2);
        }   

        return r;
    }

    string BigNumber::subtract( 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;
            }

            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);
        return Num3;

    }

int BigNumber::compare1(string Num1 , string Num2)
{

    int MaxLen;
    if(Num1[0]=='0') 
    Num1.erase(0,1);
    if(Num2[0]=='0') 
    Num2.erase(0,1);
    if(Num1.size() < Num2.size())
    {
        return -1;
    }
    if(Num1.size() > Num2.size())
    {
        return 1;
    }
    if(Num1.size() == Num2.size())
    {
        MaxLen=Num2.size();
        int i= 0;

        while(MaxLen!=0)
        {
            if(Num1.at(i)-48 <Num2.at(i)-48)
                return  -1;
            if(Num1.at(i)-48 >Num2.at(i)-48)
                return 1;
            else
            {
                i++;
                MaxLen--;
            }
        }
        return 0;
    }
}

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

سوال شده فروردین 15, 1393  بوسیله ی Azar (امتیاز 628)   29 42 61
ویرایش شده فروردین 16, 1393 بوسیله ی Azar

2 پاسخ

0 امتیاز

چرا داخل تابع میره ولی تو while مشکل داره. ۲ تا رشته با هم مساوین و هیچ وقت دو تا if در while اجرا نمیشن و همیشه else اجرا میشه و چون در else داره i++ میشه پس نهایت i تا 6 میره و بعدش از اندازه رشته میزنه بیرون و overflow میشه و برنامه بسته میشه

پاسخ داده شده فروردین 16, 1393 بوسیله ی moh3en (امتیاز 209)   15 28 40
اهان فهمیدم ..
بعد i++
Maxlen-- میخواد
ویرایش کردم
+1 امتیاز

اول این که تعریف compare رو به این شکل بزار

int BigNumber::compare1(const string& Num1 ,const string& Num2)

بعد میشد این if آخر توی while رو به این شکل هم نوشت :

if(Num1.size() == Num2.size())
 {
     int i= 0;
     while(i<Num2.size())
     {
         if(Num1.at(i)<Num2.at(i))
             return  -1;
         else if(Num1.at(i) >Num2.at(i))
             return 1;
         i++;
     }
     return 0;
 }

نکته بعد این که این تابع از نظر منطقی درست کار نمی کنه زمان /= نباید یک شی جدیدم اونم static بسازین باید همون کلاس رو عوض کنین مقدارشو

  BigNumber& BigNumber::operator/=(const BigNumber& other)
    {
        static BigNumber r = 0;
        string &Num1 = this->data_;
        string Num2 = other.data_;
        while(compare1(Num1,Num2)>0)
        {
            r++;
            Num1 = subtract(Num1,Num2);
        }   

        return r;
    }

مثلا بهتر بود این شکلی می نوشتین

BigNumber& BigNumber::operator/=(const BigNumber& other)
 {
     string Num1 = this->data_;
     const string& Num2 = other.data_;
     this->data="0";
     while(compare1(Num1,Num2)>0)
     {
         this->operator+=("1");
         Num1 = subtract(Num1,Num2);
     }   

     return *this;
 }
پاسخ داده شده فروردین 16, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
من وقتی const میکنم erase هارو اشکال میگیره ..
خب insert ها رو هم حذف کن قبل از عدد 0 کجا بود ؟
یا قبل از فرستادن به این تابع insert رو بزار
البته مهم هم نیست که & باشن (فقط باعث میشه  زمان اجرای تقسیم برنامت چند برابر بشه به خاطر کپی شدن بی مورد)
erase ، نه insert
ممنون.
...