FirstChar = Grossbuchstabe

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

FirstChar = Grossbuchstabe

Beitrag von Blackskyliner »

wie kann ich es machen, dass der erste buchstabe eines wortes mit nem grossem zeichen beginnt?? also sowat in der art UCFirst(satz.s)
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

hab was gefunde hat sich erledigt sorry!

Code: Alles auswählen

Procedure.s ucfirst (string.s) ; Erster Buchstabe gross darstellen. 
  For x=1 To Len(string.s) 
    If Mid(string.s,x,1)<>Chr(32) 
       BrkPos.l=x 
       Break 
    EndIf 
  Next x 
  ersterteil.s=UCase(Mid(String.s,1,BrkPos.l)) 
  zweiterteil.s=Mid(String.s,BrkPos.l+1,len(string.s)-BrkPos.l) 
  ProcedureReturn ersterteil.s+zweiterteil.s 
EndProcedure 
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag von crossroads »

Etwas kürzer:

Code: Alles auswählen

Procedure.s ucfirst(String$)
  ersterteil.s = LTrim(String$)
  ProcedureReturn Space(Len(String$) - Len(ersterteil)) + UCase(Left(ersterteil, 1)) + Right(ersterteil, Len(ersterteil) - 1)
EndProcedure

Debug ucfirst("          hallo!")
Man soll die Tür aufmachen, bevor man durchgeht ...
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Hier noch eine Version, die wahrscheinlich etwas schneller ist:

Code: Alles auswählen

Procedure.s UCaseFirst(str.s)
  Protected result.s
  result = str
  PokeB(@result, Asc(UCase(PeekS(@result, 1))))
  ProcedureReturn result
Endprocedure
!UD2
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Danke!
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Rob
Shadow Admin
Beiträge: 258
Registriert: 26.08.2004 01:39
Kontaktdaten:

Beitrag von Rob »

Und noch ein paar Millisekunden beschleunigt :D
Es läuft übrigens ~10 mal so schnell, wenn du es aus der Prozedur rausnimmst:

Code: Alles auswählen

string.s = "hallo welt"




Procedure.s UCaseFirst(str.s) 
  Protected result.s 
  result = str 
  PokeB(@result, Asc(UCase(PeekS(@result, 1)))) 
  ProcedureReturn result 
EndProcedure

Procedure.s ucfirst(String$) 
  ersterteil.s = LTrim(String$) 
  ProcedureReturn Space(Len(String$) - Len(ersterteil)) + UCase(Left(ersterteil, 1)) + Right(ersterteil, Len(ersterteil) - 1) 
EndProcedure


Debug "Bitte warten..."

start = ElapsedMilliseconds()
For i = 1 To 10000000
  str.s = ucfirst(string)
Next
Debug "crossroads - Procedure: " + Str(ElapsedMilliseconds() - start) +  " ms"


start = ElapsedMilliseconds()
For i = 1 To 10000000
  ersterteil.s = LTrim(string) 
  str.s = Space(Len(string) - Len(ersterteil)) + UCase(Left(ersterteil, 1)) + Right(ersterteil, Len(ersterteil) - 1)
Next
Debug "crossroads - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms"


start = ElapsedMilliseconds()
For i = 1 To 10000000
  s.s = UCaseFirst(string)
Next
Debug "Froggerprogger - Procedure: " + Str(ElapsedMilliseconds() - start) +  " ms"



start = ElapsedMilliseconds()
For i = 1 To 10000000
  s.s = UCase(Chr(PeekB(string))) + Right(string,Len(string)-1)
Next
Debug "Rob - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms"


start = ElapsedMilliseconds()
For i = 1 To 10000000
  PokeB(@string, Asc(UCase(PeekS(@string, 1)))) 
Next
Debug "Froggerprogger - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms"


strong.s = "hallo welt"

start = ElapsedMilliseconds()
For i = 1 To 10000000
  PokeB(strong, UCase(Chr(PeekB(strong))))
Next
Debug "Rob 2 - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms"

strung.s = "hallo welt"

start = ElapsedMilliseconds() 
For i = 1 To 10000000 
  PokeB(strung, PeekB(strung)-32) 
Next 
Debug "Rob 3 - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms"
[EDIT: Keine Ahnung was UCase() genau macht, aber für "normale" Strings mit Buchstaben kannst du auch einfach 32 abziehen. Ist nochmal etwas schneller.

Code: Alles auswählen

PokeB(string, PeekB(string)-32)
]
Zuletzt geändert von Rob am 01.11.2005 21:03, insgesamt 1-mal geändert.
Build a man a fire and he's warm for a day. Set a man on fire and he's warm for the rest of his life
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Dankeschön!! Des hebt die Performance erheblich :D
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

PokeB(strung, PeekB(strung)+32)
gibt mir aber nur ne Adresse zurück...

EDIT:
ahh ok isst die buffer address

Code: Alles auswählen

start = ElapsedMilliseconds() 
For i = 1 To 10000000 
  PokeB(strung, PeekB(strung)+32) 
Next 
Debug "Rob 3 - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms"
Gibt bei mir bei nem Debug von nem PeekS() des PokeB´s ein falsches zeichen aus...
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Rob
Shadow Admin
Beiträge: 258
Registriert: 26.08.2004 01:39
Kontaktdaten:

Beitrag von Rob »

Ich Trottel :>
Musst natürlich 32 abziehen, nicht addieren (Siehe ASCII-Tabelle)

So gehts:

Code: Alles auswählen

string.s = "hallo welt"
PokeB(string, PeekB(string)-32) 
Debug string
Build a man a fire and he's warm for a day. Set a man on fire and he's warm for the rest of his life
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

Beitrag von NicTheQuick »

Was soll denn das mit diesen "strong" und "strung"?

Hab übrigens neue Ergebnisse:
Programm hat geschrieben:crossroads - Procedure: 13920 ms
crossroads - direkt: 10354 ms
Froggerprogger - Procedure: 11707 ms
Rob - direkt: 4947 ms
Froggerprogger - direkt: 511 ms
Rob 2 - direkt: 431 ms
Rob 3 - direkt: 120 ms

Code: Alles auswählen

string.s = "hallo welt" 

#MaxD = 10000000


Procedure.s UCaseFirst(str.s) 
  Protected Result.s 
  Result = str 
  PokeB(@Result, Asc(UCase(PeekS(@Result, 1)))) 
  ProcedureReturn Result 
EndProcedure 

Procedure.s ucfirst(String$) 
  ersterteil.s = LTrim(String$) 
  ProcedureReturn Space(Len(String$) - Len(ersterteil)) + UCase(Left(ersterteil, 1)) + Right(ersterteil, Len(ersterteil) - 1) 
EndProcedure 


start = ElapsedMilliseconds() 
  For i = 1 To #MaxD 
    str.s = ucfirst(string) 
  Next 
text.s = "crossroads - Procedure: " + Str(ElapsedMilliseconds() - start) +  " ms" + #CRLF$


start = ElapsedMilliseconds() 
  For i = 1 To #MaxD 
    ersterteil.s = LTrim(string) 
    str.s = Space(Len(string) - Len(ersterteil)) + UCase(Left(ersterteil, 1)) + Right(ersterteil, Len(ersterteil) - 1) 
  Next 
text + "crossroads - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms" + #CRLF$


start = ElapsedMilliseconds() 
  For i = 1 To #MaxD 
    s.s = UCaseFirst(string) 
  Next 
text + "Froggerprogger - Procedure: " + Str(ElapsedMilliseconds() - start) +  " ms"  + #CRLF$



start = ElapsedMilliseconds() 
  For i = 1 To #MaxD 
    s.s = UCase(Chr(PeekB(string))) + Right(string,Len(string)-1) 
  Next 
text + "Rob - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms" + #CRLF$


start = ElapsedMilliseconds() 
  For i = 1 To #MaxD 
    PokeB(@string, Asc(UCase(PeekS(@string, 1)))) 
  Next 
text + "Froggerprogger - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms" + #CRLF$


string.s = "hallo welt" 

start = ElapsedMilliseconds() 
  For i = 1 To #MaxD 
    PokeB(string, UCase(Chr(PeekB(string)))) 
  Next 
text + "Rob 2 - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms" + #CRLF$

string.s = "hallo welt" 

start = ElapsedMilliseconds() 
  For i = 1 To #MaxD 
    PokeB(string, PeekB(string)-32) 
  Next 
text + "Rob 3 - direkt: " + Str(ElapsedMilliseconds() - start) +  " ms" + #CRLF$

MessageRequester("Ergebnisse", text)

SetClipboardText(text)
Aber auf was man auch noch achten sollte: Was ist, wenn der erste Buchstabe schon großgeschrieben ist?
Antworten