Frage zur Definition eines eigenen Datentypes

Dizzy_Ti

Vice Admiral Special
Mitglied seit
11.11.2001
Beiträge
667
Renomée
0
Standort
Düsseldorf
Hi,
ich programmiere gerade eine Klasse für große Zahlen (3000 Zeichen).
Dafür verwende ich einen Char Array und in jedes Feld kommt eine Ziffer.
Im Konstruktur wird die Zahl übergeben mit der Datentyp vorbelegt werden soll.
So wird zum Beispiel die 100 richtig abgespeichert und die restlichen nachfolgenen Stellen werden mit 0 belegt.
Mein Problem zur Zeit ist, dass ich Probleme mit der Ausgabe habe.Meine erste Idee ist es nach der ersten Zahl zu suchen die nicht 0 ist und alle 0 die davor sind wegzustreichen.
Dies klappt auch gut.Das Problem ist, dass ich wenn ich zwei Zahlen meines Datentypes (z.B 1+2) addieren will nicht 3 ausgegeben wird sondern 3 + die restlichen folgenden Nullen.Wie kann ich die unwichtigen 0 streichen lassen, ohne das dannach zuwenig Nullen angezeigt werden?
 
hmmm, das ist ne gute frage.

aber wäre es nicht sinnvoller nen array anzulegen bei dem in jeden feld sagen wir 8bit oder 16bit zahlen vorhanden sein müssen.
zahl 257
a1 a0
[1] [256]
 
ja sinnvoller wäre das schon, aber dadurch wird es auch schwieriger die Rechenarten richtig umzusetzen.
 
Die Nullen werden ausgegeben, weil du keinerlei Information darüber hast ob eine Null jetzt zum Ergebnis gehört oder Overhead ist. Warum verwendest du nicht einfach ein NaN anstelle einer Null? Oder ein X oder irgendwas anderes, was bei einer normalen, arithmetischen Operation niemals vorkommen wird? Dann hast du das Null-Problem bei der Ausgabe nicht mehr und kannst alle NaN oder X oder wasauchimmer abschippeln und die Nullen lassen.
 
Wir haben letztes Semester in Java mal so eine Klasse für beliebig große natürlichte Zahlen gebaut.
Da haben wir (auch eine selbstgebaute Klasse) doppelt verkettete Listen verwendet.
Damit ist eine Ausgabe der ganzen zahl oder die Addition von 2 Zahlen recht einfach und die Länge der Zahlen können zur Laufzeit beliebig varieren.
 
Code:
uint3000 test(120);
uint3000 test2(20);
test2=test-test2-test2;

ShowMessage("Test:"+test.ausgabe(false));
ShowMessage("Test2:"+test.ausgabe(false));
//test=test-test2;
ShowMessage("Lösung:"+test.ausgabe(true))
EDIT:
Arggg Problem doch nicht ganz gelöst.
80-20-20=40 rechnet er richtig aus, aber 100-20-20 kriegt das 88 raus.
Hier der Code von der Subtraktion
Code:
      uint3000 uint3000::operator- (uint3000 &rhs)
       uint3000 re();
 
      AnsiString eins=rhs.ausgabe(true);
      AnsiString zwei=this->ausgabe(true);

      int lange1=eins.Length();
      int lange2=zwei.Length();
      int zahler=0;
      int zw=0;
      int merk=0;
      zahler=eins.Length();
     
      if (lange1==lange2)
       {
        
        zahler=eins.Length();
      // ShowMessage ("Gleich gross");
       }

      if (lange1<lange2)
       {
      //ShowMessage("Rhs wird angepasst");
       rhs.transform_in_right_length(rhs,(zwei.Length()-eins.Length()),eins.Length());
       zahler=zwei.Length();
       }
       if (lange2<lange1&&equal)
        {
        this->transform_in_right_length((lange1-lange2),lange2);
        zahler=lange1;
       // ShowMessage("Lhs wird angepass");
        }
        //zahler=zahler-1;
        //  beide Werten sind nun angepasst
        // von hinten nach vorne rechnen
        // wenn Wert eins kleiner als 0 dann rechne ich von 10 - den  Wert
           // ShowMessage(this->ausgabe(false));  //120
   //    ShowMessage(rhs.ausgabe(false));  //020


       for (int i=2999;i>=0;i--)
       {
            //  ShowMessage("I:"+AnsiString(i));
              if (zahler>=0)
               {
        //  ShowMessage("This:"+AnsiString( int(this->value[zahler-1])));
       //  ShowMessage("Rhs:"+AnsiString(int(rhs.value[zahler-1])));
          if (this->value[zahler-1]<rhs.value[zahler-1])
          {
         //  ShowMessage("Kleiner");
           zw=this->value[zahler-1]%10;
           zw+=10;
           re.value[i]=(zw-rhs.value[zahler-1]);
           rhs.value[zahler-2]=rhs.value[zahler-2]+1;

           }
           else
           {
           re.value[i]=this->value[zahler-1]-(rhs.value[zahler-1]);
           }

           zahler--;


           if (zahler==0)
            {
            merk=i;
            break;
            }
      }
    }
     int ze=2999;   ; int merk2=0;
     int mk=merk;
      int temp=0;
               for (int i=0;i<(2999-merk+1);i++)
                {

                re.value[i]=re.value[mk];
                //ShowMessage(AnsiString(int(puffer[mk])));
              //  ShowMessage(int(re.value[i]));
               // ze--;
                mk++;
                merk2=i;
                }


            int o=merk2+1;
            re.value[o]='x';

          this->setvalue(zwei); // Zu Test zwecken
          rhs.setvalue(eins); // Zu Test zwcken
           //  ShowMessage("RHS:"+rhs.ausgabe(false));
         //  Wert von This bleibt trotzdem gleich
         return re;
SetValue:
Code:
void uint3000::setvalue(AnsiString val)
   {
    int einzelstelle=0;
            int merk=0;
            int zahler=0;
            for (int i=1;i<=val.Length();i++)
             {
            // ShowMessage(val.SubString(i,1));
             einzelstelle=val.SubString(i,1).ToInt();
             //ShowMessage(einzelstelle);
             this->value[zahler]=einzelstelle;
                  merk=i;
                  zahler++;
             //ShowMessage( AnsiString(int(value[i])));


             }
             // ShowMessage("Ge"+AnsiString(zahler));
             for (int i=zahler;i<3000;i++)
             {
             // ShowMessage(i);
             this->value[i]='x';
             }
   }
 
Zuletzt bearbeitet:
Hmm wie kann man den eine eigene Divisionsmethode programmieren bei diesem Datentyp, der eine Ganzzahl zurückliefert?
 
Zurück
Oben Unten