Ir ao conteúdo
  • Cadastre-se

como converter char em int


claude754

Posts recomendados

Olá , estou tentando fazer um algoritmo que resolva o seguinte problema:

Dada uma placa qualquer de um veiculo dizer a qual estado essa claca pertence.
para ajudar na criação desse algoritmo vou postar uma tabela com as series inicias e finais de cada estado :eek:

Combinação alfanumérica? UF?

As placas para cada estado está em sequencia e em anexo..
^_^

 

Portanto eu achei uma maneira de resolver creio que funcione... é o seguinte

Desprezando os números. Como eles sempre vão de 0001 até 9999, não tem porque considerá-los.

Eu acho que o grande segredo,  está em gerar uma representação decimal do número da placa. Da para fazer isso convertendo a base das letras na base decimal, e somando com os números do final.

Tipo o alfabeto vai até 26 certo? então cada letra recebe um numero correspondente como A = 0, B = 1 etc...

Apos isso , acho que criando um intervalo para cada sequência de placas e comparar com >= e <= de certo.

porém sou meio novo em C++ não sei como converter char em int ...

 

Alguem poderia me ajudar? :confused: :confused: :confused:

 

OBS: Tem que ser em C++ :D

Sequencia.txt

Link para o comentário
Compartilhar em outros sites

Em C, existem apenas dois tipos de dados: inteiro e ponto flutuante.

Para inteiros, temos:

- [unsigned/signed] char (1 byte) - números de -128 a 127 ou 0 a 255

- [unsigned/signed] short int (2 bytes) - números de -32768 a 32767 ou 0 a 65535

- [unsigned/signed] int (4 bytes) - números de -2147483648 a 2147483647 ou 0 a 4294967296

- [unsigned/signed] long long int (8 bytes) - números de -9223372036854775808 a 9223372036854775807 ou 0 a 18446744073709551616

É bastante fácil calcular. 1 byte = 8 bits = 0000 0000 a 1111 1111, portanto, 2^8=256 possibilidades de combinar 0s e 1s. Para x bytes, temos 2^(8x) possibilidades, então os números vão de 0 a 2^(8x)-1 (para unsigned), ou -2^(8x-1) a 2^(8x-1)-1 (para signed).

Para ponto flutuante, temos (seguem o padrão IEEE 754, google ou wikipedia se quiser saber mais):

- float (4 bytes)

- double (8 bytes)

- long double (12 bytes, mas usa apenas 10, o resto é "lixo")

Mas voltando para os inteiros: como pode ver, todo caractere é um inteiro. A ideia é que para cada caractere se associa um número inteiro (procure no google por tabela ascii). Assim, o 'A' equivale a 65. O 'a' equivale a 97. Literalmente! Digitar 'a' ou 97 dá exatamente no mesmo em C ou C++ (teste, por exemplo, printf("%d", 'a'*'a'); ou printf("%d", 'a'*97);, cujos resultados serão ambos 9409).

Portanto, se quer converter um char em um inteiro... bem, não precisa. O char já é um inteiro. Agora, se quer fazer com que 'A' seja 0, 'B' seja 1, etc, apenas subtraia 'A' da variável. Afinal, se você subtrai 'A' de 'A', você tem 0. Como 'B' é 'A'+1, se você subtrai 'A' de 'B', tem 1. E assim vai:

#include <stdio.h>int main (){	char c;	printf("Digite uma letra maiuscula:");	scanf(" %c", &c);	printf("%c -> %d\n", c, c - 'A');	return 0;}
PS: estou usando printf/scanf porque não gosto de cout/cin. Mas se preferir:
#include <iostream>using namespace std;int main (){	char c;	cout << "Digite uma letra maiuscula:";	cin >> c;	cout << c << " -> " << (c-'A') << endl;	return 0;}
Por fim (principalmente para C++, que tem override de operadores), se você quiser garantir que ele vá interpretar algo como char ou como int, ou como qualquer tipo, use casts. int(c-'A'), por exemplo, para forçar uma transformação de (c-'A') para inteiro, se necessário (se não for necessário, o compilador apenas ignorará o cast); ou char(c-'A'), para char. Etc. Leia mais sobre casts em: http://www.cplusplus.com/doc/tutorial/typecasting/
Link para o comentário
Compartilhar em outros sites

hum complicou um pouco, mas e com o uso do atoi ?

não seria mais fácil para depois poder comparar?

 

por exemplo se eu teria que fazer uma função para transformar cada letra e depois compara os resultados, mas

ficaria muito extenso o programa ainda mais na hora de comparar...

Digamos que eu tenha essa placa: BFA 0001 a GKI 9999 São Paulo

 

se eu digitar uma placa tipo: CGI .... teria que dizer que é de São Paulo

 

a lógica que eu fiz no começo eu acho que está certo mas não consigo implementar...!

Link para o comentário
Compartilhar em outros sites

O que você quer, então, não é converter char pra inteiro, nem string (ou char*) para inteiro. Você quer comparar strings.

Para isso, você pode usar a classe string do C++, ou usar funções de string do C (que obviamente também funciona em C++): strcmp ou stricmp.

Como você está fazendo em C++, é mais prático usar string:

#include <string>bool pertenceAoIntervalo(const std::string& placa, const std::string& intervalo_inicio, const std::string& intervalo_fim) {	return intervalo_inicio <= placa && placa <= intervalo_fim;}
Depois, percorra a lista de placas/estado, e veja a qual estado pertence a placa.

Apenas um exemplo:

#include <string>struct IntervaloDePlacas{	std::string inicio;	std::string fim;	enum Estado estado;} placas[] = {	{"AAA 0001", "BEZ 9999", Estado.PR},	{"BFA 0001", "GKI 9999", Estado.SP},	// etc};const int numPlacas = sizeof(placas)/sizeof(struct IntervaloDePlacas);bool pertenceAoIntervalo(const std::string& placa, const std::string& intervalo_inicio, const std::string& intervalo_fim) {	return intervalo_inicio <= placa && placa <= intervalo_fim;}enum Estado procuraEstado(const std::string& placa){	for (int i = 0; i < numPlacas; i++)		if (pertenceAoIntervalo(placa, placas[i].inicio, placas[i].fim))			return placas[i].estado;	return Estado.DESCONHECIDO;}
Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...