Entwickler-Ecke
Sonstiges (Delphi) - String mit 30 stellen in einen Integer umwandeln
ak - Do 06.03.03 00:09
Titel: String mit 30 stellen in einen Integer umwandeln
Wie kann ich einen String (z.B. strzahl:=edit1.text) der 30 Stellen hat in einen integer umwandeln, so dass ich mit ihm rechnen kann??
Hat da jemand ne Idee?
Gruß AK
P.S. bin neu hier und begrüsse mal alle members hier
Borlox - Do 06.03.03 00:19
Du musst einfach StrToInt() noch hinzufügen!
strzahl:=StrToInt(edit1.text);
Das hat natürlich den Nachteil, dass es einen schweren Fehler gibt, wenn mal ein Buchstabe mit im Feld steht!
ak - Do 06.03.03 11:02
Hallo Peter Lustig,
Ich habe diese Aufgabe in einem Einstellungstest bekommen und hatte dafür nur 30 Minuten Zeit. Es geht hier "nur" um 30 stellige Integerzahlen und nicht wie in deinem auch sehr hilfreichem Link um Zahlen bis 500 Stellen. Da der Quelltext in deinem Link sehr sehr gross ist, denke ich mal dass es da noch ne andere Lösung geben muss.
Wäre für jeden Tip dankbar.
Gruß AK
ak - Do 06.03.03 11:06
Titel: bigInt
Der vorgegebene Code in meinem Einstellungstest hatte 2 Funktionen zum umwandeln, einmal von "BigIntinString" und einmal von "StringinBigInt".
Dann noch eine dritte Funktion zum addieren der beiden BigIntegers.
Als Type war BigInt und ein Fragezeichen (Type BigInt = ?), welchen Typ ich da am besten verwende weiss ich auch noch nicht.
Gruß AK
Udontknow - Do 06.03.03 11:21
Hallo!
Das ist aber ein gemeiner Test. Und dazu so fern der Praxis!
Ich glaube, ich hätte angefangen, mir zu überlegen, wie viel Bit ich für die Darstellung einer 30-stelligen Dezimal-Zahl benötige. Um einen Wertebereich von 10^30 Kombinationsmöglichkeiten mit einer binären Zahl abzudecken, muss man also eine Potenz finden für die gilt 2^x>=10^30. Diese Potenz gibt einem dann die Anzahl der Bit, die der Datentyp benötigen würde.
Das Addieren wäre ja noch einfach, aber wie man dann einen Textstring in diesen Typ umwandelt... Keine Ahnung!
Ihr hattet nicht zufälligerweise eine Internetverbindung nach draussen zur Verfügung? Vielleicht war das so ein Test ala "Schauen wir mal, ob sie sich einen abbrechen bei der Realisierung oder lieber sofort so klug sind und sich die Quellen aus dem Netz holen. Man muss ja nicht wissen, wie es geht, man muss nur wisssen, wo es steht.". :wink:
Cu,
Udontknow
ak - Do 06.03.03 12:27
Naja es war auf einem Laptop, und die Internetverbindung habe ich nicht gecheckt, ich denka mal nicht dass es darum ging.
Hier mal die original Aufgabe, vielleicht war ja auch nur das Prinzip und die Addier-Routine gefragt. Der "Prüfer" meinte auch dass ich mir die aufgabenstellung genau durchlesen sollte, und meinte, "ich wäre nicht der erste der daran gescheitert ist". Hier also die original Aufgabe:
"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"
aber ohen dem umwandeln der Strings aus dem Textfeld kann ich nicht addieren....hmmmm....
Gruß AK
dude - Do 06.03.03 12:55
aber BigInt gibt es doch gar nicht ![/code]
Udontknow - Do 06.03.03 12:56
@AK:
Ha! Es ist nicht von DEZIMAL-Zahlen die Rede! Du kannst also einfach Binärzahlen als Eingabe verlangen! Eine solche Umsetzung von String in ein Array ist einfach.
@Dude: Dieser Datentyp plus Umwandlungsfunktionen sollte erstellt werden .
Cu,
Udontknow
Christian S. - Do 06.03.03 12:56
Zitat: |
Ich habe diese Aufgabe in einem Einstellungstest bekommen und hatte dafür nur 30 Minuten Zeit. Es geht hier "nur" um 30 stellige Integerzahlen und nicht wie in deinem auch sehr hilfreichem Link um Zahlen bis 500 Stellen. Da der Quelltext in deinem Link sehr sehr gross ist, denke ich mal dass es da noch ne andere Lösung geben muss. |
Konnte ich ja nicht wissen! :schmoll:
Der Vorschlag von Udontknow ist eigentlich schon ziemlich gut. Wenn ich mich nicht verrechnet habe, brauchst Du 100 Bits plus eins fürs Vorzeichen. Also:
Type BigInt = Array[0..100] OF Boolean;
Eine Addition implementierst Du so, wie Du es auch bei einer schriftlichen Addition machst!
Waren die Funktionen zur Umwandlung von und nach String jetzt gegeben oder musste man die noch schreiben? In der Aufgabenstellung steht zumindest nicht, dass man das muss!
MfG,
Peter
Udontknow - Do 06.03.03 13:04
So wie ak das jetzt geschrieben hat, muss man gar nicht die Eingabe bzw. Umwandlung realisieren. Man muss einfach nur einen Datentyp erstellen und die Rechenoperation "addieren" implementieren.
Cu,
Udontknow
ak - Do 06.03.03 13:12
Nee nee auf dem Laptop waren bei den 2 Umwandlungsfunktionen (BigInt in String und umgekehrt) Fragezeichen gewesen ( den Funktionen fehlte das "wehsentliche", nur das "drumherum" war da). Also denke ich mal, dass diese auch entwickelt werden mussten. Da das Formular ja auch schon da war, sollte die Funktionalität dann bestimmt getestet werden.
Gruß
ak - Do 06.03.03 13:13
aber bis jetzt ist es schon sehr hilfreich :-)
Christian S. - Do 06.03.03 13:18
Bei der Aufgabenstellung und zusammen mit dem Hinweis der Prüfers, die Aufgabenstellung genau durchzulesen und mit der begrenzten Zeit glaube ich nicht, dass Du eine solche Routine schreiben musst.
Sonst stände da ja nicht: "Schreiben Sie eine Routine zur Addition" sondern "Schreiben Sie eine Routine zur Addition und Umwandlung von und nach String".
Die Fragezeichen in den entsprechenden Funktionen standen wahrscheinlich nur da, damit man keinen Hinweis bekommt, wie der Datentyp aussieht!
Udontknow - Do 06.03.03 13:20
Achso. Naja, da aber eben ind er Aufgabe keine Rede davon war, daß es Dezimalzahlen in Strings sein müssen, die die Funktionen annehmen bzw. ausgeben, ist, wie schon gesagt, eine Umwandlung recht einfach. Wenn wir mal Peter Lustigs Ansatz nehmen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function BigIntToStr(Value:BigInt):String; var i:integer; begin Result:=''; for i:=Low(Value) to High(Value) do if Value[i] then Result:=Result+'1' else Result:=Result+'0'; end; |
Cu,
Udontknow
ak - Do 06.03.03 13:24
@Peter Lustig, ich denke du hast recht, 30 minuten sind wirklich ein bisschen wenig für alles.
Gut jetzt haben wir den Typen : Type BigInt = Array[0..100] OF Boolean;
jetzt fehlt "nur" noch die Addierroutine, wobei ich gegen eine komplette Umandlungsroutine nicht haben würde :-) .
Gruß
ak - Do 06.03.03 13:32
@udontknow, ich teste gerade mal deine Umwandlungsroutine. Thanx
Udontknow - Do 06.03.03 13:33
Ohne Gewähr:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function Addieren(Val1,Val2):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; |
Cu,
Udontknow
ak - Do 06.03.03 13:48
Wie würde denn eine StrToBigInt Funktion aussehen???
Gruß
ak - Do 06.03.03 13:58
Ich habe mal folgendes versucht (mal etwas code):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
BigInt = Array[0..100] OF Boolean;
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function BigIntToStr(Value:BigInt):String;
var i:integer;
begin
Result:='';
for i:=Low(Value) to High(Value) do
if Value[i] then
Result:=Result+'1'
else
Result:=Result+'0';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
wert1 :BigInt;
begin
wert1:= ? ;
edit2.Text:=BigIntToStr(wert1);
end;
end.
--------------------------------
Wie kann ich in der button1 click procedure dem wert1 etwas zuweisen???
entweder komt die fehlermeldung :
[Error] Unit1.pas(43): Integer constant too large
oder
[Error] Unit1.pas(43): Incompatible types: 'BigInt' and 'Int64'
bin etwas ratlos.
Gruß
Udontknow - 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 - Do 06.03.03 14:41
Ich danke dir, bin an dieser Sache wirklöich interessiert.
Gruß AK
Udontknow - 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.
Quelltext
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 - 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 - 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 - 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 - 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 - 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 - 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. 8)
Udontknow - 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
Raptor - 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.
Raptor - Mi 12.03.03 21:43
So ich hab das jetzt mal schnell getippt
Quelltext
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 :D
Ich weiß ist nicht sehr sauber programmiert, war nur auf die schnelle :oops:
Wer das Prog mal Testen will, ne kurze Mail reicht
hansa - Mi 12.03.03 21:54
Da kann der Heini einen Haken drunter machen. Auf den ersten Blick (5 Sek. 8) ) sehe ich mal keinen Fehler. Ich hätte es nur mit einem einfachen String gemacht. :lol:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!