Autor |
Beitrag |
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 06.03.03 14:32
So einfach ist das bei einem selbsterstellten Datentyp eben nicht. Um so etwas wie x:=y zu formulieren, müsstest du den Zuweisungsoperator (":=") übersteuern, das ist aber in Delphi leider nicht möglich. In C++ oder C# wäre so etwas machbar.
Über den Umweg IntToStr & ginge es, ich werde StrToBigInt nachher nachschieben.
Cu,
Udontknow
|
|
ak 
      
Beiträge: 240
Suse Windows 9 XP
D6 Professional
|
Verfasst: Do 06.03.03 14:41
Ich danke dir, bin an dieser Sache wirklöich interessiert.
Gruß AK
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 06.03.03 14:59
So, da sind wir wieder.
Hier die Funktionen noch einmal. Ich habe die Funktion BigIntToStr so umgeschrieben, daß sie das niederwertigste Bit ("Low(Value)") nach rechts schreibt, vorher war das niederwertigste Bit links. Es sind natürlich nun nur Dualzahlen möglich ('111000111'), die Routinen prüfen nicht den String auf evtl. falsche Zeichen, aber das kannst du ja leicht ergänzen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| function BigIntToStr(Value:BigInt):String; var i:integer; begin Result:=''; for i:=Low(Value) to High(Value) do if Value[i] then Result:='1'+Result else Result:='0'+Result; end;
function StrToBigInt(Value:String):BigInt; var i:integer; begin //BigInt-Variable Result initialisieren for i:=Low(Result) to High(Result) do Result[i]:=False;
//Wert zuweisen, Low ist niederwertigstes Bit for i:=Length(Value) downto 1 do Result[Length(Value)-i]:=(Value[i]='1'); end;
function Addieren(Val1,Val2:BigInt):BigInt; var i:integer; var Uebertrag:Boolean; begin Uebertrag:=False; for i:=Low(Val1) to high(Val1) do begin Result[i]:=(Val1[i] xor Val2[i]) xor Uebertrag; Uebertrag:=Val1[i] and Val2[i] or ((Val1[i] or Val2[i]) and Uebertrag); end; end;
procedure TForm1.Button1Click(Sender: TObject); var wert1,Wert2,Wert3 :BigInt; begin Wert1:=StrToBigInt(Edit1.Text); Wert2:=StrToBigInt(Edit2.Text); Wert3:=Addieren(Wert1,Wert2); edit3.Text:=BigIntToStr(wert3); end; |
Cu,
Udontknow
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Do 06.03.03 17:26
moin,
warum machtst du das ganze nicht direkt auf den strings? also vom Ende des Strings nach vorne laufen und dann immer eine Stelle in ein int um wandeln und mit der aus der anderen zahl addieren...
Wenn du weitere fragen hast, dann schick mir mal ne mail --> Profil
Gruß
Ken
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 06.03.03 17:32
Es ging doch um die Erstellung eines Integer-Datentyps. Natürlich kann man auch Strings aufaddieren. Aber darum ging es in der Aufgabenstellung eben nicht. Lies dir am besten mal den ganzen Thread durch.
Cu,
Udontknow
|
|
ak 
      
Beiträge: 240
Suse Windows 9 XP
D6 Professional
|
Verfasst: Do 06.03.03 18:34
hui das sieht ja fein aus, danke für die schnelle Antwort, werd mich gleich mal ransetzen.
Gruß AK
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Do 06.03.03 20:29
Udontknow hat folgendes geschrieben: | Es ging doch um die Erstellung eines Integer-Datentyps. Natürlich kann man auch Strings aufaddieren. Aber darum ging es in der Aufgabenstellung eben nicht. Lies dir am besten mal den ganzen Thread durch. |
Aber folgendes ist die aufgabenstellung. Da steht nicht, daß man einen integerdatentyp erstellen soll...
Zitat: |
"Entwerfen Sie eine Unit für das Durchführen der Grundrechenarten mit 30-stelligen Ganzen Zahlen. Skizzieren sie dabei kurz das Prinzip und implementieren sie eine entsprechende Addier-Routine" |
Gruß
Ken
|
|
ak 
      
Beiträge: 240
Suse Windows 9 XP
D6 Professional
|
Verfasst: Do 06.03.03 20:52
@CenBells, stimmt, viele Wege führen nach Rom. Wenn du Lust hast kannste ja mal deine Lösung reinsetzen.
Gruß AK
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 06.03.03 21:48
Hi,
tja viele Mutmaßungen, das hier ist dann die nächste. Nicht meckern, falls ich in dem Thread etwas überlesen habe!
ak hat folgendes geschrieben: | "Entwerfen Sie eine Unit für das Durchführen der Grundrechenarten mit 30-stelligen Ganzen Zahlen. Skizzieren sie dabei kurz das Prinzip und implementieren sie eine entsprechende Addier-Routine" |
Es wurde doch gesagt, man solle sich die Frage genau durchlesen. Für mich heißt das, daß das Problem nicht sehr kompliziert ist, sofern man die Frage verstanden hat.
Als erstes fiel mir ein Taschenrechner ein. Nun, was macht der eigentlich  Der nimt eine Zeichenkette in Empfang und wertet diese nach Auswahl einer Rechenoperation aus, oder nicht ? Derjenige, der die Frage entworfen hat, weiß haargenau, warum es um 30 stellige Zahlen und dann noch integer geht. Weil es die eben nicht gibt. Gibt es solche langen überhaupt als Float oder wie ? Vermute mal nicht. Der weiß warum es 30 Stellen sein sollen. Wegen der knappen Zeit kommen die
Binärzahlen wohl nicht in Betracht. Wahrscheinlich wollte der das "von Hand Rechnen" als Programm haben.
Zitat: | ...eine Unit für das Durchführen der Grundrechenarten mit 30-stelligen Ganzen Zahlen. Skizzieren sie dabei kurz das Prinzip... |
Ich hätte folgendes geschrieben (abgekürzt nur für Addition): Die Zahlen werden in zwei Strings gespeichert. Nun werden diese Strings von rechts nach links abgearbeitet, wobei jeweils die beiden Zeichen mit dem gleichen Index im Stringarray addiert werden (bzw. der Asccii Wert - ???). Per IntToStr wird das Ergebnis wiederum in einen String (Max-Länge 2) gespeichert. Ist dessen Länge zwei wird die zweite Stelle als ergebnis an einen dritten string übergeben. Die erste Stelle wird dann zwischengespeichert usw.
Alleine, das auszuformulieren, da wären bei mir schon mind. 10 Min. weg.
Implementierung ? Nene, ohne mich. Steht ja hier alles wie es geht. 
_________________ Gruß
Hansa
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 07.03.03 11:54
@Cenbells:
Nun, da aber eben Funktionsrumpfe "BigIntToStr" sowie "StrToBigInt" vorgegeben waren, kann man davon ausgehen, daß man es eben nicht mit Strings erledigen sollte.
Cu,
Udontknow
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 12.03.03 19:42
Ist das da auch von Dir :
www.delphipraxis.net...2fd71b3b56432924c5dd
Da gehts aber um Strings und Zahlen der Länge 100. Scheint aber dieselbe Aufgabe zu sein.
_________________ Gruß
Hansa
|
|
Raptor
      
Beiträge: 48
WIN 98 / WIN XP prof.
D 5 St. / D 3 prof.
|
Verfasst: Mi 12.03.03 20:47
Also, nirgendwo steht doch das BigInt ein Integer sein muß
Die Funktion heißt so, was innerhalb der Funktion gemacht wird ist also egal.
Wenn StrInBigInt den String in Einzelne Ziffern zerlegt kann man diese Ziffern Adieren
in der Funktion BigIntAdd(Zahl1,Zahl2) z.B.
Nun das ganze wieder zu einem String mit BigIntInStr und fertig
Es interessiert auch keinen wie Delphi mit Integerzahlen umgeht, sie werden auch nur bit-weise gespeichert, sind also im Speicher keine Integerzahlen mehr.
_________________ Semper aliquid haeret RAPTOR
|
|
Raptor
      
Beiträge: 48
WIN 98 / WIN XP prof.
D 5 St. / D 3 prof.
|
Verfasst: Mi 12.03.03 21:43
So ich hab das jetzt mal schnell getippt
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type BigInt = Array [0 .. 30] of Byte; TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit3: TEdit; Label3: TLabel; Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button2Click(Sender: TObject); procedure StrToBigInt(Zahl :String; var ZahlInt : BigInt); procedure BigIntToStr(ZahlInt: BigInt; var Zahl : String); procedure BigIntAdd(ZahlInt1 : BigInt; var ZahlInt2 : BigInt); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1; Zahl1, Zahl2, Ergebniss : BigInt; implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject); begin close; end;
procedure TForm1.StrToBigInt(Zahl : String; Var ZahlInt: BigInt); var Lauf : Byte; begin for lauf := 1 to 30 do begin ZahlInt[Lauf] := StrToInt(Zahl[lauf]); end; end;
procedure TForm1.BigIntToStr( ZahlInt : BigInt; Var Zahl: String); var lauf : Byte; helper1 : String; begin for lauf := 1 to 30 do begin Helper1 := IntToStr(ZahlInt[lauf]); Zahl := zahl + helper1; end; end;
procedure TForm1.BigIntAdd(ZahlInt1 : BigInt; var ZahlInt2 : BigInt); var lauf : Byte; begin ZahlInt2[0] := 0; for lauf := 30 downto 1 do begin ZahlInt2[lauf] := ZahlInt2[lauf] + ZahlInt1[lauf] + ZahlInt2[0]; if ZahlInt2[lauf] > 9 then begin ZahlInt2[Lauf] := ZahlInt2[lauf]-10; ZahlInt2[0] := 1; end else ZahlInt2[0] := 0; end; end;
procedure TForm1.Button1Click(Sender: TObject); var helper : String; begin StrToBigInt(Edit1.Text,Zahl1); StrToBigInt(Edit2.Text,Zahl2); BigIntAdd(Zahl1,Zahl2); BigIntToStr(Zahl2, helper); Edit3.Text := Helper; end;
end. |
Das ganze funktioniert mit 3 Editfeldern mit maxlength 30
und 2 Button
nur wenn das ergebniss länger als 30 Stellen ist dann ist mist
aber das kann man ja noch ändern
Wer Fragen hat der frage
Ich weiß ist nicht sehr sauber programmiert, war nur auf die schnelle
Wer das Prog mal Testen will, ne kurze Mail reicht
_________________ Semper aliquid haeret RAPTOR
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 12.03.03 21:54
Da kann der Heini einen Haken drunter machen. Auf den ersten Blick (5 Sek.  ) sehe ich mal keinen Fehler. Ich hätte es nur mit einem einfachen String gemacht. 
_________________ Gruß
Hansa
|
|