Forum: PC-Programmierung Welches Zeichen, das angibt, dass der nächste Buchstabe in Großschreibung interpretiert werden soll?


von Guido C. (guidoanalog)


Lesenswert?

Hallo,

manchmal arbeite ich mit Systemen, die intern nicht zwischen Groß- und 
Kleinschreibung unterscheiden. Eine Abfrage der Art "ä" == "Ä" liefert 
entsprechend der Abfrage "ä" == "ä" den booleschen Wert True. Ich 
behelfe mir in diesem Fall, indem ich großen Buchstaben das "^"-Zeichen 
voranstelle. Die Abfrage lautet somit "ä" == "^ä" und liefert den 
booleschen Wert False.

Meine Frage an Euch: Gibt es ein "offizielles" Zeichen das angibt, dass 
der folgende Buchstabe in Großschreibung interpretiert bzw. ausgegeben 
werden soll?

Mit freundlichen Grüßen
Guido

von Peter II (Gast)


Lesenswert?

um welche Programiersprache geht es überhaupt?

> Ich
> behelfe mir in diesem Fall, indem ich großen Buchstaben das "^"-Zeichen
> voranstelle.
du kannst auch "ich will false" davor schreiben dann liefert dann auch 
eine false zurück - aber ob das sinn macht?

von mb (Gast)


Lesenswert?

Hi Guido,

wir bauen alle Befehlsinterpreter so, dass nur auf Kleinschreibung 
geprüft wird. Vorher werden alle Befehle in 'lower case' konvertiert. 
Dementsprechend gibt es nur einen Befehlssatz und der Anwender kann die 
Befehle schreiben, wie er möchte.
Vielleicht wäre das für Dein Projekt auch ein weg.

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

Peter II schrieb:
> um welche Programiersprache geht es überhaupt?

z. B. FAMOS

Peter II schrieb:
> du kannst auch "ich will false" davor schreiben dann liefert dann auch
> eine false zurück - aber ob das sinn macht?

Ist mir natürlich klar. Mich hätte eher interessiert, ob es hierfür ein 
gebräuchliches Zeichen bzw. eine gebräuchliche Zeichenkette gibt.

Mit freundlichen Grüßen
Guido

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

mb schrieb:
> wir bauen alle Befehlsinterpreter so, dass nur auf Kleinschreibung
> geprüft wird. Vorher werden alle Befehle in 'lower case' konvertiert.
> Dementsprechend gibt es nur einen Befehlssatz und der Anwender kann die
> Befehle schreiben, wie er möchte.
> Vielleicht wäre das für Dein Projekt auch ein weg.

Im konkreten Fall möchte ich in Zeichenketten Sonderzeichen durch 
"normale" Zeichen ersetzen (z. B. "ä" durch "ae" oder "Ä" durch "Ae"). 
Die Groß- und Kleinschreibung soll dabei erhalten bleiben. Das 
Schwierigkeit dabei ist weniger das Ersetzen und das ganze "drum herum", 
sondern vielmehr die Tatsache, dass ich innerhalb des Listings eine 
Ersetzungstabelle definieren muss. So in der Art:

Tabelle:{ä} = "ae"
Tabelle:{Ä} = "Ae"
Tabelle:{ö} = "oe"
Tabelle:{Ö} = "Oe"
usw...

Das Problem ist, dass Tabelle:{ä} und Tabelle:{Ä} die gleiche Variable 
ist. Daher die Idee mit

Tabelle:{ä} = "ae"
Tabelle:{^ä} = "Ae"
Tabelle:{ö} = "oe"
Tabelle:{^ö} = "Oe"
usw...

Die Frage ist nur, ob das "^" so glücklich gewählt ist.

Mit freundlichen Grüßen
Guido

von Günther (Gast)


Lesenswert?

Guido C. schrieb:
> Gibt es ein "offizielles" Zeichen das angibt, dass
> der folgende Buchstabe in Großschreibung interpretiert bzw. ausgegeben
> werden soll?

nennt sich Shift-Taste.

von MWS (Gast)


Lesenswert?

Guido C. schrieb:
> Die Frage ist nur, ob das "^" so glücklich gewählt ist.

Kannst ja auch vereinbaren, dass zwei ää ein Ae ergeben.

von Udo S. (urschmitt)


Lesenswert?

Wenn die Systeme keine Unterscheidung machen warum willst du dann mit 
Gewalt eine machen.
Es gibt kein solches Zeichen, denn in praktisch allen Zeichensätzen gibt 
es dafür einfach 2 Zeichen nämlich 'O' und 'o', 'A' und 'a' ...
Wenn du die deutschen Sonderzeichen wegen Suchen ersetzen willst würde 
ich nicht ä mit ae sondern einfach ä mit a ersetzen usw.
Zum suchen und vergleichen einen STring immer in Lowercase konvertieren. 
Wenn du das Original noch für eine Anzeige incl. Großschreibung brauchst 
musst du ihn halt doppelt halten.

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

Udo Schmitt schrieb:
> Wenn die Systeme keine Unterscheidung machen warum willst du dann mit
> Gewalt eine machen.

Die Daten kommen von außerhalb des Systems, daher der "Gewaltakt".

Mit freundlichen Grüßen
Guido

von hmmmm (Gast)


Lesenswert?

Verstehe ich das richtig: Es gibt intern Repräsentationen für Groß- und 
kleinbuchstaben, aber Vergleiche unterscheiden nicht zwischen Groß- und 
kleinschreibung?
Vielleicht gibts nen Parameter zum einstellen oder ne Extrafunktion mit 
der es geht?
Kannst du auf die ASCII-Codes zugreifen und dir darüber nen Hack bauen?

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

hmmmm schrieb:
> Verstehe ich das richtig: Es gibt intern Repräsentationen für Groß- und
> kleinbuchstaben, aber Vergleiche unterscheiden nicht zwischen Groß- und
> kleinschreibung?

Ja. Es gibt keine vordefinierte Funktion, die es ermöglicht zwei 
Zeichenketten unter Berücksichtigung der Groß- und Kleinschreibung zu 
vergleichen. Der Vergleich von "TeST" mit "tesT" liefer True.

hmmmm schrieb:
> Kannst du auf die ASCII-Codes zugreifen und dir darüber nen Hack bauen?

Darauf wollte ich eigentlich hinaus. Beim Einlesen ändere ich alle 
Großbuchstaben in z. B. "^Kleinbuchstabe" und beim Ausgeben geht's 
wieder zurück. Meine Frage war, welches Präfix hierfür üblich ist? Wie 
ich den bisherigen Antwort entnehmen gibt es hierfür jedoch nicht den 
Präfix. Ich werde daher wohl bei "^" bleiben.

Mit freundlichen Grüßen
Guido

von hmmmm (Gast)


Lesenswert?

Wenn du auf die Ascii-Codes zugreifen kannst, kannst du dir doch eine 
Vergleichsfunktion bauen?

von Robert L. (lrlr)


Lesenswert?

>Beim Einlesen ändere ich alle
>Großbuchstaben

woher weißt du dass es ein großbuchstabe ist ;-)

wenn sich A nicht von a unterscheidet?

mach es wie hmmmm  vorgeschlagen hat...

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

Robert L. schrieb:
> woher weißt du dass es ein großbuchstabe ist ;-)

Über die Codes der Zeichen. Hierfür gibt es eine Funktion.

Robert L. schrieb:
> mach es wie hmmmm  vorgeschlagen hat...

Dies würde natürlich auch gehen. Wenn ich jedoch mit einem Präfix 
arbeite, muss ich nur beim Einlesen und Ausgeben der Zeichenketten 
"aktiv werden". Es sind keine weiteren Anpassungen innerhalb bestehender 
Programme notwendig.

Mit freundlichen Grüßen
Guido

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Lass es lieber. Die Kennzeichnung von Großbuchstaben durch ein Präfix 
ist absolut unüblich, und wird bei jedem der deinen Code sieht erst mal 
ein Stirnrunzeln hervorrufen. Ich kann mir auch kein Szenario vorstellen 
in dem so ein Hack sinnvoll ist. Du sparst vielleicht hier und da ein 
paar Zeichen Code, aber du bringst zusätzliche Komplexität in das 
Programm, du erschaffst ein neues Stringformat für das du 
Konvertierungsfunktionen von und zu ASCII schreiben musst, du erzeugst 
Mehrdeutigkeiten ("^Bla", "^bla", "Bla"), musst Sonderfälle behandeln 
("^^bla"), kurz, du kommst von Regen in die Traufe. Schreib dir lieber 
eine strcomp-Funktion die case sensitive ist.

von Reinhard Kern (Gast)


Lesenswert?

Andreas Schwarz schrieb:
> Schreib dir lieber
> eine strcomp-Funktion die case sensitive ist.

Aber die übliche C-Funktion strcmp() IST case-sensitive. Ich kenne das 
so, z.B. von Pascal, dass man eine Variation der Funktion (stricmp) 
verwenden muss, wenn man case insensitive prüfen will. Ich dachte 
bisher, das wäre generell so, weil die Basisfunktion schlicht 
ASCII-Werte vergleicht, deshalb wundert mich, dass das angefragte 
Problem überhaupt besteht.

Das Win32 API stellt meiner Erinnerung nach Vergleichsfunktionen für 
jede Art des Vergleichs zur Verfügung. Manche Systeme identifizieren 
übrigens Ä nur als Grossbuchstabe zu ä, wenn deutsch oder europäisch im 
System ausgewählt ist.

Gruss Reinhard

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

Andreas Schwarz schrieb:
> Konvertierungsfunktionen von und zu ASCII schreiben musst, du erzeugst
> Mehrdeutigkeiten ("^Bla", "^bla", "Bla"), musst Sonderfälle behandeln
> ("^^bla"), kurz, du kommst von Regen in die Traufe. Schreib dir lieber
> eine strcomp-Funktion die case sensitive ist.

Reinhard Kern schrieb:
> Aber die übliche C-Funktion strcmp() IST case-sensitive. Ich kenne das
> so, z.B. von Pascal, dass man eine Variation der Funktion (stricmp)
> verwenden muss, wenn man case insensitive prüfen will. Ich dachte
> bisher, das wäre generell so, weil die Basisfunktion schlicht
> ASCII-Werte vergleicht, deshalb wundert mich, dass das angefragte
> Problem überhaupt besteht.

Ihr habt sicher recht. Allerdings ist es so, dass ich meine Programme 
bzw. Skripte für imc FAMOS 6.0 schreibe. Dort ist es definitiv so, dass 
alle vordefinierten String-Vergleichfunktionen case-insensitive sind. 
Eine eigene String-Vergleichsfunktion zu schreiben werde ich mir noch 
einmal überlegen. Ich befürchte jedoch, dass diese gegenüber den 
eingebauten Vergleichsfunktionen extrem langsam sein wirde. Damit es für 
Euch verständlicher wird: Dies wäre in etwa damit vergleichbar als würde 
man in MATLAB den Mittelwert der Elemente eines Vektors mittels Schleife 
über alle Elemente berechnen. Die macht natürlich keiner, da Matlab 
hierfür eine eingebaute Funktion bereitstellt, die wesentlich schneller 
ist als eine Schleife über die Elemente des Vektors.

Mit freundlichen Grüßen
Guido

von Markus V. (valvestino)


Lesenswert?

Guido C. schrieb:
> Ich befürchte jedoch, dass diese gegenüber den
> eingebauten Vergleichsfunktionen extrem langsam sein wirde.

Eines der grundlegenden Prinzipien in der Software-Entwicklung ist es, 
seinen Code erst einmal simpel und einfach zu entwerfen und erst später 
bei Bedarf Code bezüglich Laufzeit und Speicherbedarf zu optimieren, 
wenn sich herausstellt, das Programm ist zu langsam oder benötigt zu 
viel Speicher. Dies erfolgt mit geeigneten Werkzeugen wie z.B. einfachen 
Zeitmessungen oder Profilern und nicht per Raten. Das funktioniert 
nämlich überhaupt nicht.

In Deinem Fall bedeutet dies: Implementiere einen case-sensitiven 
Sting-Vergleich mittels Schleife und schaue mal, ob da nicht ausreicht. 
Wenn nicht, kannst Du Dir immer noch den Kopf über wilde Optimierungen 
zerbrechen.

Gruß
Markus

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Man könnte den case sensitiven Vergleich auch einfach nur dann anstoßen 
wenn der nicht sensitive fehlschlug:
1
if (cmp(a,b) && caseSensitive(a,b)) {
2
 //tu was
3
}
je nachdem wie häufig halt gleiche Werte sind... das bringt aber 
wirklich nur was wenn die "naive" Implementierung sehr viel langsamer 
als die eingebaute ist. Ansonsten gilt was Markus schrieb.

von D. I. (Gast)


Lesenswert?

Guido C. schrieb:
> Dies wäre in etwa damit vergleichbar als würde
> man in MATLAB den Mittelwert der Elemente eines Vektors mittels Schleife
> über alle Elemente berechnen. Die macht natürlich keiner, da Matlab
> hierfür eine eingebaute Funktion bereitstellt, die wesentlich schneller
> ist als eine Schleife über die Elemente des Vektors.

Aha wie denn? Multi-threaded mittels Tournier-Verfahren? Sonst fiele mir 
ad hoc erstmal nicht ein wie man unter O(n) das berechnen sollte.

Guido C. schrieb:
> Eine eigene String-Vergleichsfunktion zu schreiben werde ich mir noch
> einmal überlegen. Ich befürchte jedoch, dass diese gegenüber den
> eingebauten Vergleichsfunktionen extrem langsam sein wirde.

Same here, was glaubst du denn was die eingebaute Funktion magisches 
macht außer Zeichen für Zeichen zu vergleichen?

von Arc N. (arc)


Lesenswert?

D. I. schrieb:
> Guido C. schrieb:
>> Dies wäre in etwa damit vergleichbar als würde
>> man in MATLAB den Mittelwert der Elemente eines Vektors mittels Schleife
>> über alle Elemente berechnen. Die macht natürlich keiner, da Matlab
>> hierfür eine eingebaute Funktion bereitstellt, die wesentlich schneller
>> ist als eine Schleife über die Elemente des Vektors.
>
> Aha wie denn? Multi-threaded mittels Tournier-Verfahren? Sonst fiele mir
> ad hoc erstmal nicht ein wie man unter O(n) das berechnen sollte.

Und? Die Laufzeiten von Algorithmen der gleichen Komplexität müssen 
nicht identisch sein. Einfach mal das Beispiel mit ein paar Durchläufen 
auf einem 1000k Vektor ausprobieren.

von Robert L. (lrlr)


Lesenswert?

>Same here, was glaubst du denn was die eingebaute Funktion magisches
>macht außer Zeichen für Zeichen zu vergleichen?


dass die eingebaute (vermutlich) in z.B. C/C++ usw.  geschrieben ist..

die selbergeschriebene (vermutlich) nicht compiliert, sonder 
interpretiert würde..

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

Robert L. schrieb:
> dass die eingebaute (vermutlich) in z.B. C/C++ usw.  geschrieben ist..

das weiß ich leider nicht. Es ist jedoch sehr wahrscheinlich.

Robert L. schrieb:
> die selbergeschriebene (vermutlich) nicht compiliert, sonder
> interpretiert würde..

Dem ist so. FAMOS besitzt einen Interpreter und keinen Compiler. Das 
ganze ist dann auch eher eine Skript- als eine Programmiersprache.

Mit freundlichen Grüßen
Guido

von Robert L. (lrlr)


Lesenswert?

ich würd a) trotzdem erstmal die selbergeschriebene StrCompare funktion 
probieren

und b) generell mal das vergleichen von strings in frage stellen..

denn: ist der String von einem EndUSER eingegeben, dann macht 
CaseInsesitiv durchaus sinn..

ist der String nicht von einem EndUser, ist sowieso irgendwas am kozept 
faul..

die mEisten endUser scheren sich nicht so um die großKleinschreibung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.