[SOLVED] Code weiter zu vereinfachen?

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.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

[SOLVED] Code weiter zu vereinfachen?

Beitragvon RauberRacing » Donnerstag 6. Dezember 2007, 23:14

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
Zuletzt geändert von RauberRacing am Freitag 7. Dezember 2007, 13:50, insgesamt 1-mal geändert.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Donnerstag 6. Dezember 2007, 23:34

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.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

Beitragvon RauberRacing » Freitag 7. Dezember 2007, 00:29

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

Beitragvon BlackJack » Freitag 7. Dezember 2007, 00:39

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))
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

Beitragvon RauberRacing » Freitag 7. Dezember 2007, 00:50

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 ^^)
BlackJack

Beitragvon BlackJack » Freitag 7. Dezember 2007, 08:55

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.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

Beitragvon RauberRacing » Freitag 7. Dezember 2007, 13:48

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
Squaller
User
Beiträge: 12
Registriert: Mittwoch 21. November 2007, 18:34
Kontaktdaten:

hey tim :P

Beitragvon Squaller » Sonntag 9. Dezember 2007, 19:31

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
BlackJack

Beitragvon BlackJack » Sonntag 9. Dezember 2007, 19:39

Tja, warum einfach, wenn's auch umständlich geht. :roll:
Squaller
User
Beiträge: 12
Registriert: Mittwoch 21. November 2007, 18:34
Kontaktdaten:

Beitragvon Squaller » Sonntag 9. Dezember 2007, 19:53

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
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

Beitragvon Joey_das_Chameleon » Sonntag 9. Dezember 2007, 19:54

Schewi du schlange :D
hier nimm das


Code: Alles auswählen

def bin2dec(zahl):
    return int(str(zahl), 2)
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

Beitragvon Joey_das_Chameleon » Sonntag 9. Dezember 2007, 19:57

was macht eigentlich der Befehl "append" ??
BlackJack

Beitragvon BlackJack » Sonntag 9. Dezember 2007, 20:15

Falls Du die Methode auf Listen meinst: Ein Element an die Liste anhängen.
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

Beitragvon Joey_das_Chameleon » Sonntag 9. Dezember 2007, 20:17

und was heißt das genau oben steht ja z.b. "result.append(digits[rest])"
was passiert da genau
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

Beitragvon Hobbes Hobson » Sonntag 9. Dezember 2007, 20:27

einfach mal "append python" in google eingeben?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder