PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ befehl:switchcase wörter und nicht "char"



jookerxxx
23.11.2008, 14:20
hallo ich hab da ma ne frage:

gibt es im switchcase auch einen befehl der wörter definiert(ist evtl. net der richtige ausdruck)

bei so einem tutorial meinte jemand das man dass nur mit char und int und so was machen kann,also nur mit eintelnen ziffern.

meine frage geht das auch mit wörtern?
und wenn ja welcher befehl.

eins weiß ich schon ma:

bin der meinung dass mit strings nichts geht...........

hoffe ihr versteht mich und danke schonmal im voraus für alle antworten.


und was ist daran falsch?


#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <cstdlib.h>
using namespace std;

int main(){
char wb,bereit;
int zahl;

cout<<"Hallo Stefan\nHast du heute gut geschlafen?[j/n]" <<endl;
cin>>wb;

switch (wb)
{
case 'j':
case'J':
cout<<"\n Gut dann koennen wir beginnen" <<endl;
getch();
break;
case 'n':
case'N':
cout<<"Oh naja dises Quiz ueber \"Die Staemme\" wird dich schon aufmuntern"<<endl;
getch();

break;

default:
cout<<"Bitte antworte richtig auf die Frage Stefan"<<endl;
getch();
cout<<"FEHLER IM PROGRAMM!!!Das Programm beendet sich von alleine"<<endl;
getch();
return 0;
}
cout<<"\n Biste du wirklich bereit?[j/n]"<<endl;
cin>>bereit;

switch (bereit)
{
case 'j':
case 'J':
{
cout<<"Gut dann kommt hier die erste Frage"<<endl;
system ("cls");
}
break;
case 'n': //ab hier beginnt der NEIN-FAKTOR-BLOCK
case 'N':
{
cout<<"OK.Dann gib die Zeit an die du brauchst:(in Sek.)"<<endl;
cin>>zahl;
cout<<"Ok.Dann warte ich jetzt so lange auf dich....."<<endl;
system ("zahl");
break;
}
}

}



der compiler sagt mir diesen fehler:

\Dokumente und Einstellungen\Marco\Eigene Dateien\computersprachen\C++\8. proggi für stefan stämme quiz.cpp C:\Dokumente und Einstellungen\Marco\Eigene Dateien\computersprachen\C++\C cstdlib.h: No such file or directory.

.wired
23.11.2008, 15:16
Ja is doch kla...

Der Default Block tritt dann ein, wenn keiner der Case's angesprochen wurde.

AlterHacker
23.11.2008, 15:20
Ja is doch kla...

Der Default Block tritt dann ein, wenn keiner der Case's angesprochen wurde.

Das hat mit dem Compilerfehler aber nichts zu tun
C:\Dokumente und Einstellungen\Marco\Eigene Dateien\computersprachen\C++\C cstdlib.h: No such file or directory.

mach das #include ccstdlib.h weg

cout<<"Ok.Dann warte ich jetzt so lange auf dich....."<<endl;
system ("zahl");

Daraus machst du besser
cout<<"Ok.Dann warte ich jetzt so lange auf dich....."<<endl;
Sleep(zahl*1000);

Dafür musst du wohl die windows.h includieren

jookerxxx
23.11.2008, 15:21
das orblem wurde schon gelöst sry echt............
ich bin auch zu blöd ich bin imma so einer der alles sofort wissen will und dann poste ich das schnell hier rein und löse das dann auf einmal selber...........
tut mir echt leid.
das problem hier hab ich aba net sofort hier reingepostet.
ich wieß einfach net was ich da machen soll.

blackberry
23.11.2008, 17:33
Der Default Block tritt dann ein, wenn keiner der Case's angesprochen wurde.

So ganz richtig ist das aber auch nicht.
Hier mal ein Beispiel:

#include <stdio.h>


int main(void)
{
switch(1)
{
case 0:
puts("- case 0");
case 1:
puts("- case 1");
default:
puts("- default");
}
return 0;
}

Ausgabe:

blackberry@system:~/Desktop$ ./output
- case 1
- default

Wie man sieht wird der default-Block ausgeführt, obwohl davor ein case-Block (case 1 um genau zu sein) ausgeführt wurde.
Das ich das "break" nach dem case-Blöcken "vergessen" habe ist dabei natürlich klar.

______________________________
back2topic


gibt es im switchcase auch einen befehl der wörter definiert(ist evtl. net der richtige ausdruck)

Nein. In C sind für switch-Anweisungen nur Integer zugelassen (native Datentypen werden in der Regel gecastet, siehe S. 220, "Programmieren in C", 2. Auflage).
Ein "string" wie du ihn aus C++ ist ein Objekt und ein char-Vector ist letztendlich nur eine Adresse von einem x-char-Elemente großen Speicherblocks und somit lassen sich Zeichenketten in form von char*'s nicht über Operatoren wie == vergleichen vergleichen (zumindest nicht im ganzen), da die Adressen nicht übereinstimmen, egal was sich hinter diesen verbirgt.

Trotzdem kann man mit ein bisschen tricksen auch Zeichenketten mit switch vergleichen, sofern diese in einem Integer vorliegen.
Das bedeutet, dass wir für jeden case-Block einen Integer-wert für den zugeordneten String berechnen müssen und anschließend unser Vergleichsobjekt mit dem selben Algorithmus in einen Integer umwandeln müssen.
Hier mal ein Beispiel:

#include <stdio.h>


int convert(char *str)
{
int i = 0;
while(*str)
{
i += *str++;
}
return i;
}

int main(void)
{
char str[20];
printf("enter a string: ");
scanf("%19s", &str);
switch(convert(str))
{
case 532: /* "hello" */
puts("- hi");
break;
case 552: /* "world" */
puts("- what?");
break;
default:
puts("- default");
}
return 0;
}

Bitte beachte, dass sich der oben verwendete Algorithmus AUF KEINEN FALL für soetwas eignet, weil sehr viele doppelte Werte vorkommen (zB. "hello", "olleh", "lloeh", ... würden alle 532 ergeben) -> der Code dient nur als Veranschaulichung des Beispiels und ist nicht Praxistauglich!!!
Besser geeignet wären Algorithmen, von denen bekannt ist, dass diese verlässliche Werte erzeugen. Solche Algorithmen könnten sein: MD5, SHA1, CRC, ... (im Internet findest du sicher sehr viele C/C++ Implementierungen dieser Algorithmen, oder du schreibst dir deine Eigene).

PS:
auch wenn das Problem schon gelöst wurde ist der zweite Teil meines Posts vielleicht auch für andere interessant also bitte stehenlassen ;)


mfG. BlackBerry

jookerxxx
23.11.2008, 18:06
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
using namespace std;

int main(){
char wb,bereit,bereit2;
int zahl,HQ;

cout<<"Hallo Stefan\nHast du heute gut geschlafen?[j/n]" <<endl;
cin>>wb;

switch (wb)
{
case 'j':
case'J':
{
system("cls");
cout<<"Gut dann konnen wir beginnen" <<endl;
getch();
}
break;
case 'n':
case'N':
{
system ("cls");
cout<<"Oh naja dises Quiz uber \"Die Staemme\" wird dich schon aufmuntern"<<endl;
getch();
}
break;

default:
{
system("cls");
cout<<"Bitte antworte richitg auf die Frage,Stefan"<<endl;
getch();
cout<<"FEHLER IM PROGRAMM!!!Das Programm beendet sich von alleine!!!"<<endl;
getch();
cout<<"..."<<endl;
getch();
return 0;
}
} //bis hier hin funktioniert alles ------------------------
system("cls");
cout<<"[fragen werden geladen.....]"<<endl;
Sleep(5000);
cout<<"..."<<endl;
Sleep (5000);
cout<<"..."<<endl;
Sleep (5000);
system("cls");
cout<<"Biste du wirklich bereit?[j/n]"<<endl; //ab hier beginnt switch (bereit)
cin>>bereit;

switch (bereit)
{
case 'j':
case 'J': //JA-FAKTOR-BLOCK funktioniert auch
{
system("cls");
cout<<"Dann kommt hier die erste Frage:"<<endl;
getch();
system ("cls");
}
break; //ab hier beginnt der NEIN-FAKTOR-BLOCK
case 'n':
case 'N':
{
system("cls");
cout<<"Dann gib die Zeit an die du brauchst,bis du bereit bist:(in Sek.)"<<endl;
cin>>zahl;
system("cls");
cout<<"Ok.Dann warte ich jetzt so lange auf dich....."<<endl;
Sleep (zahl*1000); //PROBLEM:Wenn man davor eine zahl eingibt dann schläft das system ewig
system("cls");
cout<<"Ok.Bist du jetzt bereit?[j/n]"<<endl;
cin>>bereit2;

switch (bereit2)
{
case 'j':
case'J':
{
system("cls");
cout<<"Gut dann kommt hier die erste Frage"<<endl;
getch();
system("cls");
}
break;
case 'n':
case 'N':
{
system("cls");
cout<<"Ok.Dann hab ich auch keine lust mehr."<<endl;
getch();
cout<<"\nAktivier mich wenn du der Meinung bist das du jetzt kannst....."<<endl;
getch();
return 0;
}
}
} //NEIN-FAKTOR-BLOCK wird geschlossen


} //switch (bereit) wird geschlossen

cout<<"Wie weit kann man das Hauptgebaude ausbauen?(Zahl eingeben)"<<endl;
cin>>HQ;


}


Da wo Problem steht ist das Problem:

Denn wenn man da zufälligerweiße eine Zahl eingibt dann schläft das system ewig.
das will ich beseitigt haben.

ich hab mir überlegt dass man evtl. mit dem befehl if oder mit switchcase weiterarbeiten könnte.
dass man kurz davor noch was ranhängt.
VORSCHLAG:


#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
using namespace std;

int main(){
char wb,bereit,bereit2;
int zahl,HQ;

cout<<"Hallo Stefan\nHast du heute gut geschlafen?[j/n]" <<endl;
cin>>wb;

switch (wb)
{
case 'j':
case'J':
{
system("cls");
cout<<"Gut dann konnen wir beginnen" <<endl;
getch();
}
break;
case 'n':
case'N':
{
system ("cls");
cout<<"Oh naja dises Quiz uber \"Die Staemme\" wird dich schon aufmuntern"<<endl;
getch();
}
break;

default:
{
system("cls");
cout<<"Bitte antworte richitg auf die Frage,Stefan"<<endl;
getch();
cout<<"FEHLER IM PROGRAMM!!!Das Programm beendet sich von alleine!!!"<<endl;
getch();
cout<<"..."<<endl;
getch();
return 0;
}
} //bis hier hin funktioniert alles ------------------------
system("cls");
cout<<"[fragen werden geladen.....]"<<endl;
Sleep(5000);
cout<<"..."<<endl;
Sleep (5000);
cout<<"..."<<endl;
Sleep (5000);
system("cls");
cout<<"Biste du wirklich bereit?[j/n]"<<endl; //ab hier beginnt switch (bereit)
cin>>bereit;

switch (bereit)
{
case 'j':
case 'J': //JA-FAKTOR-BLOCK funktioniert auch
{
system("cls");
cout<<"Dann kommt hier die erste Frage:"<<endl;
getch();
system ("cls");
}
break; //ab hier beginnt der NEIN-FAKTOR-BLOCK
case 'n':
case 'N':
{
system("cls");
cout<<"Dann gib die Zeit an die du brauchst,bis du bereit bist:(in Sek.)"<<endl;
cin>>zahl;

if (zahl==int)
{
system("cls");
cout<<"Ok.Dann warte ich jetzt so lange auf dich....."<<endl;
Sleep (zahl*1000); //PROBLEM:Wenn man davor eine zahl eingibt dann schläft das system ewig
}
else if(zahl==char)
{
system("cls");
cout<<"Tut mir leid aber anscheinend kannst du noch nicht einmal Zahl von Buchstabe unterscheiden"<<endl;
getch()
cout<<"ERROR"<<endl;
return 0;
}
system("cls");
cout<<"Ok.Bist du jetzt bereit?[j/n]"<<endl;
cin>>bereit2;

switch (bereit2)
{
case 'j':
case'J':
{
system("cls");
cout<<"Gut dann kommt hier die erste Frage"<<endl;
getch();
system("cls");
}
break;
case 'n':
case 'N':
{
system("cls");
cout<<"Ok.Dann hab ich auch keine lust mehr."<<endl;
getch();
cout<<"\nAktivier mich wenn du der Meinung bist das du jetzt kannst....."<<endl;
getch();
return 0;
}
}
} //NEIN-FAKTOR-BLOCK wird geschlossen


} //switch (bereit) wird geschlossen

cout<<"Wie weit kann man das Hauptgebaude ausbauen?(Zahl eingeben)"<<endl;
cin>>HQ;


}


So in der Art hätte ich mir das gedacht.

.wired
23.11.2008, 18:10
system("cls");
benutz lieber:

clrscr()

das nur am Rande

jookerxxx
23.11.2008, 18:20
hm welche hadder datei brauche ich dann?

blackberry
23.11.2008, 18:49
conio aber die hast du bereits

Ich hab mir den Code mal angeschaut und ETWAS entwirrt (sieht immernoch schrecklich unübersichtlich aus).

#include <iostream>
#include <string>
#ifdef _WIN32
#include <windows.h>
#include <conio.h>
#else
/* damit das ganze auf auf Linux compiliert...
nicht der beste Weg, aber es funktioniert */
#define getch() getc(stdin)
#define Sleep(x)
/* SEHR unschön, aber das ewige "sh: cls: not found" nervt */
#define system(x)
#endif


using namespace std;

int main(void)
{
char wb, bereit, bereit2;
int zahl, HQ;
cout << "Hallo Stefan\nHast du heute gut geschlafen?[j/n]" << endl;
cin >> wb;
switch (wb)
{
case 'j': case'J':
system("cls");
cout << "Gut dann konnen wir beginnen" << endl;
getch();
break;
case 'n': case'N':
system ("cls");
cout << "Oh naja dises Quiz uber \"Die Staemme\" wird dich schon aufmuntern" << endl;
getch();
break;
default:
system("cls");
cout << "Bitte antworte richitg auf die Frage, Stefan" << endl;
getch();
cout << "FEHLER IM PROGRAMM!!!Das Programm beendet sich von alleine!!!" << endl;
getch();
cout << "..." << endl;
getch();
return 0;
} // bis hier hin funktioniert alles ------------------------
system("cls");
cout << "[fragen werden geladen.....]" << endl;
Sleep(5000);
cout << "..." << endl;
Sleep (5000);
cout << "..." << endl;
Sleep (5000);
system("cls");
cout << "Biste du wirklich bereit?[j/n]" << endl; // ab hier beginnt switch (bereit)
cin >> bereit;
switch (bereit)
{
case 'j': case 'J': // JA-FAKTOR-BLOCK funktioniert auch
system("cls");
cout << "Dann kommt hier die erste Frage:" << endl;
getch();
system ("cls");
break; // ab hier beginnt der NEIN-FAKTOR-BLOCK
case 'n': case 'N':
system("cls");
cout << "Dann gib die Zeit an die du brauchst, bis du bereit bist:(in Sek.)" << endl;
cin >> zahl;
/*
if (zahl == int) <----- was soll das sein? Das ergibt keinen Sinn!
{
system("cls");
cout << "Ok.Dann warte ich jetzt so lange auf dich....." << endl;
Sleep (zahl*1000);// PROBLEM:Wenn man davor eine zahl eingibt dann schläft das system ewig
}
else if(zahl == char) <----- was soll das sein? Das ergibt keinen Sinn!
{
system("cls");
cout << "Tut mir leid aber anscheinend kannst du noch nicht einmal Zahl von Buchstabe unterscheiden" << endl;
getch();
cout << "ERROR" << endl;
return 0;
}
*/
// -------------------------------------
system("cls");
cout << "Ok.Dann warte ich jetzt so lange auf dich....." << endl;
Sleep (zahl*1000); // PROBLEM:Wenn man davor eine zahl eingibt dann schläft das system ewig
// -------------------------------------
system("cls");
cout << "Ok.Bist du jetzt bereit?[j/n]" << endl;
cin >> bereit2;
switch (bereit2)
{
case 'j': case'J':
system("cls");
cout << "Gut dann kommt hier die erste Frage" << endl;
getch();
system("cls");
break;
case 'n': case 'N':
system("cls");
cout << "Ok.Dann hab ich auch keine lust mehr." << endl;
getch();
cout << "\nAktivier mich wenn du der Meinung bist das du jetzt kannst....." << endl;
getch();
default:
return 0;
}
break;
default:
return 0;
} // switch (bereit) wird geschlossen
cout << "Wie weit kann man das Hauptgebaude ausbauen?(Zahl eingeben)" << endl;
cin >> HQ;
}

Bei deinen Problemen mit "dann schläft das System ewig" würde ich einfach mal die Zahl eingeben und dann nochmal ausgeben und sicherstellen, dass die Zahl richtig ist!

jookerxxx
23.11.2008, 19:09
zum thema if:

das soll bedeuten:
wenn die zahl gleich ein integer ist also eine zahl.
dann passiert das und das.
denn das problem ist imma dass wenn man kurz vor sleep einen buchstaben eingibt,dass der dann ewig schläft.

blackberry
23.11.2008, 20:17
das soll bedeuten:
wenn die zahl gleich ein integer ist also eine zahl.

Das habe ich mir schon gedacht, aber es macht keinen Sinn, weil "zahl" sowieso als int vereinbart wurde und damit in jedem Fall ein Integer ist. Um sicherzustellen, dass keine anderen Zeichen eingegeben wurden kannst du ja einen String bzw. char-Vektor einlesen und nach char-Elementen kleiner als '0' oder größer als '9' absuchen (die einfachen Anführungszeichen gehören mit dazu!! -> also NICHT c < 0 oder so). Danach über die C-Library Funktion "atoi" (stdlib.h/cstdlib) den char-Vektor in einen Integer umwandeln.



denn das problem ist imma dass wenn man kurz vor sleep einen buchstaben eingibt,dass der dann ewig schläft.

Selbe Methode wie oben! Wenn cin einen Buchstaben in einen Integer einliest dreht es durch und der Integer wird mit enorm hohen Werten belegt.


mfG. BlackBerry

jookerxxx
23.11.2008, 20:24
eijeijeij das tut mir leid aba......
ich mach das erst seit freitag abend und so recht hab ich das ganze noch net vertanden mit integer und c libary und so.......
sry echt
würde es dir was aus machen nochma in angänger sprache zu diktieren?

blackberry
23.11.2008, 20:59
Dann würde ich dir echt empfehlen dein Buch (oder was auch immer du zum lernen benutzt) zu ende zu lesen.

Trotzdem hier mal ein kleiner Beispielcode:

#include <stdlib.h>
#include <stdio.h>


int is_numeric(char *str)
{
while(*str)
{
if (*str < '0' || *str > '9')
return 0;
str++;
}
return 1;
}

int main(void)
{
int number;
char buffer[20];

printf("> ");
scanf("%19s", buffer);

if (!is_numeric(buffer))
{
puts("Du sollst eine Zahl eingeben!");
return 0;
}

number = atoi(buffer) + 123;
printf("Deine Zahl + 123 ergibt %d!\n", number);

return 0;
}

jookerxxx
23.11.2008, 21:10
das buch das bekomme ich erst am donnerstag^^
ich hab das über paar tutorials gelernt.