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

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

Beitragvon Klebewesen » Samstag 30. August 2008, 16:47

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: 2405
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Samstag 30. August 2008, 17:06

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:

Beitragvon roschi » Samstag 30. August 2008, 17:19

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.
Fuer Alle, die in Python einsteigen wollen, kann ich das Buch A Byte of Python nur waermstens empfehlen!
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beitragvon str1442 » Samstag 30. August 2008, 17:20

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

Beitragvon abgdf » Samstag 30. August 2008, 17:35

... 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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Samstag 30. August 2008, 18:03

@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

Beitragvon abgdf » Samstag 30. August 2008, 20:36

@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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Samstag 30. August 2008, 20:51

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

Beitragvon numerix » Samstag 30. August 2008, 21:02

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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Samstag 30. August 2008, 22:21

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

Beitragvon BlackJack » Sonntag 31. August 2008, 06:48

@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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 31. August 2008, 07:58

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.

Dankeschön :)

Beitragvon Klebewesen » Sonntag 31. August 2008, 12:27

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

Beitragvon numerix » Sonntag 31. August 2008, 12:47

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

Beitragvon abgdf » Sonntag 31. August 2008, 16:36

@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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]