Recht simples Rechenprogramm...

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
Daniel123
User
Beiträge: 5
Registriert: Freitag 27. September 2019, 11:38

Hallo,
ich versuche ein kleine Rechenprogramm zu schreiben bei dem man 24 Kommazahlen eingibt. Das Programm soll dann immer 3 Zahlen miteinander multiplizieren (sollte 2925 mögliche Kombinationen geben) und mir dann diejenigen Produkte( mit den einzelnen Faktoren) anzeigen die in einem bestimmten Bereich liegen.
Das Programm muss nicht "schön" aussehen ich bin nur an den Ergebnissen interessiert...

Komme da nicht wirklich weiter..

a = float(input())
b = float(input())
.
.
.
x = float(input())

i=

for i in range ()
print i




Danke im Voraus...
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Verstehe das Problem leider nicht. Kannst du bitte versuchen das ein bisschen genauer zu beschreiben? Also welches Verhalten erwartest du und was passiert stattdessen tatsächlich? (Am Besten anhand eines kleines Beispiels) Und was für Code hast du schon geschrieben? Mit deinem Code da oben kann ich leider nicht viel Anfangen und so (wie er da steht) wird der Code auch nicht laufen.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt 24 Zahlen einzeln Variablen zuzuweisen, benutzt man dafür Schleifen und Listen.
Dann brauchst Du noch itertools.combinations für die Dreierpäckchen.
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

Daniel123 hat geschrieben: Freitag 27. September 2019, 11:51 (sollte 2925 mögliche Kombinationen geben)
Ich komme auf 2024 (Binomialkoeffizient); das ist auch, was mit itertools.combinations herauskommt.
Daniel123
User
Beiträge: 5
Registriert: Freitag 27. September 2019, 11:38

Erstmal danke dass hier jemand geantwortet hat...
2024 stimmt, bin schon so verwirrt von den Erinnerungen an den Informatik Grundkurs an der Uni dass da nicht mehr viel geht im Köppes...
Es geht um optimale Teambildung und darum aus 24 Leuten die besten 3er Teams in bestimmten Bereichen zu bilden.
Das Programm sollte so laufen, dass ich 24 Zahlen eingebe, dann eine Range(bspw. 22,5-23,9) und dann alle Triples(bspw 2,5*3,1*2,9) angezeigt bekomme die in dieser Range liegen.
Kann mich noch daran erinnern das der damalige Dozent ein komplizierteres Rechenprogramm mit 7-8 Zeilen code in 2 Minuten gemacht hat und hab mir gedacht das sollte doch dann
nicht so kompliziert sein, aber denkste...
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

Daniel123 hat geschrieben: Freitag 27. September 2019, 15:11 Kann mich noch daran erinnern das der damalige Dozent ein komplizierteres Rechenprogramm mit 7-8 Zeilen code in 2 Minuten gemacht hat und hab mir gedacht das sollte doch dann
nicht so kompliziert sein, aber denkste...
Ja, 8 Zeilen kommt hin:

Code: Alles auswählen

In [1]: from itertools import combinations                                           

In [2]: from functools import reduce                                                 

In [3]: from operator import mul                                                     

In [4]: from random import uniform                                                   

In [5]: numbers = [uniform(-20, 20) for _ in range(24)]                            

In [6]: triplets = ((triplet, reduce(mul, triplet)) for triplet in combinations(numbers, 3))                                                                      

In [7]: for item in filter(lambda x:-50.0 < x[1] < 50.0, triplets): 
   ...:     print(item) 
Allerdings ist das nicht die anfängerfreundliche Variante. 'reduce' und 'lambda' sind zudem umstritten. Mit 'itertools.combinations' lässt es sich auch komfortabel mit den Sprachelementen (Listen, Schleifen, Abfragen, ggf. List Comprehensions), die im offiziellen Tutorial erklärt werden, lösen -- wenn auch nicht in 8 Zeilen ;)
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

nezzcarth hat geschrieben: Freitag 27. September 2019, 15:46 Mit 'itertools.combinations' lässt es sich auch komfortabel mit den Sprachelementen (Listen, Schleifen, Abfragen, ggf. List Comprehensions), die im offiziellen Tutorial erklärt werden, lösen -- wenn auch nicht in 8 Zeilen ;)
...oder doch:

Code: Alles auswählen

In [1]: from itertools import combinations                                           

In [2]: numbers = [float(input()) for _ in range(24)]                                

In [3]: for triplet in combinations(numbers, 3): 
  ....:     # Wenn es immer nur Triplets sind, könnte natürlich auch einfach die drei Zahlen in einer Zeile multiplizieren...     
   ...:     product = 1 
   ...:     for item in triplet: 
   ...:         product *= item 
   ...:     if 30.0 < product < 35.0: 
   ...:         print(triplet, product) 
Wenn man daraus ein richtiges Skript machen möchte, ist es natürlich doch etwas länger. Man würde die Kernfunktion vmtl. in eine parametrisierbare Funktion kapseln und die Eingabe etwas fehlertoleranter gestalten.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Ab Python 3.8 kann man auch einfach math.prod benutzen.
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

Sirius3 hat geschrieben: Freitag 27. September 2019, 19:19 Ab Python 3.8 kann man auch einfach math.prod benutzen.
Das wusste ich nicht. Dauert ja nicht mehr so lange, bis es heraus kommt :) (aber leider dann doch, bis die Version so abgehangen ist, dass man das Feature bedenkenlos verwenden kann).
Daniel123
User
Beiträge: 5
Registriert: Freitag 27. September 2019, 11:38

Vielen Dank für die Mühe, so weit wäre ich im Leben nicht gekommen.
Wenn ich versuche das Programm laufen zu lassen bekomme ich die Fehlermeldung from (vor itertools) invalid syntax,
ich habe die aktuellste Python version muss ich da noch etwas importieren oder am code ergänzen?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Daniel123: Du musst da noch was am Code ”ergänzen”. Einfach mal das Tutorial in der Python-Dokumentation durcharbeiten um zu sehen wie Python-Quelltext aussieht und dann ein ganz kleines bisschen überlegen was denn an dem gezeigten Quelltext anders ist. 😉
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Daniel123
User
Beiträge: 5
Registriert: Freitag 27. September 2019, 11:38

Das Programm läuft jetzt, zumindest ohne Fehlermeldung. Weiß allerdings nicht wie ich die Werte und den Zielbereich eingeben soll.Ich werd mein Bestes geben und mich nochmal melden falls ich nicht weiterkomm... Kaum zu glauben aber ich hab damals das Python Modul mit 2,3 bestanden...
@nezzcarth für die Mühe die du dir da gemacht hast würde ich mich gern erkenntlich zeigen, wenn du einen Verein oder eine Organisation etc. unterstützt würde ich dir zu Ehren da ein paar Euronen spenden...
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

Daniel123 hat geschrieben: Sonntag 29. September 2019, 05:38 Weiß allerdings nicht wie ich die Werte und den Zielbereich eingeben soll.
Im zweiten Beispiel habe ich ja einen Hinweis gegeben, wie man das machen kann. Mit 'input()' kann man Eingaben erfragen und diese müssen dann in den passenden Datentyp (float) konvertiert werden. Die Frage wäre halt auch, welches Interface du dir vorstellst. Wäre das Skript für mich, würde ich vermutlich den Wertbereich als Kommandozeilen Parameter abfragen und die Zahlen aus einer Textdatei einlesen.

Hier mal ein simples funktionsfähiges Beispiel, das sich auf grundlegende Sprachbestandteile beschränkt. Das kann man noch deutlich schöner schreiben:

Code: Alles auswählen

#!/usr/bin/env python
from itertools import combinations

N = 24


def read_number(message=''):
    while True:
        content = input(message)
        try:
            return float(content)
        except ValueError:
            print('Invalid input.')


def main():
    lower = read_number('Lower limit: ')
    upper = read_number('Upper limit: ')
    if lower >= upper:
        raise ValueError
    numbers = []
    print('Numbers:')
    for i in range(N):
        number = read_number('{}. '.format(i + 1))
        numbers.append(number)
    print('=' * 79)
    for triplet in combinations(numbers, 3):
        product = 1
        for item in triplet:
            product *= item
        if lower < product < upper:
            print('{} * {} * {} = {}'.format(*triplet, product))


if __name__ == '__main__':
    main()
Daniel123 hat geschrieben: Sonntag 29. September 2019, 05:38 @nezzcarth für die Mühe die du dir da gemacht hast würde ich mich gern erkenntlich zeigen, wenn du einen Verein oder eine Organisation etc. unterstützt würde ich dir zu Ehren da ein paar Euronen spenden...
Das ist eine nette Geste, aber kostenlose Hilfe ist ja der Zweck des Forums. :)
Zuletzt geändert von nezzcarth am Sonntag 29. September 2019, 16:04, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei Textdatei ja auch `sys.stdin` sein kann, dann kann man sich überlegen ob man die Zahlen eingeben möchte oder aus einer Datei in das Programm ”reinpipen” möchte.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Daniel123
User
Beiträge: 5
Registriert: Freitag 27. September 2019, 11:38

Ich war schon kurz davor aufzugeben und muss auch ehrlich gestehn dass hätte ich so nie hinbekommen...
Nochmals Vielen Dank an alle die hier aktiv waren und @nezzcarth bei mir in der Nähe ist so eine Art buddhistischer Schrein da hab ich ein paar Räucherstäbchen für dich entzündet, wenn dich also in nächster Zeit
plötzlich ein wohlig wärmeliges Gefühl überkommt nicht wundern, dass ist der positive Karma-Regen der auf dich niedergeht ich hoffe das geht klar und fällt noch unter die Rubrik kostenlos ;)
Antworten