Pruefziffernrechner

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
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

:twisted:
Seit mir nicht böse wenn ich schon wieder schreib, aber ich wollte mal eure Meinungen hören, wie ihr einen Prüfziffernrechner machen würdet.

Für alle die nicht wissen was das ist:

1. Ihr habt eine Nummer z.B.
29958247

2. Jetzt rechnet ihr die letzte Ziffer mal 2, die vorletzte mal 1, die drittletzte wieder mal 2 und so weiter und bildet dann aus jeder neu entstandenen Zahl die Quersumme. In unsrem Beispiel dann:
29918445

3. Jetzt alle Ziffern Zusammenrechnen:
42

4.Und jetzt diese Zahl von der nächst größeren 10-er Zahl abziehen:
50-42=8

Damit wäre die Prüfziffer 8. Ich find es ist eine spannende Aufgabe und (für mich jedenfalls) nicht so leicht. Also wenn ihr Lösungsvorschläge habt, immer raus damit
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Schon mal auf Wikipedia oder bei Google vorbeigeschaut? Da gibt es nämlich eine Menge an Verfahren zur Erzeugung von Prüfziffern, welche auch mathematisch einen Sinn machen.
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Hi,

ich weiss nicht so recht, worauf Du hinaus willst mit der Frage, "Wie würdet Ihr einen Prüfziffer Rechner machen", aber so wirklich viel lässt sich da nicht "neu" erfinden.

Die Formeln dazu gibt findet man überall, der Aufbau selbst bleibt ja jedem selber überlassen (Konsolenprogramm, grafische Oberfläche) und die Funktionalität ist ja eigentlich nur simples Übernehmen der Funktionen in Programmcode.

Wir haben diesen Prüfziffernrechner seinerzeit in der Schule als Übung geschrieben und wie gesagt, es ist nicht viel mehr dahinter als die Rechenfunktionen einfach umzuschreiben in der erforderlichen Syntax.

Beginn doch einfach mal damit, die Funktionalität zu implementieren (schreib Dir einfach ne Funktion die erstmal alles beinhaltet), dann lagerst Du einzelne Teile aus, programmierst darum einen sinvollen Aufbau (Menü, usw.) und dann kannst Du das ganze ja noch irgendwie erweitern mit anderen Prüfsummenrechnern.

Spass macht es auf jeden Fall und es ist eine sehr gute Übung, grade zu Beginn...


ne0h
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Es geht mir hier aber nicht darum die Lösung zu erfahren, sonst würde ich nicht seit Tagen daran sitzen so einen Rechner zu machen.
Ich wollte
1. Hier wenn überhauptverbesserungsvorschläge bekommen.
2. Falls jemand nichts zu tun hat, ihm eine "nette kleine" Aufgabe stellen.


Da gibt es nämlich eine Menge an Verfahren zur Erzeugung von Prüfziffern

Ja mathematische Verfahren. Aber schon mal versucht das in Python umzusetzten?

mfg nightm4r3^ :roll:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Zeig doch erst mal, was du an Code hast, dann kann man dir auch einfacher weiterhelfen.

Ist das Problem nun, dass du keine Verfahren zu Berechnung findest, oder bekommst du ein Verfahren nicht implementiert?
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

nightm4r3^ hat geschrieben:Also wenn ihr Lösungsvorschläge habt, immer raus damit
Die Summe von Ziffern in einer Liste bekommst Du mit

Code: Alles auswählen

sum(liste) 
heraus. Hast du eine liste, dann kann man sie mit

Code: Alles auswählen

 liste.reverse()
einfach umdrehen, andererseits bietet

Code: Alles auswählen

liste[::-1]
auch die Möglichkeit, alle Ziffern "von hinten" aufzuführen. Ob ein Index der Liste gerade oder ungerade ist, bekommst Du mit dem Modulo-Operator heraus. Die Anzahl der 10er einer Zahl ist ein Einsatzgebiet der div-Operation.

Liebe Grüße

Gnushi
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Ich weiß nicht ob ihr mich recht Versteht. Ich bin mit meinem Programm schon weiter. Ich habe schon Lösungswege und ich wollte mit dem Post keine Hilfe, sondern allen Python usern (wenn sie Spass darn haben) eine Aufgabe zeigen an der ich momentan am knobeln bin.
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Zeig doch mal ein wenig Code, damit wir etwas "Handfestes" haben worauf man sich beziehen kann.

Wenns Dir nicht um Hilfe geht dann kann man trotzdem ein wenig gemeinsam dran knobeln, nur wäre es wirklich interessant zu sehen, wie der Code bei Dir aussieht und welchen Weg Du genommen hast.


ne0h
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Da ich noch nicht ganz fertig bin, ist es vllt ein bisschen Schwer zu verstehen. Gerade deswegen, weil ich mir auch keine mühe mit den Variablen bezeichnungen gegeben hab:

Code: Alles auswählen


#Definition der Quersumme:
def Quersumme(a):
    quersumme=sum([int(p) for p in str(a)])
    print quersumme

#Definition der Prüfziffer
def pruefziffer(a):
    Liste1=map(int, str(a))
    Listeungerade=[]
    i=len(Liste1)
    for n in range (0,i):
        if Liste1[n]%2==0:
            quersumme=Quersumme(Liste1[n]*2)
            print quersumme

Bis jetzt gibt er nur Bis zu Schritt 2 die Zahlen alle untereinander aus und auch nur bis jetzt von den Geraden Zahlen.
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

Hi!
nightm4r3^ hat geschrieben:Ich habe schon Lösungswege und ich wollte mit dem Post keine Hilfe, sondern allen Python usern (wenn sie Spass darn haben) eine Aufgabe zeigen an der ich momentan am knobeln bin.
Na, dann habe ich Dich wohl falsch verstanden.

Unter http://www.pythonchallenge.com/index.htm findest du weitere Knobelaufgaben.

GnuShi
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Danke GnuShi
die Seite sieht wirlkkch gut aus. Die werd ich wohl mal öfter besuchen :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

In Quersumme würde in statt ``print`` ``return`` schreiben und die ``range``-Konstruktion in der anderen Funktion mit enumerate() ersetzen. Oder einem anderen Generator der 1 und 0 zurückgibt. Lässt sich mit itertools' ``izip`` und ``cycle`` vermutlich recht elegant zusammenbauen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Zum Beispiel so:

Code: Alles auswählen

def checksum(n):
    x = sum(sum(divmod(a * b, 10))
            for a, b in izip(imap(int, reversed(str(n))), cycle((2, 1))))
    return x  # Hier fehlt noch was.
Bei dem ``return`` fehlt noch der 4. Schritt, da möchte ich den Spass beim selber lösen (der Hausaufgaben?) nicht vorwegnehmen. Andererseits kann sich der OP das auch aus dieser Scheme-Lösung rauslesen (wenn er das lesen kann :-)): http://paste.pocoo.org/show/28155/
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie gemein, jetzt fehlem ihm noch 6 Zeichen zur Lösung -- zumindest fällt mir nichts kürzeres ein ...:P
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Das ist ja alles gut und schön, aber würde es nicht gehen mit meinem Ansatz weiter zu machen? Unser Lehrer wäre nicht so erfreut wenn ich so viele Befehle benutze, die wir noch nicht besprochen haben...

Also ich würde eure Lösung halt gern verstehen^^
BlackJack

Und wir und Dein Lehrer hätten halt lieber eine Lösung von Dir, die Du verstehst. ;-)
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

ja ne ist klar. ich werd dem auch sicher kein programm geben das ich nicht selber verstehe.

ich will einfach nur wissen wie ihr sowas lösen würdet
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

nightm4r3^ hat geschrieben:ja ne ist klar. ich werd dem auch sicher kein programm geben das ich nicht selber verstehe.
optimal wäre natürlich, wenn du ihm ein Programm geben würdest, was du selber geschrieben hast.

Wie "wir" es lösen würden, hat blackjack dir gezeigt.
Wie du es lösen würdest, können wir dir nicht sagen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Sieht dein Quelltext immer noch so aus?

Code: Alles auswählen

#Definition der Quersumme:
def Quersumme(a):
    quersumme=sum([int(p) for p in str(a)])
    print quersumme

#Definition der Prüfziffer
def pruefziffer(a):
    Liste1=map(int, str(a))
    Listeungerade=[]
    i=len(Liste1)
    for n in range (0,i):
        if Liste1[n]%2==0:
            quersumme=Quersumme(Liste1[n]*2)
            print quersumme 
Die Berechnung der Quersumme funktioniert ja schonmal. Aber du solltest dir erst einmal die Mühe machen, etwas aufzuräumen, die Bezeichner geschickter und gemäß üblicher Konvention zu benennen (Funktionen und Variablen klein anfangen):
  • Eine zusätzliche Variable in der Quersummenfunktion brauchst du nicht. Statt einer Ausgabe auf den Bildschirm wäre die Rückgabe wohl sinnvoll. Darauf hat Leonidas schon hingewiesen.
  • Wenn du beim Erzeugen der Liste die Reihenfolge der Ziffern gleich umdrehst, machst du dir den Rest einfacher. Du kannst dann von vorne jedes zweite Listenelement behandeln. Wenn du bei range() bleiben willst, dann kannst du die Schrittweite als dritten Parameter ja gleich angeben und diese Elemente zunächst nur verdoppeln.
  • Dann läufst du einmal durch Liste und bildet von jedem Element die Quersummme, danach dann die Summe aller Listenelemente.
  • Wie du die Differenz zum nächsten Vielfachen von Zehn ermittelst, kannst du erstmal selbst überlegen. Das fehlt in deinem Code noch.
Antworten