Seite 1 von 3

Säulendiagramm

Verfasst: 28.03.2009 00:09
von Weisshaar
Moin.
Erstens: Ich bin nach Jahren des nichtstuens in Basic wieder da.
Ich probier es wenigstens...
Zweitens: Purebasic hat mit Basic, so wie ich es mir angelernt habe wenig zu tun.
Drittens: Wer einmal Basic auf dem ZX81 und AmigaBasic geübt hat ist anscheinend versaut ;-)
Viertens: Ich bin 60; hat aber damit eigentlich nichts zu tun?-)

Code: Alles auswählen

;
; ------------------------------------------------------------
;
; Säulendiagramm
;
; ------------------------------------------------------------
;



;variablen Farben
weiss = $ffffff
schwarz = $000000
rot = $0000FF
gelb = $00FFFF
gruen = $00CC00
braun = $6699CC


If OpenWindow(100, 1000, 300, 400, 300, "Säulendiagramm", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
;       Nummer |ortx,| orty, |Breite,| Höhe,| "Name",    |   Flags

If CreateImage(100, 400, 300)

    If StartDrawing(ImageOutput(100))
     For k=0 To 300
      FrontColor(RGB(206, 230, 133))   ; füllt den Hintergrund
      Line(0, k, 400, 0)
    Next







For z = 100 To 10 Step -1                  ;von unten nach oben zeichnen schleife 1
  If z = 30
  Break
  EndIf
  Plot(50, z, (schwarz))
    Plot(51, z, (schwarz))
  Plot(52, z, (schwarz))
  
Next

For y = 100 To 10 Step -1 
If y = 80
  Break
  EndIf                 ;schleife 2
  Plot(70, y, (rot))
    Plot(71, y, (rot))
  Plot(72, y, (rot))
Next

For x = 100 To 10 Step -1
If x = 30
  Break
  EndIf                 ;schleife 3
  Plot(90, x, (gruen))
    Plot(91, x, (gruen))
  Plot(92, x, (gruen))
Next

For w = 100 To 10 Step -1
If w = 90
  Break
  EndIf                   ;schleife 4
  Plot(110, w, (gelb))
    Plot(111, w, (gelb))
  Plot(112, w, (gelb))
  Next
  
For u = 100 To 10 Step -1
If u = 15
  Break
  EndIf             ;schleife 5
  Plot(130, u, (braun))
    Plot(131, u, (braun))
  Plot(132, u, (braun))                                                       ;:For pause = 1 To 1000000 : Next
;  --------------------------------------------------------------------------------
Next
;For u = 10 To 50            ;schleife 6
 ; Plot(130, u, (schwarz))
  ;  Plot(131, u, (schwarz))
  ;Plot(132, u, (schwarz))                                                      ;:For pause = 1 To 1000000 : Next
;Next

; ----------------------------------------------------------------------------------------------------------------------------------

For a = 10 To 380
  Plot( a, 100,(weiss))           ;waagerechte Nullinie
   Plot( a, 101, (weiss))
  Plot( a, 102, (weiss))
Next

For b = 10 To 200
  Plot( 5, b, (weiss))                       ;senkrechte nullinie 
   Plot( 6, b, (weiss))
  Plot( 7, b, (weiss))
Next

          Circle(5, 101, 3, schwarz)                            ;nullpunkt
          
; ------------------------------------------------------------------------------------------------------------------------------------- 

     
StopDrawing() ;aufhören mit Zeichnen

ImageGadget(0, 0, 0, 0, 0, ImageID(100))

  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_CloseWindow  ; wartet auf den Befehl vom schließen-Gadget des Fensters
      Quit = 1
    EndIf ;fur repeat

  Until Quit = 1   ; führt den Befehl vom schließen-Gadget des Fensters aus. Quit ist WAHR
  
EndIf ;für OpenWindow
EndIf ;für StartDrawing
EndIf

End   ; Alle Fenster zu!
Das kleine Programm funktioniert.
soll also darstellen wieviel die einzelnen Parteien an Stimmen bekommen, wie im TV.
Die Eingabe soll in Stimmen erfolgen. Säulen sollen aufgebaut werden.
Ich habe Plot benutzt um auf jeden Pixel zugreifen zu können.

Sehr hilfreich währe auch wenn ihr meine Kommentare im Programm lesen würdet.
Sind die richtig? Oder sehe ich das total falsch?

Ich suche aber eine vernünftige Eingabe der ausrechenbaren Daten.
Eingaberequester sind sehr unbequem oder ich habe den "Richtigen" noch nicht gefunden.

BTW können openconsole und openwindow/openscreen variablen austauschen?

Liebe Grüße, Weisshaar. (4.30)[/code]

Verfasst: 28.03.2009 00:25
von Kaeru Gaman
Moin

also, für das Zeichnen solltest du dir mal Box() ansehen, das ist effektiver als in einer Schleife so viel zu plotten.

was die eingabe betrifft, du könntest auch SpinGadgets nehmen um die Werte einzustellen,
aber grundsätzlich würde man die wohl eher in eine Textdatei schreiben,
diese vom Programm aus mit ReadFile() öffnen,
mit ReadString() die Zahlenstrings einlesen,
und mit Val() in Zahlen umwandeln die man benutzen kann.
die Textdatei kann man einfach mit NotePad erstellen.

Verfasst: 28.03.2009 01:25
von Bisonte
Ich hab da mal kurz was gebastelt, weil ich auch grad für ein Remake eines 64'er Spiels sowas brauche ;)
Ist allerding nur grad für positive Bilanzen geeignet...

Ich hab die Werte in Datazeilen gepackt. Sollte aber kein Problem sein sich diese anders zu beschaffen... (so wie Kaeru das schon beschrieb... )

Es laeuft hier mit einem 2Dimensionalen Array, da ich es für einfacher hielt,
die Stimmen und die Farben zu den "Parteien" zuzuordnen.

Code: Alles auswählen

Parteien = 6
Global Gesamtstimmen = 0
Global Dim Stimmen(Parteien, 2) ; Stimmen(1,1) = Stimmen... Stimmen(1,2) = Farbe des Balkens

Procedure Saeule(Partei)
  x = 50 + (Partei * 10) ; X - Position
  h.f = (100/Gesamtstimmen)*Stimmen(Partei,1) ; hier in Prozent umrechnen damit der balken nie höher als 100 Bildpunkte wird
  Box(x,100-h,3,h,Stimmen(Partei,2))
EndProcedure

;##### eventuell hier einlesen, per ReadFile()
;##### Ich mach es eben mal schnell mit Read und Data

For i = 1 To Parteien
  Read.i Stimmen(i,1)
  Gesamtstimmen + Stimmen(i,1)
Next i
For i = 1 To Parteien
  Read.i r
  Read.i g
  Read.i b 
  Stimmen(i,2)=RGB(r,g,b)
Next i
DataSection
  Data.i 22,50,96,6,71,18
  Data.i 255,0,0,0,255,0,0,0,0,255,255,0,164,114,0,0,0,255
EndDataSection

Win = OpenWindow(#PB_Any, 500, 300, 400, 300, "Säulendiagramm", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
If Win
  Image = CreateImage(#PB_Any,400,300)
  StartDrawing(ImageOutput(Image))
    Box(0,0,400,300,RGB(206, 230, 133)) ; Hintergrund einfärben
    Box(10,100,370,2,#White) ;waagerechte Nullinie
    Box(20,10,2,190,#White) ;senkrechte nullinie 
    Circle(21, 101, 3, schwarz) ; Nullpunkt  
    ;##### Hier werden alle Parteien gezeichnet  
    For i = 1 To Parteien
      Saeule(i)
    Next i
  StopDrawing()
  ImageGadget(0, 0, 0, 0, 0, ImageID(Image))
EndIf

Repeat
  
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow  ; wartet auf den Befehl vom schließen-Gadget des Fensters
    Quit = 1
  EndIf ;fur repeat
Until Quit = 1

Verfasst: 28.03.2009 08:38
von Weisshaar
Bisonte hat geschrieben:Ich hab da mal kurz was gebastelt, weil ich auch grad für ein Remake eines 64'er Spiels sowas brauche ;)
Ist allerding nur grad für positive Bilanzen geeignet...

Ich hab die Werte in Datazeilen gepackt. Sollte aber kein Problem sein sich diese anders zu beschaffen... (so wie Kaeru das schon beschrieb... )

Es laeuft hier mit einem 2Dimensionalen Array, da ich es für einfacher hielt,
die Stimmen und die Farben zu den "Parteien" zuzuordnen.

Code: Alles auswählen

Parteien = 6
Global Gesamtstimmen = 0
Global Dim Stimmen(Parteien, 2) ; Stimmen(1,1) = Stimmen... Stimmen(1,2) = Farbe des Balkens

Procedure Saeule(Partei)
  x = 50 + (Partei * 10) ; X - Position
  h.f = (100/Gesamtstimmen)*Stimmen(Partei,1) ; hier in Prozent umrechnen damit der balken nie höher als 100 Bildpunkte wird
  Box(x,100-h,3,h,Stimmen(Partei,2))
EndProcedure

;##### eventuell hier einlesen, per ReadFile()
;##### Ich mach es eben mal schnell mit Read und Data

For i = 1 To Parteien
  Read.i Stimmen(i,1)
  Gesamtstimmen + Stimmen(i,1)
Next i
For i = 1 To Parteien
  Read.i r
  Read.i g
  Read.i b 
  Stimmen(i,2)=RGB(r,g,b)
Next i
DataSection
  Data.i 22,50,96,6,71,18
  Data.i 255,0,0,0,255,0,0,0,0,255,255,0,164,114,0,0,0,255
EndDataSection

Win = OpenWindow(#PB_Any, 500, 300, 400, 300, "Säulendiagramm", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
If Win
  Image = CreateImage(#PB_Any,400,300)
  StartDrawing(ImageOutput(Image))
    Box(0,0,400,300,RGB(206, 230, 133)) ; Hintergrund einfärben
    Box(10,100,370,2,#White) ;waagerechte Nullinie
    Box(20,10,2,190,#White) ;senkrechte nullinie 
    Circle(21, 101, 3, schwarz) ; Nullpunkt  
    ;##### Hier werden alle Parteien gezeichnet  
    For i = 1 To Parteien
      Saeule(i)
    Next i
  StopDrawing()
  ImageGadget(0, 0, 0, 0, 0, ImageID(Image))
EndIf

Repeat
  
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow  ; wartet auf den Befehl vom schließen-Gadget des Fensters
    Quit = 1
  EndIf ;fur repeat
Until Quit = 1
Mach mich nicht das Hemd am flattern :) Ich bin noch sehr wackelig.

Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.

@Kaeru Gaman
Querlesen gilt nicht. Der Tip mit Notepad ist gut. Ich Plotte, weil ich jeden Pixel in den Griff bekommen wollte. Mit Box() hatte ich angefangen...
Mein Programmierstil(ups:-)) ist folgender: Ich hacke den Code zusammen und schaue dann in die Anleitung warum das nicht geht.:allright:

Liebe Grüße, Weisshaar.

Verfasst: 28.03.2009 14:35
von Andesdaf
Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
Bei mir nicht. PureBasic 4.3

Verfasst: 28.03.2009 14:39
von cxAlex
Auch bei mir kein Fehler.

PB 4.3 x86

Verfasst: 28.03.2009 14:52
von Kaeru Gaman
Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
schreib bitte deine PB-Version in die Signatur.
wenn i nicht erkannt wird, hast du höchstens 4.1
wenn Read nicht getypet werden muss, hast du höchstens 4.2

im ersten Posting hattest du etwas von 4.3 geschrieben, deshalb dachte ich, du hättest die auch....

>> Querlesen gilt nicht.
¿quid?

Verfasst: 28.03.2009 15:35
von mk-soft
@Weisshaar

willkommen in Board
Wer einmal Basic auf dem ZX81 und AmigaBasic geübt hat ist anscheinend versaut
:allright:

Wer mit ZX81 angefangen hat lernte bestimmt auch ASM :allright:
Mein ZX81 funktioniert immer noch :mrgreen:

Mit Purebasic habe ich eine Sprache gefunden mit der ich am Besten mit klar kommte. Ab und zu arbeitet ich auch wenn es sein muss mit VB oder C#.
Tue mich aber schwer mit der OOP Struktur. PB ist schon die richtige Wahl da man immer weiss wo das Programm abläuft und die Fehlersuche ist sehr einfach.

FF :wink:

Verfasst: 28.03.2009 16:11
von Weisshaar
Andesdaf hat geschrieben:
Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
Bei mir nicht. PureBasic 4.3
Was soll ich sagen... :oops:
Läuft bei mir jetzt auch. Aber ich schwör das war gestern anders. :roll:

Verfasst: 28.03.2009 16:21
von Weisshaar
Kaeru Gaman hat geschrieben:
Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
schreib bitte deine PB-Version in die Signatur.
wenn i nicht erkannt wird, hast du höchstens 4.1
wenn Read nicht getypet werden muss, hast du höchstens 4.2

im ersten Posting hattest du etwas von 4.3 geschrieben, deshalb dachte ich, du hättest die auch...

>> Querlesen gilt nicht.
¿quid?
:oops:
Ich hatte um folgendes gebeten:

Sehr hilfreich währe auch wenn ihr meine Kommentare im Programm lesen würdet.
Sind die richtig? Oder sehe ich das total falsch?
BTW können openconsole und openwindow/openscreen variablen austauschen?