NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Mezinárodní den IT společnosti je tady! Pouze nyní můžeš získat 90 % extra kreditů při nákupu od 1199 kreditů s promo kódem AJTACI90. Tak neváhej!

Diskuze: převod znaků na čísla

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
shatem
Člen
Avatar
shatem:29.10.2014 17:15

zdravím, potřeboval bych pomoct vyřešit problém jak ze vstupu znaků, udělat číslo. bohužel jsem se s tím ještě nesetkal a nic mě nenapadá. ukázka: vstup znak A by se měl převést na 0, B na 1 atd.

 
Odpovědět
29.10.2014 17:15
Avatar
Neaktivní uživatel:29.10.2014 18:16

Můžeš zkusit něco takového.

char znak = 'D';
int cislo = (int)(znak - 'A'); // cislo bude 3
Editováno 29.10.2014 18:16
Nahoru Odpovědět
+1
29.10.2014 18:16
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:30.10.2014 8:26

Na to si vytvoř funkci, např:

int CharToNumber(char znak) {
switch(znak) {
case A: return 1; break;
case a: return 1; break;
case B: return 2; break;
case b: return 2; break;
case C: return 3; break;
case c: return 3; break;
//a tak pokracujes az do pismene z

default: return -1; break;
}

}

a kdekoliv v kódu pak použij:

int Cislo = CharToNumber(znak);
Nahoru Odpovědět
-3
30.10.2014 8:26
Neaktivní uživatelský účet
Avatar
shatem
Člen
Avatar
shatem:30.10.2014 9:53

díky, zkusím asi obě metody. první se mi teda líbí víc kvůli úspoře ikdyž je udělaná šalamouncky :) jinak děkuji oběma

Editováno 30.10.2014 9:53
 
Nahoru Odpovědět
+1
30.10.2014 9:53
Avatar
Neaktivní uživatel:30.10.2014 10:02

Jo, udělal jsem tam chybu, zapomněl jsem znaky dát do apostrofů:

int CharToNumber(char znak) {
switch(znak) {
case 'A': return 1; break;
case 'a': return 1; break;
case 'B': return 2; break;
case 'b': return 2; break;
case 'C': return 3; break;
case 'c': return 3; break;
//a tak pokracujes az do pismene z

default: return -1; break;
}

}
Nahoru Odpovědět
-2
30.10.2014 10:02
Neaktivní uživatelský účet
Avatar
Eldan
Člen
Avatar
Odpovídá na Neaktivní uživatel
Eldan:30.10.2014 14:40

No to je dost blbé řešení. V ASCII tabulce jdou znaky za sebou a víme že 'A' = 65 a 'a' = 97. Takže pak stačí castnout na int a odečíst 65 pro uppercase a 97 pro lowercase. To všechno na pár řádků a bez padesátiprvkového switche.

Nahoru Odpovědět
+5
30.10.2014 14:40
Unobfuscated executable == free source code
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:30.10.2014 15:55

Btw, když už bys to chtěl takhle psát, tak psát nakonec break je zbytečné a mohl bys použít propadávání u switche.

switch(znak) {
case 'A':
case 'a': return 1;
case 'B':
case 'b': return 2;
...
 
Nahoru Odpovědět
+2
30.10.2014 15:55
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:31.10.2014 16:05

Když už bys to chtěl takhle psát... :D

switch (Char.ToUpper(znak))
case 'A': return 1; break;
case 'B': return 2; break;
case 'C': return 3; break;
Editováno 31.10.2014 16:06
Nahoru Odpovědět
31.10.2014 16:05
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:31.10.2014 17:53
switch (Char.ToUpper(znak))
 case 'A': return 1;
 case 'B': return 2;
 case 'C': return 3;

radši :D

 
Nahoru Odpovědět
31.10.2014 17:53
Avatar
shatem
Člen
Avatar
shatem:31.10.2014 20:25

zjistil jsem, ze to jde udelat i jednoduseji, staci retezec ulozit do int retezce a dostanou se hodnoty ascii tabulky, teda resil jsem to ja jak to prevyst ale kdyby vas to zajimalo

 int x[HODNOTA] = {};
char a[HODNOTA] = {};
scanf ( "%s", a);
while (a[i] !='\0') {
    x[i]= (a[i]);
    i++;
}
Editováno 31.10.2014 20:26
 
Nahoru Odpovědět
31.10.2014 20:25
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:31.10.2014 21:17

achjo.. ja ten zbytek akorat hlpupe zkopiroval a ted vypadám jak blbec :(

Nahoru Odpovědět
31.10.2014 21:17
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:1.11.2014 9:49

kde jste vzali

Char.ToUpper(znak)

?
co musím includovat?

Nahoru Odpovědět
1.11.2014 9:49
Neaktivní uživatelský účet
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:1.11.2014 12:02

Neaktivní uživatel - google? http://www.cplusplus.com/…ype/toupper/
takže předpokládám

#include <stdio.h>
#include <ctype.h>

potom..
Psát 50ti řádkovej switch je blbost, nebo ne blbost, ale zbytečnost, takže zůstává ve hře 2. varianta - ta od Neaktivní uživatel

char znak = 'D';
int cislo = (int)(znak - 'A'); // cislo bude 3

Jen doplnim, že je to založený na převodu charu na ASCII hodnotu (viz ASCII table)..

  • char 'A' = 65 int (dec), B = 66 ,... a = 97 ,... , z = 122

Předpokládám, že chceš aby 'A' i 'a' vracelo 1- takže..

  • načtení charu
  • vynucení převodu na kapitálku
  • převod ASCII
  • posunutí o "offset" (aby A bylo 1 a ne 65 z ASCII)

a máš vyřešeno (samozřejmě je možnost načítat char rovnou do int proměnný) :D

char znak;      //vstup
int znakASCII;  //pom. pro převod

//načtení
scanf ( "%c", &znak);

//převod
znak = toupper(znak);
znakASCII = (int) znak;

//vypsání s offsetem  (A = 65 ASCII, aby A= 1 -> -64)
printf("znak %c jako 'int': %i",znak,znakASCII-64);

Něco v tomhle smyslu =)

Nahoru Odpovědět
+1
1.11.2014 12:02
Unix- svět, kde chcete být nulou :) (UID)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.