Pular para o conteúdo

Loop infinito em uma media ponderada. [RESOLVIDO]

Responder tópico
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
  • Denunciar
  • Indicar

1. Loop infinito em uma media ponderada. [RESOLVIDO]

Enviado em 24/04/2026 - 16:41h

Prazer novamente.
Não consigo descobrir o erro na lógica abaixo.
import java.util.Scanner;

public class CasosdeTestes
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
char resp;
int p = 0,M = 0, p1 = 0, n1 = 0, n = 0, i;
System.out.println("Entre com o número de vezes de quantos cálculos serão feitos da média ponderada");
int val = sc.nextInt();
System.out.println("Entre com os valores para calcular a média ponderada.");

do
{
for(i = 0;i <= val; i++)
{
System.out.println("Entre com o valor do peso1 da média.");
p = sc.nextInt();
p = p + 1;
System.out.print("Entre com valor1: ");
n = sc.nextInt();
n = n + 1;
System.out.println("Entre com o valor do peso2 da média.");
p1 = sc.nextInt();
p1 = p1 + 1;
System.out.print("Entre com valor2: ");
n1 = sc.nextInt();
n = n + 1;
; }
M = (n * p) + (n1*p1) / (p + p1);
System.out.println("O valor da média ponderada é:" + M);
sc.nextLine();
System.out.print("Deseja Continuar? <s/n>: ");
resp = sc.next().charAt(0);
} while (resp != 'n');
sc.close() ;
}

}

//Média Ponderada = (x&#8321;·p&#8321; + x&#8322;·p&#8322; + ... + xn·pn) / (p&#8321; + p&#8322; + ... + pn)

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

2. Re: Loop infinito em uma media ponderada. [RESOLVIDO]

Melhor resposta

Enviado em 25/04/2026 - 02:46h

Para começar, vou usar o recurso de colocar o código (reformatado) entre as tags [code] e [/code].
import java.util.Scanner;

public class CasosdeTestes {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
char resp;
int p = 0,M = 0, p1 = 0, n1 = 0, n = 0, i;
System.out.println("Entre com o número de vezes de quantos cálculos serão feitos da média ponderada");
int val = sc.nextInt();
System.out.println("Entre com os valores para calcular a média ponderada.");
do {
for(i = 0; i <= val; i++){
System.out.println("Entre com o valor do peso1 da média.");
p = sc.nextInt();
p = p + 1;
System.out.print("Entre com valor1: ");
n = sc.nextInt();
n = n + 1;
System.out.println("Entre com o valor do peso2 da média.");
p1 = sc.nextInt();
p1 = p1 + 1;
System.out.print("Entre com valor2: ");
n1 = sc.nextInt();
n = n + 1;
}
M = (n * p) + (n1*p1) / (p + p1);
System.out.println("O valor da média ponderada é:" + M);
sc.nextLine();
System.out.print("Deseja Continuar? <s/n>: ");
resp = sc.next().charAt(0);
} while (resp != 'n');
sc.close();
}
}

//Média Ponderada = (x&#8321;·p&#8321; + x&#8322;·p&#8322; + ... + xn·pn) / (p&#8321; + p&#8322; + ... + pn)


Tem vários problemas no código acima.

O que mais salta aos (meus) olhos é que o cálculo da média está errada: a expressão (n*p)+(n1*p1)/(p+p1) divide apenas a segunda parcela ((n1*p1)) pela soma dos pesos (p+p1). Claramente a expressão de uma média ponderada com duas parcelas deveria ser a soma das duas parcelas (i.e. (n*p+n1*p1)) dividida pela soma dos pesos.

Essa se resolve apenas colocando os parênteses no lugar correto.


Entretanto, pelo comentário que está na última linha, parece que o que você queria fazer era calcular uma média de vários valores, cada um com seu peso. A expressão da média é uma fração na qual o numerador é uma soma de N parcelas na forma peso*valor e o denominador é a soma dos pesos.

Para isso, dentro do laço de repetição você deveria ler somente um peso e um valor, correspondentes à i-ésima parcela do numerador, e ir acumulando a soma do numerador (algo na forma “numerador+=peso*valor;”) e a soma do denominador (“denominador+=peso;”).

Eu não entendi — e digo isso sinceramente — o que está dentro do laço for no seu programa. Você lê dois pares distintos de peso e valor, mas altera esses valores (somando 1 a cada valor lido, não sei por qual razão), mas não usa esses valores para acumular para nenhum numerador nem denominador. Além disso, o primeiro par parece ser o das variáveis p e n, e o segundo par fica com as variáveis p1 e n1, mas você acrescenta 1 a n de novo (não a n1), sugerindo que você pode ter esquecido de editar após um copy-and-paste (se bem que todo o código está bem estranho).


Não gosto muito de entregar respostas prontas, porque acho que os alunos aprendem melhor pelo exercício próprio do que quando veem a solução escrita por outra pessoa (ou por um chatbot de IA). Contudo, como esse algoritmo é bem básico, eu vou mostrá-lo em C++ (porque eu sou mais familiarizado com C++ do que com Java).
#include <iostream>

int main(){
do {
std::cout << "Entre a quantidade de valores para a média ponderada (0 para sair): ";
unsigned n_parcelas;
std::cin >> n_parcelas;
if(n_parcelas==0)
break;
float numerador=0, denominador=0;
for(unsigned i=1; i<=n_parcelas; ++i){
float peso, valor;
std::cout << "Entre o peso da " << i << "ª parcela: ";
std::cin >> peso;
std::cout << "Entre o valor da " << i << "ª parcela: ";
std::cin >> valor;
numerador+=peso*valor;
denominador+=peso;
}
if(denominador!=0.0)
std::cout << "A média ponderada é " << numerador/denominador << ".\n";
else
std::cout << "A soma dos pesos não pode ser igual a zero.\n";
std::cout << '\n';
} while(true);
}



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Loop infinito em uma media ponderada. [RESOLVIDO]

Enviado em 29/04/2026 - 15:08h


Obrigado pelo retorno, vou ler com calma e ver onde errei.

4. Re: Loop infinito em uma media ponderada. [RESOLVIDO]

Enviado em 29/04/2026 - 15:20h


Eu coloquei o for para dizer quantas vezes o usuário quer efetuar o cálculo, duas, três ou mais, e o while para encerrar o programa. Não consegui pensar em um meio para colocar tudo dentro do do while, pedir quantas vezes fazer o cálculo e se não quiser mais sair do programa. Na verdade, nem precisava, era porque tava dando erro no scanner usando uma string para encessar o programa, assim decidir usar um caracter. E também por causa do buffer do teclado, não limpava de jeito nenhum e dava erro quando tentava terminar o programa. Obrigado. Também não gosto de respostas prontas, temos de pensar para aprender e assim não erramos mais, mas tentei de várias maneiras e não consegui encontrar uma solução. Obrigado.

5. Re: Loop infinito em uma media ponderada. [RESOLVIDO]

Enviado em 29/04/2026 - 21:15h


Você respondeu em C. Valeu, gostei.

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Responder tópico

Entre na sua conta para responder.

Fazer login para responder