Fehler beim umrechnen von Dual nach Dezimalzahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Ich hab gestern aus langeweile ein Script geschrieben, welches Dualzahl in Dezimalzahlen umrechnet.

Code: Alles auswählen

zahl = raw_input("Geben sie eine beliebege Zahl im Dualsystem ein: ")
dezimal = 0
max_potenz = len(zahl)
stelle = 0
while (stelle <= len(zahl)):
    if (zahl[stelle] == "1"):
       dezimal = dezimal + 2**(max_potenz - stelle)
    stelle = stelle + 1
print dezimal
Leider kommt jedes Mal die Meldung "string index out of range" für die Zeile

Code: Alles auswählen

    if (zahl[stelle] == "1"):
Was mach ich falsch?
Dies ist keine Signatur!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das bedeutet, dass stelle in dem Term zahl[stelle] einen Index anspricht, der zu groß ist! Lass Dir doch mal den Wert von "stelle" vorher ausgeben und vergleiche den dann mit der Länge von "zahl". Dann überlege Dir, was der kleinste und der größte mögliche Index für "zahl" sein kann (Denke daran, dass hier bei 0 angefangen wird zu zählen!).
lunar

"zahl[len(zahl)]" gibt es nicht. Die Zählung fängt nämlich bei 0 an. Die Bedingung in der Schleife ist folglich falsch. Außerdem frage ich mich, wieso du "len(zahl)" an einen Namen bindest, diesen Namen in der Schleifenbedingung aber nicht nutzt.

Besser wäre es aber, auf die Schleife ganz zu verzichten. Zeichenketten sind iterierbar, und enumerate() erlaubt den komfortablen Zugriff auf den Index:

Code: Alles auswählen

number = raw_input("Geben sie eine beliebege Zahl im Dualsystem ein: ")
decimal = 0
max = len(zahl)
for index, char in enumerate(number):
    if (char == "1"):
       dezimal = dezimal + 2**(max - index)
print dezimal
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Warum machst du's nicht so:

Code: Alles auswählen

dual = raw_input("Geben sie eine beliebege Zahl im Dualsystem ein: ")
potency = len(dual) - 1
sum = 0
for digit in dual:
    sum += int(digit) * (2 ** potency)
    potency -= 1
print sum
@lunar: Hab deinen Beitrag nicht gesehen.
Zuletzt geändert von snafu am Freitag 17. Oktober 2008, 22:59, insgesamt 1-mal geändert.
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

zahl[len(zahl)] steht auch nirgendwo.
Naja, bin ziemlicher Anfänger. Iteratoren kenn ich (noch) nicht. Was der Fehler bedeutet weiß ich auch, nur warum wird er ausgegeben. Stelle ist gleich Null. Bestimmt gibt es einen eleganter geschriebenen Code, aber dieser ist im Rahmen meiner Fähigkeiten geschrieben. Wo liegt jetzt also genau der Fehler in diesem Code?

EDIT: Der letzte Code funktioniert, danke für die Hilfe. Jetzt weiß ich nur immernoch nicht warum mein Code einen Fehler ausgibt ^^"
Dies ist keine Signatur!
lunar

Shaldy hat geschrieben:zahl[len(zahl)] steht auch nirgendwo.
Du hast es so nicht hingeschrieben, dass ist wohl wahr. Allerdings läuft deine Schleife, bis "stelle" kleiner gleich "len(zahl)" ist ... was glaubst du, was dann in Zeile sechs ausgeführt wird, wenn "stelle" gleich "len(zahl)" ist?

Befolge doch einfach mal Hyperions Tipp, und lass die "stelle" in der Schleife per "print" ausgeben.
Zuletzt geändert von lunar am Freitag 17. Oktober 2008, 23:08, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Shaldy hat geschrieben:zahl[len(zahl)] steht auch nirgendwo.
Doch, "stelle" nimmt den Wert im letzten Schleifendurchlauf an.

Code: Alles auswählen

sum([int(x)*2**i for (i,x) in enumerate(zahl[::-1])])
oder natürlich die ultimative Lösung:

Code: Alles auswählen

int(zahl, 2)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@lunar: Dein Code scheint nicht richtig zu funktionieren. Selbst wenn man die Tippfehler bei den Variablen ausbessert bekomme ich z.B. für 1101 als Ergebnis 26 statt 13 zurück.
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Okay, habs verstanden, danke!

Kann geschlossen werden.
Dies ist keine Signatur!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

snafu hat geschrieben:@lunar: Dein Code scheint nicht richtig zu funktionieren. Selbst wenn man die Tippfehler bei den Variablen ausbessert bekomme ich z.B. für 1101 als Ergebnis 26 statt 13 zurück.
Du bist aber auch echt nicht kreativ ;-) Statt "max - index" müsste es bei lunar "max - index - 1" heißen.
lunar

snafu hat geschrieben:@lunar: Dein Code scheint nicht richtig zu funktionieren. Selbst wenn man die Tippfehler bei den Variablen ausbessert bekomme ich z.B. für 1101 als Ergebnis 26 statt 13 zurück.
Jo ... mir ging es ja auch nur darum, die Nutzung von enumerate zu zeigen. Dazu hab ich halt einfach den Code des OP entsprechend umgeschrieben. Ob der nun tatsächlich korrekt war, hab ich gar nicht überprüft.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

EyDu hat geschrieben:Du bist aber auch echt nicht kreativ ;-) Statt "max - index" müsste es bei lunar "max - index - 1" heißen.
:o Ich musste doch schon meine ganze geistige Energie für die Variablen benutzen. Da blieb wohl nichts mehr übrig. :(
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Welcher Weg ist hier eigentlich der bessere: Die Multiplikation mit Null draufrechnen oder - wie vom OP getan - auf "1" zu prüfen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

snafu hat geschrieben:Welcher Weg ist hier eigentlich der bessere: Die Multiplikation mit Null draufrechnen oder - wie vom OP getan - auf "1" zu prüfen?
Ich finde meins schöner (sonst hätte ich es auch nicht so geschrieben ;-) ) da der Code so an Symmetrie gewinnt.

Du solltest aber nicht vergessen zu testen, dass auch wirklich nur Nullen und Einsen eingegeben wurden, sonst schlagen beide Varianten fehl.

BTW: Es heißt "power" und nicht "potency" ;-)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn ich es mir recht überlege, ist es vielleicht auch nicht gerade prickelnd, 0 * 2 ^ 3456 draufzuschlagen. Also wäre wohl die vorherige Prüfung schon sinnvoller.

EDIT: Nein, "may the potency be with you" ist schön. :)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

http://www.icoost.com/programmiersprach ... umgekehrt/

ich hatte auch mal ein Skript geschrieben und das zurückrechnen geht eigentlich sehr einfach...
BlackJack

@snafu: Das wäre ein netter Slogan für einen Phizer-Werbespot bei dem Darth Vader und Yoda vergleichen wer den, äh das längere Lichtschwert hat, oder wessen Lichtschwert länger steht. ;-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Einen längeren Thread zum Thema "Dualzahlenumwandlung" gab es neulich schonmal: http://www.python-forum.de/topic-13891.html
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Shaldy hat geschrieben:Dualzahl in Dezimalzahlen
Hallo!

Vielleicht habe ich die Aufgabe falsch verstanden. Aber wenn nicht, dann möchte ich auf ``int(x, 2)`` hinweisen.

Code: Alles auswählen

print int(raw_input("Geben sie eine beliebege Zahl im Dualsystem ein: "), 2)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten