Schreibweise ändern (so geht das <> So Geht Das)...?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Wir sollten uns nochmal auf die "Regeln" einigen.
Eure Prozeduren korrigieren nur Buchstaben, denen (in)direkt ein Leerzeichen voransteht.

Auf solche Konstrukte geht ihr nicht ein:

Code: Alles auswählen

Debug wasnlos("muss_dies_hier_nicht_auch_Großgeschrieben_werden?")
Ich dachte, es geht hier darum, frei stehende Worte zu korrigieren; dabei müssen diese nicht unbedingt nur durch ein Leerzeichen getrennt sein.

Machen wir das jetzt nur vom Leerzeichen abhängig oder nehmen wir auch Konstrukte wie mein obiges Beispiel mit rein?

> LCase
LCase() ist der "worst case" ^^
Stell dir mal vor, du jagst mein obiges Beispiel durch LCase(). Dabei würde das Wort "Großschreibung" verkleinert. Deine Prozedur macht das aber nicht rückgängig, also ist deine Prozedur fehlerhaft!
Wenn du das so machen möchtest, gern; dann musst du aber auch alle 'erkennbar freistehenden' Wörter korrigieren und nicht nur jene, die (in)direkt durch Leerzeichen getrennt sind.

Deshalb schlage icgh vor, wir beschränken uns nicht nur auf Leerzeichen, sondern nehmen auch andere Trennzeichen mit rein. Theoretisch kann ja jedes Zeichen außer a-z und A-Z als Trennzeichen dienen.


@ alle
Noch was:
Bin dank dem Stichwort LCase() drauf gekommen. LCase() berücksichtigt auch Sonderzeichen wie é, Ä, Ö und so weiter. Diese müssen wir hier auch einbauen. Habe bisher auch nicht dran gedacht, aber Jungs, wir wissen ja jetzt was zu tun ist!
Frisch ans Werk! :allright:
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 »

Hier eine Liste der Buchstaben, die wir in unseren Prozeduren berücksichtigen müssen:

Code: Alles auswählen

For n=32 To 255
	If Asc(LCase(Chr(n))) <> Asc(UCase(Chr(n)))
		Debug "Zeichen: "+Chr(n)+" ("+Str(n)+")"
	EndIf
next
Achtung: Passt auf, zum Beispiel scheint Chr(247), wenn man es durch UCase() und LCase() jagt, kein gültiges Zeichen zu sein!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Du musst jetzt aber auch keine Doktorarbeit über dieses Pipifaxthema abhandeln.

Ich bin nur eingestiegen, weil mich Andreas' Aussage irgendwie gereizt hat:
>>Glaub aber das man das nicht mehr schneller machen kann, es seidenn es kann mir jemand das gegenteil beweisen^^

Das Thema sollte nun durch sein, zumindest für mich, so spannend finde ich das denn auch wieder nicht.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Es zwingt dich ja niemand, mitzumachen.
Leider kann man nicht ohne Weiteres !32 zum kleinschreiben und |32 zum großschreiben anwenden, dies klappt bei ein paar Zeichen nicht.
Trotzdem danke für diese Idee, ist immerhin schneller als +-32.
Dennoch: Wenn man's macht, sollte man's schon richtig machen. Finde ich.
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 »

So hier meine Prozedur:

Code: Alles auswählen

Procedure.s Capitalize(text.s)
	Protected *pos.Character=@text, inWord.l
	While *pos\c
		Select *pos\c
			Case 1 To 64, 91 To 96, 123 To 191, 215, 247
				inWord=0
			Default
				If inWord
					Select *pos\c
						Case 65 To 90, 192 To 214, 216 To 222
							*pos\c|32
						Case 159
							*pos\c=255
					EndSelect
				Else
					Select *pos\c
						Case 97 To 122, 224 To 246, 248 To 254
							*pos\c!32
						Case 255
							*pos\c=159
					EndSelect
					inWord=1
				EndIf
		EndSelect
		*pos+SizeOf(Character)
	Wend
	ProcedureReturn text
EndProcedure

Debug Capitalize("<DiES 'isT #eIn +testText, ~um 3zu 4zEigÖn &wAs_(paS)siertÖ")
Debug Capitalize("äöüÄÖÜß ß ^ ÿÞ")
Die wandelt ganze Wörter um, egal ob diese durch Leerzeichen, Bindestriche, Unterstriche, etc. getrennt sind.
Durch die falsche Handhabung von ÿ und Ÿ musste ich eine manuelle Korrektur mit einem zusätzlichen Case vornehmen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten