Hilfe!!! zu: Umwandlung in Großbuchstaben mit if-Anweisung



  • Hallo, ich habe grade mit C++ Angefangen und brauche dringend Hilfe zu dieser Aufgabe:
    Schreiben Sie ein Programm, welches ein Zeichen einliest. Handelt es sich dabei um einen Kleinbuchstaben (ein Zeichen aus der Menge {a..z}), soll es den entsprechenden Großbuchstaben ausgeben. Andernfalls wird das eingegebene Zeichen unverändert ausgegeben.
    Beispiel Dialog :
    Dialog 1
    Zeichen:

    a <RETURN>
    A

    Dialog 2
    Zeichen:

    1 <RETURN>
    1

    Nun soll ich das nur mit Hilfe der if-Anweisng lösen und kann auch nur die " #include <iostream>" Bibliothek verweden. Also wirklich nur die ersten Grundkenntnisse von C++.... Ich bräuchte drigend Hilfe, da ich seit Studen nicht darauf komme und mir Büchen und Internet auch nicht Helfen konnten. Ihr seid meine letzte hoffnung 😞 😞 😞

    LG



  • Ich würde mir eine Ascii-Tabelle anschauen, welchen Wert die Zeichen haben und wie sie in Verbindung stehen. Dann eine Abfrage, ob in Menge {a..z} und ... weiter siehe Ascii-Tabelle.



  • #include <iostream>
    using namespace std;
    
    int main(){
    	char a;
    	cin >> a;
            cout << a << endl;
            if(a>='a' && a<='z') {
                a-=32;
            }
            cout << a << endl;
    }
    

    https://www.uni-due.de/hummell/infos/ascii/

    Da jedem Zeichen ein bestimmter Code zugeordnet ist, kannst du mit if(a>='a' && a<='z') schauen, ob der Buchstabe im Zahlenbereich der kleinen Buchstaben liegt, falls ja, dann muss nur noch die Differenz abgezogen werden, hier 32.



  • Benutze besser die Standard-Funktionen dazu: islower und toupper.



  • Nur bräuchte man dafür doch <cctype>? Das beißt sich doch mit der Aufgabenstellung?



  • Vielen lieben Dank! hab es bis auf eine kleinigkeit verstanden... warum muss ich die Differenz 32 abziehen? ich habe mir die ascii Tabelle angeschaut und sehe keinen zusammenhang mit der 32. (Ist mir schon etwas peinlich 😞 aber will es wirklich verstehen)



  • Jul4ik-89 schrieb:

    Vielen lieben Dank! hab es bis auf eine kleinigkeit verstanden... warum muss ich die Differenz 32 abziehen? ich habe mir die ascii Tabelle angeschaut und sehe keinen zusammenhang mit der 32. (Ist mir schon etwas peinlich 😞 aber will es wirklich verstehen)

    Ich ziehe meine Frage zurück. Hab es verstenaden 🙂 🙂 🙂
    Danke Leute... besonders an bruhial 👍



  • Was ist denn mit der offensichtlichen Lösung?

    char mytoupper(char c)
    	if(c == 'a') return 'A';
    	else if(c == 'b') return 'B';
    	else if(c == 'c') return 'C';
    	...
    	else if(c == 'z') return 'Z';
    	else return c;
    }
    


  • Irgendwie bin ich jetzt irritiert 😉 27 Codezeilen statt 3 würde mir nun gar nicht einfallen? 😕



  • #include <iostream>
    using namespace std;
    
    int main(){
    	char a;
    	cin >> a;
            cout << a << endl;//hier gar keine ausgabe
            if(a>='a' && a<='z') {
                a-=32;//('a'-'A') statt 32
            }
            cout << a << endl;//'\n' statt endl
    }
    


  • EDIT: Sorry, mein Fehler


  • Mod

    Da jetzt schon Komplettlösungen im Umlauf sind, hier noch eine kurze und prägnante:

    int main() {
        for (unsigned char c; cin >> c;)
            cout.put(toupper(c));
    }
    

    Gehen wir mal Schritt für Schritt durch:

    • unsigned char c; ist das Statement des Schleifenkopfs (der bekanntermaßen die Form for( Anweisung; Weiterlaufbedingung; Ausdruck ) hat). unsigned weil toupper davon ausgeht, dass alle Zeichenwerte positiv sind.
    • cin >> c extrahiert ein Zeichen aus dem Strom und speichert es in c . Anschließend ergibt der Ausdruck true wenn der Stream noch läuft; falls das Ende erreicht wurde, d.h. die Konsole EOF an den Strom ( stdin ) gibt, ergibt der Ausdruck false . Damit wäre die Weiterlauf-Bedingung nicht erfüllt, und das Programm wird beendet.
    • Falls nicht abgebrochen wurde, gibt cout.put(toupper(c)) das Ergebnis von toupper aus, nachdem es nach char konvertiert wurde. Wir wissen, dass toupper niemals EOF zurückgeben wird, wenn cin >> c nicht fehlschlug; daher ist diese Konvertierung sicher. cout << toupper(c) funktioniert nicht, da der Rückgabewert von toupper int ist (was den EOF fall abdeckt; EOF hat keinen von unsigned char repräsentierbaren Wert), wir würden daher nur den Codepoint als Zahl ausgeben. Der Rückgabewert von toupper ist, wenn ungleich EOF, ein positiver Wert (bspw. 0 bis 255). Es ist sehr wahrscheinlich, dass die Konvertierung zu char (welches wahrscheinlich -128 bis 127 abdeckt) alle int Werte entsprechend überträgt, aber diese Konvertierung kann von Implementierungen abhängen, daher wäre es theoretisch am sichersten std::char_traits<char>::to_char_type zu verwenden (in praktisch allen Fällen ist das aber überflüssig).


  • Jul4ik-89 schrieb:

    Nun soll ich das nur mit Hilfe der if-Anweisng lösen und kann auch nur die " #include <iostream>" Bibliothek verweden.
    LG

    toupper ist allerdings in ctype.h



  • korrekterweise in diesem Unterforum <cctype>. Hatten wir aber schon.


Log in to reply