Python-Neuling findet den kleinen Fehlerteufel nicht

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
Chillee
User
Beiträge: 7
Registriert: Sonntag 20. November 2011, 14:31

Hallo liebe Python-Community,

ich bin ein Neuling was Python betrifft, aber kein Neuling was Programmieren betrifft ;-) ! Ich habe schon mit C sowie C++ also auch Java gearbeitet.

Ich habe ein Programm geschrieben, welche triviale Potenzen im Bereich von 0 bis 100 ausgeben soll.
Dazu gibt es eine Funktion, die auf triviale Potenzen testet und jeweils 0 oder 1 zurück gibt (so von der Aufgabenstellung gefordert).
Soweit so gut...da ich in C etwas sicherer bin, das ganz in C getippt und dann in Python übersetzt.
In C hat alles super funktioniert und in Python passiert scheinbar gar nix :( ...die Ausgaben kommen, aber die trivialen Potenzen bleiben aus. Nun habe ich schon jede Menge rumprobiert und vor lauter probieren wahrscheinlich blind was den kleinen Fehler betrifft...deswegen hoffe ich nun, dass mir ein paar fremde Augen weiterhelfen können.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def power(n):
  if n < 4:
    return 0
  for i in range(2,n):
    zwErg = n
    while zwErg % i == 0:
      zwErg = zwErg/i
      if zwErg == 0:
        return 1
  return 0

def run():
  print "\nHausaufgabe 4\n"
  print "Alle trivialen Potenzen im Bereich von 0 bis 100: "
  a = 0
  for i in range(101):
    b = power(a)
    if b == 1:
      print a,
    a += 1
  print "\n"
  
# Startroutine
if __name__ == '__main__':
  run()
  raw_input('[Enter] fuer Programmende druecken')
Also das Programm an sich ist auch startfähig ;-) !

Danke schon mal für jede Hilfe!!!

Viele Grüße,
Chillee
BlackJack

@Chillee: Dann scheint ja etwas mit der `power()`-Funktion nicht zu stimmen. Vergleich doch mal den Ablauf dieser Funktion inklusive aller Zwischenergebnisse mit der C-Funktion die funktioniert. Dann solltest Du ja auf dem Unterschied kommen können.

Anmerkungen zum Quelltext: Per Konvention werden vier Leerzeichen pro Einrückebene verwenden. Das wird besonders dann wichtig, wenn man den Quelltext mit anderen teilt, oder zum Beispiel in einem Forum zum ausprobieren veröffentlicht.

Du schreibst ja extra das 0 und 1 von der Aufgabenstellung gefordert waren, also ist Dir wahrscheinlich bewusst, dass `False` und `True` eigentlich besser wären. Ich würde die an Deiner Stelle verwenden und argumentieren, dass es sich dabei trotzdem um 0 und 1 handelt, denn `bool` ist eine Unterklasse von `int` und die beiden Objekte `False` und `True` haben die Werte 0 und 1:

Code: Alles auswählen

In [42]: issubclass(bool, int)
Out[42]: True

In [43]: True == 1
Out[43]: True

In [44]: False == 0
Out[44]: True

In [45]: True + 1
Out[45]: 2

In [46]: 42 * False
Out[46]: 0
Warum gibt es `a`? Das nimmt in der Schleife die Werte 0 bis 100 an. Genau das tut auch `i`! Wenn man die Liste mit Zahlen nicht wirklich braucht, sollte man `xrange()` statt `range()` verwenden.

Vielleicht war der Name für `power()` auch vorgegeben, aber Testfunktionen haben üblicherweise `has_*` oder `is_*` als Vorsilbe.

Man kann hier auch die `filter()`- oder noch besser `itertools.ifilter()`-Funktion einsetzen:

Code: Alles auswählen

def main():
    print '\nHausaufgabe 4\n'
    print 'Alle trivialen Potenzen im Bereich von 0 bis 100: '
    for i in ifilter(is_trivial_power, xrange(101)):
        print i,
    print '\n'
`zwErg` ist ein niedlicher Name, aber keine übliche Abkürzung. Ich hätte hier `tmp` verwendet.
BlackJack

An der TU-Chemnitz gibt es eine Hausaufgabe (4. Übungszettel) die dieser entspricht, bis heute um Mitternacht abgegeben werden muss, aber in C zu lösen ist. Interessanter Zufall…
Chillee
User
Beiträge: 7
Registriert: Sonntag 20. November 2011, 14:31

@BlackJack: Danke für die vielen Tipps, ich weis in vielen Fällen hast du recht, aber du hast ja auch schon die Aufgabe gefunden :wink: .

Was neu für mich war ist die Konvention mit dem den 4 Leerzeichen, danke dafür.

Aber rein äußerlich findest du auch keinen Fehler in meinem Code oder?
Ich verstehe einfach nicht warum bei der Ausgabe:
Hausaufgabe 4

Alle trivialen Potenzen im Bereich von 0 bis 100:
kommt aber danach nix mehr. Ich finde meinen Denkfehler einfach nicht, formal stimmt es ja...abgesehen von Konventionen.


PS: Ja die Aufgabe ist für die Informatiker konzipiert, die es in C schreiben müssen. Ich bin Wirtschaftsinformatiker und muss mir dieses Jahr für die Prüfung noch Python aneignen sowie die Aufgabe in Python abgeben. :wink:


EDIT: Dieses "a" ist noch ein Überbleibsel von meiner ganzen Rumprobiererei ;D .
BlackJack

@Chillee: Gehe den Algorithmus doch einfach mal Schritt für Schritt durch mit einer Zahl von der Du weisst, dass es eine triviale Potenz ist. Dann wirst Du den tatsächlich ziemlich einfachen Fehler finden.
Chillee
User
Beiträge: 7
Registriert: Sonntag 20. November 2011, 14:31

aaaaarrrrrggggggg.....verdammt!!!

@BlackJack: Vielen herzlichen Dank!!!

Ich war grad mal eine Runde laufen und schon sieht die Welt ganz anders aus...da hätte ich eigentlich gar nicht doof fragen müssen :D, aber immerhin paar gute Tipps bekommen!
Wer natürlich den C-Code:

Code: Alles auswählen

while(zwErg%i == 0){
			zwErg = zwErg/i;
			if(zwErg == 1) return 1;  //Man bemerkte zwErg == 1
		}	
in folgenden Python-Code umwandelt:

Code: Alles auswählen

while zwErg % i == 0:
      zwErg = zwErg/i
      if zwErg == 0:                                  # Hier plötzlich zwErg == 0....warum? Keiner weis es :D 
          return 1
ist natürlich selber schuld, wenn er sich wundert warum nix funktioniert!
Aber um das zu sehen war ich vorhin einfach zu blind.

Problem gelöst!!! Ich wünsche noch einen angenehmen Sonntagabend!

Viele Grüße,
Chillee
Antworten