Ajuda em lógica de exercício [RESOLVIDO]

Pessoal, gostaria que dessem uma olhada no meu código e, se possível, me ajudem a corrigi-lo. É um dos exercícios do capítulo 2 da 6ª edição do livro Java - Como Programar.

A descrição é a seguinte: Escreva um aplicativo que insere três inteiros digitados pelo usuário e exibe a soma, a média, o produto e os números menores e maiores.

O erro é que quando coloco valores iguais, a variável maior não altera seu valor inicial.

Desde já, agradeço.

[code]import java.util.Scanner;

public class Ex217 {

public static void main ( String [] args ) {

	Scanner input = new Scanner( System.in );

	int num1;
	int num2;
	int num3;
	int soma;
	int media;
	int prod;
	int maior = -2147483648;
	int menor = 2147483647;

	System.out.print( "Didite o primeiro númnero inteiro: " );
	num1 = input.nextInt();
	System.out.print( "Digite o segundo número inteiro: " );
	num2 = input.nextInt();
	System.out.print( "Digite o terceiro número inteiro: " );
	num3 = input.nextInt();

	soma = num1 + num2 + num3;
	media = soma / 3;
	prod = num1 * num2 * num3;

	if ((num1 > num2) && (num1 > num3))
		maior = num1;
	else if ((num2 > num1) && (num2 > num3))
		maior = num2;
	else if((num3 > num1) && (num3 > num2))
		maior = num3;
	else if((num1 < num2) && (num1 < num3))
		menor = num1;
	else if ((num2 < num1) && (num2 < num3))
		menor = num2;
	else if((num3 < num1) && (num3 < num2))
		menor = num3;
	else if((num1 == num2) && (num1 > num3))
		maior = num1;
	else if((num1 == num3) && (num1 > num2))
		maior = num1;
	else if((num2 == num3) && (num2 > num1))
		maior = num2;
	else if((num1 == num2) && (num1 < num3))
		menor = num1;
	else if((num1 == num3) && (num1 < num2))
		menor = num1;
	else if((num2 == num3) && (num2 < num1))
		menor = num2;

	System.out.printf( "A soma dos inteiros é %d\n", soma);
	System.out.printf( "A média dos inteiros é %d\n", media);
	System.out.printf( "O produto desses inteiros é %d\n", prod);
	System.out.printf( "O maior dos inteiros é %d\n", maior);
	System.out.printf( "O menor dos inteiros é %d\n", menor);

}//Fim do método main

}//Fim da classe[/code]

Como assim valores iguais, se o valor for igual ao valor da variavel maior não mesmo pq de mudar! :?

Acho que não expliquei direito. Eu tenho que inserir 3 números e retornar tudo que o aplicativo pede. Se eu inserir um 3 na variável num1 e um 3 na variável num2, e mesmo esses valores sendo maiores que a variável num3, o valor da variável maior não é alterado (maior é o nome da variável).

olha soh

[code]
int a= 3
int b= 3
int c= 2

se (a > b) E (a>c)
maior = a; FALSO

senão se ( b>a) E (b>c)
maior = b; FALSO

senão se (c >a) E (c>b)
maior =c; FALSO;[/code]

entendeu onde está o erro?
se (não entendeu)
print("Erro esta na condição > q deve ser trocada por >= ");

:smiley:

Vc pode adicionar mais uma condição, que seja ‘se n1 = n2 e n1 = n3 entao valores sao iguais’

A minha sugestão seria:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.Scanner;

/**
 *
 * @author admin
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int num1;
        int num2;
        int num3;
        int soma;
        int media;
        int prod;
        int maior;
        int menor;

        System.out.print("Didite o primeiro númnero inteiro: ");
        num1 = input.nextInt();
        maior = num1; // o primeiro numero sempre e o maior
        menor = num1; // e tambem o menor
        System.out.print("Digite o segundo número inteiro: ");
        num2 = input.nextInt();
        maior = maiorNumero(num2, maior); // metodo para validar qual o maior - atual ou o novo numero
        menor = menorNumero(num2, menor); // metodo para validar qual o menor - atual ou o novo numero
        System.out.print("Digite o terceiro número inteiro: ");
        num3 = input.nextInt();
        maior = maiorNumero(num3, maior); // metodo para validar qual o maior - atual ou o novo numero
        menor = menorNumero(num3, menor); // metodo para validar qual o menor - atual ou o novo numero

        soma = num1 + num2 + num3;
        media = soma / 3;
        prod = num1 * num2 * num3;

        System.out.printf("A soma dos inteiros é %d\n", soma);
        System.out.printf("A média dos inteiros é %d\n", media);
        System.out.printf("O produto desses inteiros é %d\n", prod);
        System.out.printf("O maior dos inteiros é %d\n", maior);
        System.out.printf("O menor dos inteiros é %d\n", menor);

    }//Fim do método main

    public static int maiorNumero(int pNum, int pMaior) {
        if (pNum > pMaior) {
            return pNum;
        } else {
            return pMaior;
        }
    }

    public static int menorNumero(int pNum, int pMaior) {
        if (pNum < pMaior) {
            return pNum;
        } else {
            return pMaior;
        }
    }
}

espero ter ajudado.

vc exagerou nos IF´s…
seguindo a mesma lógica que a sua, faça assim…
tve if faltando igualdade e outros que tavam errados…
mude esses if…



import java.util.Scanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Damiao
 */
public class MaiorMenor
{

	public static void main ( String [] args ) {

		Scanner input = new Scanner( System.in );

		int num1;
		int num2;
		int num3;
		int soma;
		int media;
		int prod;
		int maior = -2147483648;
		int menor = 2147483647;

		System.out.print( "Didite o primeiro númnero inteiro: " );
		num1 = input.nextInt();
		System.out.print( "Digite o segundo número inteiro: " );
		num2 = input.nextInt();
		System.out.print( "Digite o terceiro número inteiro: " );
		num3 = input.nextInt();

		soma = num1 + num2 + num3;
		media = soma / 3;
		prod = num1 * num2 * num3;

		if((num1>=num2)&&(num1>=num3))
                   maior = num1;
                if((num2>=num1)&&(num2>=num3))
                   maior = num2;
                if((num3>=num1)&&(num3>=num2))
                   maior = num3;

                if((num1<=num2)&&(num1<=num3))
                   menor = num1;
                if((num2<=num1)&&(num2<=num3))
                   menor = num2;
                if((num3<=num1)&&(num3<=num2))
                   menor = num3;

		System.out.printf( "A soma dos inteiros é %d\n", soma);
		System.out.printf( "A média dos inteiros é %d\n", media);
		System.out.printf( "O produto desses inteiros é %d\n", prod);
		System.out.printf( "O maior dos inteiros é %d\n", maior);
		System.out.printf( "O menor dos inteiros é %d\n", menor);

	}//Fim do método main
}//Fim da classe

vlw

Olá rperet,

Andei verificando e o erro ocorre no seguinte código

else if ((num2 < num1) && (num2 < num3)) menor = num2; else if((num3 < num1) && (num3 < num2)) menor = num3; Linhas 37,38,39 e 40.

Usando o exemplo que você falou, utilizei os seguintes valor
1- num1 = 3, num2 = 1 e num3 = 3
2 - num1=3, num2=3 e num1= 1
e percebi que realmente a variável nao muda o valor inicial pelo seguinte motivo.

Quando você insere os valores 3,1,3 respectivamente, ele cai no seguinte if
num2 é menor que numero 1 && num2 é menor que num3.
Caindo nesse if ele não chega até a condição de num1 = num2 ou vice e versa… O mesmo ocorre para o 2 exemplo.

Se você colocar essas linhas por ultimo e fizer o teste você vai ver que irá conseguir realizar oq estava tentando, porém vai dar outros erros.

Se eu fosse você, utilizaria o exemplo do nosso amigo Damiao Cunha. Até pq nós programador(na minha opinião) temos que procurar caminhos curtos!

[]'s

[color=darkred][b]Pessoal, muito obrigado :!:

Vou dar uma olhada nas soluções que vocês apresentaram e resolver meu erro por aqui. Com certeza terei muitos outros posts desse tipo. Minhas dúvidas são muitas e minha experiência é mínima em pogramação.[/b][/color]

:smiley:

Rperet a minha sugestão leva o fato de que sempre que possível você deve tentar sair de um numero fixo de testes (no seu caso são três) então imagine se o teste fosse para 20 numeros, acredito que a quantidade de testes lógicos seria imensa (if´s) e extremamente trabalhoso por este motivo a sugestão de criar um método (maiorNumero / menorNumero) para realizar os cálculos se torna mais plausível como diriam os caçadores de mitos.

[]´s

montroni, eu percebi a criação desses métodos no seu código e, por isso, deixei ele guardado aqui para quando eu começar a implementar, algum ter idéia de como começar.

Ainda não cheguei a implementar nenhum método. Como disse, a experiência é mínima e por isso resolvi começar a postar por aqui. :lol:

rperet,

Embora você esteja no começo, e o conhecimento no começo é um pouco limitado, eu incentivaria você a estudar o código do nosso amigo montroni. Você vai ver que muita coisa será facilitada com isso. Um exemplo disso é a qtdade de linhas que se economizou…
Mas independente disso
nao deixe jamais de estudar
=]

E post suas duvidas… =]

Ficou uma dúvida em relação ao código do montroni. Por que os métodos ficaram marcados como static se eles estão dentro da própria classe??

Facilita em algo??

rperet,

Encontrei um artigo sobre o static…

Talvez te ajude…

Eu também as vzs me confundo com esse conceito de static, mas é legal dar uma lida aqui nesse artigo.
Ve se te ajuda a entender, caso contrário, só avisar

http://www.guj.com.br/article.show.logic?id=121

E só pra finalizar, alguem me corriga se estiver falando algo errado mas, como o main é static , para que os métodos sejam acessíveis dentro do main, é necessário que sejam declarados como static também. Você pode fazer um teste. Se retirar o static dos métodos, o programa dará erro informando que um non-static não pode ser referenciado por um static.

E por ai vai…

Entendeu?

[b][color=darkred]Relamente, pelo que li no artigo o que você falou está correto. Acho que não vai ter o que corrigir.

Obrigado pelas respostas.

Abraços![/color][/b]

Por nada!

E precisando de mais alguma coisa… Sou novata em java mas oq eu souber e puder,ajudarei…
=]

[]'s

se os metodos forem da mesma clase, não precisam ser static, é só vc no main criar um objeto da classe, ai vc pode acessar os metodos…
vlw