PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zur Definition eines eigenen Datentypes



Dizzy_Ti
07.05.2004, 14:15
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?

PseudoReal
07.05.2004, 14:42
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]

Dizzy_Ti
07.05.2004, 14:55
ja sinnvoller wäre das schon, aber dadurch wird es auch schwieriger die Rechenarten richtig umzusetzen.

mj
07.05.2004, 15:59
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.

Dizzy_Ti
07.05.2004, 16:29
Danke für die Antwort :) Die Lösung war so leicht, dass ich einfach gar nicht daran gedachte habe :]

jpwookenny
07.05.2004, 21:05
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.

Dizzy_Ti
10.05.2004, 16:49
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


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:


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';
}
}

Dizzy_Ti
11.05.2004, 18:27
Hmm wie kann man den eine eigene Divisionsmethode programmieren bei diesem Datentyp, der eine Ganzzahl zurückliefert?