BPS #25: Lesbar Laden - Auswertung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #25: Lesbar Laden - Auswertung

BeitragMo, Okt 15, 2012 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzBasic:
;* Variablen mit Standardwerten:
Global User$="None", gfx_w%=256, gfx_h%=256, Vol%=100
;* Die Datei Auslesen:
LoadInfo("File.txt")

;* Anzeigen:
Graphics(gfx_w,gfx_h,0,2)
Text(gfx_w*.5,gfx_h*.5,"+"+User+"+",True,True)
Text(gfx_w*.5,gfx_h*.5+15,"+"+Vol+"+",True,True)
WaitKey()
End


Function LoadInfo(FileName$)
;* Datei öffnen
Local File = ReadFile(FileName)
;* Falls die Datei nicht geöffnet werden konnte, beenden
If File=0 Then Return

Repeat
;* Aktuelle Zeile einlesen
Local l$=ReadLine(File)

;* Trenne links vom Gleichheitszeichen.
Local Pos%=Instr(l,"=")
Local name$=Trim(Left(l,Pos-1))

;DebugLog("+"+name+"+")

;Interpretiere, welche Variable(n) geladen werden sollen
Select name
Case "UserName"
;* Der String ist in Anführungszeichen eingefasst.
;* Wir suchen also beide Positionen:
Local p1 = Instr(l,Chr(34))
Local p2 = Instr(l,Chr(34),p1+1)
;* Dann Schneiden wir die Variable aus der mitte heraus (ohne die Anführungszeichen)
User = Mid(l,p1+1,p2-p1-1)
;DebugLog("UserName: "+name)

Case "Graphics"
;* Die Zahlen sind nur durch ein Komma getrennt
Local pos2 = Instr(l,",")
;* Wir trennen vom Gleichheitszeichen zum Komma...
gfx_w = Int(Trim(Mid(l, Pos+1,pos2-Pos-1)))
;* Und nach dem Komma bis zum Ende der Zeile
gfx_h = Int(Trim(Mid(l, pos2+1,Len(l)-pos2)))
;DebugLog("Graphics: "+gfx_w+" x "+gfx_h)

Case "Volume"
; Vom Gleichheitszeichen bis zum Ende der Zeile
Vol=Int(Trim(Mid(l, Pos+1,Len(l)-Pos)))
;DebugLog("Volume: "+Vol)
End Select

Until Eof(File)
;* Nicht vergessen, die Datei wieder zu schließen!
CloseFile(File)
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am So, Dez 23, 2012 12:45, insgesamt 2-mal bearbeitet

SpionAtom

BeitragMo, Okt 15, 2012 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Lernt vom Profi! *Hust*

Code:
;Betreff: BPS #25: Lesbar Laden - Sep 30, 2012
;SpionAtom

;Sämtliche Daten werden in die BlitzArrays strings und ints gelesen
;je nachdem ob es sich um Zeichenketten (Strings) oder Ganzzahlen (Integers)
;handelt.
   Global strings$[10], ints[10]
;Für die Lesbarkeit bekommen die einzelnen Indizes individuelle Bezeichnungen
   Const USERNAME = 0
   Const GRAPHICS_WIDTH = 0, GRAPHICS_HEIGHT = 1, VOLUME = 2


;Es folgt die übliche Routine um eine Datei zeilenweise auszulesen:
; - Dateistream öffnen im Lese-Modus -> ReadFile
; - Eine Schleife, die solange Zeilen einer Datei ausliest, bis das Dateiende
;   erreicht wurde -> While Not Eof(datei)
; - für jede eingelesene Zeile rufe eine Function auf, die die
;   Werte in die BlitzArrays schreibt -> liesWertEin()
   Local dateiname$ = "bps25.txt"
   Local datei = ReadFile(dateiname)
   Local zeile$
   While Not Eof(datei)
      zeile = ReadLine(datei)
      liesWertEin(zeile)
   Wend

;Ausgabe der eingelesenen Daten
   Print "UserName:  " + Chr(34) + strings[USERNAME] + Chr(34)
   Print "Auflösung: " + ints[GRAPHICS_WIDTH] + " x " + ints[GRAPHICS_HEIGHT]
   Print "Volume:    " + ints[VOLUME]

WaitKey
End

;Prüft, ob ein Text mit einer bestimmten Zeichenfolge beginnt
;und gibt dementsprechend true oder false zurück.
Function beginntMit(txt$, beginn$)

   Local laenge = Len(beginn)
   Return Left(txt, laenge) = beginn

End Function


;Interpretiert eine Zeile, und weist den BlitzArrays (strings, ints)
;entsprechende Werte zu
Function liesWertEin(zeile$)

   ;Alle Zeilen, die eine Zuweisung beinhalten, beinhalten auch ein
   ;Gleichheitszeichen. Anhand der Position des Gleichheitszeichen lässt
   ;sich der Teil hinter dem Gleichheitszeichen ermitteln. Die Position
   ;des Gleichheitszeichen lässt sich mit Instr() ermitteln, die Teil-
   ;Zeichenkette dahinter erhält man mit Mid()
   Local werte$, gleichheitszeichen
   gleichheitszeichen = Instr(zeile, "=")
   If gleichheitszeichen Then werte = Mid(zeile, gleichheitszeichen + 1)

   
   ;Hier verzweigt das Programm je nach Zeilenbeginn in einen anderen Block,
   ;da die Werte unterschiedlich ermittelt werden müssen.

   ;Um den Text von UserName zu ermitteln, benötigt man die Positionen der
   ;umschließenden Anführungszeichen und kann so wieder mit Mid den eigentlichen
   ;Text ermitteln.
   If beginntMit(zeile, "UserName") Then
      anfang = Instr(werte, Chr(34)) + 1
      ende = Instr(werte, Chr(34), anfang)
      strings[USERNAME] = Mid(werte, anfang, ende - anfang)
   

   ;Um die beiden Werte der Auflösung zu erhalten, benötigt man die Position
   ;des Kommas, der diese beiden Werte trennt.
   Else If beginntMit(zeile, "Graphics") Then
      komma = Instr(werte, ",")
      ints[GRAPHICS_WIDTH] = Left(werte, komma - 1)
      ints[GRAPHICS_HEIGHT] = Mid(werte, komma + 1)
   

   ;Um den Wert des Volumens zu erhalten wird keine weitere Arbeit benötigt, es
   ;ist identisch mit dem schon ermittelten Wert hinter dem Gleichheitszeichen.
   Else If beginntMit(zeile, "Volume") Then
      ints[VOLUME] = werte
   End If
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

TimBo

BeitragDi, Okt 16, 2012 1:09
Antworten mit Zitat
Benutzer-Profile anzeigen
jaja du Profi Very Happy

ich hätte es mit BlitzBasic:
Select Case
in der LiesWertEin gemacht, aber sonst elegant ^^
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group