Buchstabenumwandlung



  • Dann kann man Bit 5 ja gleich toggeln und braucht es nicht nochmal abzufragen:

    // für jedes Zeichen
    for (i=0; i < laenge; i++){
    
        // wenn es ein Buchstabe ist
        if (wort[i] >= 'a' && wort[i] <= 'z' || wort[i] >= 'A' && wort[i] <= 'Z')
    	// Bit 5 toggeln
    	wort[i] ^= 0x20;
    }
    


  • Wau, danke für die prompte Hilfe! allerdings kann ich mit dem letzten beitrag relativ wenig anfangen. was sind denn toggeln?

    ok, ich habe das Programm jetzt soweit editiert. Es wandelt alles schön um. Jetzt komme ich dadurch allerdings direkt zum nächsten problem: es wandelt wie gesagt alles um. allerdings sollen sonderzeichen und zahlen stehen bleiben. meine überlegung war jetzt einfach am anfang alles bis auf die Zalenbereiche 65-90 und 97-122 auszuklammern. aber, wie mache ich das am elegantesten?

    *edit*

    mit toupper und tolower hatten wir shcon ein funktionsfähiges programm in einem Lehrbuch gefunden, allerdings durften wir diese funktionen nicht benutzen 😞 😉

    so sieht das programm jetzt aus:

    #include <stdio.h>
    #define MAXLENGTH 2000
    
    int main (void)
    
    {
    	char wort[MAXLENGTH];
    	int laenge;
    	char i;
    
    	printf("Bitte wort eingeben: ");
    	scanf( "%s" , &wort);
    
    	laenge= 0;
    
    	while (wort[laenge] != '\0')		
    		laenge++;
    
    	for (i=0; i < laenge; i++)
    		{
    
    		if (wort[i]<=96 ) // hier würde dann die 'ausklammerung' stattfinden
    
    			wort[i] += 32;
    
    		else
    			wort[i] -= 32;
    		}
    
    	printf( "%s\n\n" , wort);
    	printf( "Die laenge der Zeichenkette ist %i\n", laenge);
    	printf( " i3 liegt bei %i\n", i );
    	printf( " oder %c\n" , i);
    
    	return 0;
    }
    


  • Meine eben geposteter Code erledigt alles, was du machen willst.
    Er wandelt wirklich nur die Buchstaben ineinander um. Keine Sonderzeichen, Zahlen, etc.

    Toggeln:

    Wie net schon geschrieben hat unterscheiden sich Groß- und Kleinbuchstaben nur am 5. Bit:

    a:  0110.0001
    A:  0100.0001
    

    Das bedeutet, wenn du Groß- in Kleinbuchsatben und umgedreht umwandeln willst, brauchst du nur das Bit Nummer 5 "umzuschalten". Also, wenn ne 0 dasteht machste ne 1 draus und andersherum. Das nennt sich toggeln.

    Das wird in ner Programmiersprache mit einer XOR-Verknüpfung erledigt:

    0110.0001   (a)
    XOR   0010.0000   (0x20)
    ------------------------
          0100.0001   (A)
    
    und nun zurück:
    
         0100.0001    (A)
    XOR  0010.0000    (0x20)
    ------------------------
         0110.0001    (a)
    

    Wie du siehst, kannst du mit einer Operation (XOR 0x20) zwischen Groß- und Kleinbuchstaben "umschalten". XOR wird in C mit dem Zeichen '^' dargestellt.



  • "toggeln" bedeutet einfach, daß ein Bit zwischen 0 (aus) und 1 (an) umgeschaltet wird (das macht DathZiu mit der XOR-Konstruktion "wort[i]^=0x20;").

    Ansonsten kannst du mehrere Bedingungen per && (UND) bzw. || (ODER) miteinander verknüpfen, um die "erlaubten" ASCII-Bereiche auszufiltern.



  • @ DarthZiu & CStoll:

    Vielen Danke für die Super erklärung! Allerdings habe ich es selbernochmal versuchen müssen, da wir das Programm vorstellen müssen. da wir toggeln noch nicht behandelt haben könnte das dann auffallen 😉

    So, soweit habe ich das proggi jetzt fertig. macht alles so wie es soll. jetzt habe ich nur noch eine Frage: wie stell ich das an, dass der auch leerzeichen mitnimmt; sprich, dass er einen ganzen Satz umwandelt?

    ich habe mal irgendwas mit getchar und putchar gelesen, aber keine eindeutige erklärung finden können.

    #include <stdio.h>
    #define MAXLENGTH 2000
    
    int main (void)
    
    {
        char wort[MAXLENGTH];
        int laenge;
        char i;
    
        printf("Bitte wort eingeben: ");
        scanf( "%s" , &wort);
    
        laenge= 0;
    
        while (wort[laenge] != '\0')
            laenge++;
    
        for (i=0; i < laenge; i++)
            {
    			if( wort[i]>=65 &&wort[i]<=90 || wort[i]>=97 && wort[i]<=122 )
    
           			if (wort[i]<=90 )
    
                		wort[i] += 32;
    
            		else
                		wort[i] -= 32;
            }
    
        printf( "\nUmwandlung: %s\n\n" , wort);
    
        return 0;
    }
    


  • So, soweit habe ich das proggi jetzt fertig. macht alles so wie es soll. jetzt habe ich nur noch eine Frage: wie stell ich das an, dass der auch leerzeichen mitnimmt; sprich, dass er einen ganzen Satz umwandelt?

    Dazu kannst du fgets() für die Eingabe verwenden (oder auch "scanf("%[^\n]",wort);")

    PS: Wieso machst du eigentlich zwei Schleifen? Das kannst du doch zusammenfassen:

    while(wort[i]!='\0'
    {
      if(...)
      i++;
    }
    

    oder

    for(i=0;wort[i]!='\0';++i)
      ...
    


  • hm, mit der ersten zähle ich, wieviele buchstaben das wort hat und bei der zweiten sage ich: breche ab, wenn du alle buchstaben durchgearbeitet hast. ka, ob man das noch großartig anders schreiben kann, habe erst vor knapp 3 monaten mit c angefangen, deshalb sieht alles noch ein bischen wüst aus 🙂



  • Da ist es doch einfacher zu sagen "arbeite so lange, bis du das Wortende erreicht hast" (siehe die Code-Schnipsel in meinem vorigen Beitrag)



  • campinge schrieb:

    Allerdings habe ich es selbernochmal versuchen müssen, da wir das Programm vorstellen müssen. da wir toggeln noch nicht behandelt haben könnte das dann auffallen 😉

    Das seh ich aber völlig anders: Du kannst doch sagen, dass du im www gefunden hast, dass sich Groß- und Kleinbuchstaben nur an Bitstelle 5 unterscheiden.

    Und dann hast du dich hier http://de.wikipedia.org/wiki/Bitmaske#Bit_umschalten_.28toggle.29 belesen, wie dass mit dem Umschalten funktioniert. Wär ja schlimm, wenn du in der Schule dafür "bestraft" wirst, eigenständig zu denken.



  • hm, ist auch ne gute idee.

    ich habe mal beide Programme fertiggemacht und lasse dann die anderen aus meine mteam entscheiden, ob sie was lernen möchten oder nicht 😉
    Auf jeden fall vielen Dank nochmal für eure fixe Hilfe! ich werd bestimmt noch öfters mal vorbeischaun, lol 🙂


Anmelden zum Antworten