Werte in eine Tabelle eintragen

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
Luftkegler
User
Beiträge: 2
Registriert: Samstag 18. Juni 2022, 13:27

Moin erst einmal. Ich hoffe ich bin hier richtig.
Ich baue gerade eine Anzeige für eine Luftkegelbahn. Die Anzeige besteht aus 11einstelligen 7-Segmentanzeigen und einer zweistelligen 7-Segmentanzeige für das Ergebnis. Die 7-Segmentanzeigen werden über jeweils einen Arduino Nano mit hinter geschaltetem ULN2803A angesteuert. Der Raspberry ( PI B3+) kommuniziert über den I2C-Bus mit den einzelnen Arduinos. Die Steuerung der Anzeigen funktioniert.

Der Programmablauf sieht bis jetzt so aus :
1. Der Schreiber gibt die Anzahl der Mannschaften ein.
2. Der Schreiber gibt die Anzahl der Spieler für die gerade kegelnde Mannschaft ein.
3. Jetzt wird der Wert für den jeweiligen Wurf vom Schreiber eingegeben
4. Nach dem 11 Wurf wird der schlechteste Wurf gelöscht, und das Ergebnis aus zehn Würfen wird errechnet.
5. Nach einer Pause von 5 Sec. werden die 7-Segmentanzeigen für die Würfe und das Ergebnis gelöscht
6. Das Programm startet wieder bei der Eingabe für den ersten Wurf.
Leider weiß ich nicht wie man hier das Programmlisting einfügt
Nun möchte ich dass die einzelnen Würfe, die Gesamtpunktzahl der Würfe sowie das Ergebnis der Mannschaft in einer Tabelle ( die dann später ausgedruckt werden soll ) gespeichert wird.
Da hapert es noch, vielleicht kann mir da jemand helfen.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Den Code postet man hier zwischen Code-Tags.
Die Code Tags werden automatisch eingefügt, wenn du den </> Button im vollständigen Editor drückst.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Luftkegler: Was heisst „Tabelle“ genau? Wie soll ausgedruckt werden? Würde es reichen an der entsprechenden Stelle wo die Daten alle vorliegen eine CSV-Datei zu erstellen oder zu erweitern? Zum schreiben und lesen von CSV-Dateien gibt es in der Standardbibliothek das `csv`-Modul.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Luftkegler
User
Beiträge: 2
Registriert: Samstag 18. Juni 2022, 13:27

Mit Tabelle meine ich, in den Spalten A2 - J2 werden die Punkte von den 10 gültigen Würfen eines Spielers eingetragen, in Spalte K2 wird das Ergebnis der 10 Würfe eingetragen und in Spalte L2 das Ergebnis der jeweiligen Mannschaft.
Für den zweiten Spieler wird in Zeile 3 geschrieben usw.
In Zeile 1 steht | Wurf 1 bis Wurf 10 | Ergebnis Spieler | Ergebnis Mannschaft
Ich weiß , man könnte das Programm kürzer schreiben, aber ich finde es so übersichtlicher.

Code: Alles auswählen


#!/usr/bin/python
# coding=utf-8

import smbus
import time, sys
#import picamera
#camera = picamera.PiCamera()
bus = smbus.SMBus(1)


Wurfnummer = 1
Dummy_1 = 10
Dummy_2 = 101
Wurf = 0
Weiter = 1
Kegel_1 = 0
Kegel_2 = 0
Kegel_3 = 0
Kegel_4 = 0
Kegel_5 = 0
Kegel_6 = 0
Kegel_7 = 0
Kegel_8 = 0
Kegel_9 = 0
Kegel_10 = 0
Kegel_11 = 0
Personen = 1
Ergebniss_Mannschaft = 0
Mannschaften = 0
Mannschaften = int(input("Wieviel Mannschaften sind heute gemeldet ?"))
Mannschaften = Mannschaften + 1
for x in range (1,Mannschaften,1):
					Personen = int(input("Wieviel Personen sind in der Mannschaft ?"))
					Personen = Personen +1
					for i in range (1,Personen,1):
							Kegel_1 = 0
							Kegel_2 = 0
							Kegel_3 = 0
							Kegel_4 = 0
							Kegel_5 = 0
							Kegel_6 = 0
							Kegel_7 = 0
							Kegel_8 = 0
							Kegel_9 = 0
							Kegel_10 = 0
							Kegel_11 = 0
							time.sleep(0.1)
							print("Anzeigen werden gelöscht")
							address = 0x1b
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x1d
							bus.write_byte(address,Dummy_1)
							time.sleep(1)
							address = 0x1f
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x09
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x0b
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x0d
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x0f
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x11
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x13
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x15
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x17
							bus.write_byte(address,Dummy_1)
							time.sleep(0.1)
							address = 0x19
							bus.write_byte(address,Dummy_2)
							time.sleep(0.1)

							print("Nun gehts los")

							time.sleep(0.1)

							address = 0x1b
							Kegel_1 = int(input("Punkte für Wurf 1 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_1 > 9:
									Kegel_1 = 0
							bus.write_byte(address,Kegel_1)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x1d
							Kegel_2= int(input("Punkte für Wurf 2 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_2 > 9:
									Kegel_2 = 0
							bus.write_byte(address,Kegel_2)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x1f
							Kegel_3= int(input("Punkte für Wurf 3 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_3 > 9:
									Kegel_3 = 0
							bus.write_byte(address,Kegel_3)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x09
							Kegel_4= int(input("Punkte für Wurf 4 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_4 > 9:
									Kegel_4 = 0
							bus.write_byte(address,Kegel_4)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x0b
							Kegel_5 = int(input("Punkte für Wurf 5 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_5 > 9:
									Kegel_5 = 0
							bus.write_byte(address,Kegel_5)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x0d
							Kegel_6= int(input("Punkte für Wurf 6 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_6 > 9:
									Kegel_2=0
							bus.write_byte(address,Kegel_6)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x0f
							Kegel_7= int(input("Punkte für Wurf 7 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_7 > 9:
									Kegel_7 = 0
							bus.write_byte(address,Kegel_7)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x11
							Kegel_8= int(input("Punkte für Wurf 8 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_8 > 9:
									Kegel_8 = 0
							bus.write_byte(address,Kegel_8)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x13
							Kegel_9= int(input("Punkte für Wurf 9 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_9 > 9:
									Kegel_9 = 0
							bus.write_byte(address,Kegel_9)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x15
							Kegel_10= int(input("Punkte für Wurf 10 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_10 > 9:
									Kegel_10 = 0
							bus.write_byte(address,Kegel_10)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)

							address = 0x17
							Kegel_11= int(input("Punkte für Wurf 11 eingeben ( für einen Pudel bitte 11 ) :"))
							if Kegel_11 > 9:
									Kegel_11 = 0
							bus.write_byte(address,Kegel_11)
							time.sleep(0.1)
							address = 0x19
							Ergebniss_roh = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
							bus.write_byte(address,Ergebniss_roh)
							time.sleep(0.1)



							Wurfnummer = int(input("Bitte den ungültigen Wurf eingeben : "))



							if Wurfnummer == 1:
								address = 0x1b
								Dummy_1 = 10
								Kegel_1 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 2:
								address = 0x1d
								Dummy_1 = 10
								Kegel_2 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 3:
								address = 0x1f
								Dummy_1 = 10
								Kegel_3 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 4:
								address = 0x09
								Dummy_1 = 10
								Kegel_4 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 5:
								address = 0x0b
								Dummy_1 = 10
								Kegel_5 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 6:
								address = 0x0d
								Dummy_1 = 10
								Kegel_6 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 7:
								address = 0x0f
								Dummy_1 = 10
								Kegel_7 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 8:
								address = 0x11
								Dummy_1 = 10
								Kegel_8 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)


							elif Wurfnummer == 9:
								address = 0x13
								Dummy_1 = 10
								Kegel_9 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 10:
								address = 0x15
								Dummy_1 = 10
								Kegel_10 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)

							elif Wurfnummer == 11:
								address = 0x17
								Dummy_1 = 10
								Kegel_11 = 0
								bus.write_byte(address,Dummy_1)
								address = 0x19
								Ergebniss = (Kegel_1 + Kegel_2 + Kegel_3 + Kegel_4 + Kegel_5 + Kegel_6 + Kegel_7 + Kegel_8 + Kegel_9 + Kegel_10 + Kegel_11)
								bus.write_byte(address,Ergebniss)


							print("Spieler hat " ,Ergebniss, " Punkte")
							Ergebniss_Mannschaft = (Ergebniss_Mannschaft + Ergebniss)
							print("Die Manschaft hat ",Ergebniss_Mannschaft, "Punkte")
							time.sleep(5)
						










Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Luftkegler: Eingerückt wird mit vier Leerzeichen pro Ebene nicht mal mit *20* und mal mit 8.

`sys` wird importiert, aber nirgends verwendet.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Und nein, ein Programm ohne Funktionen mit 300 Zeilen Code der hauptsächlich durch kopieren und einfügen entstanden ist, ist nicht übersichtlich. Das will keiner lesen.

Man nummeriert keine Namen. Dann will man sich entweder bessere Namen überlegen, oder gar keine Einzelwerte sondern eine Datenstruktur verwenden. Oft eine Liste.

Man definiert Namen erst wenn man sie braucht und belegt die nicht alle am Anfang mit einem Wert der in vielen Fällen dann überhaupt nicht verwendet wird. Zwei Namen `Wurf` und `Weiter` werden nur definiert und dann überhaupt nicht verwendet. Das wäre Dir wahrscheinlich aufgefallen wenn das nicht alles am Anfang definiert worden wäre.

Einen Wert an einen Namen binden nur um in der nächsten Zeile einen anderen Wert an den gleichen Namen zu binden, macht keinen Sinn.

Die Werte von `Mannschaften` und `Personen` stimmen nicht. Die sind um 1 zu hoch. Statt einen zu hohen Wert an die Namen zu binden würde man die Anpassung für `range()` im `range()`-Aufruf machen und nicht die Werte verfälschen.

Die Anpassung ist aber auch total überflüssig, weil die Schleifenvariablen gar nicht verwendet werden, es bei dem `range()` also überhaupt nicht auf die gelieferten Werte ankommt, sondern nur auf die Anzahl. Da wäre ``range(Mannschaften)`` und ``range(Personen)`` mit den korrekten Anzahlen für diese Werte viel einfacher.

Als Namen an Stellen wo man syntaktisch einen Namen braucht, den Wert aber dann überhaupt nicht benutzt, hat sich `_` durchgesetzt. Dann weiss der Leser gleich bescheid, dass es kein Programmierfehler ist das `x` und `i` nirgends verwendet werden.

Defaultwerte gibt es damit man die nicht extra übergeben muss. Also zum Beispiel die Schrittweite von 1 bei `range()`.

Die Antwort auf die Frage nach der Tabelle ist jetzt auch noch nicht wirklich beantwortet. Beziehungsweise eher als Rätsel dessen Antwort vielleicht Tabellenkalkulationddatei ist. Vielleicht im XLSX-Format‽ Da gäbe es Beispielsweise das `openpyxl`-Package für.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Engerückt wird nicht mit Tabs, sondern mit 4 Leerzeichen pro Ebene.
`Dummy` ist für einen Variablennamen, der für einen bestimmten Wert steht, verwirrend.
Die vielen Codewiederholungen lassen sich durch einfache Schleifen ersetzen.
Die sleep-Aufrufe scheinen zuällig verteilt zu sein, können also weg.

Mit ein paar Funktionen zur Strukturierung sieht das dann ungefähr so aus:

Code: Alles auswählen

import smbus
import time

ADDRESSES = [0x1b, 0x1d, 0x1f, 0x09, 0x0b, 0x0d, 0x0f, 0x11, 0x13, 0x15, 0x17]
ADDRESS_TOTAL = 0x19

DISPLAY_EMPTY = 10
DISPLAY_SPECIAL = 101

def clear_display(bus):
    print("Anzeigen werden gelöscht")
    for address in ADDRESSES:
        bus.write_byte(address, DISPLAY_EMPTY)
    bus.write_byte(ADDRESS_TOTAL, DISPLAY_SPECIAL)


def enter_points(bus)
    all_points = []
    for nr, address in enumerate(ADDRESSES, 1):
        points = int(input(f"Punkte für Wurf {nr} eingeben (für einen Pudel bitte 11):"))
        if points > 9:
            points = 0
        all_points.append(points)
        bus.write_byte(address, points)
        bus.write_byte(ADDRESS_TOTAL, sum(all_points))
    return all_points


def enter_invalid(bus, all_points):
    wurfnummer = int(input("Bitte den ungültigen Wurf eingeben: ")) - 1
    if 0 <= wurfnummer <= len(all_points):
        all_points[wurfnummer] = 0
        bus.write_byte(ADRESSES[wurfnummer], DISPLAY_EMPTY)
        bus.write_byte(ADDRESS_TOTAL, sum(all_points))


def main():
    bus = smbus.SMBus(1)
    mannschaften = int(input("Wieviel Mannschaften sind heute gemeldet ?"))
    for _ in range (mannschaften):
        personen = int(input("Wieviel Personen sind in der Mannschaft ?"))
        result_team = 0
        for _ in range (personen):
            clear_display(bus)
            print("Nun gehts los")
            all_points = enter_points(bus)
            enter_invalid(bus, all_points)
            result = sum(all_points)
            print(f"Spieler hat {result} Punkte")
            result_team += result
            print(f"Die Manschaft hat {result_team} Punkte")
            time.sleep(5)

if __name__ == "__main__":
    main()
An Deiner Stelle würde ich die Ergebnisse mit Hilfe des csv-Moduls in eine csv-Datei schreiben. Das ist am einfachsten.
Antworten