Kann mir jemand hierbei helfen?

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.
Neiqi
User
Beiträge: 26
Registriert: Freitag 18. Oktober 2019, 15:10

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... :D
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

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")
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Neiqi
User
Beiträge: 26
Registriert: Freitag 18. Oktober 2019, 15:10

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
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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))
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

__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.
Neiqi
User
Beiträge: 26
Registriert: Freitag 18. Oktober 2019, 15:10

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
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.")
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke der Algorithmus den du dir gedacht hast ginge schon. Ein simples

Code: Alles auswählen

if len(s) > 2 and s[-1] in ('0', '5'):
Neiqi
User
Beiträge: 26
Registriert: Freitag 18. Oktober 2019, 15:10

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 !
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Dann gib doch mal 101 ein....
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Code: Alles auswählen

if len(Zahl) > 3:
diese zeile ist falsch. len() sagt wie lange etwas ist. du vergleichst ob die zahl mehr als 3 stellen hat!
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

__deets__ hat geschrieben: Samstag 19. Oktober 2019, 09:38 Ich denke der Algorithmus den du dir gedacht hast ginge schon. Ein simples

Code: Alles auswählen

if len(s) > 2 and s[-1] in ('0', '5'):
len(s) > 2 zur Überprüfung ob die Zahl > 100 ist passt aber nicht für z.B. 100 oder 000.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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

nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Stimmt. Aber das ist ja auch nur eine Bedingung mehr, die auf den Vergleich mit == rausläuft. Und damit auch „nur“ auf strings arbeitet.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

__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. :)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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
Antworten