IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: převod znaků na čísla

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
29.10.2014 18:16
Neaktivní uživatelský účet
Avatar
Jirka Vavřík: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
30.10.2014 8:26
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
30.10.2014 9:53
Avatar
Jirka Vavřík: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
30.10.2014 10:02
Avatar
Eldan
Člen
Avatar
Odpovídá na Jirka Vavřík
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
30.10.2014 14:40
Unobfuscated executable == free source code
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Jirka Vavřík
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
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
Jirka Vavřík:1.11.2014 9:49

kde jste vzali

Char.ToUpper(znak)

?
co musím includovat?

 
Nahoru Odpovědět
1.11.2014 9:49
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:1.11.2014 12:02

Jirka Vavřík - 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.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.