Converter de String para Int sem usar a biblioteca java

ai Macoy
o brain pifou aqui… nao guento mais… vo nanar
mas cara eu vi teu pseudo codigo e o cod que postei foi o jeito q arrumei pra codificar o teu pseudo codigo (claro dentro do meu limitado ponto de vista)
nao to sabendo fazer sem usar array
ufsss
mas amnha tento mais
valeu!

ah… tem alguma ideia pra mim pegar um char componente da string de cada vez sem usar o charAt() ?

[quote=rafaelczy]creio q entendi Vingdel
vou tentar implementar
eu pensava q eu era bom de logica mas to vendo que nao
eu nunca iria sacar essa sua logica ai, parabens mesmo!
até gostaria de te perguntar, tu raciocinou isso agora ou ja tinha visto isso antes postado por outros?
valeu![/quote]

rafaelczy, pensei na hora que li a sua dificuldade.
A questão era pensar em posicionar os números em seu devidos lugares sem que um interferisse no outro.

Quanto ao seu código, para fazer potenciação existem um método chamado pow() da classe Math.

Procure sobre ele na documentação java. Cara, sempre que você quiser saber sobre alguma classe java, recorra ao google. Por exemplo, se você quer saber sobre a classe Math, busque por “Math java se6” vai ser o primeiro link para você. Já vi que você gosta de falar inglês. Creio que você não vá ter dificuldade de entender.

Quanto a variável expoente, inicialize ela com o valor do comprimento da string-1.

Cara, quero fazer você pensar, por isso não te dou a resposta. Entende, ne?

Abraço!

botei um carvao pra nao dormir de barriga vazia
legal galera so passei pra desejar boa programaçãp pra quem fica
nao aguento ler mais nada mas amnha recomeço a queimação de neuronios
valeu ai Vingdel

[quote=Macoy_AbZ]Ainda tá meio confuso, dá pra simplificar mais. Não precisa de tantos vetores (arrays). Aliás não precisa de nenhum.

Declare apenas as seguintes variáveis

String s = "12345"; //String a ser convertida para inteiro
int d; //dígito que resulta da subtração do caractere indexado pelo '0' do unicode. Ex: '2' - '0' = 2
int i; //contador/indexador da string
int total; // acumulador do valor total, vai somando (total * 10) + d

Eu testei aqui aquele pseudo-codigo que fiz no post anterior e funcionou. Queima a muringa mais um pouco aí que você vai chegar lá.

Abraços[/quote]

Macoy_AbZ, boa noite!

Este teste que você fez foi no java?
Pelo que eu entendi, seu raciocínio não funciona em java.

Aguardo resposta.

EDIT: Opa, agora que prestei atenção, não tinha notado o 0 (zero) entre aspas simples caracterizando char…

Aí sim é correto…

Abraço!

Fala rafaelczy!

Tente pensar “iterativamente” na solução. A cada iteração você tem um caracter unicode que deve ser tranformado em um dígito numérico (inteiro). Você também pode levar a posição do caractere dentro da String (centenas, dezenas, unidades) para saber o múltiplo correto de 10 a ser utilizado.

Passo 1:

Você tem uma String
“24760”

Passo 2:

Você “quebra” a string em caracteres individuais (Aqui ainda não há numeros, apenas caracteres representando-os)
‘2’, ‘4’, ‘7’, ‘6’, ‘0’

Passo 3:

Você pega a distância do caractere unicode do zero ‘0’ (Exemplo: ‘1’ - ‘0’ = 1) e consegue obter os valores individuais dos dígitos (em valores inteiros)
2, 4, 7, 6, 0

Passo 4:

Agora vem a parte chata, multiplicar os valores acima pela potencia adequada de 10 como o Vingdel falou. Existem outras maneiras de fazer isso mas uma delas é:

2 * 10^4
4 * 10^3
7 * 10^2
6 * 10^1
0 * 10^0

A outra maneira de resolver essa parte é ir multiplicando o resultado da iteração anterior por 10. Depois posta o teu programa aqui pra gente ver.

Vingdel, te mandei uma MP depois dá uma olhada.

Abraços

Marcio

bah acordei de brain novo e vamos pra pauleira de novo
que bostinha dificil essa… mas é a vida…
Marcoy
realmente to boiando ainda no passo 3 descrito por vc! (os outros eu entendi até já consegui implementar)
será q da pra clarear mais o passo 3
valeu

ta ai meu cod
só cosegui evoluir a incialização da var expoente e mais nada
ufss…

String s = "2345";
		char[] arrayChar = new char[4];
		int[] arrayInt = new int[4];
		int inteiro;
		int expoente = arrayInt.length -1;
		int soma = 0;
		
		for (int i=0; i<=arrayChar.length-1; i++){
			arrayChar[i] = s.charAt(i);
			arrayInt[i] = arrayChar[i];
			inteiro = arrayInt[i]*10^expoente;
			expoente-- ;
			soma += inteiro;
			System.out.println(inteiro);
		}
		System.out.println("O inteiro e: " + soma);

Tá quente agora!

Na linha 10, mude de:

 arrayInt[i] = arrayChar[i];

para:

 arrayInt[i] = arrayChar[i] - '0';

O que você está fazendo é movendo a representação numérica do char (exemplo ‘9’ em ascii é 57) e subtraindo a representação numérica do char ‘0’ (48 em ascii). o que dá: 57 - 48 = 9 que é exatamente o valor que queremos. Lembrando que o java usa o UNICODE e não a Tabela ASCII. Mas isso não interfere no resultado do cálculo.

Acho que o seu programa deve funcionar agora. Mas repense a utilização de tantos arrays… Não é necessário nenhum array.

Abraços

Marcio

“O que você está fazendo é movendo a representação numérica do char (exemplo ‘9’ em ascii é 57) e subtraindo a representação numérica do char ‘0’ (48 em ascii). o que dá: 57 - 48 = 9 que é exatamente o valor que queremos”
incrivel, juro, tive de ler isso umas 20 vezez pra cair a ficha, entender a logica do teu exemplo.
eu sabia que meu arrayInt[i] tava recebendo nao o 9 da string mas 57 q é o posição dele na tab unicode, ou referencia, ou sei la o que na unicode. enfim, o que eu jamais iria imaginar era que tem que subtrair o char 0 que na unicode é 48. dai claro, 57 - 48 = 9
eu ficava focado em arrumar um jeito de parar de receber o valor unicode 57 e conseguir receber 9 em inteiro e tu aceitou trabalhar com o que estava recebendo e foi muito flexivel ao adiconar mais um char ainda na operação ( ‘0’ ) pra subtrair do valor unicode do primeiro char e passar esse resto que vira inteiro no arrayInt[i].
notavel
-recebo nao o 9 mas um char que na tab unico vale 57 . certo. será que há entao na unicode algum valor que eu subtraipoosto de 57 e da o resto 9 do tipo char ainda que seja dai meu arrayInt[i] vai guardar o int 9 direitinho-
nunca eu iria pensar assim eu acho.
o que eu quero dizer é que sinto que ainda nao posso ser deixado sozinho pra resolver só com dicas e pistas fornecidas pelo pessoal do forum, ainda que a intenção deles seja das mais nobres em nao dar resposta pra ajudar o beginer como eu a pensar.
Sinto que no inicio pra caras como eu, “entregar” a resposta como tu fez me ajuda a entender que existe um caminho assim.
as vezes simplesmente nao adiante queimar o brain pq nao vai, o carar falta em base essencial.
melho é o cara pegar algumas respostas vai se acostumando mais e depois com apenas pistas e dicas, ai sim, conseguem descobrir tudo.

bom Marcoy captei finalmente, valeu
ainda nao ta funfando
me creio a que parte delicada resolvi e aprendi
agora vou tentar arrumar
e depois fazer o que me parece impossivel: nao usar arrays…
ufssss…
bela sexta feira
rsss

String s = "2345";
		char[] arrayChar = new char[4];
		int[] arrayInt = new int[4];
		int inteiro;
		int expoente = arrayInt.length -1;
		int soma = 0;
		
		for (int i=0; i<=arrayChar.length-1; i++){
			arrayChar[i] = s.charAt(i);
			arrayInt[i] = arrayChar[i] - '0';
			inteiro = arrayInt[i]*10^expoente;
			expoente-- ;
			soma += inteiro;
			System.out.println(inteiro);
		}
		System.out.println("O inteiro e: " + soma);

procurei legal e vi varios posts de autores diferentes e uma coisa em comum que me fazia nao compreender todos exemplos de codigos era que tinha que subtrair o ‘0’
inclusive pulei tb do teu exemplo de cod por causa disso.
rsssss

int expoente = arrayInt.length-1;     // aqui começa com 3
inteiro = arrayInt[i]*10^expoente;  // aqui eu queria implemntar 10 elevado na 3 mas minha instrução nao diz isso. 

tenho que implementar diferente a potenciação mas nao to sabendo no java como elevar 10 na potencia de uma var que vale 3 (10 elevado na 3a potencia)

Faz tipo um método de potencia…

public static int potencia(int base, int expoente) { if (expoente == 0) return 1; while (expoente-- > 1) base*=base; return base; }
Aí se quiser pegar 10 elevado a 3 é só chamar:

resultado = Classe.potencia(10, 3);
Cara, tenta obter uma cópia da primeira edição traduzida do livro “C a linguagem de programação”. É um livro fininho, pra ler em uma semana. Mas é uma obra prima em termos de algoritmos. Você sai diferente depois da leitura desse livro porque certas coisas ficam muito mais claras. Tambem tenta dar uma reforçada no aspecto de álgebra e aritmética. E tire os arrays do seu programa. Eles não são necessários.

Abraços

Marcio

Cara, tudo bem que exercita criar um método para potenciação, mas já existe um como eu já citei no tópico.

É o Math.pow(). Mas eu acho mais interessante multiplicar por a cada iteração.

Fiz o método aqui e ficou com 8 linhas, bem simples.

Ai Marcoy valeu a as dicas, vou tentar obter o livro e rever algebra e aritmetica.
Vindgdel posta teu codigo de 8 linhas ai.
abaixo o meu finalmente rodando

o main

String s = "2345";
		char[] arrayChar = new char[4];
		int[] arrayInt = new int[4];
		int inteiro;
		int expoente = arrayInt.length-2;
		int soma = 0;
		
		for (int i=0; i<=arrayChar.length-1; i++){
			arrayChar[i] = s.charAt(i);
			arrayInt[i] = arrayChar[i] - '0';
			inteiro = arrayInt[i]*Potenciacao.calculaPotenciacao(expoente);
			expoente--;
			soma += inteiro;
			System.out.println(inteiro);
		}
		System.out.println("O inteiro e: " + soma);

a classe que clacula a potenciação:

public abstract class Potenciacao {
	
	public static int calculaPotenciacao (int num){
		int potenciado = 1;
		for (int i=0; i<=num; i++){
			potenciado = potenciado * 10 ;
		}
		return potenciado;
	}
}

Quem puder ajudar a fazer sem arrays eu agradeço - passando so a teoria ja me serve
abração

[quote=Macoy_AbZ]Faz tipo um método de potencia…

Cara, tenta obter uma cópia da primeira edição traduzida do livro “C a linguagem de programação”. É um livro fininho, pra ler em uma semana. Mas é uma obra prima em termos de algoritmos. Você sai diferente depois da leitura desse livro porque certas coisas ficam muito mais claras. Tambem tenta dar uma reforçada no aspecto de álgebra e aritmética. E tire os arrays do seu programa. Eles não são necessários.

Abraços

Marcio[/quote]

Os autores são Brian W. Kernighan; Dennis M. Ritchie ? Lançado em 1989
304 paginas ! pra ler numa semana?
caramba nem meu aspirador de pó chupa esse livro em 1 semana…rsss
mas gostei
vou comprar
http://www.extra.com.br/livros/informaticaecertificacao/LinguagemeProgramacao/C-A-Linguagem-de-Programacao-Padrao-ANSI-118084.html?utm_source=buscape&utm_medium=comparadorpreco&utm_campaign=Livros_Linguagem-de-Programacao&cm_mmc=buscape_XML--LIVR--Comparador-_-83657

é esse o livro a que te referes mesmo?

Três versões do mesmo método.
A primeira não faz nenhuma verificação.
A segunda já trata números negativos, entretanto ainda não verifica se o número é válido.
Por fim, a terceira, verifica se a String que está sendo analizada representa de fato um número e caso não seja, lança uma NumberFormatException.
Não comentei os códigos. Faça um teste de mesa para entender o que está acontecendo.

[code]public static int toInt( String n ) {

int valor = 0;
int multiplicador = 1;
char[] c = n.toCharArray();

for ( int i = c.length - 1; i >= 0; i-- ) {
    valor += ( ( int ) c[i] - 48 ) * multiplicador;
    multiplicador *= 10;
}

return valor;

}

public static int toInt( String n ) {

int valor = 0;
int multiplicador = 1;
int ate = 0;
char[] c = n.toCharArray();

if ( c[0] == '-' ) {
    ate = 1;
}

for ( int i = c.length - 1; i >= ate; i-- ) {
    valor += ( ( int ) c[i] - 48 ) * multiplicador;
    multiplicador *= 10;
}

// se ate for igual a 1, quer dizer
// que o número é negativo
if ( ate == 1 ) {
    return -valor;
} else {
    return valor;
}

}

public static int toInt( String n ) throws NumberFormatException {

int valor = 0;
int multiplicador = 1;
int ate = 0;
char[] c = n.toCharArray();

if ( c[0] == '-' ) {
    ate = 1;
} else if ( c[0] < '0' || c[0] > '9' ) {
    throw new NumberFormatException( n + " não é um inteiro!" );
}

for ( int i = c.length - 1; i >= ate; i-- ) {

    if ( c[i] < '0' || c[i] > '9' ) {
        throw new NumberFormatException( n + " não é um inteiro!" );
    }

    valor +=  ( ( int ) c[i] - 48 ) * multiplicador;
    multiplicador *= 10;

}

if ( ate == 1 ) {
    return -valor;
} else {
    return valor;
}

}[/code]

[]'s

[quote=rafaelczy][quote=Macoy_AbZ]Faz tipo um método de potencia…

Cara, tenta obter uma cópia da primeira edição traduzida do livro “C a linguagem de programação”. É um livro fininho, pra ler em uma semana. Mas é uma obra prima em termos de algoritmos. Você sai diferente depois da leitura desse livro porque certas coisas ficam muito mais claras. Tambem tenta dar uma reforçada no aspecto de álgebra e aritmética. E tire os arrays do seu programa. Eles não são necessários.

Abraços

Marcio[/quote]

Os autores são Brian W. Kernighan; Dennis M. Ritchie ? Lançado em 1989
304 paginas ! pra ler numa semana?
caramba nem meu aspirador de pó chupa esse livro em 1 semana…rsss
mas gostei
vou comprar
http://www.extra.com.br/livros/informaticaecertificacao/LinguagemeProgramacao/C-A-Linguagem-de-Programacao-Padrao-ANSI-118084.html?utm_source=buscape&utm_medium=comparadorpreco&utm_campaign=Livros_Linguagem-de-Programacao&cm_mmc=buscape_XML--LIVR--Comparador-_-83657

é esse o livro a que te referes mesmo?[/quote]

Não, procure a primeira edição que a tradução é bem melhor. Além disso você acha em sebos bem mais barato.

Aqui ele: http://www.submarino.com.br/produto/1/10410/c:+a+linguagem+de+programacao

Abraços

Marcio

Olá, pessoal!

Como já ví que o rafael_czy conseguiu fazer o código da maneira dele, e mais um amigo resolveu participar do tópico postando algumas ideias de código e até com verificação vou postar o meu, sem verificação, apenas com a conversão básica, aliás, 2 formas que me vieram a mente. Seguem:class StringToInt{ public static void main(String[] args){ String a = "1234"; System.out.print(stringToInt(a)); } public static int stringToInt(String str){ int inteiro = 0; for(int i = 0; i < str.length(); i++){ inteiro *= 10; inteiro += str.charAt(i)-'0'; } return inteiro; } }Outra forma:class StringToInt{ public static void main(String[] args){ String a = "1234"; System.out.print(stringToInt(a)); } public static int stringToInt(String str){ int inteiro = 0; int exp = str.length()-1; for(int i = 0; i < str.length(); i++){ inteiro += ((int)str.charAt(i)-'0')*Math.pow(10,exp--); } return inteiro; } }
Abraço!

davibuzzato valeu desde q tu postou ate agora estou analizando. ótimo aprendizado essas tres versoes. grato
Vingdel muito interessante: nao usaste nehuma array. vou estudar os teus tb. eu estava querendo ver isso. grato
Marcoy vou visitar um sebos aqui em porto Alegre, espero encontrar!
A todos abração!

Aqui está meu código melhorado, fiz minha forma de validação da string após análise do código do davidbuzzato. public static int stringToInt(String str) throws NumberFormatException{ int inteiro = 0; int count = 0; if(str.charAt(0) == '-') count = 1; while(count < str.length()){ if(str.charAt(count) >= '0' && str.charAt(count) <= '9'){ inteiro *= 10; inteiro += str.charAt(count++)-'0'; }else throw new NumberFormatException("Para a string entrada: \""+str+"\""); } if(str.charAt(0) == '-') return -inteiro; return inteiro; }Abraço!