Calcular média com indexOf e substring, dúvida

7 respostas
guj1

Olá pessoal,

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?

Grato

7 Respostas

ViniGodoy
Imprima o que você está fazendo e veja o que está errado:
String dados;
        int soma = 0;
        int contador = 0;
        Scanner pega = new Scanner(System.in);
        System.out.println(&quot;Informe uma sequência de números separados por vígulas: &quot;);
        dados = pega.nextLine();
   
        for (int i = 0; i &lt;= dados.length(); i++) {
   
            if (i == dados.indexOf(&quot;,&quot;)) {
               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(&quot;Falso&quot;);
            }
           
//            System.out.println(soma / contador);
           
        }
jeffev

teste assim:

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);  
		     
		}
guj1

Valeu! :slight_smile:

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(). :slight_smile:

sergiotaborda

guj1:
Valeu! :slight_smile:

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

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.

guj1

Bom eu fiz assim:

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).

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 : "

Criado 27 de fevereiro de 2013
Ultima resposta 1 de mar. de 2013
Respostas 7
Participantes 5