Avatar
shatem
Člen
Avatar
shatem:

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
Posix
Člen
Avatar
Posix:

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
Proč to dělat jednoduše, když to jde složitě.
Avatar
Jirka Vavřík:

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
Inteligentní nemá čas si pamatovat, inteligentní musí vymýšlet.
Avatar
shatem
Člen
Avatar
shatem:

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

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
Inteligentní nemá čas si pamatovat, inteligentní musí vymýšlet.
Avatar
Eldan
Člen
Avatar
Odpovídá na Jirka Vavřík
Eldan:

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ý
Redaktor
Avatar
Odpovídá na Jirka Vavřík
Jan Vargovský:

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
Posix
Člen
Avatar
Odpovídá na Jan Vargovský
Posix:

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
Proč to dělat jednoduše, když to jde složitě.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Posix
Jan Vargovský:
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:

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
Posix
Člen
Avatar
Odpovídá na Jan Vargovský
Posix:

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

Nahoru Odpovědět 31.10.2014 21:17
Proč to dělat jednoduše, když to jde složitě.
Avatar
Jirka Vavřík:

kde jste vzali

Char.ToUpper(znak)

?
co musím includovat?

Nahoru Odpovědět 1.11.2014 9:49
Inteligentní nemá čas si pamatovat, inteligentní musí vymýšlet.
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:

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 Posix

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.