Seite 1 von 2

[SOLVED] Code weiter zu vereinfachen?

Verfasst: Donnerstag 6. Dezember 2007, 23:14
von RauberRacing
kann mal grad einer von euch hier drüber gucken?
is als Hausaufgabe aufgewesen die Funktionen für Dezimal in Binär und umgekehrt zu schreiben
ich hab das ganze etwas ausgedehnt, auf beliebige Stellenwertsysteme. Sieht jemand noch verbesserungsvorschläge?
Danke im Voraus

Code: Alles auswählen

# -*- coding: utf-8 -*-
#programmed 2007 by Tim Rauber

#konvertiert Zahlen von jedem beliebigen Stellenwertsystem in eine Dezimalzahl
def sysX2dec(zahl, system):
    system = int(raw_input('In welchem Stellenwertsystem steht die eingegebene Zahl? '))
    ergebnis = 0
    zaehler = 0
    while (zaehler < len(zahl)):
        if (zahl[zaehler] != 0):
            ergebnis = ergebnis + (int(zahl[zaehler])*(system**(len(zahl)-(zaehler+1))))
        zaehler = zaehler  + 1
    return ergebnis

#konvertiert eine Dezimahlzahl in ein beliebiges Stellenwertsystem
def dec2sysX(zahl, system):
    ganz = zahl / system
    rest = zahl % system
    x = 0 #x ist das Zeichen das eingefügt werden soll
    while(x <= system):
        if (str(rest) == str(x)):
            ziffer = str(x)
            x = system + 1
        else:
            x = x + 1
    if (ganz == 0):
        return ziffer
    else:
        return dec2sysX(ganz, system) + ziffer

Verfasst: Donnerstag 6. Dezember 2007, 23:34
von BlackVivi
Um vom SysX zu einer Dezimalen Zahl zu konvertieren...

Code: Alles auswählen

print int("100101", 2)
print int("A12B", 16)
Als Beispiel :3

Und wieso fragst du bei der ersten Funktion die Zahl nochmal ab? Wieso verwendest du eine while Schleife mit einem Zähler? Stichwort range und for schleife.

Verfasst: Freitag 7. Dezember 2007, 00:29
von RauberRacing
wo frag ich in der ersten Funktion die Zahl nochmal ab?

achso... und int('zahl', basis) wär zu einfach gewesen ^^ verdammt.... so viel gedanken gemacht um aufzuschreiben was ne vordefinierte Funktion macht -.-

Verfasst: Freitag 7. Dezember 2007, 00:39
von BlackJack
In Zeile 6 fragst Du die Basis vom Benutzer ab, obwohl die ja eigentlich schon als Argument in die Funktion kommt.

Die Namensgebung ist nicht so treffend. Es wird nicht von/in Dezimalzahlen umgewandelt sondern in Zahlen. Zu welcher Basis die intern gespeichert werden und/oder ausgegeben werden ist eine reine Darstellungssache.

Die zweite Funktion sieht etwas verwirrend/kompliziert aus. Einfache(re) Variante ohne Rekursion und diese komische ``while``-Schleife:

Code: Alles auswählen

import string


def int2str(value, base):
    digits = string.digits + string.ascii_lowercase
    result = list()
    while value:
        value, rest = divmod(value, base)
        result.append(digits[rest])
    if not result:
        return '0'
    else:
        return ''.join(reversed(result))

Verfasst: Freitag 7. Dezember 2007, 00:50
von RauberRacing
ahh ok ja habs jetzt erst gesehen...

die namen der funktionen sind vorgegeben
(in der ori aufgabe bin2dec und dec2bin)

und zu deinem Vorschlag zu Aufgabe 2
is super, keine Frage, aber wir programmieren im Kurs jetzt erst seit 3 Monaten mit Python und da sind sachen wie append noch nicht so wirklich gern gesehen.
Die Aufgaben sollen halt so gehalten werden dass sie jeder im Kurs versteht. Deswegen werd ich meine Version von der 2. Aufgabe hochladen (müssen) aber werd für mich privat deine Nutzen weil sie halt nachvollziehbarer ist.

Schonmal danke euch beiden für die Hilfe und die erschütternde Tatsache umsonst überlegt zu haben ;) (bezügl. Aufgabe 1 ^^)

Verfasst: Freitag 7. Dezember 2007, 08:55
von BlackJack
Dadurch dass die Namen vorgegeben sind, werden sie nicht besser. Da könnte man den "Vorgebenden" auch drauf hinweisen.

Also ich finde meine Version verständlicher. Das ist der Weg den man für gewöhnlich geht, wenn man das ganze selbst per Hand mit Bleistift und Papier machen würde. Rekursion ist IMHO schwerer zu erklären und Deine ``while``-Schleife habe ich nicht mal versucht nach zu vollziehen, da sie furchtbar ineffizient aussieht. Wenigstens die solltest Du beseitigen/ersetzen.

Und so etwas wie `divmod()` zu verwenden, statt die beiden Teile einzeln zu berechnen, sollte IMHO auch drin sein. Wenn ihr so etwas nicht verwendet sollt, kommt das ja einem Verbot gleich die Doku zu lesen und selbstständig zu denken.

Verfasst: Freitag 7. Dezember 2007, 13:48
von RauberRacing
joa das kann ich bei gelegenheit ma tun...
aber schonma danke für den code... das hat mir echt geholfen...
würde sagen... problem solved :D

hey tim :P

Verfasst: Sonntag 9. Dezember 2007, 19:31
von Squaller

Code: Alles auswählen

def bin2dec(x):
    zaehler = 0
    ergebnis = 0
    while (zaehler < len(x)):
        ergebnis = ergebnis + int(x[zaehler])
        zaehler = zaehler + 1
        ergebnis = 2 * ergebnis
    ergebnis = ergebnis/2
    return ergebnis

def dec2bin (val):
  val = "%o" % val
  ret = ""    
  l = len(val)  
  for i in range(l):
    byte = int(val[l-i-1])
    bit = 0     

    if byte & 1: bit = 1
    if byte & 2: bit = 10 + bit
    if byte & 4: bit = 100 + bit

    if i != len(val) - 1: bit = "%03d" % bit
    else: bit = `bit`

    ret = bit + ret
  return ret

Verfasst: Sonntag 9. Dezember 2007, 19:39
von BlackJack
Tja, warum einfach, wenn's auch umständlich geht. :roll:

Verfasst: Sonntag 9. Dezember 2007, 19:53
von Squaller
ja schon^^
nur musste ichs mal zeigen :D
wie könnte ich das eigentlich verständlicher machen?
meins ist ja jetzt ziemlich kompliziert, würde das gerne ändern ohne die obere version zu kopieren...
mfg

Verfasst: Sonntag 9. Dezember 2007, 19:54
von Joey_das_Chameleon
Schewi du schlange :D
hier nimm das

Code: Alles auswählen

def bin2dec(zahl):
    return int(str(zahl), 2)

Verfasst: Sonntag 9. Dezember 2007, 19:57
von Joey_das_Chameleon
was macht eigentlich der Befehl "append" ??

Verfasst: Sonntag 9. Dezember 2007, 20:15
von BlackJack
Falls Du die Methode auf Listen meinst: Ein Element an die Liste anhängen.

Verfasst: Sonntag 9. Dezember 2007, 20:17
von Joey_das_Chameleon
und was heißt das genau oben steht ja z.b. "result.append(digits[rest])"
was passiert da genau

Verfasst: Sonntag 9. Dezember 2007, 20:27
von Hobbes Hobson
einfach mal "append python" in google eingeben?

Verfasst: Sonntag 9. Dezember 2007, 20:29
von BlackJack
So langsam kommen wir wieder auf dem "Tutorial vorlesen"-Niveau an. Da passiert genau was da steht. `rest` wird als Index in `digits` benutzt und das Ergebnis an die `result`-Liste angehängt.

Man kann auch das Tutorial durcharbeiten und ein wenig mit dem Code spielen. Interaktiv und/oder durch ``print``-Anweisungen nachsehen wie die Ergebnisse von den Einzelteilen aussehen.

Verfasst: Sonntag 9. Dezember 2007, 20:33
von Joey_das_Chameleon
kk mach ich hätte ich auch früher draufkommen könne naber hier sind die PROS :!:

Verfasst: Sonntag 9. Dezember 2007, 20:36
von Joey_das_Chameleon
ja sry das ich gefragt hab wusste nicht das es so ein turtorail hier gibt

Verfasst: Sonntag 9. Dezember 2007, 20:38
von Hobbes Hobson
noch ein typ

es gibt einen button, der was ganz tolles kann:

Bild ;)

Verfasst: Sonntag 9. Dezember 2007, 20:41
von Joey_das_Chameleon
ja ich weiß aber ich hab mich gerade angemeldet und bin noch neben bei was anderes am machen und da hatte ich nicht so den überblick
tut mir wirklich leid sollte keine spam attacke oder sowas werden