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
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();
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).
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!