RECHNEN in PB

Anfängerfragen zum Programmieren mit PureBasic.
Holgersson
Beiträge: 13
Registriert: 11.07.2009 14:14

Beitrag von Holgersson »

ja was soll ich sagen ........

echt genial so schnell mal eben umgecodet^^

mmm wollte doch PureBasic lernen, programmieren ist bei mir schon etwas länger her und man kommt schnell raus wenn man nicht tag täglich codet^^

auf jedenfall weiss ich jetzt das ich ja doch nicht allzu daneben lag.

ja dann werde ich wohl mal mein PureBasic wissen weiter ausbauen um mal wieder etwas mehr in die Programmierung reinzukommen ;-)

Danke nochmal an alle das hat mir sehr geholfen!
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Was hier noch fehlt, ist das Rechnen mit ungeraden Zahlen.
Schließlich rechnet mein Taschenrechner eben auch mit einem
Komma.

Also Komma mit einem Punkt (.) angeben.

Nochmal etwas umgeändert :wink:

Code: Alles auswählen

#WindowWidth = 420
#WindowHeight = 170

Enumeration
  #zahl1
  #zahl2
  #gesamt
  #text_1
  #text_2
  #text_gesamt
  #button_berechne
EndEnumeration

Global zahl1.f
Global zahl2.f
Global gesamt.f

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "TEST-RECHNENPROGRAMM", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)

  StringGadget(#zahl1, 70, 40, 90, 20, "")
  StringGadget(#zahl2, 70, 80, 90, 20, "")
 
  StringGadget(#gesamt, 70, 120, 90, 20, "")
 
  TextGadget(#text_1, 10, 40, 250, 20, "Zahl 1:")
 
  TextGadget(#text_2, 10, 80, 250, 20, "Zahl 2:")
  TextGadget(#text_gesamt, 10, 120, 250, 20, "Gesamt:")
 
 
  ButtonGadget(#button_berechne, 190, 60, 200, 20, "BERECHNE")
 
  Repeat
    EventID = WaitWindowEvent()
   
    If EventID = #PB_Event_Gadget
   
      Select EventGadget()
        Case #button_berechne
          If EventType() = #PB_EventType_LeftClick
            zahl1 = ValF(GetGadgetText(#zahl1))
            zahl2 = ValF(GetGadgetText(#zahl2))
            ;gesamt.l = zahl1 + zahl2
            gesamt = zahl1 + zahl2
            SetGadgetText(#gesamt, StrF(gesamt,2)); Maximal 2 Stellen hinterm Komma (.)
          EndIf
      EndSelect
   
    EndIf
   
  Until EventID = #PB_Event_CloseWindow
  EndIf
 
End 
Bild
Win11 Pro 64-Bit, PB_6.11b1
Holgersson
Beiträge: 13
Registriert: 11.07.2009 14:14

Beitrag von Holgersson »

hi Falco,

das ist auch schön zu wissen, nu weiß ich wie man die anzeige formatiert mit auf 2 stellen hinter dem komma.

ja, eigentlich wollt ich ja nur wissen wie es geht weil einerseits interessiert es mich und würde gerne PureBasic lernen.

auf der anderen seite habe ich ein kleines tool in VB gebastelt was halt flächenberechnungen ausgibt und die eingaben erfolgen in mm (ja soll so sein) ... gibt dann m² aus - ja hört sich blöd an mm -> m² ist aber so gewollt^^

jetzt ist meine überlegung PureBasic zu lernen und das tool umzusetzen auf PureBasic. Aber da habe ich noch 1,2 Fragen^^

später habe ich mal eine kleine datenbankanwendung geplant und würde diese gerne mit PureBasic umsetzen (wenn ich soweit fit bin in PB)^^

Datenbanken möglich in PB soweit ich gesehen habe (JA!)

- ist es auch möglich die datensätze per schaltflächen durchzublättern
halt so das mir dann jeweils der entsprechende datensatz in meinem
window angezeigt wird? ja blöde frage^^ mitsicherheit ja, nur wie^^
(aber das ist jetzt auch erstmal unwichtig,
muss erstmal bei PB durchblicken)

Nett wäre wenn mir jemand sagen könnte wo ich z.B. ein eBook oder auch ein Buch herbekommen wo es halt gut drin erklärt wird speziell für Datenbanken. (Die ebooks von purearea habe ich schon^^)

Also PureBasic sagt mir schon sehr zu nach gut 2-3 Tagen (vorkenntnisse in QB und VB) kommt man da schon so langsam hinter die syntax, werde wohl VB links liegen lassen^^

...werde wohl noch viel ausprobieren müssen in PB!

ach ja, bei meinem code sind die StringGadgets ja IsNumeric (hehe da is wohl ein kleiner bug drin immer wenn ich in eines von den 3 Feldern einen Buchstaben eingebe - verschwinden einfach 2 Felder ;)

Ach ja, Falco wenn wir schon dabei sind, dann....
könnte man man ja auch noch wegen der bedienerfreundlichkeit
den Punkt umbasteln so das man ein komma eingeben kann (ist halt schöner auf dem nummernbock zahlen einzugeben) ;-)

P.S. echt nettes Forum!!!
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich kann Dir jetzt nicht alle Fragen beantworten, aber hier schon mal
ein Beispiel, wie du es mit dem Komma machen könntest.

Weitere Fragen bezüglich Datenbanken würde ich nach und nach
empfehlen, wenn du ein Beispiel postest, worauf man eben besser
antworten kann.

Schau Dir mal die WaitWindowEvent() im Repeat / Until - Beispielen
in der PB-Hilfe an. Am Besten unter Gadget bzw. GadgetID.
Dort kann man die GadgetID() prüfen, welche z.B. für das Auslösen
eines bestimmten Buttons vor und zurück nötig ist. Beispiele zur
Repeatschleife sind in der normalen PB-Hilfe genug vorhanden. Wir
werden Dir aber garantiert weiterhelfen, wenn es irgendwo im Source
hakt :wink:

So, nun hier das Komma - Beispiel. Sicher kann man hier und da was kürzen. Das wollte ich aber hier vermeiden.

Code: Alles auswählen

#WindowWidth = 420
#WindowHeight = 170

Enumeration
  #zahl1
  #zahl2
  #gesamt
  #text_1
  #text_2
  #text_gesamt
  #button_berechne
EndEnumeration

Global zahl1.s
Global zahl2.s
Global gesamt.f

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "TEST-RECHNENPROGRAMM", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)

  StringGadget(#zahl1, 70, 40, 90, 20, "")
  StringGadget(#zahl2, 70, 80, 90, 20, "")
 
  StringGadget(#gesamt, 70, 120, 90, 20, "")
 
  TextGadget(#text_1, 10, 40, 250, 20, "Zahl 1:")
 
  TextGadget(#text_2, 10, 80, 250, 20, "Zahl 2:")
  TextGadget(#text_gesamt, 10, 120, 250, 20, "Gesamt:")
 
 
  ButtonGadget(#button_berechne, 190, 60, 200, 20, "BERECHNE")
 
  Repeat
    EventID = WaitWindowEvent()
   
    If EventID = #PB_Event_Gadget
   
      Select EventGadget()
        Case #button_berechne
          If EventType() = #PB_EventType_LeftClick
            
            
            zahl1 = GetGadgetText(#zahl1)
            zahl2 = GetGadgetText(#zahl2)
            If FindString(zahl1,",",0)
              zahl1=ReplaceString(zahl1,",",".");Da PB mit Punkt rechnet, korrigiert dieser und folgender Replace das Ergebnis von Komma nach Punkt.
            EndIf
            If FindString(zahl2,",",0)
              zahl2=ReplaceString(zahl2,",",".")
            EndIf            
            
            ;gesamt.l = zahl1 + zahl2
            gesamt = ValF(zahl1) + ValF(zahl2)
            
            SetGadgetText(#gesamt, ReplaceString(StrF(gesamt,2),".",",")); Maximal 2 Stellen hinterm Komma (.), wobei das Replace hier den String korrekt mit einem (,) ausgibt.
          EndIf
      EndSelect
   
    EndIf
   
  Until EventID = #PB_Event_CloseWindow
  EndIf
 
End 

Anstelle der beiden IF-Abfragen für zahl1 und zahl2 könntest du es
diese IF's weglassen und die beiden Zeilen tauschen. Nur so nebenbei.

Code: Alles auswählen

;...   Sorry kommentierte Zeile weglassen :)

           zahl1 = ReplaceString(GetGadgetText(#zahl1),",",".")
           zahl2 = ReplaceString(GetGadgetText(#zahl2),",",".")

;...  Sorry kommentierte Zeile weglassen :)

Gruß Falko
Zuletzt geändert von Falko am 12.07.2009 00:08, insgesamt 2-mal geändert.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Holgersson
Beiträge: 13
Registriert: 11.07.2009 14:14

Beitrag von Holgersson »

... zu den Datenbanken habe ich ne menge gefunden im Forum 3 Beispielcodes (da werde ich mich mal so nach und nach durcharbeiten, denke damit komme ich schon klar)

lol hast du das jetzt tatsächlich mit dem Punkt-und-Komma noch umgestrickt^^ (sieht aber kompliziert aus die syntax den . in ein , zu wandeln - RESPEKT!

gruß

Holgersson
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich habe im Kommentar noch etwas hinzugefügt. Nach einigen Anläufen wirst Du sehen, das es doch nicht so kompliziert ist, wie es
aussieht.

Mir geht es vielleicht genauso wie Dir, da ich mich an den vor 3 Tagen erworbenen NS Basic/Desktop probiere. Dabei ist dieser Stark an VisualBasic angelehnt, wobei man sich dort mit Objekten Classes und Methoden auseinander setzen muss.

Was dort vielleicht Main() ist, ist in PB die Repeat : Until WaitEventWindow() - Schleife, in der die Abfragen mit If, Else, Endif oder Select, Case .. EndSelect geprüft werden.


Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Beitrag von Pelagio »

Hallo Leute,

da so viele Beispieleaufgezeigt werden, möchte ich auch noch ein Beispiel einbringen in dem mit Nachkommastellen gerechnet wird, allerdings die Aufgabe in einer Zeile eingegeben.

Code: Alles auswählen

Structure Aufgabe
    Zahl.s
    NKS.b
EndStructure

Dim Art.b(3) 
Dim Wert.Aufgabe(1)
Art(0) = 42: Art(1) = 43: Art(2) = 45: Art(3) = 47 
NKS.b  = 0 

Repeat 
   Rechnung$ = InputRequester ("Rechnung","Bitte geben sie ihre Rechnung ein:","") 
   Rechnung$ = ReplaceString  (Rechnung$, ",", ".") 
   Ergebnis.s = "" 
   For n=0 To 3 
     If FindString(Rechnung$, Chr(Art(n)), 0) 
        Wert(0)\Zahl = StringField(Rechnung$, 1, Chr(Art(n)))
        Wert(0)\NKS  = FindString(Wert(0)\Zahl, ".", 0)
        If Wert(0)\NKS: Wert(0)\NKS = Len(Wert(0)\Zahl)-Wert(0)\NKS:EndIf
        Wert(1)\Zahl = StringField(Rechnung$, 2, Chr(Art(n)))
        Wert(1)\NKS  = FindString(Wert(1)\Zahl, ".", 0)
        If Wert(1)\NKS: Wert(1)\NKS = Len(Wert(1)\Zahl)-Wert(1)\NKS: EndIf
        If (Wert(0)\NKS>Wert(1)\NKS): NKS = Wert(0)\NKS: Else: NKS = Wert(1)\NKS: EndIf
        Select n 
            Case 0
               Ergebnis = StrF(ValF(Wert(0)\Zahl)*ValF(Wert(1)\Zahl), NKS)
            Case 1 
               Ergebnis = StrF(ValF(Wert(0)\Zahl)+ValF(Wert(1)\Zahl), NKS)
            Case 2 
               Ergebnis = StrF(ValF(Wert(0)\Zahl)-ValF(Wert(1)\Zahl), NKS)
            Case 3 
               Ergebnis = StrF(ValF(Wert(0)\Zahl)/ValF(Wert(1)\Zahl), NKS)
        EndSelect 
      EndIf 
   Next n
   If (Ergebnis<>""): MessageRequester("Test", Ergebnis): Else: Break: EndIf 
ForEver    

End 
Da ich viel lieber mit Proceduren Arbeite, das gleiche Beispiel noch einmal so geändert das man nur noch eine Procedure aufrufen muss.

Code: Alles auswählen

Procedure.c Max(Array vWert.c(1))
   Protected pResult.c
   
   If (vWert(0)>vWert(1)): pResult = vWert(0): Else: pResult = vWert(1): EndIf
   ProcedureReturn pResult
EndProcedure

Procedure.c NKS(Array vWert.s(1))
   Protected n.c, Dim pNKS.c(1)
   
   For n=0 To 1
      pNKS(n) = FindString(vWert(n), ".", 0)
      If pNKS(n): pNKS(n) = Len(vWert(n)) - pNKS(n): EndIf
   Next n
   ProcedureReturn Max(pNKS())
EndProcedure

Procedure.s Rechnung(vValue.s)
   Protected n.c, pResult.s, pNKS.c
   Protected Dim pArt.c(3), Dim pWert.s(1)
   
   pArt(0) = 42: pArt(1) = 43: pArt(2) = 45: pArt(3) = 47 
   For n=0 To 3
      If FindString(vValue, Chr(pArt(n)), 0)
         pWert(0) = StringField(vValue, 1, Chr(pArt(n)))
         pWert(1) = StringField(vValue, 2, Chr(pArt(n)))
         pNKS = NKS (pWert())
         Select n 
            Case 0
               pResult = StrF(ValF(pWert(0))*ValF(pWert(1)), pNKS)
            Case 1 
               pResult = StrF(ValF(pWert(0))+ValF(pWert(1)), pNKS)
            Case 2 
               pResult = StrF(ValF(pWert(0))-ValF(pWert(1)), pNKS)
            Case 3 
               pResult = StrF(ValF(pWert(0))/ValF(pWert(1)), pNKS)
         EndSelect 
         Break
      EndIf
   Next n
   ProcedureReturn pResult
EndProcedure

Procedure Main()
   Protected pValue.s, pResult.s
   
   Repeat 
      pValue = InputRequester ("Rechnung","Bitte geben sie ihre Rechnung ein:","") 
      pValue = ReplaceString  (pValue, ",", ".") 
      pResult= Rechnung       (pValue)
      If (pResult<>""): MessageRequester("Test", pResult): Else: Break: EndIf 
   ForEver
EndProcedure

Main()

End
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Holgersson
Beiträge: 13
Registriert: 11.07.2009 14:14

Beitrag von Holgersson »

moin moin

da sieht man mal die ganzen unterschiedlichen möglichkeiten.
ja PureBasic hats mir echt angetan und das PureBoard ist auch super.

die möglichkeiten scheinen ja unbegrenzt zu sein, hab gelesen PureBasic ist ne hochsprache? - ah, deswegen am amfang erstmal alles komplizierter^^

kann denn jemand ein guten Visual-Designer für PureBasic empfehlen
der interne sagt mir nicht so zu und PureVision leider auch nicht.
...ja das setzen der Gadgets ist im sourcecode schon relativ stressig^^



gruß

Holgersson
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Beitrag von Pelagio »

Hallo Holgersson,

ich habe eine gewisse Zeit mit PureForm von Gnozal gearbeitet (Entwickelt jaPBe weiter) allerdings bin ich schnell davon ab aber nicht weil es schlecht ist sondern weil ich bemerkt habe das für mich die Arbeit ohne Visual-Designer viel mehr bringt, ich dadurch schneller die Logig für die Programmierung mit Purebasic verstanden habe und heute schneller das Design tippen kann als ich es mit einem Visual-Designer könnte. Wie gesagt ansonsten PureForm, wobei ich nicht weiß ob es für PB4.31 auch einsetzbar ist, kann ich empfehlen. :allright:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Antworten