![]() |
Programm für Octalzahlen in Dezimalzahlen
Hallo,
ich habe in der Schule den Auftrag bekommen ein Programm zu entwickeln welches Binär bzw. Octal Zahlen in Dezimalzahlen umwandelt. Das hat auch für Binär ganz gut geklappt, nur eben nicht für Octal. Ich poste mal den Code für Binär, damit man erkennt nach welchem Schema das Programm geschrieben werden soll. Bitte bedenkt das ich noch dabei bin die Sprache zu lernen und möglicherweise einige Befehle noch nicht kenne. LG SirMaurice (PS. Eine Erklärung wäre nett, will es ja nicht nur abschreiben sondern auch verstehen ^^) EDIT: Entwicklungsumgebung ist Delphi 5
Delphi-Quellcode:
procedure TForm1.BBindezClick(Sender: TObject);
var i: integer; Position, Ergebnis: cardinal; begin Position:=1; Ergebnis:=0; for i:=length(Ebin.text) downto 1 do begin if Ebin.text[i] = '1' then Ergebnis:=Ergebnis + Position; Position:= Position * 2; end; Edez.text:=inttostr(Ergebnis); end; |
AW: Programm für Octalzahlen in Dezimalzahlen
Es sind zwei Änderungen nötig: Es wird mit 8 multipliziert statt mit 2 und die Eingabe enthält Ziffern 0,1,2,...,6,7.
Um die Oktalzahl 1357 umzuwandeln, berechnet man ausgehend von der höchsten Ziffer
Code:
oder für 76543
1*8 + 3 = 11
11*8 + 5 = 93 93*8 + 7 = 751
Code:
Du muß also die einzelnen Zeichen der Eingabe testen, ob sie in der Menge ['0', '1', ..., '6', '7'] enthalten sind. Wenn ja werden die Zeichen in die entsprechende Integerzahl umgewandelt, und wie gezeigt gerechnet.
7*8 + 6 = 62
62*8 + 5 = 501 501*8 + 4 = 4012 4012*8 + 3 = 32099 Das ganze wird dann wie bei Basis 2 in eine Schleife gepackt (die hier dann einfach vorwärts durchlaufen wird, aber man kann die Sache so ähnlich wie bei Deiner Binärwandlung auch rückwärts durchlaufen; vorwärts kommt ohne die Variable Position aus). Der Vorwärtsalgorithmus ist analog zum Hornerschema (man rechnet ja Summen a[k]*8^k aus). |
AW: Programm für Octalzahlen in Dezimalzahlen
Zitat:
noch ein Tipp von mir zu deinem Code: wenn du dir angewöhnst zur Einrückung immer 2 stat wie bei dir bisher 1 Zeichen zu benutzen, dann ist es nicht nur Delphi/Pascal STandard, sondern erhöht auch die Lesbarkeit ungemein. Du wirst viel schneller sehen was zu einem if gehört usw... Und wenn du gewisse AUfrufe auch noch in pascalCase schreiben würdest, wäre es auch noch übersichtlicher:
Delphi-Quellcode:
Der nächste Schritt, wenn du das mit der Oktalumrechnung hinbekommen hast,
procedure TForm1.BBindezClick(Sender: TObject);
var i: Integer; Position, Ergebnis: Cardinal; begin Position := 1; Ergebnis := 0; for i := length(Ebin.Text) downto 1 do begin if Ebin.Text[i] = '1' then Ergebnis := Ergebnis + Position; Position := Position * 2; end; Edez.Text := IntToStr(Ergebnis); end; wäre übrigens, die jeweiligen Umrechnungsalgorithmen in eigene Methoden auszulagern, damit die nicht fix an einem Button Klick Event dran hängen, sondern flexibel benutzbar sind. Die Methode würden dann einen String übergeben benkommen, der die eingegebenen daten enthält und einen String mit den umgewandelten Daten zurück geben. dann kann sie an jeder Stelle im Programm eingesetzt werden. Grüße und weiter viel Spaß beim Lernen TurboMagic PS: ist Delphi 5 das, was die Schule besitzt? Weil das ja eigentlich schon recht alt ist und Schullizenzen gar nicht so teuer sind... |
AW: Programm für Octalzahlen in Dezimalzahlen
Zitat:
Edit: Internet Archive ist einfach nur gut: ![]() Der Download-Link auf der Seite funktioniert auch. |
AW: Programm für Octalzahlen in Dezimalzahlen
Danke für die Tipps, wäre auch mal nett sowas von seinem Lehrer zu erfahren.
Ich habe versucht das untenstehende umzusetzen, leider funktioniert absolut gar nichts. Bevor der Quellcode kommt: Von meinem Lehrer ist leider absolut gar keine Hilfe zu erwarten. Weiterhin habe ich noch versucht mit einer case of Struktur zu arbeiten, hat auch nicht funktioniert.
Code:
procedure TForm1.BBerechnen2Click(Sender: TObject);
var i: integer; Position, Ergebnis: cardinal; begin Position:= 1; Ergebnis:= 0; for i:= length(EOct.Text) downto 1 do begin if EOct.Text[i]='0' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; if EOct.Text[i]='1' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; if EOct.Text[i]='2' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; if EOct.Text[i]='3' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; if EOct.Text[i]='4' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; if EOct.Text[i]='5' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; if EOct.Text[i]='6' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; if EOct.Text[i]='7' then Ergebnis:= Ergebnis +Position; Position:= Position * 8; end; EDez.text := inttostr(Ergebnis); end; Zitat:
Danke noch mal an alle Antwortgebenden. :thumb: |
AW: Programm für Octalzahlen in Dezimalzahlen
Zitat:
|
AW: Programm für Octalzahlen in Dezimalzahlen
Ich weiß deinen Vorschlag zu schätzen, jedoch weiß ich nicht so ganz wie ich das umsetzen soll. Wir haben in der Schule einfach gesagt bekommen: Macht das mal. Ende. Die Rückwärtszählung war in der Aufgabe enthalten.
Außerdem möchte ich erwähnen, dass ich in meiner Schullaufbahn noch nie etwas vom Horner-Schema gehört habe. Ich hab mich ein bisschen zu dem Thema informiert, jedoch ist mein Wissen auch nach der Recherche mehr so naja. |
AW: Programm für Octalzahlen in Dezimalzahlen
Zitat:
Delphi-Quellcode:
Dies kannst Du in Dein Programm einbauen und rufst die Funktion zB mit
{-----------------------------------------------------------}
function oct2dec(const os: string): cardinal; {-Umwandlung des Strings os, der eine Oktalzahl enthält, in eine Dezimalzahl} var Ergebnis, Potenz: cardinal; i: integer; d: byte; c: char; begin Potenz := 1; Ergebnis := 0; for i:=length(os) downto 1 do begin {Umwandlung nächste Oktalziffer in Dezimalvariable d} c := os[i]; if c in ['0'..'7'] then d := ord(c)-ord('0') else begin {Fehlerbehandlung: hier} ShowMessage(c+' ist keine gültige Oktalziffer'); end; {Aufsummieren} Ergebnis := Ergebnis + Potenz*d; {nächste Achter-Potenz} Potenz := Potenz*8; end; oct2dec := Ergebnis; end;
Delphi-Quellcode:
auf.
dez := oct2dec(EOct.Text)
Hier noch Tip, der wichtiger ist als schöne Formatierung (die nicht vor Logik-Fehlen schützt): Versuche die Berechungen von der Oberfläche/Eingabe/Ausgabe zu trennen. Dann ist die Routine allgemein einsetzbar und hängt nicht von Deinen Editfeldern ab (in der Funktion oben sollte man deshalb besser einen Fehlercode liefern oder ein Exception werfen.) |
AW: Programm für Octalzahlen in Dezimalzahlen
Danke für die Hilfe. Ich muss noch mal kurz erwähnen, dass mir einige Bezeichnungen unbekannt sind. Ich werde mal nachlesen was diese machen.
Ich wollte tatsächlich eine zweite Unit für die Rechnung erstellen, mein Lehrer meinte jedoch, dass ich dies nicht tun soll. Vielen Dank nochmal. |
AW: Programm für Octalzahlen in Dezimalzahlen
Zitat:
Delphi-Quellcode:
schreiben, was vielleicht bekannter ist.
d := strtoint(c)
|
AW: Programm für Octalzahlen in Dezimalzahlen
Zitat:
Und zum Case, falls deine kaskadierenden ifs so etwas umsetzen sollten noch ein kurzes Beispiel:
Delphi-Quellcode:
Dabei ist Aufruf1 bis Aufruf4 jeweils eine Prozedur/Methode oder Funktion die du aufufen möchtest.
var
c : Char; begin case c of 'a': Aufruf1; 'b': Aufruf2; 'c'..'e': Aufruf3; else Aufruf4; end; end; 'c'..'e' bedeuitet, dass dieser Fall für c, d und e gilt und der else Zewig wird für alle Fälle abgedeckt in denen c nicht im bereich a-e liegt. |
AW: Programm für Octalzahlen in Dezimalzahlen
Zitat:
Delphi-Quellcode:
in eine neue Zeile. Da bluten meine Augen.
begin
Delphi-Quellcode:
Das begin gehört nach Delphi-Styleguide in die nächste Zeile. Alles andere ist einfach nur hässlich und kommt aus der C-Gegend.
for i:= Length(EOct.Text) downto 1 do
begin |
AW: Programm für Octalzahlen in Dezimalzahlen
Wenn ich nicht etwas übersehen habe, hat außer mir niemand einen inhaltlichen Beitrag geschrieben.
Leider gibt es hier im Forum immer wieder die störende Tendenz, nicht auf die eigentlichen Fragen und Probleme einzugehen, sondern auf Äußerlichkeiten zu fokussieren (Formatierung, Bezeichner, 'letzte Jahrtausend' usw). Das bringt für die Problemlösung 0.42% oder so. Wichtig ist ein konsistenter und konstanter Stil, und nicht das, was irgendein Programm automatisch vorschlägt. Ich weiß, das mein Beitrag jetzt auch das Problem hat, aber nicht zu antworten ist keine Lösung. Zitat:
![]() |
AW: Programm für Octalzahlen in Dezimalzahlen
Ich kann nix für unnötige Leerzeichen. Mein Beitrag zielt darauf ab, dass begin laut Styleguide in die nächste Zeile gehört. Jetzt irgendwelche Fehler in irgendwelchen Leerzeichen zu suchen, nur damit mein Beitrag schlecht gemacht werden kann, gehört aber auch nicht hier her.
Ich könnte auch noch was zu Delphi 5 schreiben aber lassen wir das. |
AW: Programm für Octalzahlen in Dezimalzahlen
Hallo,
natürlich trägt die Formattierung nicht wirklich was zur Lösung des Algorithmus im engeren Sinne bei, da er aber eine Programmiersprache lernt, sollte er sich gleich von vorne herein eine gute Formatierung angewöhnen, da es eben die Lesbarkeit und amit die "Analysierbarkeit" erhöht. Ich denke diese Punkte sind inzwischen jedoch geklärt und wir sollten uns dem Algorithmus zuwenden. Vielleicht mal einfach nochmal von vorne rekapitulieren wie Stellenwertsysteme funktionieren. Dezimalzahlen sind ein Stellenwertsystem zur Basis 10, d.h. jede Stelle weiter links hat den 10-fachen Wert der rechts davon befindlichen Stelle. Und wie ist das nun mit Oktalzahlen? Jede Stelle hat den 8-fachen Wert der rechts davon befindlichen. Man könnte es mittels zwei Zählern umsetzen: einem für den bearbeiteten Index, der läuft von length des Eingabestrings runter nach 1 (kann also mit einer downto for Schleife abgebildet werden) und einem Wert-Zähler der nach jeder bearbeiteten Stelle mit 8 multipliziert wird. Sovil mal als Hinweis von mir. Grüße TurboMagic |
AW: Programm für Octalzahlen in Dezimalzahlen
Danke das Du meinen Lösungsvorschlag
![]() |
AW: Programm für Octalzahlen in Dezimalzahlen
Du hättest auf #2 verweisen sollen.
Gut, ohne Hinweis auf das Horner-Schema vielleicht nicht sofort eingängig, aber da war doch alles klar. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz