Rozeznání čísla – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rozeznání čísla – C / C++ – Fórum – Programujte.comRozeznání čísla – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
6. 11. 2014   #1
-
0
-

 
Ahoj, potřebuju poradit, jak udělat aby program rozeznal číslo od písmena.
Našel jsem příkaz cin.fail, ale asi nevím jak ho správně použít.

Když zadám písmeno, skočí mi to do nekonečného ciklu.

Díky za rady.

funkce:
	int pole[256], zbytek, i, vstup, soustava;
	int k = 0;
	cout << "Soustava, do ktere chcete prevadet: ";
	cin >> soustava;
	cout << "\n";
	if ((soustava <= 16) && (soustava > 1))
	{
		cout << "Cislo: ";
		cin >> vstup;
		if (cin.fail()) goto funkce;
		
		......
Nahlásit jako SPAM
IP: 147.32.11.–
6. 11. 2014   #2
-
0
-

Jedna možnost je načíst zadané číslo jako řetězec a zkoumat jednotlivé znaky. Je dobré se podívat do ASCII tabulky. 

To použití goto... (jsem nenašel smajlíka, co mu jdou oči šejdrem)

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:29c9:ca...–
Kit+15
Guru
6. 11. 2014   #3
-
0
-

#2 hlucheucho
go... co? To prý kdysi bylo ve Fortranu.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
6. 11. 2014   #4
-
0
-

#3 Kit
používá goto, naprosto zbytečně. V C už pár let dělám a nikdy jsem goto nepotřeboval.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:29c9:ca...–
vitamin+8
Grafoman
6. 11. 2014   #5
-
0
-

#4 hlucheucho
V C sa goto dost casto pouziva na uvolnovanie zdrojov, v c++ je vo vecsine pripadov zbytocne (cest vynimkam ako stavove automaty a break cyklu ak si v switchi...).

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kit+15
Guru
6. 11. 2014   #6
-
0
-

#5 vitamin
Break v cyklu i ve switchi jsou také zbytečné a obcházet je přes goto tuplem.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
vitamin+8
Grafoman
6. 11. 2014   #7
-
0
-

#6 Kit
Niesu zbytocne. Samozrejme je dobre minimalizovat pouzivanie goto/break/continue. Ale nie za kazdu cenu, niekedy je goto/break/continue prehladnejsie ako alternativy.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kit+15
Guru
6. 11. 2014   #8
-
0
-

#7 vitamin
goto/break/continue neumí předat hodnotu, proto je return jako alternativa zpravidla výhodnější.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
vitamin+8
Grafoman
6. 11. 2014   #9
-
0
-

#8 Kit
Napr ked robis lexer a v cykly prechadzas znaky tak ak checes preskakovat biele znaky tak sa continue/break hodi.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
6. 11. 2014   #10
-
+1
-
Zajímavé

#1 Proxima_Centauri
Triviální vlastní kontrola na testování čísla

char value = 'a'; // nejaky znak (treba z konzole)
bool isNumber = (value >= '0' && value <= '9');

if (isNumber) {
    // je cislo...
}

nebo můžeš použít hotový fce... ta teda umí přímo i pole

char* value = "156a";

if (isdigit(value)) {
    // je cislo...
}

A rozhodně by si jako vstup neměl mít int, ale char/string a to potom po kontrole přetypovat

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Kit+15
Guru
6. 11. 2014   #11
-
0
-

#9 vitamin
Procedurální záležitosti raději přenechávám systémovým knihovnám. Lexery dělám jen výjimečně, na ty se continue občas hodí. Ve vyšších vrstvách k tomu obvykle není důvod.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
6. 11. 2014   #12
-
0
-

#10 ingiraxo
Akorát že ta tvoje funkce nezvládne číslice "٠١٢٣٤٥٦٧٨٩"

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ingiraxo+15
Grafoman
6. 11. 2014   #13
-
0
-

#12 Kit
myslim, že tohle je detail... už vidim, že tam někdo bude sypat rýži :)

pokud bych to měl řešit přes unicode, tak bych to jednoduše převedl na číslo a měl tam kontrolu na min/max hodnotu (protože unicode znaky to převede též na číslo podle unicode table)... pokud uživatel zadá něco jinýho než číslice, tak jeho problém... 

wchar_t* value = L"١٢٣٤٥٦٧٨٩";
int num = _wtoi(value);

if (num > 99 && num < 1000) {
   // podporujeme pouze hodnotu mezi 100-999
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
6. 11. 2014   #14
-
0
-

Trochu jsem se na to podíval a šlo by to řešit takto (možná to není úplně čistý)... podporuje to ti pole unicode znaků... ale spíš bych nepoužíval unicode vůbec

bool isNumber(wchar_t* input)
{
    if (!input || *input == '\0') return false;

    bool valid = true;
    int i = 0;

    do {
        wchar_t* ch = (input + i);
        if (*ch == '\0') break;
        int dec = _wtoi(ch);
        valid &= (dec == 0x7FFFFFFF || (*ch >= '0' && *ch <= '9')) ?
            (*ch >= '0' && *ch <= '9') : false;
        i++;
    } while (valid);

    return valid;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Proxima_Centauri
~ Anonymní uživatel
4 příspěvky
6. 11. 2014   #15
-
0
-

Proč řešíte použití goto?   To je snad moje věc..

Děkuji ingiraxo za normální odpověď  

Nahlásit jako SPAM
IP: 78.102.159.–
Kit+15
Guru
6. 11. 2014   #16
-
0
-

#15 Proxima_Centauri
To víš, za používání goto se i vyhazuje z práce, ale souhlasím, je to tvoje věc.

Nahlásit jako SPAM
IP: 37.48.35.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Proxima_Centauri
~ Anonymní uživatel
4 příspěvky
6. 11. 2014   #17
-
0
-

Neboj, ten program není do práce a programování není můj primární obor.

Nahlásit jako SPAM
IP: 78.102.159.–
Proxima_Centauri
~ Anonymní uživatel
4 příspěvky
6. 11. 2014   #18
-
0
-

 Jinak ještě jednou děkuji ingiraxo, vyzkoušel jsem a funguje perfektně.

Zamykám

Nahlásit jako SPAM
IP: 78.102.159.–
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, 76 hostů

Podobná vlákna

Čísla — založil Michal

CIsla — založil Nery

Čísla — založil Onsi

Fibonacciho čísla — založil laney10

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ý