![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Newbie
![]() Registriert seit: 26.05.2001
Beiträge: 4
|
![]() Hallo,
da ich erst angefangen habe, mit c++ zu proggen bin ich logischerweise nicht sehr gut ;-) Meine Frage: Wie kann ich einen String(nur Großbuchstabe) nach dem alphabet ordnen ??? Danke für eure Hilfe !! thx mode2 |
![]() |
![]() |
![]() |
#2 |
Inventar
![]() |
![]() programmerl schreiben das zeichen in einem string nach seinen ascii werten ordnet
![]()
____________________________________
\"Ein Gewitter reinigt die Luft\", sagte der Mann, nachdem ein Blitz seine Frau erschlug Nicht klicken! Erstposteralarm/Beschwerde/Kummerkasten Verplattet |
![]() |
![]() |
![]() |
#3 |
Senior Member
![]() |
![]() HI !
strcmp(...,...); dieser befehl vergleicht Wörter und Buchstaben, die du in der klammer (zb. als pointer) angibst und liefert folgenden wert zurück: zb: strcmp(*(a+i),*(a+i+1)) wobei *(a+i) auf den ersten namen verweist *(a+i+1) auf den 2ten wenn die beiden zu vergleichenden wörter/buchstaben gleich sind: 0 wenn der 1 im alph. vor dem 2 kommt( also wenn die reihenfolge stimmt): -1 wenn der name 2 im alph. vor name 1 kommt: 1 das ganze kannst du dann mittels einer if schleife und dem bubblesort verfahren lösen |
![]() |
![]() |
![]() |
#4 |
Newbie
![]() Registriert seit: 26.05.2001
Beiträge: 4
|
![]() Danke,
aber wie komme ich von einem char zeichen zum ASCII Code, welchen Befehl gibt es da ?? |
![]() |
![]() |
![]() |
#5 |
Newbie
![]() Registriert seit: 26.05.2001
Beiträge: 4
|
![]() Danke Stingerr
mit pointer kann ich aber im moment noch nichts anfangen, bin noch blutiger anfänger |
![]() |
![]() |
![]() |
#6 |
Inventar
![]() |
![]() @mode2 kannst einfach abfrage
string[i]>string[i+1] ascii tabelle gibts hier oder du schreibst dir ein proggie das dir von 0 an bis 255 alle ascii zeichen aufzählt einfach: char x=0; int i; for(i=0;i<=255;i++) {printf("%d",x); x++;} //sonderzeichen wie linefeed usw müsstest halt abfangen
____________________________________
\"Ein Gewitter reinigt die Luft\", sagte der Mann, nachdem ein Blitz seine Frau erschlug Nicht klicken! Erstposteralarm/Beschwerde/Kummerkasten Verplattet |
![]() |
![]() |
![]() |
#7 |
Newbie
![]() Registriert seit: 26.05.2001
Beiträge: 4
|
![]() @pong
Wie meinst du das mit string[i]<string[i+1], könntest das bitte genauer erklären danke für deine hilfe mode2 |
![]() |
![]() |
![]() |
#8 |
Inventar
![]() |
![]() du willst ja in einem string alle zeichen ordnen? oder hab ich das falsch verstanden wenn ja dann nicht mehr weiterlesen
du gehst einfach zeichenweise durch den string solange i<stringlänge { solange j<stringlänge wenn string[j]<string[i] {dann tausch} j++ } i++ j=0 } du fragst einfach zeichenweise ab, string is dein string egal wiest ihn nennst i is da index
____________________________________
\"Ein Gewitter reinigt die Luft\", sagte der Mann, nachdem ein Blitz seine Frau erschlug Nicht klicken! Erstposteralarm/Beschwerde/Kummerkasten Verplattet |
![]() |
![]() |
![]() |
#9 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Hallo mode2 !
Einen char vereinbarst Du und es ist eine einstellige (1 Byte große) Datenvariable, die den Wert 0 bis 255 aufnimmt, oder falls es eine vom Datentyp her signed char Variable ist, kann man damit die Werte -128 bis +127 ablegen, das mit dem +/- oder Absolutwert 0-255 ist Ansichts- und auch - logischerweise - Definitionssache. Wie Du eben die Variable vereinbarst. char ch; /* 1 ASCII-Zeichen für den Charactercode, standardmäßig signed char !!, sonst explizit unsigned char verwenden um positive Zahlen verwenden zu können, das wäre dann 0-255, falls mit Umlauten verglichen wird z.B. mit einem 'ä' (ist größer als 127), dann funktioniert der Vergleich mit einer signed char Datenvariable auch so, bei Angabe des dezimalen (numerischen) ASCII-Codewerts muß ein negativer Wert verwendet werden (Zweierkomplement) */ char *p_ch; /* Zeiger auf einen Wert vom Datentyp [signed] char */ char a_name[20]; /* maximal 19 stelliges Character-Array + Nullbyte */ Um zum Ascii-Code eines Buchstabens zu kommen, brauchst Du eine sogenannte ASCII-Codetabelle, da werden dann die Codes für die Zeichen 0 bis 127 oder sogar darüber hinaus (128-255) für einen spezifischen nationalen Zeichensatz (z.B. PC850 Westeuropa in MS-DOS) tabellarisch in irgend einer allgemeingültigen Form aufgelistet. Mit Dezimalcode, Hexcode, Oktalcode, Characterzeichen, Signalname (z.B. dezimal 27 = ESC Zeichen). Die Großbuchstaben beginnen bei 65 (= A) und enden mit 90 (=Z), um zu den Kleinbuchstaben zu kommen, mußt Du nur das Bit 5 (= dezimal 32) zu z.B. 65 hinzuzählen, dann erhältst Du den Dezimalcode für das kleine "a". Also, besorge Dir eine ASCII-Tabelle. Ein Link dazu steht ja bereits im Thread angeführt. >>>>>>>>>>> Wie druckt man nun eine Charvariable am Bildschirm aus ? printf("Zeichencode: %c", ch); Also, schau Dir den Befehl printf - besser gesagt die Funktion printf - in einem C-Lehrbuch an. In C++ geht es einfacher, mit: cout << "Zeichencode: " << ch; Der Funktionsaufruf für printf bzw. cout blablabla für den Zeiger, der so gesetzt sein muß: p_ch= &ch; /* Zeiger p_ch erhält die Adresse von ch, Adresse mittels address-of Operator '&' */ müßte vom Prinzip her so aussehen: printf("Zeichencode: %c", *p_ch); /* Zugriff auf den Character-Datenwert durch p_ch mittels des '*'-Operators */ cout << "Zeichencode: " << *p_ch; printf bzw. cout blablabla für die erste Stelle (das erste Element) des Character-Array a_name[Anzahl_der_Elemente+1]; printf("Zeichencode: %c", a_name[0]); /* Zugriff auf den Character-Datenwert durch a_name Position 0, in C und C++ beginnt man bei 0 zu zählen ! cout << "Zeichencode: " << a_name[0]; Will man auf die 2.Stelle des Arrays zugreifen, schreibt man a_name[1], die Schreibweise kann auch anders lauten, nämlich: *(a_name+1). Für die 1.Stelle reicht *a_name, a_name ist sozusagen die Anfangsadresse des Arrays, mit dem *-Operator greifst Du dann aber bereits auf eines der ! DATEN... ! -Elemente des (in diesem Fall char-)Arrays zu. Alles klar, ja, dann tu schön weiter. Vergiß nicht strukturiert und überlegt zu entwerfen, wie auch zu codieren. Mit der Funktion strcmp(string1,string2) kannst Du den Vergleich machen, vorher solltest Du die Strings mit einer anderen Funktion strupper(string1); strupper(string2); in Großbuchstaben umwandeln. Funktioniert aber nicht für die Umlaute, am besten eine eigene Routine schreiben mittels for-Schleife durch das 'Array' von 'chars' durchlaufen und fragen/durchführen: if(*p_ch=='ä') *p_ch='Ä'; gleiches für das 'ö' und das 'ü'. Das Ende erkennst Du durch das Null-Zeichen im Characterarray bzw. String. /* Funktion mystrupper, 20010527 myname=Autor, keine Veränderungen String auf Großschreibung bringen --------------------------------------------------------------------*/ int mystrupper(char *string) { if(!string) return -1; /* der Nullpointer wurde übergeben ! ? */ /* for - Schleife zum Umwandeln in Großschreibung */ /* Schleifenkopf des for-Befehls, bestehend aus: 1 = Vorbereitung, einmalige Inititalisierung von Daten- und Adreßvariablen, Anweisungen werden durch Kommata getrennt 2 = Vergleichsbedingung positiv, diese Bedingung muß wahr sein (numerisch <> 0, damit mit der Schleifenbehandlung fortgefahren wird 3 = Increment / Decrement ad 1): einmal vor allem anderen auszuführen, "Initialisierung" ad 2): jedesmal VOR dem Ausführen des Schleifenkörpers abzufragende Bedingung, die auf positiv testen muß ad 3): jedesmal NACH dem Durchlauf des Schleifenkörpers auszuführende Operationen, die zum Hoch- oder Niederzählen von Zählern oder Zeigern dienen, können auch mehrere Anweisungen sein, durch Kommata getrennt der Befehl break + ";" dient zum (vorzeitigen) Verlassen der Schleife, ohne daß weitere Anweisungen ausgeführt werden der Befehl continue + ";" dient zum (vorzeitigen) Ausführen des Increment/Decrement-Teils mit anschließender Testung der Schleifenbedingung und dem wiederholten Ausführen des Schleifenkörpers, falls die Bedingung positiv testet */ for ( /*keine Vorbereitung notwendig, wozu auch */ ; *string /* Vergleich, ob die aktuelle Stringposition (noch) ungleich Null ist */ ; string++ /* String - Pointer - Variable um ein Element (=1 Byte) hochzählen */ ) { /* Beginn des Schleifenkörpers der for-Schleife */ if(*string>='a' && *string<='z') *string-= 32; /* 32 vom ASCII-Code des kleinen Buchstabens abziehen, um zum großen Buchstaben zu kommen */ else /* falls es kein Kleinbuchstabe war, dann halt hier weiter, jedenfalls kein *string-= 32; !! */ { /* Beginn des 1.else-Zweiges zu if(*string>='a' ... */ if(*string=='ä') *string='Ä'; else if(*string=='ö') *string='Ö'; else if(*string=='ü') *string='Ü'; } /* Ende 1.else */ } /* Ende des for-Schleifenkörpers */ return 0; } /* mystrupper */ >>>>>>>>>>> Wie vergleichst Du nun ? |
![]() |
![]() |
![]() |
#10 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() #include <stdio.h>
#include <myfuncs.h> void main (int argc, char **argv) { int string_compare; /* speichern des Ergebnisses des Stringvergleichs */ /* Das Programm checkt auf zwei Argumente vom Aufruf in der Konsole (z.B. in der DOS-Box in Windows), 3 = Programmpfad+Filename sowie String1 und String2, ansonsten wird das Programm mit Aufrufhinweis beendet */ if(argc!=3) { printf("usage: cmp2str string1 string2\n"); exit(0); } mystrupper ( *(argv+1) ); /* Funktionsaufruf mystrupper für String1 = String1 in Großschreibweise verwandeln */ mystrupper ( *(argv+2) ); /* String2 umwandeln in Großschreibweise */ string_compare = strcmp ( *(argv+1) , *(argv+2) ); if( string_compare < 0 ) printf("String 1 (%s) ist kleiner als String 2 (%s)\n",*(argv+1),*(argv+2)); else if( string_compare > 0 ) printf("String 1 (%s) ist größer als String 2 (%s)\n",*(argv+1),*(argv+2)); else printf("String 1 (%s) ist gleich wie String 2 (%s)\n",*(argv+1),*(argv+2)); } /* Ende der Funktion main Hier gibts Links auf C und C++ Anleitungsskripte Miau, und Roar Kikakater ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|