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>
ADialog 2
Zeichen:1 <RETURN>
1Nun 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.
-
-
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
-
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 Formfor( Anweisung; Weiterlaufbedingung; Ausdruck )
hat).unsigned
weiltoupper
davon ausgeht, dass alle Zeichenwerte positiv sind.- cin >> c extrahiert ein Zeichen aus dem Strom und speichert es in
c
. Anschließend ergibt der Ausdrucktrue
wenn der Stream noch läuft; falls das Ende erreicht wurde, d.h. die Konsole EOF an den Strom (stdin
) gibt, ergibt der Ausdruckfalse
. 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 vontoupper
aus, nachdem es nachchar
konvertiert wurde. Wir wissen, dasstoupper
niemalsEOF
zurückgeben wird, wenncin >> c
nicht fehlschlug; daher ist diese Konvertierung sicher.cout << toupper(c)
funktioniert nicht, da der Rückgabewert vontoupper int
ist (was denEOF
fall abdeckt;EOF
hat keinen vonunsigned char
repräsentierbaren Wert), wir würden daher nur den Codepoint als Zahl ausgeben. Der Rückgabewert vontoupper
ist, wenn ungleich EOF, ein positiver Wert (bspw. 0 bis 255). Es ist sehr wahrscheinlich, dass die Konvertierung zuchar
(welches wahrscheinlich -128 bis 127 abdeckt) alleint
Werte entsprechend überträgt, aber diese Konvertierung kann von Implementierungen abhängen, daher wäre es theoretisch am sicherstenstd::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.
LGtoupper ist allerdings in ctype.h
-
korrekterweise in diesem Unterforum <cctype>. Hatten wir aber schon.