AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Programm für Octalzahlen in Dezimalzahlen

Ein Thema von SirMaurice · begonnen am 7. Dez 2018 · letzter Beitrag vom 11. Dez 2018
Antwort Antwort
Seite 1 von 2  1 2   
SirMaurice

Registriert seit: 7. Dez 2018
Ort: Berlin
16 Beiträge
 
Delphi 5 Enterprise
 
#1

Programm für Octalzahlen in Dezimalzahlen

  Alt 7. Dez 2018, 16:43
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] = '1then
     Ergebnis:=Ergebnis + Position;
    Position:= Position * 2;
  end;
  Edez.text:=inttostr(Ergebnis);
 end;
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 7. Dez 2018, 18:46
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).

Geändert von gammatester ( 7. Dez 2018 um 22:07 Uhr) Grund: Tippfehlerkorrktur und Hinweis auf Horner
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.049 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 14:58
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] = '1then
     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] = '1then
      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...
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.075 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 15:41
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.
Thomas Mueller

Geändert von dummzeuch ( 9. Dez 2018 um 15:47 Uhr)
  Mit Zitat antworten Zitat
SirMaurice

Registriert seit: 7. Dez 2018
Ort: Berlin
16 Beiträge
 
Delphi 5 Enterprise
 
#5

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 16:30
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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 17:58
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!
  Mit Zitat antworten Zitat
SirMaurice

Registriert seit: 7. Dez 2018
Ort: Berlin
16 Beiträge
 
Delphi 5 Enterprise
 
#7

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 18:16
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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#8

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 19:01
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 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.)

Geändert von gammatester ( 9. Dez 2018 um 19:22 Uhr) Grund: 9 -> 7
  Mit Zitat antworten Zitat
SirMaurice

Registriert seit: 7. Dez 2018
Ort: Berlin
16 Beiträge
 
Delphi 5 Enterprise
 
#9

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 20:36
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.

Geändert von SirMaurice ( 9. Dez 2018 um 20:38 Uhr) Grund: Erweiterte Antwort
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#10

AW: Programm für Octalzahlen in Dezimalzahlen

  Alt 9. Dez 2018, 20:57
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 d := strtoint(c) schreiben, was vielleicht bekannter ist.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf