Schleife: Wenn alle b/i ganz--->Meldung

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
Benutzeravatar
Klebewesen
User
Beiträge: 2
Registriert: Donnerstag 28. August 2008, 16:55
Wohnort: hinterm Mond, in einem verrosteten Backofen.

Moin, moin!

Kurz vorweg: Ich bin bloß eine arme kleine Anfängerin, die keine Ahnung von (fast) nix hat. Daher bitte ich die in Ehren ergrauten Spezialisten hier darum, gnädig über meine Trotteligkeit hinwegzusehen. :wink:

Nun zu meinem Problem(chen).

Ich möchte gern ein kleines Programm schreiben, das die Teilbarkeit einer bestimmten Zahl b durch alle natürlichen Zahlen 2 bis x testet. Ist b durch alle Zahlen teilbar, so soll eine entsprechende Meldung A ausgegeben werden; wenn es bei der Division durch eine dieser Zahlen einen Rest gibt, wird das Durchprüfen bei dieser Zahl gestoppt und die Meldung B ausgegeben.

Dafür erschien mir eine Schleife ganz praktisch:

Zunächst müssen b und x definiert werden. Da bei der Division zweier Integer der Nachkommarest, den ich aber zur Überprüfung der Teilbarkeit brauche, unter den Tisch fallen gelassen wird, definiere ich b gleich als float.

for i in range(2,x+1):

... if b/i =! int(b/i): #Wenn b/i keine ganze Zahl ist...
... return B

Tja, soweit, so schlecht.
Nur weiß ich nun nicht, wie ich es schaffe, das Programm eine Meldung ausgeben zu lassen, wenn ALLE Quotienten b/i durchgeprüft wurden und ganz sind. Könnte mir da jemand helfen?

Vielen Dank im Voraus! :D

Das Klebewesen

P.S.: Bitte stört euch nicht an den paar Syntaxfehlern, die kann ich auch selber noch korrigieren. ;)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ich würde `yield` statt `return` verwenden und den Wahrheitswert mit all() prüfen.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!

ich denke, das muesste gehen:

Code: Alles auswählen

def check(b, x):
  for i in xrange(2,x+1):
    y = b/i  # so braucht man es nur einmal auszurechnen
    if not y == int(y): return i-1
  return True

b = 10.0
x = 5
result = check(b, x)
if result == True: print "durch alles teilbar bis " + str(x)
else: print "nur teilbar durch zahlen bis " + str(result)
du kannst natuerlich auch zeile 7-8 ersetzen durch:

Code: Alles auswählen

while True:
  try:
    b = float(raw_input("zu pruefende zahl: "))
    x = int(raw_input("pruefen bis: "))
  except ValueError: continue
  break
mfg
roschi

PS: 'xrange' ist schneller als 'range'

EDIT: kleiner denkfehler im code ausgebessert
Zuletzt geändert von roschi am Samstag 30. August 2008, 17:25, insgesamt 2-mal geändert.
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Hallo,

du kannst für sowas mit dem "Modulo" Operator arbeiten:

Code: Alles auswählen

def f(b, x):
    for i in xrange(2, x+1):
        if b % i != 0:
            print "Es gibt einen Rest."
Alternativ solltest du, wenn du schon weist, was List Comprehensions und Generator Ausdrücke sind, mit diesen in Kombination mit Funktionen arbeiten, grade bei solchen eher einfachen, mathematischen Dingen sind diese Dinge sehr nützlich:

Code: Alles auswählen

def f(b, x):
    return all(b % i == 0 for i in xrange(2, x+1))

if f(2, 4):
    print "Es gibt keinen Rest."
else:
    print "Es gibt einen Rest."
abgdf

... bei mir sieht's so aus:

Code: Alles auswählen

#!/usr/bin/env python

b = 12

x = 4

y = 0

for i in range(2, x + 1, 1):

    if b % i:

        print "B"
        break

    else:
        y += 1

if y == x - 1:
    print "A"
Gruß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@abgdf: Eine kleine Vereinfachung:

Code: Alles auswählen

for i in range(2, x+1):
    if b % i:
        print "B"
        break
else:
    print "A"

@str1442: Alternativ auch:

Code: Alles auswählen

def f(b, x):
	return not any(b%i for in in range(2, x+1))
Ist aber sicherlich Geschmackssache.
abgdf

@EyDu: Worauf bezieht sich denn Dein "else:" in Zeile 5 ?
Von der Einrückung kommt das mit dem "if" nicht hin, und wenn man es in die for-Schleife ziehen würde, würde es nicht das machen, was die OP wollte (Ausgabe "A" nur, wenn "b durch alle Zahlen teilbar").

Gruß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Natürlich bezieht sich das else auf das for. In welchem Fall sollte meine Variante deiner Meinung nach denn nicht funktionieren?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

EyDu hat geschrieben:Natürlich bezieht sich das else auf das for. In welchem Fall sollte meine Variante deiner Meinung nach denn nicht funktionieren?
Sicher funktioniert das.
Aber dafür funktioniert deine Alternative nicht .... :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Verarschen kann ich mich alleine schon ganz gut :lol: , aber ich hätte dann doch gerne ein konkretes Beispiel, bei dem meine Variante versagt. Ich sehe nämlich gerade kein Problem.
BlackJack

@EyDu: Der Compiler sieht ein Problem:

Code: Alles auswählen

In [22]: def f(b, x):
   ....:     return not any(b%i for in in range(2, x+1))
------------------------------------------------------------
   File "<ipython console>", line 2
     return not any(b%i for in in range(2, x+1))
                             ^
<type 'exceptions.SyntaxError'>: invalid syntax
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ja, das ist mir auch schon aufgefallen, aber es ist ja nicht so, dass man nicht sofort erkennen könnte, dass das erste "in" nur "i" bedeuten soll. Allerdings haben abgdf und numerix sich auf meinen ersten Vorschlag bezogen.

Edit: Ach jetzt verstehe ich numerix Post. Der erste Satz bezog sich nicht auf das else sondern auf die ganze erste Variante und der zweite Satz auf den Syntaxfehler. :idea:
Zuletzt geändert von EyDu am Sonntag 31. August 2008, 12:41, insgesamt 1-mal geändert.
Benutzeravatar
Klebewesen
User
Beiträge: 2
Registriert: Donnerstag 28. August 2008, 16:55
Wohnort: hinterm Mond, in einem verrosteten Backofen.

Ui, ich stelle mit Freuden fest, dass hier doch einige geantwortet haben! :D

Zwar sind mir die Methoden, die ihr angewandt habt, zum Großteil noch unbekannt; da muss ich mich erst einmal reinlesen. Trotzdem vielen Dank für die (aus meiner Sicht übrigens sehr eleganten *schleim* :wink: ) Lösungsvorschläge!
Es gibt drei Sorten von Mathematikern auf der Welt: Die einen können bis drei zählen, die anderen nicht.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

EyDu hat geschrieben:Edit: Ach jetzt verstehe ich numerix Post. Der erste Satz bezog sich nicht auf das else sondern auf die ganze erste Variante und der zweite Satz auf den Syntaxfehler. :idea:
Ja, genauso war das gemeint ...
abgdf

@EyDu: Oh, Entschuldigung (s.o) :oops:. Ich hätte echt nicht gedacht, daß es "for ... else" - Schleifen gibt.

Sicher sehr komfortabel, andererseits möchte ich mich aber so ausdrücken, daß der Code (z.B. gegenüber C) möglichst wenig Sprachbesonderheiten enthält.

Viele Grüße
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

abgdf hat geschrieben:@EyDu: Oh, Entschuldigung (s.o) :oops:. Ich hätte echt nicht gedacht, daß es "for ... else" - Schleifen gibt.
Dafür muss man sich doch nicht entschuldigen, es können ja nicht alle so allwissen sein wie ich :lol:
abgdf hat geschrieben:Sicher sehr komfortabel, andererseits möchte ich mich aber so ausdrücken, daß der Code (z.B. gegenüber C) möglichst wenig Sprachbesonderheiten enthält.
Dann solltest du wohl besser C programmieren ;-) Nee, mal im Ernst: Ich benutze eine Sprache ja gerade deshalb, weil ich der Meinung bin, dass sie geeigneter für eine Aufgabe ist als eine andere. Wenn ich die (sinnvollen) neuen Features nicht nutze habe ich keinen Vorteil. Versteht ein "C-Programmierer" keine Python-Programme ist das nicht mein Problem.
BlackJack

Warum dann eine andere Sprache verwenden, wenn man deren Konstrukte nicht benutzen möchte? Gerade gegenüber solchen "low level"-Sprachen wie C bietet Python da einiges.
abgdf

Hi,
Dann solltest du wohl besser C programmieren
Genaugenommen wollte ich das eigentlich auch, hab's auch mehrfach versucht, hab' es dann aber jedesmal wieder seingelassen. C's Datentypen waren mir zu schwer zu handhaben, und Speicherfehler zu finden, war zu schmerzhaft. Es fehlten mir da vor allem so aussagekräftige Fehlermeldungen wie in Python. Um in C ein größeres Programm zu realisieren, muß man eben den Aufwand treiben, der dazu nötig ist und allgemein auch betrieben wird, das heißt, man braucht größere Entwicklerteams. Als einzelner Hobbyprogrammierer kann ich in Python viel mehr realisieren, das heißt, ich kann in Python Sachen machen, die ich in C schon vom Aufwand her gar nicht schaffen könnte.

Mit sprachtypischen Features ist das so eine Sache: Perl, das voll von solchen speziellen Features ist, ist wohl ein gutes Negativbeispiel. Jemand, der Perl nicht wirklich gut kennt, kann Code nicht verstehen, der von Perl-Profis geschrieben ist, obwohl er durchaus schon brauchbare Programme schreiben kann.
Most important, you don't have to know everything there is to know about Perl before you can write useful programs. You can learn Perl "small end first". You can program in Perl Baby-Talk, and we promise not to laugh. Or more precisely, we promise not to laugh any more than we'd giggle at a child's creative way of putting things ... Though simple in many ways, Perl is also a rich language, and there is much to learn about it. That's the price of making hard things possible. Although it will take some time for you to absorb all that Perl can do, you will be glad that you have access to the extensive capabilities of Perl when the time comes that you need them.
http://www.unix.com.ua/orelly/perl/prog3/ch00_01.htm
(Kamel-Buch)
Wieauchimmer, jedenfalls möchte ich gern altbekannte Strukturen verwenden, wenn das möglich ist.
Ich glaube, das stimmt auch ganz gut mit dem Zen von Python überein.
Ist aber sicher Geschmackssache.

Viele Grüße
BlackJack

Das ``for`` oder ``while`` mit ``else`` verwendet werden kann, ist vielleicht ein wenig "exotisch", aber man kann und sollte altbekannte C-Konstrukte schon deshalb nicht verwenden, weil es keine Entsprechung der ``for``-Schleife von C in Python gibt. Python kennt "nur" das iterieren über "iterierbare" Objekte und dieser Umstand (und auch Guido) favorisiert Iteratoren/Generatorausdrücke, die es so in C nicht gibt.

Die guten alten C-Kosntrukte mit iterieren über ``xrange(len(obj))`` und Indexzugriffen nach zu bauen ist definitiv eine schlechte Idee. Man sollte nicht C in Python programmieren.

Und die Lösungen mit ``not any(…)`` oder ``all(…)`` und einem Generatorausdruck finde ich recht "pythonisch" und elegant und eigentlich auch ganz gut verständlich.
Antworten