Iniciante em java

oi! eu tenho praticamente o código inteirinho pronto e funfando, mas ele ta dando problema pra satisfazer a condição de saída do while, pra finalizar o programa, porque ele me retorna o zero infinito…
o meu código é esse:

import java.util.Scanner;

public class {
public static void main(String[] args) {

	Scanner entrada = new Scanner(System.in);
	
	int a1, razao, an, soma;
	
	a1= 1;
	an = 1;
	razao = 1;
	
	while (a1 != 0 && an != 0 && razao != 0) {
		
	System.out.println("Insira x (primeiro termo da PA): ");
	a1 = entrada.nextInt();
	
	System.out.println("Insira y (ultimo termo da PA): ");
	an = entrada.nextInt();
	
	System.out.println("Insira z (razao da PA): "); 
	razao = entrada.nextInt();
	
	soma = 0;
	
		for (int i = a1;i<=an;i+=razao) {
			System.out.print(i);
			soma = soma + i;
		}
		System.out.println(" e a soma da progressao eh igual a " + soma);
	}
}

}

quando eu insiro x = 0, y = 0 e z = 0 ele retorna o zero infinito ao invés de finalizar o programa na condicao do while, por conta da soma (eu acho). tentei inserir um outro operador lógico && pra soma no while e inicializei com 1, mas nao deu certo também, mudou os resultados…

Vamos traduzir esse for pensando em todas as entradas como 0:
0 + 0 (i+=razao) é igual a 0. Então esse loop nunca termina, porque a1 vai ser sempre igual an, e essa é a condição que esse for usa para continuar rodando.

O que vc podia fazer é colocar true na condição do while para que ele seja infinito, checar se x, y e z são iguais a 0 e, caso sejam, usar o break para parar a execução do while

1 curtida
    Scanner entrada = new Scanner(System.in);
    
    int a1, razao, an, soma;
    
    a1= 1;
    an = 1;
    razao = 1;
    
    System.out.print("Insira x (primeiro termo da PA): ");
    a1 = entrada.nextInt();
    
    System.out.print("Insira y (ultimo termo da PA): ");
    an = entrada.nextInt();
    
    System.out.print("Insira z (razao da PA): "); 
    razao = entrada.nextInt();
    
    soma = 0;
    
    if ((a1 != 0) && (an != 0) && (razao != 0)) {
        for (int i = a1; i <= an; i+=razao) {
            System.out.print(i + " ");
            soma = soma + i;
        }
        System.out.println(", e a soma da progressao eh igual a " + soma);
    } else {
        System.out.println("\nErro: um dos valores está zerado");
    }
    
    System.out.println("\nfim");
    
    entrada.close();
1 curtida

Como já explicaram acima, quando todas as variáveis são zero, esse for nunca termina, pois você inicia i com zero, depois compara se é menor ou igual a zero, e depois soma zero - ou seja, i continua sendo zero e a condição i <= an sempre é satisfeita, e o loop nunca termina.

Uma forma de resolver é interromper o while imediatamente se elas forem zero:

Scanner entrada = new Scanner(System.in);
while (true) {
    System.out.println("Insira x (primeiro termo da PA): ");
    int a1 = entrada.nextInt();
    System.out.println("Insira y (ultimo termo da PA): ");
    int an = entrada.nextInt();
    System.out.println("Insira z (razao da PA): ");
    int razao = entrada.nextInt();
    if (a1 == 0 && an == 0 && razao == 0) {
        break;
    }

    int soma = 0;
    for (int i = a1; i <= an; i += razao) {
        System.out.print(i);
        soma += i;
    }
    System.out.println("A soma da progressão é igual a " + soma);
}

while (true) cria um loop infinito, que só é interrompido se encontrar um break. E eu só chamo o break se todos os valores forem zero. Repare também que não precisa declarar todas as variáveis no início, você pode declará-las apenas quando elas forem usadas. Talvez seja questão de “gosto”, mas na minha opinião fica mais claro por indicar melhor onde cada variável é usada, além de restringir o escopo de cada uma (no caso, elas só existem dentro do while, pois não faz sentido elas existirem fora dele).

2 curtidas

Obrigada mesmo!!! Era exatamente essa solução que eu estava buscando, que eu tinha pensado, mas não conseguia executar. Eu tinha tentado uma muito semelhante, mas coloquei o break no lugar errado, porque não entendia muito da função break dentro das condições (em qual momento interromperia, no caso). Abriu bastante a minha lógica agora, valeu mesmo! Consegui até solucionar um outro exercício que eu estava praticamente com o mesmo problema. Abraços!

1 curtida