Cyklus Do While – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Cyklus Do While – C / C++ – Fórum – Programujte.comCyklus Do While – C / C++ – Fórum – Programujte.com

 

Filips
~ Anonymní uživatel
4 příspěvky
20. 12. 2016   #1
-
0
-

Ahoj,

potřeboval bych poradit s následujícím kódem. Při spuštění programu, se vypíše nějaký uvítací text a následně si budu vybírat z nějakého menu (stisknu klávesu, která provede určitý krok). Jednoduše bych to přirovnal k nějaké kalkulačce. Zmáčknu A budu sčítat, zmáčknu B, budu odečítat atd. Pokud zmáčku jiné číslo, vyhodí to chybu a program se vrátí na začátek.

To by mi celkem fungovalo. Pokud zmáčknu jiné písmeno, než mám v menu, tak mě to hodí na začátek. Jenže bych navíc potřeboval, až tohle celé proběhne a vyhodí to třeba výsledek, aby byl dotaz, jestli chci zadat další příklad. To už mi nefunguje a cyklus se vždy ukončí. A nefunguje ani to vrácení na začátek.

Můžete mi s tím prosím poradit?

Nahlásit jako SPAM
IP: 77.48.59.–
Filips
~ Anonymní uživatel
4 příspěvky
20. 12. 2016   #2
-
0
-

 Nevložil se mi zdrojový kód. Je zde:

#include <stdio.h>
main ()
{
	char volba;
	char pokracuj;
	




do // menu nacteni akce
	{
		printf("Pro ovladani stisknete prislusnou klavesu:\n");
		printf("A, B, C, D, E nebo F\n");
		scanf("%c", &volba);
		switch(volba)
			{
			case 'a':
			case 'A':
				printf("Vybrana volba A \n");
				break;
	
			case 'b':
			case 'B':
				printf("Vybrana volba B \n");
				break;
				
			case 'c':
			case 'C':
				printf("Vybrana volba C \n");
				break;
				
			case 'd':
			case 'D':
				printf("Vybrana volba D \n");
				break;
	
			case 'e':
			case 'E':
				printf("Vybrana volba E \n");
				break;
	
			case 'f':
			case 'F':
				printf("Vybrana volba F \n");
				break;
	
			default: printf("CHYBA!\n");
			}
		
		printf("Chcete prevest dalsi menu? [A/N]\n");
		scanf("%c", &pokracuj);
		getchar();	
			

} while ((pokracuj == 'A') || (pokracuj == 'a'));


}
Nahlásit jako SPAM
IP: 77.48.59.–
gna
~ Anonymní uživatel
1891 příspěvků
20. 12. 2016   #3
-
0
-

Když zadáš <A> <Enter>, tak ti první scanf načte <A>, ten druhý <Enter> a pak to čeká na další vstup u toho getcharu.

Předpokládám, že právě proto tam ten getchar máš. Tak ho můžeš dát i k tomu prvnímu scanfu. Není to dobré řešení (uživatel může zadat jen <Enter> a celé se to rozbije), ale pro začátek by ti to mohlo stačit.

Já bych to asi řešil funkcí, která načte celý řádek a vrátí jen první znak, nebo chybu, pokud uživatel zadává kraviny.

Nahlásit jako SPAM
IP: 213.211.51.–
Filips
~ Anonymní uživatel
4 příspěvky
21. 12. 2016   #4
-
0
-

Díky! Ten getchar jsem tam zkoušel, ale nějak to nefungovalo, tak asi sem se uklepl, ale už je to OK.

Ještě bych měl jeden dotaz. Bylo by možné, aby mě ten default v tom switchi přepnul na začátek toho switche? Nebo to budu muset udělat přes další cyklus? Jeden cyklus na default (pokud zadám jinou hodnotu než A - F) a ten vložit do cyklu "Chcete opraci provést znovu" nebo něco takového.

Pokud by to v této konstrukci vůbec šlo.

Nahlásit jako SPAM
IP: 77.48.59.–
gna
~ Anonymní uživatel
1891 příspěvků
21. 12. 2016   #5
-
0
-

Příkazem continue můžeš přeskočit zbytek těla toho cyklu a jet další. Nebo příkazem goto skákat kam se ti zachce, ale tím se jen naučíš prasit.

Normálně bych tu volbu dal do dalšího cyklu. Ale jsem trochu zmatený z toho, jak jsi to napsal. Takhle nějak bych to viděl.

do
{
	do
	{
		volba
	} while (nesmysl);

	switch
	{
	}

} while (pokracuj);

A to ptaní na pokračování bych asi zrušil. Mužeš hned do hlavní nabídky dát možnost ukončení.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
4014 příspěvků
22. 12. 2016   #6
-
0
-

Slo by to udelat tak, ze das switch jako funkci a pak muzes volat funkci ve funkci. Nebo proste pri dalsim cyklu, jak pises. Nebo, jak pise gna, muzes cely ten switch obalit cyklem, ktery ceka, az mu treba nejakou promennou nastavis z false na true.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:6585:ad...–
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, 4 hosté

Podobná vlákna

Cyklus — založil Jan Burant

Cyklus — založil Jirka

Cyklus for — založil vojta

Cyklus For — založil nergaldiabolus

Cyklus — založil JerryM

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ý