Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Strings vs. Integer?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 21.08.2016, 12:53    Titel: Strings vs. Integer? Antworten mit Zitat

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.
Code:
Punkte(i, j)
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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 21.08.2016, 13:11    Titel: User Defined Type (TYPE) Antworten mit Zitat

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
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 21.08.2016, 13:31    Titel: Antworten mit Zitat

Uff...
Hmmm....
????
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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 21.08.2016, 13:44    Titel: Antworten mit Zitat

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").
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 21.08.2016, 14:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 21.08.2016, 15:31    Titel: Array um 1 Dimension erweitern statt Type Antworten mit Zitat

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. lächeln

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. durchgeknallt )

Viele Grüße!
Sebastian
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 873
Wohnort: Ruhrpott

BeitragVerfasst am: 21.08.2016, 20:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 21.08.2016, 21:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz