Estou tentando calcular a média dos números (separados por vírgulas) digitados pelo usuário em um programa java. Estou com dificuldades porque os dados que o usuário digita eu recupero numa string (regra da atividade). O erro no meu programa está exatamente na hora de converter a primeira posição do array em int. Vejam:
Stringdados;intsoma=0;intcontador=0;Scannerpega=newScanner(System.in);System.out.println("Informe uma sequência de números separados por vígulas: ");dados=pega.nextLine();for(inti=0;i<=dados.length();i++){if(i==dados.indexOf(",")){soma+=Integer.parseInt(dados.substring(i,i-1));System.out.println(soma);contador+=1;dados.substring(i,dados.length());}else{System.out.println("Falso");}// System.out.println(soma / contador);}
Eu estou errando na conversão do pedaço da string em int. Quando eu tiro a linha 12, tudo funciona, caso contrário não.
Alguma sujestão?
Imprima o que você está fazendo e veja o que está errado:
Stringdados;intsoma=0;intcontador=0;Scannerpega=newScanner(System.in);System.out.println("Informeumasequênciadenúmerosseparadosporvígulas:");dados=pega.nextLine();for(inti=0;i<=dados.length();i++){if(i==dados.indexOf(",")){Stringtexto=dados.substring(i,i-1);System.out.println(texto);//Aqui tem que sair um número, sem a virgulasoma+=Integer.parseInt(texto);System.out.println(soma);contador+=1;dados.substring(i,dados.length());}else{System.out.println("Falso");}// System.out.println(soma / contador);}
jeffev
teste assim:
Stringdados;intsoma=0;intcontador=0;Scannerpega=newScanner(System.in);System.out.println("Informe uma sequência de números separados por vígulas: ");dados=pega.nextLine();String[]numeros=dados.split(",");for(inti=0;i<numeros.length;i++){soma+=Integer.parseInt(numeros[i]);System.out.println(soma);contador+=1;dados.substring(i,dados.length());System.out.println(soma/contador);}
guj1
Valeu!
Acho que agora estou conseguindo.
Só que tem um problema, quando o usuário digitar 13, o parseInt() converte isso para 1 e 3 e não 13.
E mais outra coisa, tentei reinicializar a string inicial para contar a partir da vírgula encontrada + 1 ou i = dados.indexOf("," + 1) e não funfa.
Esqueci de acrescentar que só pode usar indexOf() e substring().
sergiotaborda
guj1:
Valeu!
Acho que agora estou conseguindo.
Só que tem um problema, quando o usuário digitar 13, o parseInt() converte isso para 1 e 3 e não 13.
E mais outra coisa, tentei reinicializar a string inicial para contar a partir da vírgula encontrada + 1 ou i = dados.indexOf("," + 1) e não funfa.
Esqueci de acrescentar que só pode usar indexOf() e substring(). :)
Vc precisa entender que o numero está entre duas virgulas. O que vc está fazendo é assumir que o numero tem uma posição
Stringtexto=dados.substring(i,i-1);// este -1 é assumir que tem 1 posição.
Vc não pode assumir isso.
Vc tem que encontrar a primeira viirgula, e depois a virgula a seguir a ela. O indexOf tem um metodo overload que faz isso.
Depois que vc tem as duas posições das virgulas, vc obtem o numero entre elas.
Tenha cuidado porque o primeiro e o ultimo numero não estão entre virgulas.
guj1
Bom eu fiz assim:
doublemedia=0;intcontador=0;Stringdados;Scannerpega=newScanner(System.in);System.out.println("Informe uma sequência de números separados por vígulas: ");dados=pega.nextLine();dados=dados+",";System.out.println(dados);System.out.println("Tamanho inicial: "+dados.length());for(inti=0;i<=dados.length();i++){if(i==dados.indexOf(",")){Stringtexto=dados.substring(i-1,i);intnum=Integer.parseInt(texto);contador+=1;System.out.println("Tamanho atual do contador dentro do if: "+contador);//Este não é impresso.media+=num/contador;}contador+=10;//Aqui a atribuição funciona. Mas dentro do IF não funciona.dados=dados.substring(i+1,dados.length());System.out.println("Tamanho atual: "+dados.length());System.out.println("Tamanho atual do contador fora do if: "+contador);}System.out.println("Média: "+media););}System.out.println("Média: "+media);
Olhem o resultado:
Informe uma sequência de números separados por vígulas:
7,6,5
7,6,5,
Tamanho inicial: 6
Tamanho atual: 5
Tamanho atual do contador fora do if: 10
Tamanho atual: 3
Tamanho atual do contador fora do if: 20
Tamanho atual: 0
Tamanho atual do contador fora do if: 30
Média: 0.0
E só tem um problema: as atribuições a média e contador não funcionam dentro do IF mesmo mesmo o laço entrando no IF. Não entendi o motivo.
Ao final a média sai zero e o contador também. E no debug não mostra nada, nenhuma variável nem o que elas estão recebendo, nada… (não sei se estou fazendo certo, mas tentei).
DavidUser
Leia o que o serrgiotaborda respondeu, o método substring pega uma string interna que vai de uma posição tal a outra, usando parâmetro seguintes vc tem os seguinte resultados:
(i, i - 1) Intervalo invalido pois vai de uma posição para antes dela.
(i - 1, i) Intervalo inválido para i menor ou igual a 0, para os intervalos válidos pega um único caractere (digito)
O que você precisa é de substrings
(0, posição da primeira virgula) primeiro número
(posição da ultima virgula + 1, até a próxima virgula ou fim da linha) demais números.
sergiotaborda
guj1:
Bom eu fiz assim:
.
Por tentativa e erro vc não chega lá. Tem que pensar no problema e entender.
O que vc quer ? - Separar uma string de números virgulas num conjunto de números
Depois que tem o conjunto, faça os cálculos.
Faça uma coisa de cada vez.
Depois que funcionar e vc entender porque funciona, ai vc pode tentar fazer tudo de uma vez só.
Primeira coisa, uma método que receba uma string , um separador, e retorna um array com os valores.
Como operar a string ? Com indexOf() e substring()
Que estrutura usar ? Repetição
Faça o algoritmo primeiro , depois implemente.
O algoritmo começa assim "Enquanto existirem separadores na string faça : "