Manueller Zähler

Anfängerfragen zum Programmieren mit PureBasic.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Re: Manueller Zähler

Beitrag von ullmann »

Super, vielen Dank.

Ich habe überlegt, wo du den Aufbau der Character-Struktur her hast - und bin dann darauf gekommen, dass man im Strukturverzeichnis auf die Struktur auch doppelklicken kann. Das wusste ich bisher noch nicht. Ein Test bei Word und Byte ergibt tatsächlich, dass diese auch Strukturen sind. Ich dachte bisher, dass der Basistyp ausgeschrieben (z.B. .Byte statt .b) auch ein Basistyp ist, aber in Wirklichkeit handelt es sich hier um Strukuren. Damit wäre NicTheQuick's *char.Character Definition soweit klar.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Re: Manueller Zähler

Beitrag von Vermilion »

Danke für die Hilfe. :) Der code von NicTheQuick hat mir sehr geholfen. Das ist um einiges kompakter als das Gepfusche was ich verbrochen habe. :lol:
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Re: Manueller Zähler

Beitrag von KatSeiko »

Ich hätte an der Stelle eigentlich das beliebig erweiterbare System genommen, dass es mit Link-Listen gibt. Kommt sogar ohne Struktur aus.

Code: Alles auswählen

Global NewList zahl.s{1}()
AddElement(zahl())
zahl() = "1"

Procedure Increment()
FirstElement(zahl())
If zahl() = "9"
 zahl() = "0"
 If NextElement(zahl())
  zahl() = Str(Val(zahl())+1)
 Else
  AddElement(zahl())
  zahl() = "1"
 EndIf
Else
 zahl() = Str(Val(zahl())+1)
EndIf
EndProcedure

Procedure Ausgeben()
LastElement(zahl()) ;Nötig weil wir arabische Zahlen haben
text.s = zahl()
While PreviousElement(zahl()) ;Wir gehen also von hinten nach vorne..
 text = text + zahl()
Wend
Debug text
EndProcedure

For i = 1 To 12
Increment()
Next
Ausgeben() ;Sollte "13" ergeben

End 42
Da muss man noch etwas schrauben, damit rekursiv jedes Element auf "Wenn 9" überprüft wird. Aber im Großen und Ganzen ist dieses System eigentlich sicher für Zahlen bis der Speicher voll ist.
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Manueller Zähler

Beitrag von NicTheQuick »

KatSeiko hat geschrieben:Ich hätte an der Stelle eigentlich das beliebig erweiterbare System genommen, dass es mit Link-Listen gibt. Kommt sogar ohne Struktur aus.
Ich verstehe das Argument nicht. Was ist an Strings denn nicht beliebig erweiterbar?
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Manueller Zähler

Beitrag von 7x7 »

Ich glaube mich erinnern zu können, dass es von Rings(?) sogar mal hier eine komplettes Stringarithmetikpaket gab. Habe jetzt aber leider keinen Link dazu.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Manueller Zähler

Beitrag von BSP »

Hallo.
Ich habe auch mal ein wenig "gespielt". Smile.

Variante 1 : Dezimal

Code: Alles auswählen


Global a$=Chr(Asc("0")-1)
; Damit die Anzeige auch schön bei NULL beginnt.

stelle=Len(a$)-1
anz_stellen=3

Procedure Hochzaehlen(stelle)
  If stelle>=0
    a=PeekA(@a$+stelle)+1
    If a>Asc("9")
      a=Asc("0")
      ueberlauf=1
    EndIf
    PokeA(@a$+stelle,a)
  EndIf
  ProcedureReturn ueberlauf
EndProcedure

If OpenWindow(1,0,0,400,70,"Zählen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  txtgadg=TextGadget(1,0,10,WindowWidth(1),40,"0")
  SetGadgetFont(1,LoadFont(1,"",30))
  
  ;For z=1 To anz_stellen
  Repeat
  
    Repeat
      
      If WindowEvent()=#WM_CLOSE
        Break 2
      EndIf
      
      If  Not (WindowMouseX(1)=-1 Or WindowMouseY(1)=-1)
      ; Maus muss im Window sein
      
        If Hochzaehlen(stelle)
          stelle-1
        Else
          stelle=Len(a$)-1
          SetGadgetText(1,a$)
          Delay(1) ; Damit das Gadget nicht so blinkt
        EndIf
        
      EndIf
      
    Until stelle<0
    a$="1"+a$
    
  ForEver
  ;Next
  
EndIf
;Repeat:Until WaitWindowEvent()=#WM_CLOSE
End
Variante 2 : Binär

Code: Alles auswählen


Global a$="0"
;Global a$=Space(63);64*64*64)
;a$=ReplaceString(a$,Space(1),"1")

stelle=Len(a$)-1
;anz_stellen=3

Procedure Hochzaehlen(stelle)
  If stelle>=0
    a=PeekA(@a$+stelle)+1
    If a>Asc("1")
      a=Asc("0")
      ueberlauf=1
    EndIf
    PokeA(@a$+stelle,a)
  endif
  ProcedureReturn ueberlauf
EndProcedure

If OpenWindow(1,0,0,800,170,"Zählen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  txtgadg=TextGadget(1,0,10,WindowWidth(1),40,"0")
  SetGadgetFont(1,LoadFont(1,"",30))
  edigadg=EditorGadget(2,0,60,WindowWidth(1),WindowHeight(1)-60)
  SetGadgetFont(2,LoadFont(2,"",16))
  
  ;For z=1 To anz_stellen
  Repeat
  
    Repeat
      
      If WindowEvent()=#WM_CLOSE
        Break 2
      EndIf
      
      If  Not (WindowMouseX(1)=-1 Or WindowMouseY(1)=-1)
        
        If Hochzaehlen(stelle)
          stelle-1
        Else
          stelle=Len(a$)-1
          SetGadgetText(2,a$)
          Delay(1) ; Damit das Gadget nicht so blinkt
          SetGadgetText(1,StrU(Val("%"+a$)))
          Delay(1) ; Damit das Gadget nicht so blinkt
        EndIf
      
      EndIf
      
    Until stelle<0
    a$="1"+a$
    
  ForEver
  ;next
  
EndIf
End
MfG: BSP
PB 5.31 (x86) & (x64) Win10
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Manueller Zähler

Beitrag von BSP »

Nochmals Hallo.
Das es bei meinen "Spielereien" keine Proteste gab,
wundert mich sehr.
Hatte ich die "Stelle" doch glatt zu weit herunter gezählt.
Habs aber nun verbessert.
Habe in der Procedure nun:
If stelle>=0
eingebaut.

MfG: BSP
PB 5.31 (x86) & (x64) Win10
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Manueller Zähler

Beitrag von DarkDragon »

7x7 hat geschrieben:Ich glaube mich erinnern zu können, dass es von Rings(?) sogar mal hier eine komplettes Stringarithmetikpaket gab. Habe jetzt aber leider keinen Link dazu.
Bignum in einem der älteren PBOSL Pakete.

[bobobo dazu:
http://pbosl.purearea.net/index.php?site=Libs

dort in den 3.94er Sources
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten