WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 26.05.2001, 13:56   #1
mode2
Newbie
 
Registriert seit: 26.05.2001
Beiträge: 4


Lächeln C++ ---- Bitte helfen

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
mode2 ist offline   Mit Zitat antworten
Alt 26.05.2001, 14:04   #2
pong
Inventar
 
Benutzerbild von pong
 
Registriert seit: 25.12.2000
Alter: 41
Beiträge: 9.063

Mein Computer

pong eine Nachricht über ICQ schicken
Standard

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
pong ist offline   Mit Zitat antworten
Alt 26.05.2001, 14:06   #3
Stingerr
Senior Member
 
Registriert seit: 05.11.2000
Beiträge: 114


Stingerr eine Nachricht über ICQ schicken
Standard

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
Stingerr ist offline   Mit Zitat antworten
Alt 26.05.2001, 14:07   #4
mode2
Newbie
 
Registriert seit: 26.05.2001
Beiträge: 4


Standard

Danke,


aber wie komme ich von einem char zeichen zum ASCII Code,
welchen Befehl gibt es da ??
mode2 ist offline   Mit Zitat antworten
Alt 26.05.2001, 14:11   #5
mode2
Newbie
 
Registriert seit: 26.05.2001
Beiträge: 4


Standard

Danke Stingerr
mit pointer kann ich aber im moment noch nichts
anfangen, bin noch blutiger anfänger
mode2 ist offline   Mit Zitat antworten
Alt 27.05.2001, 09:55   #6
pong
Inventar
 
Benutzerbild von pong
 
Registriert seit: 25.12.2000
Alter: 41
Beiträge: 9.063

Mein Computer

pong eine Nachricht über ICQ schicken
Standard

@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
pong ist offline   Mit Zitat antworten
Alt 27.05.2001, 14:50   #7
mode2
Newbie
 
Registriert seit: 26.05.2001
Beiträge: 4


Standard

@pong

Wie meinst du das mit string[i]<string[i+1], könntest das bitte genauer erklären

danke für deine hilfe
mode2
mode2 ist offline   Mit Zitat antworten
Alt 27.05.2001, 19:10   #8
pong
Inventar
 
Benutzerbild von pong
 
Registriert seit: 25.12.2000
Alter: 41
Beiträge: 9.063

Mein Computer

pong eine Nachricht über ICQ schicken
Standard

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
pong ist offline   Mit Zitat antworten
Alt 27.05.2001, 22:13   #9
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

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 ?
kikakater ist offline   Mit Zitat antworten
Alt 27.05.2001, 22:14   #10
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

#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
kikakater ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:25 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag