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:
String dados;
int soma = 0;
int contador = 0;
Scanner pega = new Scanner(System.in);
System.out.println("Informe uma sequência de números separados por vígulas: ");
dados = pega.nextLine();
for (int i = 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:
[code] String dados;
int soma = 0;
int contador = 0;
Scanner pega = new Scanner(System.in);
System.out.println("Informe uma sequência de números separados por vígulas: ");
dados = pega.nextLine();
for (int i = 0; i <= dados.length(); i++) {
if (i == dados.indexOf(",")) {
String texto = dados.substring(i, i - 1);
System.out.println(texto); //Aqui tem que sair um número, sem a virgula
soma += Integer.parseInt(texto);
System.out.println(soma);
contador += 1;
dados.substring(i, dados.length());
} else {
System.out.println("Falso");
}
[code]String dados;
int soma = 0;
int contador = 0;
Scanner pega = new Scanner(System.in);
System.out.println("Informe uma sequência de números separados por vígulas: ");
dados = pega.nextLine();
String[] numeros = dados.split(",");
for (int i = 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);
}[/code]
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().
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(). :)[/quote]
Vc precisa entender que o numero está entre duas virgulas. O que vc está fazendo é assumir que o numero tem uma posição
String texto = 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.
double media = 0;
int contador = 0;
String dados;
Scanner pega = new Scanner(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 (int i = 0; i <= dados.length(); i++) {
if (i == dados.indexOf(",")) {
String texto = dados.substring(i - 1, i);
int num = 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).
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.
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 : "