Seite 1 von 3
Kann mir jemand hierbei helfen?
Verfasst: Freitag 18. Oktober 2019, 15:15
von Neiqi
Hallo, ich bin ein kompletter Einsteiger in Python und genrell in Informatik komme aber wegen mein Maschinenbau Studium nicht drum rum.
Meine Aufgabe ist es, ein Programm zu schreiben, welches sagt, ob die eingegebene Zahl durch 5 Teilbar ist ohne Rest und ob sie größer ist als 100.
Das hier ist mein Ansatz:
Code: Alles auswählen
Zahl = str(input("Bitte gebe hier deine Zahl ein"))
Zahl2 = Zahl[len(Zahl)-1]
if Zahl2 == (0, 5):
print("deine Zahl ist durch 5 Teilbar ohne Rest")
else:
print("deine Zahl ist nicht durch 5 Teilbar ohne Rest")
if (0, 1) != Zahl2 > str(len(Zahl)):
print("deine Zahl ist größer als 100")
Funktioniert aber nicht...

Re: Kann mir jemand hierbei helfen?
Verfasst: Freitag 18. Oktober 2019, 17:42
von pixewakb
Mit Deinem Programm kann ich nichts anfangen, das dürfte so nicht funktionieren.
Schau mal hier:
Code: Alles auswählen
zahl = int(input("Geben Sie eine Zahl ein: "))
if zahl % 5 == 0 and zahl > 100:
print("Die Zahl ist durch 5 teilbar und größer als 100.")
else:
print("Die Zahl ist nicht durch 5 teilbar oder/und nicht größer als 100")
Re: Kann mir jemand hierbei helfen?
Verfasst: Freitag 18. Oktober 2019, 19:42
von Sirius3
Wie soll Dein Algorithmus funktionieren? Ka nst Du das erklären? Und gleich noch dazu welchen Typ die Werte Deine Variablen haben und mit was Du sie vergleichst?
Re: Kann mir jemand hierbei helfen?
Verfasst: Freitag 18. Oktober 2019, 20:56
von Neiqi
Erstmal vielen Dank für die Antworten und die Untersützung.
Ich habe mir das so gedacht, dass ich die Variable als String ansehe.
Dann nehme ich die länge von dem String und schaue mir die letzte Ziffer an ist diese eine 0 oder 5 ist sie ohne Rest Teilbar, wenn nicht dann halt nicht. Bei dem zweiten IF wollte ich ebenfalls die Zahl als String ansehen und mit dem gleichen Prinzip vorgehen gibt es mehr als zwei stellen muss die Zahl über 100 sein. So habe ich mir das gedacht ^^ LG
Re: Kann mir jemand hierbei helfen?
Verfasst: Freitag 18. Oktober 2019, 21:03
von nezzcarth
Neiqi hat geschrieben: Freitag 18. Oktober 2019, 20:56
Ich habe mir das so gedacht, dass ich die Variable als String ansehe.
Das Schöne an Zahlen ist ja, dass man damit rechnen kann

Wenn man Zahlen wie Strings behandelt, macht man oft etwas falsch. Für die Berechnung des Divisionsrests gibt es eine definierte Operation (Modulo), die man verwenden kann; in Python verbirgt sie sich hinter dem "%". Falls du das nicht verwenden darfst oder möchtest, gibt es immer noch die Möglichkeit, einen entsprechenden Algorithmus, der das ausrechnet, zu implementieren.
Insbesondere die beiden if-Statements in deinem Beispiel ergeben so leider wenig Sinn. Beim ersten prüfst du etwa, ob die Variable Zahl (die man übrigens klein schreiben sollte) dem Tupel (0, 5) entspricht; und im zweiten prüfst du zunächst, ob das Tupel (0,1) ungleich der Variable Zahl2 ist und dann, ob das Ergebnis dessen -- ein Wahrheitswert -- größer als die in eine Zeichenkette umgewandelte Länge von 'Zahl' ist...

Vielleicht solltest du dich noch etwas besser mit Python vertraut machen, zum Beispiel mittels des offiziellen Tutorials.
Re: Kann mir jemand hierbei helfen?
Verfasst: Freitag 18. Oktober 2019, 21:44
von __blackjack__
@nezzcarth: Ich glaube bei dem zweiten ``if`` hast Du die Operatorverkettung nicht berücksichtigt:
Code: Alles auswählen
(0, 1) != Zahl2 > str(len(Zahl))
# ist äquivalent zu:
(0, 1) != Zahl2 and Zahl2 > str(len(Zahl))
Re: Kann mir jemand hierbei helfen?
Verfasst: Freitag 18. Oktober 2019, 22:14
von nezzcarth
__blackjack__ hat geschrieben: Freitag 18. Oktober 2019, 21:44
Code: Alles auswählen
(0, 1) != Zahl2 > str(len(Zahl))
# ist äquivalent zu:
(0, 1) != Zahl2 and Zahl2 > str(len(Zahl))
Danke, das habe ich vergessen und nicht ausprobiert. Meist sieht man es ja mit gleichen Operatoren, da ist es einleuchtender.
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 01:11
von Neiqi
Danke nochmals, wie gesagt bin noch ein blutiger Anfänger.
Was mich aber einfach Interessieren würde, ob meine Art von Algorithmus auch funktioniert?
Wie steuer ich die letzte Zahl in einem String an z.B. ?
Ehm die Aufgabe gilt nur zur Übung ist keine HA oder sonst was also alles erlaubt.
Gibt es auch noch möglichkeit mit Import zu arbeiten? Ich bin da sehr offen und gespannt in welchen Methoden man solch eine Aufgabe alles lösen kann. Danke !

LG
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 08:26
von nezzcarth
Neiqi hat geschrieben: Samstag 19. Oktober 2019, 01:11
Danke nochmals, wie gesagt bin noch ein blutiger Anfänger.
Was mich aber einfach Interessieren würde, ob meine Art von Algorithmus auch funktioniert?
Wie steuer ich die letzte Zahl in einem String an z.B. ?
Um die einzelnen Ziffern rechnerisch zu erhalten, benötigt man ebenfalls Modulo und muss die Basis der jeweiligen Zahlendarstellung berücksichtigen. Wie man die einzelnen Elemente einer Zeichenkette ansteuert, wird im offiziellen Tutorial gut erklärt. Du hattest ja oben schon die Index-Notation mit den eckigen Klammern, aber der eingesetzte Wert war falsch und der Ausdruck fehlerhaft. Python unterscheidet verschiedene Datentypen und wenn man eine Zahl wie eine Zeichenkette verwenden möchte (um ihre Länge zu bestimmen etwa), muss man sie zu einer Zeichenkette machen.
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 09:34
von ThomasL
Neiqi hat geschrieben: Samstag 19. Oktober 2019, 01:11
Was mich aber einfach Interessieren würde, ob meine Art von Algorithmus auch funktioniert?
So richtig hast du ja noch keinen Algorithmus ausgearbeitet.
Hier mal auf die Schnelle meine Gedanken dazu, möglich das nicht alle Fälle bedacht sind.
Code: Alles auswählen
eingabe = input("Bitte gebe hier deine Zahl ein:")
if len(eingabe) > 0 and all(zeichen in "0123456789" for zeichen in eingabe):
if len(eingabe) > 1 and eingabe[-1] in "05":
print(f"{eingabe} ist glatt durch 5 teilbar.")
if (len(eingabe) == 3 and eingabe[-3] != "0" and eingabe[-1] != "0") or (len(eingabe) > 3 and any(zeichen in "123456789" for zeichen in eingabe[:-2])):
print(f"{eingabe} ist größer als 100.")
else:
print(f"{eingabe} ist keine gültige Zahl.")
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 09:38
von __deets__
Ich denke der Algorithmus den du dir gedacht hast ginge schon. Ein simples
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 09:55
von Neiqi
Super !
Er funktioniert! Hier jetzt mein Algorithmus.
Code: Alles auswählen
Zahl = str(input("Bitte gebe hier deine Zahl ein"))
if Zahl[-1] in ('0', '5'):
print("deine Zahl ist durch 5 Teilbar ohne Rest")
else:
print("deine Zahl ist nicht durch 5 Teilbar ohne Rest")
if len(Zahl) > 3:
print("Deine Zahl ist größer als 100")
else:
print("Deine Zahl ist kleiner als 100")
Ja ich weiß, man hätte es auch mit modulo machen können, dennoch wollte ich meinen Ansatz verwirklichen und schauen, ob der funktioniert.
Zudem habe ich da mal eine letzte Frage, in richtig großen Projekten ist es nicht sogar besser wenn man den Computer sowenig wie möglich rechnen lässt wenn es auch anders geht wie in meinem Code zum Beispiel. In meinem Code schaut sich das Programm doch nur 1 Zahlengruppe an undzwar die welche als letztes in dem String aufgeführt wurde müsste doch schneller sein als die Zahl zu berechnen oder sehe ich da was Falsch? Ist jetzt vielleicht ein bisschen weit her geholt, aber wenn man das auf riesen Projekte überträgt mit mehreren 100.000 Zeilen code? Dann müsste doch für das gleiche Ergebnis das Programm an sich, weniger Arbeitsspeicher und Prozessorkapazität benötigen?
Einfach nur ein gedanken Spiel. Bin auf eure Antworten gespannt aber das Problem habe ich jetzt gelöst danke !
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 10:10
von ThomasL
Dann gib doch mal 101 ein....
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 10:23
von Fire Spike
diese zeile ist falsch. len() sagt wie lange etwas ist. du vergleichst ob die zahl mehr als 3 stellen hat!
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 10:49
von ThomasL
__deets__ hat geschrieben: Samstag 19. Oktober 2019, 09:38
Ich denke der Algorithmus den du dir gedacht hast ginge schon. Ein simples
len(s) > 2 zur Überprüfung ob die Zahl > 100 ist passt aber nicht für z.B. 100 oder 000.
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 11:21
von nezzcarth
Neiqi hat geschrieben: Samstag 19. Oktober 2019, 09:55
In meinem Code schaut sich das Programm doch nur 1 Zahlengruppe an undzwar die welche als letztes in dem String aufgeführt wurde müsste doch schneller sein als die Zahl zu berechnen oder sehe ich da was Falsch?
Das kann man doch leicht selbst ausprobieren. Um die Antwort mal vorweg zu nehmen: Nein.
Hier mal ein Beispiel. Wenn man es zuverlässiger machen wollte, würde man Zufallszahlen und ggf. das 'timeit'-Modul nehmen.
Code: Alles auswählen
#!/usr/bin/env python3
from time import time
N = 556
REPETITIONS = 100
def string_based(n):
s = str(n)
return str(s)[-1] in ('0', '5') and len(s) > 2
def modulo_based(n):
return n % 5 == 0 and n > 100
ALGORITHMS = (
('string comparison', string_based),
('modulo calculation', modulo_based),
)
def main():
divisible = [(10**i) + j for i in range(1, N) for j in (0, 5)]
indivisible = [(10**i) + j for i in range(1, N) for j in (1, 3)]
print('N:', N)
print('Repetitions:', REPETITIONS)
results = dict()
for label, function in ALGORITHMS:
results[label] = 0
for _ in range(REPETITIONS):
t1 = time()
for group in (divisible, indivisible):
for number in group:
result = function(number)
t2 = time()
results[label] += t2 - t1
for label, duration in results.items():
print(label, duration)
if __name__ == '__main__':
main()
Code: Alles auswählen
$ ./fives.py
N: 556
Repetitions: 100
string comparison 0.6362471580505371
modulo calculation 0.11104273796081543
$ ./fives.py
N: 1234
Repetitions: 100
string comparison 4.7894392013549805
modulo calculation 0.4755685329437256
EDIT:
Und auch die rechnerische Umsetzung deines Vorgehens in nachfolgendem (etwas kruden) Algorithmus ist schneller:
Code: Alles auswählen
def decimal_based(n):
if n % 10 not in (0, 5):
return False
i = 0
k = n
while k > 0:
print(i, k)
i += 1
k //= 10
if i > 2:
return False
return True
Code: Alles auswählen
$./fives.py
N: 2346
Repetitions: 100
string comparison 29.056050539016724
modulo calculation 1.6789634227752686
decimal position 4.096552848815918
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 12:07
von nezzcarth
Wobei, damit es vergleichbarer ist, müsste man bei der reinen Modulo Variante auf ' > 99' prüfen. Zwar schriebst du einleitend, dass es größer 100 sein soll, dein Beispiel gibt das aber nicht her; eine "Ziffern-basierte" Lösung wäre mit der Bedingung noch komplizierter.
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 12:09
von __deets__
Stimmt. Aber das ist ja auch nur eine Bedingung mehr, die auf den Vergleich mit == rausläuft. Und damit auch „nur“ auf strings arbeitet.
Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 12:16
von nezzcarth
__deets__ hat geschrieben: Samstag 19. Oktober 2019, 12:09
Stimmt. Aber das ist ja auch nur eine Bedingung mehr, die auf den Vergleich mit == rausläuft. Und damit auch „nur“ auf strings arbeitet.
Ja, das stimmt. Ich habe dabei zugegeben eher an den Algorithmus gedacht, den ich als Drittes noch nachgeschoben habe. Dort wird die Anzahl der Ziffern ja "ausgerechnet" und dabei noch einzubauen, dass die 100 als einzige dreistellige Zahl erlaubt ist, wäre glaube ich eher schwierig (ich habe es noch nicht ausprobiert).
Edit: ...oder doch nicht. Man kann ja explizit auf 100 prüfen.

Re: Kann mir jemand hierbei helfen?
Verfasst: Samstag 19. Oktober 2019, 12:48
von Sirius3
@nezzcarth: Deine Zeitmessung geht davon aus, dass Du schon Zahlen hast und diese in Strings umwandeln mußt, der OP hat aber genau den umgekehrten Fall, mit umgekehrten Zeiten:
Code: Alles auswählen
string comparison 0.1410079002380371
modulo calculation 0.6277883052825928