problem przeładowaniem operatora :/

0

mam klase BigInt która w tablicy tupuy char przechowuje duze liczby, nastepnie chce przeladowac operator "+" aby móc dodawac obiekty owej klasy:
klasa:

class BigInt{
   char cyf[1000];  
   int dl;            
                    
                    
  public:
   BigInt(){dl=1;cyf[0]=0;}
   BigInt(char *);
   
    void operator+(BigInt &a);
    bool BigInt::operator==(BigInt &a);
    bool BigInt::operator!=(BigInt &a);
    bool BigInt::operator<(BigInt &a);
    void BigInt::add(BigInt b);
    
    
   int less(BigInt );
   void show();      

};

nastepnie moja funkcja:

void BigInt::operator+( BigInt &a) 
{
              
       while(dl<a.dl)cyf[dl++]=0;
       int r=a.dl;
       while(r<dl)cyf[r++]=0;
       r=0;
       
       for(int i=0;i<dl;i++){
          cyf[i]+=a.cyf[i]+r; 
          r=cyf[i]/10; 
          cyf[i]%=10;
       }
  if(r>0)cyf[dl++]=r;
  
}

nastepnie wywolanuie w main:

BigInt a("5438768958486759895895480987595874");
  BigInt b("53453454354354363566779");
  
  
  a+b;
  a.show();
  

i nie wiem czemu ale dostaje znaki typu serduszka, pieski, koleczka i tego typu dziwaczne rzeczy;/ funkcja "show" to petla for ktora wypiwuje cala liczbe;

bardzo prosilbym o pomoc.

0

bo wrzucasz do tablicy znaki od 0 do 9 w ascii a nie cyfry 0-9

0

no to prosze Cie abys napisal mi rozwiazanie tego;

0

no jakos nie rozumiem w czym ma mi to pomoc:/

dodam ze wczesniej robilem funkcje add(BigInt &a) ktora wywolywalem np. tak:
b.add(a) i to dziala! a przeladowanie nie dziala;/

0

to powinno dzialac:

void BigInt::operator+( BigInt &a)
{
             
       while(dl<a.dl)cyf[dl++]='0';
       int r=0;
       for(int i=0;i<dl;i++){
          cyf[i]+=a.cyf[i]+r-48;
		  if(cyf[i]>57)
		  {
			  cyf[i]-=10;
			  r = 1;
		  }
		  else r = 0;
       }
  if(r==1)cyf[dl++]='1';
}
0

kompiluje sie ale wyswietla mi jakies krzaczki znowu;
funkcja show wyglada tak:

void BigInt::show()
{
  for(int i=dl-1;i>=0;i--) cout << cyf[i];
  puts("");
} 
0

w tej mojej poprawce zapomnialem rozwazyc przypadek gdy druga liczba jest krotsza(jej tablica znakow)
troche to poprawilem i teraz powinno dzialac, ale kod jest dosyc nieczytelny i mozna by go usprawnic

void BigInt::operator+( BigInt &a)
{
             
       while(dl<a.dl)cyf[dl++]='0';
       int r=0;
       for(int i=0;i<a.dl;i++){
          cyf[i]+=a.cyf[i]+r-48;
		  if(cyf[i]>57)
		  {
			  cyf[i]-=10;
			  r = 1;
		  }
		  else r = 0;
       }
  if(r==1)
  {
	  if(dl==a.dl)
		  cyf[dl++] = '1';
	  else
	  cyf[a.dl]+=1;
  }
  r = 0;
  for(int j=a.dl;j<dl;j++)
  {
	  cyf[j] +=r;
	  if(cyf[j]>57)
	  {
		  cyf[j]-=10;
		  r = 1;
	  }
	  else r = 0;
  }
  if (r == 1)
  {
	  cyf[dl-1] = '0';
	  cyf[dl++] = '1';
  }
}

ogolnie algorytm powinien wygladac tak: jesli pierwsza jest krotsza od drugiej to uzupelniasz zerami zeby byly rowne nastepnie dodajesz wartosci pomniejszajac o 48, potem lecisz przez wszystkie pola tablicy i sprawdzasz czy jest tam liczba, jesli nie to odejmujesz 10 i dodajesz 1 do kolejnego miejsca tabeli(chyba ze jest to ostatnia pozycja w tabeli, wtedy zwiekszasz dl o 1 i wpisujesz 1 na nowym miejscu)

0

kompilowc to sie kompiluje :)
ale cholera jasna dalej wypisuje mi jakies jeb* krzaki :/ :/

może nie będzie to za piękne ale pozwole sobie wkleić cały program:

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

class BigInt{
   char cyf[1000];  // zakladamy, ze bedzie co najwyzej 1000 cyfr
   int dl;            // liczba bedzie pamietana w odwrotnej kolejnosci
                      // tzn. cyf[0] jest cyfra jednosci, cyf[1] jest cyfra dziesiatek, itd.
                    // liczba cyfr zapamietanej liczby
  public:
   BigInt(){dl=1;cyf[0]=0;}
   BigInt(char *);
   
   void operator+( BigInt &a);
    bool BigInt::operator==(BigInt &a);
    bool BigInt::operator!=(BigInt &a);
    bool BigInt::operator<(BigInt &a);
    bool BigInt::operator>(BigInt &a);
    void BigInt::add(BigInt b);
    
    // dodaje dwie liczby
   int less(BigInt ); // sprawdza, czy aktualna liczba jest mniejsza od podanej liczby
   void show();       // wyswietla zapamietana liczbe

};


bool BigInt::operator<(BigInt &a)
{
   if (dl<a.dl) return 1;
   else {
        for (int i=0; i<dl; i++)
            if(cyf[i]<a.cyf[i]) return 1;
       }
   return 0;
}


bool BigInt::operator>(BigInt &a)
{
   if (dl>a.dl) return 1;
   else {
        for (int i=0; i<dl; i++)
            if(cyf[i]>a.cyf[i]) return 1;
       }
   return 0;
}

bool BigInt::operator==(BigInt &a)
{
   if (a.dl!=dl) return 0;
   else {
        for (int i=0; i<dl; i++)
            if(a.cyf[i]!=cyf[i]) return 0;
       }
   return 1;
}


bool BigInt::operator!=(BigInt &a)
{
   if (a.dl!=dl) return 1; 
   else {
        for (int i=0; i<dl; i++)
            if(a.cyf[i]!=cyf[i]) return 1;
       }
   return 0;
}





void BigInt::operator+( BigInt &a)
{
             
       while(dl<a.dl)cyf[dl++]='0';
       int r=0;
       for(int i=0;i<a.dl;i++){
          cyf[i]+=a.cyf[i]+r-48;
                  if(cyf[i]>57)
                  {
                          cyf[i]-=10;
                          r = 1;
                  }
                  else r = 0;
       }
  if(r==1)
  {
          if(dl==a.dl)
                  cyf[dl++] = '1';
          else
          cyf[a.dl]+=1;
  }
  r = 0;
  for(int j=a.dl;j<dl;j++)
  {
          cyf[j] +=r;
          if(cyf[j]>57)
          {
                  cyf[j]-=10;
                  r = 1;
          }
          else r = 0;
  }
  if (r == 1)
  {
          cyf[dl-1] = '0';
          cyf[dl++] = '1';
  }
}

void BigInt::add(BigInt b)
{
  // najpierw, aby bylo prosciej, wyrownamy dlugosci obu liczb
  // ustawimy dl = max (dl, b.dl) i wyzerujemy odpowiednie komorki tablicy cyf w obu liczbach
  while(dl<b.dl)cyf[dl++]=0;
  int r=b.dl;
  while(r<dl)cyf[r++]=0;
  // teraz dodajemy cyfra po cyfrze uwzgledniajac reszte z poprzednio dodanych cyfr
  r=0;  // poczatkowo nie ma reszty
  for(int i=0;i<dl;i++){cyf[i]+=b.cyf[i]+r; r=cyf[i]/10; cyf[i]%=10;}
  if(r>0)cyf[dl++]=r;
}

BigInt::BigInt(char *liczba)
{
  dl=strlen(liczba);   // dlugosc napisu, liczba cyfr
  for(int i=0;i<dl;i++) cyf[i]=liczba[dl-1-i]-'0';
}

void BigInt::show()
{
  for(int i=dl-1;i>=0;i--) cout << cyf[i];
  puts("");
}

int BigInt::less(BigInt b)
{
  if(dl<b.dl) return 1;
  if(dl>b.dl) return 0;
  // w tym momencie wiadomo, ze dl == b.dl
  int i=dl-1; // bedziemy szukac pierwszej, najbardziej znaczacej cyfry, na ktorej liczby sie roznia
  while (i>=0 && cyf[i] == b.cyf[i]) i--;
  if (i>=0 && cyf[i]<b.cyf[i]) return 1;
  else return 0;
}





int main()
{
  BigInt a("10");
  BigInt b("2");

  
  a+b;
  a.show();

  
  system("pause");
}

0
BigInt::BigInt(char *liczba)
{
  dl=strlen(liczba);   // dlugosc napisu, liczba cyfr
  for(int i=0;i<dl;i++) 
	  cyf[i]=liczba[dl-1-i];
}

przepisujesz char do char, nie mozesz odejmowac wartosci '0'

0

works ! :)

0

dziala :)

0
bool BigInt::operator<(BigInt &a)
{
   
   if (dl<a.dl) return 1;
   else if (dl>a.dl) return 0;
   else {
        for (int i=0; i<dl; i++)
            if(cyf[i]<a.cyf[i]) return 1;
       }
   return 0;
}
0
bool BigInt::operator<(BigInt &a) // D-Z-I-A-L-A
{ 
    
   if (this->dl<a.dl) return 1;
  
   else if (this->dl==a.dl){
               for (int i=0; i<dl; i++)
               if(cyf[i]<a.cyf[i]) return 1;
       }
   return 0;
}

dałem tak

0

kod:

 void BigInt::operator++(){
      if (cyf[dl]==9){
                      cyf[dl-1]+=1;
                      cyf[dl]=0;
                      }
      else cyf[dl]+=1;      
      }

wywolanie:

a++;

i czemu to nie chce dzialac?
patrzac na przyklady to sie zgadza z tym co piszą :(

0

-Problem jest w tym, ze czesc twoich funkcji zaklada ze w tablicy sa przechowywane wartosci 0-9(int) a czesc ze znaki 0-9(char) czyli 48-57(int). Ta funkcja zaklada to pierwsze, a funkcja tworzaca tablice z ciagu znakow typu char zaklada przypadek drugi.
-po drugie, powinienes zwiekszac od cyf0
-po trzecie, zapominasz rozwazyc przypadek np. "99" gdzie zwiekszenie o 1 pociaga za soba zmienienie kilku znakow, a nie tylko 1 lub 2.

0

ehhh:(

0

co powiesz na to:

void BigInt::operator++(){
      if (cyf[this->dl]==9){
      while (cyf[this->dl]==9)
            {
              cyf[this->dl]=0;
              dl--; };
                      };
            cyf[dl-1]+=1;          
         
      } 

? :)

0

@Neo: wykorzystaj naturalny dla komputera zapis binarny zamiast dziesiętnego.

Ogólnie kod jest koszmarny, przyłóż się trochę.

Niech cyfry leżące bliżej początku tablicy będą cyframi mniej znaczącymi, a nie na odwrót, wtedy:

void BigInt::operator++(){
      for(int i = 0; i < dl; i++)
      {
           if(cyfry[i] != '9') {  cyfry[i]++; return; }
           cyfry[i] = '0';
      }
      if(i > 1000) 
         dl = 0;
      else
      {      
         cyfry[dl] = 1;
         dl++;
      }      
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1