|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 21.08.2016, 13:53 Titel: Strings vs. Integer? |
|
|
Hallo Community,
ich stehe vor einem kleinem Programmierproblem:
Ich versuche, für mein vor Jahren begonnenes "Stop"-Projekt, eine Punkteeingabe bzw. Tabelle zu realisieren. Nun ist es so, dass es neben den normalen Ergebnissen wie 0-1, 1-0, 1/2-1/2, auch so Sonderergebnisse wie --+, +--, --- und 0-0 gibt. Die normale Punkteeingabe inklusive 0-0 habe ich bereits realisiert! Bloß wie realisiere ich die Sonderergebnisse am besten? Es sollen natürlich auch alle Punkte der jeweils einzelnen Spieler zusammengerechnet werden können? Auf dem Bildschirm soll man eben --+ oder +-- letztendlich sehen können. Desweiteren, soll man auch erkennen können, dass es sich bei dem abgespeicherten Ergebnis um ein kampfloses handelt! Momentan habe ich die Punkte als Integer definiert. i = Spieler und j = Runde (zum Bsp.: Runde 5)
Beim Integer kann ich halt nicht - oder + eingeben. Hilft mir da ein String mehr oder kann man dass auch irgendwie mit einem Integer lösen? Was noch als Problem bei +-- oder --+ hinzu kommt, ist die sortierte Rangliste. Wenn man dann auf einmal solche Ergebnisse hat, wird es schwierig die Endtabelle korrekt zu erstellen bzw. zu berechnen. Bis jetzt habe ich noch keine Idee wie ich das am besten mache? Vielleicht hat jemand eine Idee oder Lösung dazu? Ich bedanke mich im Vorraus für die Mühe!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.08.2016, 14:11 Titel: User Defined Type (TYPE) |
|
|
Hallo ALWIM,
wenn du nicht nur ein einzelnes Datenfeld speichern willst, sondern ein Bündel aus Datenfeldern (z. B. Punktzahl, B-Note, Zeitpunkte, ...), kannst du einen UDT verwenden. Damit lassen sich mehrere einzelne Attribute in einen individuellen Verbundtyp bündeln.
Minimalbeispiel:
Code: | Enum Kampfstaerke
HarterKampf,
MittlererKampf,
FluchtFeigling
End Enum
Type AlwimErgebnis
Punkte As Integer
Kampfbewertung As Kampfstaerke
End Type
Dim Punkteliste(1 To 3) As AlwimErgebnis
Punkteliste(1).Punkte = 420
Punkteliste(1).Kampfbewertung = Kampfstaerke.HarterKampf
Punkteliste(2).Punkte = 237
Punkteliste(2).Kampfbewertung = Kampfstaerke.FluchtFeigling
Punkteliste(3).Punkte = 200
Punkteliste(3).Kampfbewertung = Kampfstaerke.MittlererKampf
Print "Punkte Kampfbewertung"
Print "~~~~~~~~~~~~~~~~~~~~~~"
For i As Integer = LBound(Punkteliste) To UBound(Punkteliste)
Print Using "######"; Punkteliste(i).Punkte;
Print " ";
Select Case Punkteliste(i).Kampfbewertung
Case Kampfstaerke.HarterKampf
Print "+++"
Case Kampfstaerke.MittlererKampf
Print "+--"
Case Kampfstaerke.FluchtFeigling
Print "---"
End Select
Next i
Getkey |
Ein paar weitere Ideen dazu:
- In einem objektorientierten Ansatz würde mind. der Kampfstaerke-Type (oder eigentlich sogar das ENUM) seine "+++", "+--" usw. selber über eine Methode zur Verfügung stellen, sodass Nutzer des TYPEs kein SELECT CASE mehr brauchen. Man würde da dann zur Ausgabe einfach sowas aufrufen wie "getKampfbewertungInRechenzeichenNotation".
- Objekte des TYPEs könnten eine Art Score aus Kampfbewertung und Punkten berechnen, nach dem dann sortiert wird. Z. B. wenn Einträge mit "+++" immer ganz oben an der Liste stehen sollen vor anderen Kampfbewertungen, könnte man dafür in dem Score immer 1000000 auf die Punktzahl draufaddieren. Oder man implementiert den Vergleich von 2 Objekten aus wie bei der compareTo-Methode des Java-Comparable-Interfaces.
Viele Grüße!
Sebastian _________________
Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 21.08.2016, 14:31 Titel: |
|
|
Uff...
????
Nun ja, immerhin etwas. ???
Vielleicht sollte ich doch mal objektorientiert programmieren? Mit Types habe ich nämlich bisher noch nie gearbeitet. Das ist das Problem!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.08.2016, 14:44 Titel: |
|
|
Du kannst damit, wenn man OOP mal außen vor lässt, Variablen definieren, die aus mehreren Untervariablen bestehen. Zum Beispiel könnte eine Variable vom Typ "SpeisekartenEintrag" aus den Bestandteilen
- Bezeichnung = "Pizza Rustica"
- Preis = 9.9
- Inhaltsstoffe = "E123, E234, Allergene, Agar, Spuren von Erdnüssen"
bestehen. Eine TYPE-Variable kann man sich vorstellen wie eine Zeile einer mehrspaltigen Tabelle ("Tupel"). _________________
Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 21.08.2016, 15:06 Titel: |
|
|
Hallo Sebastian,
sollte die Liste von deinem 1. Post nicht sortiert sein? Da wird nichts sortiert. Zum Sortieren, brauche ich ja normalerweise Swap oder?
Sebastian hat Folgendes geschrieben: | Du kannst damit, wenn man OOP mal außen vor lässt, Variablen definieren, die aus mehreren Untervariablen bestehen. Zum Beispiel könnte eine Variable vom Typ "SpeisekartenEintrag" aus den Bestandteilen
- Bezeichnung = "Pizza Rustica"
- Preis = 9.9
- Inhaltsstoffe = "E123, E234, Allergene, Agar, Spuren von Erdnüssen"
bestehen. Eine TYPE-Variable kann man sich vorstellen wie eine Zeile einer mehrspaltigen Tabelle ("Tupel"). |
Das leuchtet mir schon ein. Aber dann müsste ich ja eine extrige Variable erstellen, die dann prüft, ob das Ergebnis kampflos ist? Also 0 = Normal, 1 = Kampflos
Oder so: Punkte(i, j, k)??? i = Spieler, j = kampflos/nicht kampflos, k = Runde??? Ist es so möglich?
Vielleicht fällt mir noch eine gute Lösung ein, die funktioniert? _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.08.2016, 16:31 Titel: Array um 1 Dimension erweitern statt Type |
|
|
Hallo!
ALWIM hat Folgendes geschrieben: | Da wird nichts sortiert. Zum Sortieren, brauche ich ja normalerweise Swap oder? |
Das stimmt, da müsstest du noch einen Sortieralgorithmus deiner Wahl, z. B. BubbleSort, hinzufügen.
An der Stelle des Algorithmus, wo du 2 Werte auf ihre Reihenfolge vergleichst, könntest du den Vergleich beliebig implementieren wie z. B. "Wenn Kampfbewertung höher (1. Sortierschlüssel), dann höher - egal, wie viele Punkte; wenn Kampfbewertung gleich, dann Punkte vergleichen (2. Sortierschlüssel)".
Zu deiner Alternative:
ALWIM hat Folgendes geschrieben: | Punkte(i, j, k) |
Wenn du Datensätze hast, wo alle Spalten aus dem gleichen Datentyp bestehen (z. B. alles Integer), kannst du anstelle eines TYPEs (siehe dazu auch Wikipedia) auch eine Dimension an dein Array ranhängen, wie du vorschlägst. Dann hättest du statt 2 Dimensionen
Code: | Punkte( <Spieler>, <Runde> ) |
3 Dimensionen
Code: | Punkte( <Spieler>, <Runde>, <UnterelementDesDatensatzes> ) |
Dann würdest du die "Untervariable" deines Eintrags nicht über eine Bezeichnung wie "Punkte" oder "Kampfbewertung" selektieren, sondern einen zusätzlichen Index:
Code: | ' Ergebnis von Spieler 1 in Runde 1:
Punkte( 1, 1, 1 ) = 1337 ' Punkte
Punkte( 1, 1, 2 ) = 0 ' Kampflos
' Ergebnis von Spieler 1 in Runde 4:
Punkte( 1, 4, 1 ) = 1337 ' Punkte
Punkte( 1, 4, 2 ) = 3 ' Harter Kampf |
Bei m Spielern und n Runden erhältst du in deinem 3-D-"Punktewürfel" insg. m*n*2 Felder.
Der Index der dritten Dimension würde das Datenfeld (welche Teilinformation? Punkte oder Kampfbewertung?) repräsentieren, nicht die Kampfbewertung (z. B. Stufen von 0 bis 4).
Das funktioniert dann, wenn du alle Datentypen in einem Array unter einen Hut bringen kannst. Wenn du bspw. noch einen Kampfrichter-Kommentar (String) zu jedem Spieler-/Runde-Ergebnis hinzufügen wolltest, kämst du damit nicht aus. (Es sei denn, du speicherst statt eines Strings/Doubles/... einen 32-Bit-Pointer darauf in das int-Feld. )
Viele Grüße!
Sebastian _________________
Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 21.08.2016, 21:07 Titel: |
|
|
Die Variante mit dem UDT dürfte da weitaus praktikabler (und auch übersichtlicher) sein als die Verwendung eines erweiterten Arrays.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 21.08.2016, 22:35 Titel: |
|
|
Zitat: | Die Variante mit dem UDT dürfte da weitaus praktikabler (und auch übersichtlicher) sein als die Verwendung eines erweiterten Arrays. | Das stimmt vielleicht sogar?
Wobei ich es jetzt mit einer 2. Variable gelöst habe! Vielleicht programmiere ich das irgendwann mal um? Es geht ja nur um die Darstellung am Bildschirm. Trotzdem Danke für die Infos!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|