Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Programm für Octalzahlen in Dezimalzahlen (https://www.delphipraxis.net/198885-programm-fuer-octalzahlen-dezimalzahlen.html)

SirMaurice 7. Dez 2018 16:43

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;

gammatester 7. Dez 2018 18:46

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:
1*8 + 3 = 11
11*8 + 5 = 93
93*8 + 7 = 751
oder für 76543
Code:
7*8 + 6 = 62
62*8 + 5 = 501
501*8 + 4 = 4012
4012*8 + 3 = 32099
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.

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).

TurboMagic 9. Dez 2018 14:58

AW: Programm für Octalzahlen in Dezimalzahlen
 
Zitat:

Zitat von SirMaurice (Beitrag 1420322)
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;

Hallo,

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:
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;
Der nächste Schritt, wenn du das mit der Oktalumrechnung hinbekommen hast,
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...

dummzeuch 9. Dez 2018 15:41

AW: Programm für Octalzahlen in Dezimalzahlen
 
Zitat:

Zitat von TurboMagic (Beitrag 1420405)
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.

Selber einrücken ist ja sowas von letztes Jahrtausend. Und selbst für Delphi 5 gab es schon den Code Formatter DelForEx. (Wobei ich mich gerade frage, wo man den ggf. noch herbekommt.)

Edit: Internet Archive ist einfach nur gut:

https://web.archive.org/web/20080913.../UK/Delforexp/

Der Download-Link auf der Seite funktioniert auch.

SirMaurice 9. Dez 2018 16:30

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:

PS: ist Delphi 5 das, was die Schule besitzt? Weil das ja eigentlich schon
recht alt ist und Schullizenzen gar nicht so teuer sind...
Unsere Schule hat noch Delphi 10, jedoch ist es wohl nicht nötig mit einem aktuellen Compiler zu arbeiten.

Danke noch mal an alle Antwortgebenden. :thumb:

gammatester 9. Dez 2018 17:58

AW: Programm für Octalzahlen in Dezimalzahlen
 
Zitat:

Zitat von SirMaurice (Beitrag 1420411)
Ich habe versucht das untenstehende umzusetzen, leider funktioniert absolut gar nichts.

Wie soll denn das auch funktionieren? Wenn Du schon meinen Vorschlag der Vorwärtsberechnung nicht benutzen willst, solltest Du wissen, daß Dein Ansatz (mindestens) zwei fundamentale Fehler hat.
  • Du verwendest Deine Eingabe-Oktalziffern überhaupt nicht für die Rechung! Wie soll da etwas Vernünftiges herauskommen? Die Ziffern werden nur für völlig identische if-Anweisungen benutzt!
  • Pro Schleifendurchlauf darf nur einmal mit 8 multipliziert werden, nicht 8 mal. Bei Dir wird Position pro Zeichen mit 8^8 = 16777216 multipliziert!

SirMaurice 9. Dez 2018 18:16

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.

gammatester 9. Dez 2018 19:01

AW: Programm für Octalzahlen in Dezimalzahlen
 
Zitat:

Zitat von SirMaurice (Beitrag 1420416)
Die Rückwärtszählung war in der Aufgabe enthalten.

Na dann mal die Basisfunktion mit korrekter Implementation Deiner Methode. Ich habe Position in Potenz umbenannt, weil das die adäquate Bezeichnung ist und nicht so irreführend wie Positiion.
Delphi-Quellcode:
{-----------------------------------------------------------}
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;
Dies kannst Du in Dein Programm einbauen und rufst die Funktion zB mit
Delphi-Quellcode:
dez := oct2dec(EOct.Text)
auf.

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.)

SirMaurice 9. Dez 2018 20:36

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.

gammatester 9. Dez 2018 20:57

AW: Programm für Octalzahlen in Dezimalzahlen
 
Zitat:

Zitat von SirMaurice (Beitrag 1420428)
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.

Oft gibt es ja mehrere Möglichkeiten. ZB kann man für die Umwandlung des Oktalzeichens auch
Delphi-Quellcode:
d := strtoint(c)
schreiben, was vielleicht bekannter ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz