Switch Case und Funktionen
-
Hallo zusammen, ich muss mich in diesen Semester durch eine ziemlich bescheuerte Vorlesung quälen. Zusätzlich soll ich mir selbst C++ beibringen mit hüpschen kleinen Aufgaben und an solcher einer hänge ich grade fest!
Ich soll ein Programm schrieben das dem Benutzer abfragt welche Zahlenart er eingeben möchte, also Oktal, Dezimal oder Hexa. Danach soll die eingabe an eine Funktion weitergegeben werden die für die Eingabe die jeweils beiden anderen Zahlensysteme ausrechnet und alle 3 also Ausgabe auf den Bildschirm erscheinen lässt.
# include <iostream>
using namespace std;int main ()
{
cout << "Welche Zahlenart moechten sie eingeben? " << endl;
cout << "Geben sie Okt fuer Oktalzahlen ein" << endl;
cout << "Geben sie Dez fuer Dezimalzahlen ein" << endl;
cout << "Geben sie Hex fuer Hexadezimalzahlen ein" <<endl;
cout << "Ihre wahl ist: ";
char Auswahl=0, Okt=0 ;
cin >> Auswahl;
switch (Auswahl)
{
* case Okt:
Oktr (Auswahl);
break;
}
}
int Oktr (Auswahl);
{
cout << "Sie wollen eine Oktalzahl eingeben: "system ("pause");
return 0;Mal unabhänig davon das das Programm noch nicht fertig ist und damit auch nicht geschlossen, wird mir von Visual Studio in * folgendes angezeigt:
error C2051: case-Ausdruck ist keine Konstante.
Ich bin mir ziemlich sicher das da iwas richtig Falsch im Progamm ist, habe aber überhaupt kein Wissen um da weiter zu kommen.Kann jemand von euch mit dabei helfen ?
MFG
-
im Ausdruck:
case Okt:
ist Okt eine Variable vom Typ char. Wie Dir die Fehlermeldung mitteilen möchte, sind an dieser Stelle aber keine Variablen erlaubt.
-
Okt ist einer der möglichen eingaben die über cin >> Auswahl vom User kommen kann.
Die Variabel die in switch (Auswahl) drin steht soll beim ersten case mit den Zeichen Okt verglichen werden und wenn in Auswahl Okt drin steht soll dieser case ausgeführt werden.
Habe ich ein falschen Ansatz ?
-
blade1982 schrieb:
Habe ich ein falschen Ansatz ?
Das ist nicht ein falscher Ansatz, das ist ein Beweis dafür, dass du nicht mal die C++ Grundlagen kannst. Und dagegen hilft nur eins:
Buch oder allenfalls Tutorial lesen. Ich empfehle aber ein Buch, da man dort das Wissen meistens besser vermittelt bekommt.
- C++ Primer
- Thinking in C++ 1 & 2 (auch als gratis Download erhältlich)Grüssli
-
Grummel, wie ich oben schon gesagt habe, habe ich natürlich Null Ahnung von dem Thema.
Mein Prof. denkt ja wir können an Hand dieser kleinen Aufgaben das selbst lernen. Ich habe nicht viel mehr als ein paar Befehle und Def.
Ein Buch zu kaufen bringt mir für ein halbes Semester C++ sehr wenig und habe ich gar nicht die Zeit für, diese wälzer zu lesen.
Was ich brauche sind schnelle Lösungen oder Tips, kein C++ Studium.
Danke trozdem.
P.S. Diese Aufgabe ist quasie das TUT, traurig aber wahr.
-
Dann nimm ein Tutorial:
http://tutorial.schornboeck.net/Ist nicht so Dick wie ein Buch, sollte dir aber die Grundlagen einigermassen vermitteln können. Lösungen für Hausaufgaben machen wir hier nur gegen Bezahlung

Und Tipps zu geben ist hier ziemlich sinnlos, denn man darf mindestens erwarten, dass jemand die Grundlagen kann, wenn er um Hilfe fragt. Aber du scheinst nicht mal annähernd die Grundlagen der Sprache zu verstehen, da ist es extrem mühsam, wenn man dir das alles vorkauen müsste. Für sowas gibt es schliesslich Bücher und Tutorials
Grüssli
-
Also hier ist meine überarbeitete Version:
char Auswahl=0;
cin >> Auswahl;
switch (Auswahl)
{
case 'Okt':
Oktr ();
break;
}
}
int Oktr ()Wen ich das C++ Tut (vgl. Link) richtig verstanden habe, müsste das doch so gehen.
Über cin wird ein char eingelesen.
Nehmen wir an es würde Okt eingelesen werden, im nächsten Schritt wird dann switch (Okt) ausgeführt und der erste case trift mit case 'Okt' zu und somit wird die Funktion Oktr () ausgeführt. Die Funktion Oktr ist ein Stück drunter mit int Oktr () doch hinreichend dif. oder?
Aber wo liegt nun der Fehler ?
Ich habe leider keine Bsp. gefunden wo mit case eine Funktion ausgeführt wird.
Geht das überhaupt ?
MFG
-
Ein paar von den Problemen in deinem Code:
char stellt nur einen einzelnen Buchstaben dar, keine Zeichenkette.
int Oktr() wird erst nach seiner Verwendung deklariert.
int Oktr() wird nirgendwo definiert.
-
Ah, das ist doch mal was handfestes :).
Danke ich nehme mir die Tips zu Herzen und model das Programm weiter um.
Danke MFG
-
Wenn du willst das der Benutzer für die Oktalzahlen 0 drückt sollte das case so aussehen:
switch(Auswahl) { case '0': Okt(); break; }Das gilt aber nur wenn Auswahl vom Typ char ist, ist es ein Integer muss die 0 ohne '' geschrieben werden.
Ein kleiner Tipp: Auch wenn es mühsamer ist, arbeite lieber das Tutorial durch. Du wirst damit mehr lernen als wenn du einfach drauflos programmierst und dir die Wissensfetzen zusammenklaubst. Spätesten wenn du den Code erklären musst wird dir das weiterhelfen.
Und benutz bitte die Code Tags
Ansonsten viel Erfolg! Was studierst du denn?
-
Die einfachste Variante wäre IMO den Benutzer Zahlen eingeben zu lassen.
10 für Dezimal, 8 für Oktal und 16 für Hexadezimal. Dann könntest du einfach switch verwenden.Alternativ könntest du den Benutzer natürlich auch Strings eingeben lassen, wie du es in deinem Programm versuchst. Allerdings müsstest du dann a) Dinge einsetzen die du vermutlich noch nichtmal kennst (Strings eben) und b) könntest du kein switch() mehr verwenden, sondern müsstest die einzelnen Fälle mit "if" testen.
Wenn es die Aufgabenstellung erlaubt, würde ich dir also raten, Zahlen zu verwenden.
Der Rest der Aufgabe wird deutlich schwerer, also "verschwende" hier so wenig Zeit wie möglich

-
Danke für die guten Tips und der kleine Umrechner läuft jetzt schon mal ganz gut.
Wo jetzt schon das Wort String gefallen ist:
Wie sieht es aus wenn man in der Konsole direkt eine Aufgabe stellen möchte.
z.b. 2*12+10/2 Kann man sowas mit einen String einlesen und dem C++ Programm zur Verfügung stellen? Oder ist ein array bzw vektor dabei leichter zu fertigen?
-
#include <string> #include <iostream> int main() { // Eine Zeile einlesen: std::string line; std::getline(std::cin, line); // Ein Wort einlesen, also Zeichen bis zum nächsten Whitespace: std::string word; std::cin >> word; }Referenz:
http://www.cplusplus.com/reference/
http://www.cplusplus.com/reference/string/Grüssli
-
Dravere schrieb:
#include <string> #include <iostream> int main() { // Eine Zeile einlesen: std::string line; std::getline(std::cin, line); // Ein Wort einlesen, also Zeichen bis zum nächsten Whitespace: std::string word; std::cin >> word; }Verwende
using namespace std;Dann brauchst Du std:: nicht überall hinzuschreiben.
-
C++Fan 2009 schrieb:
Verwende
using namespace std;Dann brauchst Du std:: nicht überall hinzuschreiben.
Wie ich schon mehrmals gesagt habe, finde ich so eine Empfehlung eine ganz schlechte Idee. Wieso soll man immer gleich alle Namensräume aushebeln? Erst recht bei so einem kleinen Code? Ein paar mal mehr
std::hinschreiben, schadet wirklich keinem.
Ich bin geneigt dieses Vorgehen langsam als eine Unsitte zu bezeichnen
Naja, aber wenn schon, dann nicht in den globalen Namensraum rein, sondern zum Beispiel so:
// ... int main() { using namespace std; // ... }Grüssli
-
Die Sache mit den using namespace std, als Teil einer Funktion hab ich noch gar nicht gesehen. In den ganzen Vorlesungen und Übungen wurde das immer für den kompleten Code deklariert.
MFG
-
blade1982 schrieb:
Die Sache mit den using namespace std, als Teil einer Funktion hab ich noch gar nicht gesehen. In den ganzen Vorlesungen und Übungen wurde das immer für den kompleten Code deklariert.
Wahrscheinlich auch gerade noch in Headern, damit man wenigstens konsequent faul bleiben kann. Nur würde ich davon abraten, da man damit schneller zu Namensproblemen kommt, als man denkt. Man leert den gesamten Namensraum aus, und das in allen inkludierenden Dateien.
Ich stimme Dravere zu, ein wenig
std::finde ich nicht schlimm. Wenn man dann noch mit mehreren Bibliotheken arbeitet, sieht man auch gerade, woher ein Bezeichner kommt. Aber das muss man natürlich selbst wissen; wenn manusing namespaceverwendet, dann am besten so lokal wie möglich.
-
Cool, also der String ist jetzt schon mal drin.
Ich habe es zwar nicht ganz so gemacht wie ihr das vorgeschlagen habt, aber mal ein paar Befehle sehen ist da für mich schon sehr hilfreicht und natürlich die Links dazu.Wenn man nun erstmal den Sting eingelesen hat kann man ja nun erstmal nicht wirklich berechnen, es handelt sich dabei um eine reine Zeichenkette.
Kann man diesen String in ein Array übeführen oder gleich die Eingabe in ein Array schreiben lasssen?.
Nach meiner Ansicht wäre ein Array besser geeignet weil dort die Zahlen von den Zeichen getrennt sind.
-
Du kannst auch in einem string ganz einfach auf die einzelnen Zeichen zugreifen..
std::string s ( "hallo" ); std::cout << s [ 4 ]; // o
-
Folgendes Problem ist grade bei mir Aufgetretten:
Es geht nach wie vor um ein kleines Rechenprogramm.
Ich lass über die Konsole den User eine Rechenaufgabe stellen, das Programm hat danach genau zwei Vektoren:
double zahlen [1, ,3, ,5, ,....]
char Zeichen[ ,+, ,/, ,*,....]
Die beiden Vektoren übereinander gelegt sollen dann eine Rechenaufgabe ergeben.
Probleme sind jetzt:!
1. Ich muss den Buchstaben 'e' im Vektor char Zeichen finden, aber wie?
2. Wenn aus der Kombination von den beiden Vektoren die Zeichen /0 hinter einander stehen das Programm stopen und eine Fehlermeldung ausgeben.Hab ihr dafür Iden ? Ich hab leider keine wirklch guten:(
danke schon mal