Tausendertrennzeichen für (große) Zahlen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

hier kann man dem wachsenden speicher zusehen

Code: Alles auswählen

Procedure foo()
  d=1000
  size=2<<19

  Protected Dim a.b(size)
  Beep_(1000,100)
  Delay(d)

  Protected Dim b.b(size)
  Beep_(1000,100)
  Delay(d)

  Protected Dim c.b(size)
  Beep_(1000,100)
  Delay(d)

  Protected Dim d.b(size)
  Beep_(1000,100)
  Delay(d)

  Protected Dim e.b(size)
  Beep_(1000,100)
  Delay(d)

  Protected Dim f.b(size)
  Beep_(1000,100)
  Delay(d)

  Protected Dim g.b(size)
  Beep_(1000,100)
  Delay(d)

  Protected Dim h.b(size)
  Beep_(1000,100)
  Delay(d)

EndProcedure

foo()
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Sollte sich also lohnen, die Procedure vorzeitig zu verlassen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

/offtopic:
Dim ist ja wiederum was anderes als ne "normale" Variable, da hierfür Speicher auf dem Heap angefordert wird. Da ich dims nicht von Hand komplett löschen kann, benutz ich sie auch nicht, wenn ich den gleichen Effekt über Allocatememory() erreichen kann..
Optimismus ist ein Mangel an Information.
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

AND51 hat geschrieben:Ich habe übrigens meine neue Prozedur mit deiner Verglichen, al90.
Ohne Debugger, 3 Mio. durchläufe, pro Durchlauf die Zahlen 123 und 123456789.

AND51: ~20,6 Sek.
al90: ~28,0 Sek.
Wie gesagt, Speed ist nicht alles. Fehlerfreiheit is the Number One.
und wie ich sehe hast du das problem mit 123124 noch immer nicht gelöst. :mrgreen:
ts-soft hat geschrieben: Beim "Optimieren" übersehen haben anscheinend Alle, das Werte unter 1000
unverändert als Str() zurückgegeben werden können.
Übersehen habe ich das nicht. Habe es für diesen zweck aber weggelassen
da wir hier eh mit For/Next schleifen testen. 0-5000000 oder so.
Da machen die 0-999 auch nicht viel aus. Richtig lohnen würde es sich
erst beim einlesen von langen verzeichnissen mit vielen Klein-Files. :wink:
Benutzeravatar
Proton
Beiträge: 152
Registriert: 20.06.2006 12:21
Wohnort: Eckernförde /Stadtbergen

Beitrag von Proton »

Kann auf meinem schnellen Computer keine Unterschiede feststellen.
Zitat:
"Ich kann mich vor die Meute stellen und für Nichts kämpfen. Ich kann aber auch einen Schritt zur Seite gehen, die Meute vorbeiziehen lassen und dabei meine Zeit angenehm bei Freunden verbringen.". Da hat er Recht, mein Pap's.
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

#NULL hat geschrieben:[@al90]

Bild jetzt auch mit unicode support :) :
Werde ich mir mal genauer ansehen. <)
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Hellhound66 hat geschrieben:Also wenn es um Speed geht, dann würde ich nicht Poke() nutzen, sondern direkt über Pointer arbeiten oder gleich ASM nutzen.
Nicht übel, sprach der Dübel. <)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Wieso habe ich meine neueste Version noch nicht hier reingestellt? Ich mach es mal.

@ al90: Du wirst sehen, ich schaffe sogar 123124 :mrgreen:

Code: Alles auswählen

Procedure.s tausendertrennzeichen(zahl.q, separator.s=".")
	Protected zahl$=StrQ(zahl), start.l=Len(zahl$)%3, res.s=PeekS(@zahl$, start), n.l
	For n=start To Len(zahl$)-start-1 Step 3
		res+separator+PeekS(@zahl$+n, 3)
	Next
	If start
		ProcedureReturn res
	Else
		ProcedureReturn PeekS(@res+Len(separator))
	EndIf
EndProcedure

Debug tausendertrennzeichen(123124)
Ich werde versuchen, noch zwei Verbesserungen einzubauen, eine davon ist eine, an die bisher noch keiner außer Rainer dran gedacht hat... Schmunzel... /:->
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Verbesserungen eingebaut.

Punkt 1: Zahlen von -999 bis 999 werden direkt zurückgegeben.

Punkt 2: da hat (außer mir) keiner dran gedacht: Man kann auch kleine Zahlen gruppieren: Was wäre z. B. mit -54157 ?

Code: Alles auswählen

Procedure.s tausendertrennzeichen(zahl.q, separator.s=".")
	If zahl > -1000 And zahl < 1000
		ProcedureReturn Str(zahl)
	EndIf
	Protected zahl$=RemoveString(StrQ(zahl), "-"), start.l=Len(zahl$)%3, res.s=PeekS(@zahl$, start), n.l
	For n=start To Len(zahl$)-start-1 Step 3
		res+separator+PeekS(@zahl$+n, 3)
	Next
	If zahl < 0
		res="-"+res
	EndIf
	If start
		ProcedureReturn res
	Else
		ProcedureReturn PeekS(@res+Len(separator))
	EndIf
EndProcedure

Debug tausendertrennzeichen(1234567890)
Debug tausendertrennzeichen(123456789)
Debug tausendertrennzeichen(12345678)
Debug tausendertrennzeichen(1234567)
Debug tausendertrennzeichen(123456)
Debug tausendertrennzeichen(12345)
Debug tausendertrennzeichen(1234)
Debug tausendertrennzeichen(123)
Debug tausendertrennzeichen(12)
Debug tausendertrennzeichen(1)
Debug tausendertrennzeichen(0)
Debug tausendertrennzeichen(-1)
Debug tausendertrennzeichen(-12)
Debug tausendertrennzeichen(-123)
Debug tausendertrennzeichen(-1234)
Debug tausendertrennzeichen(-12345)
Debug tausendertrennzeichen(-123456)
Debug tausendertrennzeichen(-1234567)
Debug tausendertrennzeichen(-12345678)
Debug tausendertrennzeichen(-123456789)
Debug tausendertrennzeichen(-1234567890)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

Doch. Schon lange im Einsatz

Code: Alles auswählen

;/ Lange Zahlen mit Tausendertrenner
Procedure.s StrLong(wert.q, tt.s = ".")
  
  If Abs(wert) < 1000 : ProcedureReturn StrQ(wert) : EndIf
  
  Protected rets.s
  Protected sign.s = ""
  Protected werts.s = StrQ(Abs(wert))
  Protected ix.l = Len(werts)
  Protected ix3.l
  
  If wert < 0 : sign = "-" : EndIf
  
  While ix > 0
    If ix3 = 3 : rets = tt + rets : ix3 = 0: EndIf
    rets = Mid(werts, ix, 1) + rets
    ix - 1 : ix3 + 1
  Wend
  
  ProcedureReturn sign + rets
  
EndProcedure  

Debug StrLong(-1)
Debug StrLong(-12)
Debug StrLong(-123)
Debug StrLong(-1234)
Debug StrLong(-12345)
Debug StrLong(-123456)
Debug StrLong(-1234567)
Debug StrLong(-12345678)
Debug StrLong(-123456789)

Debug StrLong(1)
Debug StrLong(12)
Debug StrLong(123)
Debug StrLong(1234)
Debug StrLong(12345)
Debug StrLong(123456)
Debug StrLong(1234567)
Debug StrLong(12345678)
Debug StrLong(123456789)
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Antworten