Zadání písmene do proměnné INT – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zadání písmene do proměnné INT – C / C++ – Fórum – Programujte.comZadání písmene do proměnné INT – C / C++ – Fórum – Programujte.com

 

VaaR0
Duch
26. 10. 2012   #1
-
0
-

Zdravím,

na tomto příkladu, který je zde na stránkách ve cvičení 8 je výpis MENU. Pokud ale zadám místo číslic "písmeno", výpis se zacyklý. Jak to ošetřit? Díky za info

#include <iostream>
using namespace std;
void showmenu();     // prototypy funkcí
void report();
void comfort();
int main()
{
   showmenu();
   int choice;
   cin >> choice;
   while (choice != 5)
   {
      switch(choice)
      {
         case 1 : cout << "\a\n";
            break;
         case 2 : report();
            break;
         case 3 : cout << "Vedouci byl pritomen cely den.\n";
            break;
         case 4 : comfort();
            break;
         default : cout << "To neni volba.\n";
      }

      showmenu();
      cin >> choice;
   }
   cout << "Sbohem!\n";
   return 0;
}

void showmenu()
{
   cout << "Prosim, zadejte 1, 2, 3, 4 nebo 5:\n"
   "1) poplach 2) zprava\n"
   "3) vymluva 4) uklidneni\n"
   "5) ukonceni\n";
}

void report()
{
   cout << "To byl vytecny tyden pro obchod.\n"
   "Trzby vzrostly o 120%. Vydaje poklesly o 35%.\n";
}

void comfort()
{
   cout << "Vasi zamestnanci si mysli, ze jste nejlepsi vykonny reditel\n"
   "v prumyslu. Spravni rada si mysli,\n"
   "ze jste nejlepsi vykonny reditel v prumyslu.\n";
}

Nahlásit jako SPAM
IP: 89.203.175.–
Pesoxx0
Duch
26. 10. 2012   #2
-
0
-

Napadá mě použít cin.clear():

while(cin >> choice)
{
	// prikazy
}
cin.clear();

další podmínky ale musíš vyřešit přímo v cyklu.

EDIT: 

takhle jsi to asi myslel: 

int main()
{
   showmenu();
   int choice;
   while (cin >> choice && choice != 5)
   {
      switch(choice)
      {
         case 1 : cout << "\a\n";
            break;
         case 2 : report();
            break;
         case 3 : cout << "Vedouci byl pritomen cely den.\n";
            break;
         case 4 : comfort();
            break;
         default : cout << "To neni volba.\n";
      }
      showmenu();
   }
   cin.clear();
   cout << "Sbohem!\n";
   return 0;
}
Nahlásit jako SPAM
IP: 31.134.216.–
Hunty
~ Anonymní uživatel
48 příspěvků
26. 10. 2012   #3
-
0
-

Funcke
int isdigit ( int c );

by se ti taky mohla líbit.

Nahlásit jako SPAM
IP: 193.86.229.–
VaaR0
Duch
26. 10. 2012   #4
-
0
-

#2 Pesoxx
podle tvého kódu se po zadání ukončí program. Jak ale udělat, aby se vypsalo "Toto není volba" a zase se vypsalo menu a čekalo na zadání?

se v tom babrám :-))

: Hunty - zkoušel jsem to tam dobastlit, ale bez úspěchů :-( Funkce vrací true nebo false?? v podmínce if mě to stejně nešlo.

Nahlásit jako SPAM
IP: 89.203.175.–
vitamin+8
Grafoman
26. 10. 2012   #5
-
0
-

testuj cin.fail()

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Pesoxx0
Duch
26. 10. 2012   #6
-
0
-

nějak takhle : 

int main()
{
   showmenu();
   int choice=0;
   while (choice!=5)
   {
      while(!(cin >> choice))
	   {
		   cin.clear();
		   cin.ignore();
		   choice=6;
		   break;
	   }
      switch(choice)
      {
         case 1 : cout << "\a\n";
            break;
         case 2 : report();
            break;
         case 3 : cout << "Vedouci byl pritomen cely den.\n";
            break;
         case 4 : comfort();
            break;
         case 5 :
	          continue;
         default : cout << "To neni volba.\n";
      }
		showmenu();
   }
   cout << "Sbohem!\n";
   return 0;
}

EDIT:nevšiml jsem si vitaminova příspěvku (mimochodem ano, cin.fail() je na to lepší)

Nahlásit jako SPAM
IP: 31.134.216.–
vitamin+8
Grafoman
26. 10. 2012   #7
-
0
-

Zjednodusene povedane, cin "vracia" (ma pretazeny operator bool a void*) nenulovu hodnotu ak nastala daka chyba. Konkretnu chybu (eof v podstate ani nie je chyba) zistis z flagov failbit, eofbit a badbit, cize pomocou metod fail(), bad() a eof() zistis ci je dotycny flag nastaveny na 1 alebo 0. Ak chces vynulovat flagy(pokracovat v nacitavani hodnot), tak musis pouzit metodu clear() na vynulovanie flagov.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
VaaR0
Duch
26. 10. 2012   #8
-
0
-

super, děkuji za rady VŠEM :-)

Pokud bych použil cin.fail() tak místo druheho WHILE by se pouzival IF ? Stejne by se asi ale nic nezjednodusilo ?

Nahlásit jako SPAM
IP: 89.203.175.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #9
-
0
-

proc radsi nenactes jeden znak? case '1': ... '2' a tak dale?  kdyz nekdo zada 'a' tak to bude jen dalsi volba do defaultu

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
VaaR0
Duch
26. 10. 2012   #10
-
0
-

#9 KIIV
teď nevím, jak to myslíš načíst jeden znak? V prvním příspěvku je kod, kde po zadani pismene misto cisla se zacykluje výpis menu.

Nahlásit jako SPAM
IP: 89.203.175.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #11
-
0
-

   

char vstup;
cin >> vstup;
switch(vstup) {
  case '1': ... ; break;
  case '2': ... ; break;
  .....
}
Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
VaaR0
Duch
26. 10. 2012   #12
-
0
-

#11 KIIV
jooo super děkuji :-) Ještě jedna věc, když už to řešíme. Pokud zadám 'asdfg' tak se menu vypíše 5x podle počtu písmen. Zkoušel jsem cin.clear(); ale i tak to vypisuje 5x.

int main()
{
   showmenu();
   char choice;
   cin >> choice;
   while (choice != 5)
   {
      switch(choice)
      {
         case '1' : cout << "\a\n";
            break;
         case '2' : report();
            break;
         case '3' : cout << "Vedouci byl pritomen cely den.\n";
            break;
         case '4' : comfort();
            break;
   case '5' : cout << "Sbohem!\n";
   return 0;
         default : cout << "To neni volba.\n";
      }

      showmenu();
      cin >> choice;
   }
  
}

Nahlásit jako SPAM
IP: 89.203.175.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #13
-
0
-

muzes jeste nacist celou radku do string... a pak otestovat jestli tam je jeden znak a s nim pak pracovat

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Doomista+1
Stálý člen
26. 10. 2012   #14
-
0
-

#13 KIIV
nebo načítat do charu s velikosti pro jeden znak a v podmínce to akorát převést na int a odečíst ID čísla 0 v ASCII

char znak[1];

cin.getline(znak,1);

switch(int(znak)-48)

...

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý