Exercício: Método que recebe um número qualquer de argumentos (...)

Exercício resolvido e comentado em Java:
Um professor, muito legal, fez 3 provas durante um semestre mas só vai levar em conta as duas notas mais altas para calcular a média.
Faça uma aplicação em Java que peça o valor das 3 notas, mostre como seria a média com essas 3 provas, a média com as 2 notas mais altas, bem como sua nota mais alta e sua nota mais baixa. Essas médias devem ser calculadas usando o mesmo método, pois você é um programador Java e não vai ficar criando métodos à toa.
Crie um método que receba as 3 notas e retorna a maior delas. E outro que retorna a menor.


Se está acompanhando nosso curso de Java, já viu como funciona nosso método média, que recebe uma lista de argumentos de um número qualquer, em nosso artigo Passando uma lista de argumentos, de tamanho qualquer, para um método.

A idéia para descobrir o maior número, entre três números dados, é exatamente a mesma para descobrir o menor número. Vamos apenas trocar o operador > pelo <.

No método maiorNota, queremos descobrir qual o valor maior.
Vamos testar, primeiro, se 'nota1' é o maior valor. Como fazemos isso?
Ora, vamos comparar com 'nota2' e 'nota3'. Se nota1 for maior que estes dois, é claro que ele é o maior.
Vamos checar isso com dois testes condicionais if consecutivos. Caso o resultado seja true para os dois, retornamos o 'nota1' como o maior número e acaba aí o método.

Porém, logo após o primeiro if, colocamos um '{'.
Pois, caso 'nota1' não seja maior que 'nota2', é porque 'nota2' é maior (óbvio). Bom, vamos aproveitar que sabemos que 'nota2' é maior que 'nota1' e vamos ver se é maior que 'nota3' também. Pois se for, retornaremos 'nota2' como o número maior e acaba aí o método.

Caso não seja, chega ao fim os testes condicionais.
E aí? Ora, se nem 'nota1' nem 'nota2' foi maior, é óbvio que 'nota3' é a maior e retornamos ela, e acaba aí o método.
import java.util.Scanner;

public class parametrosVariaveis{
    
    public static float media(float... valores){
        float media=0;
        
        for(float valor: valores){
            media +=valor;
        }
        
        return media/valores.length;
    }
    
    public static float maiorNota(float nota1, float nota2, float nota3){
        
        if(nota1 >= nota2){
            if(nota1 >= nota3)
                return nota1;
        }else{
            if(nota2 >= nota3)
                return nota2;
        }
        return nota3;
            
    }
    
    public static float menorNota(float nota1, float nota2, float nota3){
        
        if(nota1 <= nota2){
            if(nota1 <= nota3)
                return nota1;
        }else{
            if(nota2 <= nota3)
                return nota2;
        }
        return nota3;
            
    }

    public static void main(String[] args){
            float nota1, nota2, nota3;
            Scanner entrada = new Scanner(System.in);
            
            System.out.print("Entre com o valor 1: ");
            nota1 = entrada.nextFloat();
            System.out.print("Entre com o valor 2: ");
            nota2 = entrada.nextFloat();
            System.out.print("Entre com o valor 3: ");
            nota3 = entrada.nextFloat();
            
            System.out.println("Sua maior nota foi: "+maiorNota(nota1,nota2,nota3));
            System.out.println("Sua menor nota foi: "+menorNota(nota1,nota2,nota3));
            System.out.println("Sua média com as três notas é: " + media(nota1,nota2,nota3));
            System.out.println("Sua média sem a menor nota é: "+ (nota1+nota2+nota3 - menorNota(nota1,nota2,nota3))/2);
            
        }
}

18 comentários:

Gerciley disse...

Caramba que interessante, e acreditem que ei fiz um método só pra descobrir a segunda maior nota. A vantagem é que o método pode receber um número infinito de argumentos que sempre retornara a menor nota.

Segue:
static public float Maior2(float... n) {
float maior = 0;
float maior2 = 0;
for (float valor : n) {
if (valor > maior) {
maior = valor;
}

}
for (float valor : n) {
if (valor < maior && valor > maior2) {
maior2 = valor;
}
}
return maior2;
}

Anônimo disse...

sentaaa diogo gonçalves bsi 6 fortec sao vicente

Cleverton Fernandes Guimarães disse...

Cleverton Fernandes Guimarães
clevertonfernandesguimaraes@gmail.com

Você consegue me esplicar o que estou errando aqui.
import java.util.Scanner;
public class Media {
float n1, n2, n3;
float media_total;
public static float media_total(n1,n2,n3){
media_total = (n1+n2+n3)/3;
}
public static float maiorNota(n1,n2,n3){
float = a = Math.max(n1,n2)
if (an3){
return n3}
else {return a}
}
public static void main(String[] args){
Scanner entrada = new Scanner(System.in);
System.out.println("Digite a seguir as notas do aluno");
n1 = entrada;
n2 = entrada;
n3 = entrada;
System.out.println("Você digitou as seguintes notas"+
"Nota 1 = " + n1 +
"Nota 2 = " + n2 +
"Nota 3 = " + n3 +
"Onde: " +
"Maior nota = " + a +
"Menor nota = " + b +
"Media total = " + media_total +
"Media Final = " + ((n1+n2+n3-b)/2));
}
}

Apostila Java Progressivo disse...

Cleverton,

Quando for declarar um método que recebe parâmetros, você tem que dizer quais os tipos desses parâmetros.

Em vez de "...(n1, n2, n3)"
Experimente: ...(float n1, float n2, float n3)"

Leonardo Parrillo disse...

Boa Tarde.
Seu curso é excelente e estou aprendendo muito com ele. Sou programador Progress a um bom tempo, porém é meio difícil largar os vícios, mas um dia chego lá.. kk

Tenho uma dúvida:
No enunciado do exercício você diz que é para calcular as duas médias propostas usando o mesmo método. Porém no código fonte você não utilizou o método para calcular a média com as duas maiores notas.

Porque isso ocorreu?

Anônimo disse...

usei o java.util.Arrays pra ordenar um vetor de 3 notas e diminuí o tamanho do codigo drasticamente:

import java.util.Scanner;
import java.util.Arrays;


public class exercicioMedias2 {

public static float media(float... valores){
float media=0;
for(float valor: valores){
media+=valor;
}
return media/valores.length;
}

public static void main(String[] args){
Scanner entrada=new Scanner(System.in);
float nota1,nota2,nota3;
float[] vetordenotas=new float[3];

//LE AS 3 NOTAS
for(int i=0;i<3 ;i++){
System.out.print("Digite nota "+(i+1)+": ");
vetordenotas[i]=entrada.nextFloat();
}

//ORDENA O VETOR DE NOTAS DA MENOR PARA A MAIOR
Arrays.sort(vetordenotas);

System.out.println("Media das 3 notas: "+media(vetordenotas[0],vetordenotas[1],vetordenotas[2]));
System.out.println("Maior nota: "+vetordenotas[2]);
System.out.println("Menor nota: "+vetordenotas[0]);
System.out.println("Media das 2 notas mais altas: "+media(vetordenotas[1],vetordenotas[2]));
System.out.println("Media da nota mais alta e da mais baixa: "+media(vetordenotas[0],vetordenotas[2]));
}
}

Apostila Java Progressivo disse...

Olá Anônimo,

O nosso curso segue uma ordem lógica, e no ponto que estamos, ainda não foi utilizado Arrays, por isso não usamos.

Outro objetivo também era ensinar a lógica para encontrar o número maior e menor, pra entender como as coisas funcionam.

Obviamente se usar recursos prontos, como arrays e o sort, vai ficar menor.

Anônimo disse...

Esse curso é ótimo, estou aprendendo muito e só tenho a agradecer.

Deixo aqui os dois métodos que usei para a maior e menor nota, pois ficaram diferentes da solução criada e gostaria de saber se dariam certo se o numero de notas fosse maior ou menor do que 3.

public static float notaMaisAlta(float... notas) {
float notaMaisAlta = 0;

for (float valor : notas) {
if (valor > notaMaisAlta) {
notaMaisAlta = valor;
}
}
return notaMaisAlta;
}

public static float notaMaisBaixa(float... notas) {
float notaMaisBaixa = 10;

for (float valor : notas) {
if (valor < notaMaisBaixa) {
notaMaisBaixa = valor;
}
}
return notaMaisBaixa;
}

dinbra948 disse...

Pega leve pessoal, deixe o curso seguir seu curso, afinal, alguns de nós não sabe tanto e precisamos ir passo a passo. E o curso é muito bom, muito bom não!excelente!!!

Anônimo disse...

Minha solucao:

package testes;
import java.util.Scanner;

public class Calcubis {


public static float media(float... valores){
float media=0;

for(float nota: valores){
media +=nota;
}

return media/valores.length;
}

public static float mediaSemAMaisBaixa(float... valores){
float[] lista = new float[10];
float menorNota=menorNota(valores);

for(float nota: valores){
for(int i=0;i<10;i++)
if(menorNota!=nota){
lista[i]=nota;

}

}

return media(lista);
}

public static float maiorNota(float... valores){

float maiorNota=valores[0];


for(float nota: valores){
if(maiorNotanota)
menorNota=nota;
}
return menorNota;

}

public static void main(String[] args){
float nota1, nota2, nota3;
Scanner entrada = new Scanner(System.in);

System.out.print("Entre com o valor 1: ");
nota1 = entrada.nextFloat();
System.out.print("Entre com o valor 2: ");
nota2 = entrada.nextFloat();
System.out.print("Entre com o valor 3: ");
nota3 = entrada.nextFloat();

System.out.println("Sua maior nota foi: "+maiorNota(nota1,nota2,nota3));
System.out.println("Sua menor nota foi: "+menorNota(nota1,nota2,nota3));
System.out.println("Sua média com as três notas é: " + media(nota1,nota2,nota3));
System.out.println("Sua média sem a menor nota é: "+ mediaSemAMaisBaixa(nota1,nota2,nota3));
entrada.close();
}
}

Anônimo disse...

Fiquei um pouco confuso com a questão de fazer a média com as duas maiores notas, por isso fiz mais um método com a segunda maior nota utilizando o metodo da maior nota. Testei e da certo pra qualquer número
//Maior Nota
public static float maior(float... valores){
float maior=0;
for(float valor: valores){
if(maiorvalor &&valor>maior2){
maior2=valor;
}
}
return maior2;
}

Anônimo disse...

Olá a todos!
Em primeiro lugar quero dar os parabéns por este excelente curso.

Apesar de não ter entendido muito bem a questão do
for(){} deste exemplo, consegui fazer o exercício usando o que aprendi no curso.
Segue meu exercício:

public class Medias {
static float maior=0, MAIOR=0, menor=0, MENOR=0;

public static float medias(float... notas){ // Esta parte aqui ainda não entendi direito.
float medias=0;
for(float NOTAS: notas){
medias += NOTAS;
}
return medias/notas.length;
}

public static float maioresNotas(float nt1, float nt2, float nt3){
maior = Math.max(nt1, nt2);
menor = Math.min(nt1, nt2);
MAIOR = Math.max(menor, nt3);
return MAIOR;
}

public static float menoresNotas(float nt1, float nt2, float nt3){
menor = Math.min(nt1, nt2);
maior = Math.max(nt1, nt2);
MENOR = Math.min(maior, nt3);
return MENOR;
}

@SuppressWarnings("resource")
public static void main(String [] media){
float nt1,nt2,nt3;
Scanner pegaNota = new Scanner(System.in);

System.out.print("Digite a 1ª nota: ");
nt1 = pegaNota.nextFloat();

System.out.print("Digite a 2ª nota: ");
nt2 = pegaNota.nextFloat();

System.out.print("Digite a 3ª nota: ");
nt3 = pegaNota.nextFloat();

maioresNotas(nt1,nt2,nt3);
menoresNotas(nt1,nt2,nt3);

System.out.printf("As maiores notas são: %.2f e %.2f\n",MAIOR,maior);
System.out.printf("As menores notas são: %.2f e %.2f\n",MENOR,menor);

System.out.printf("A media dos tres numeros é: %.2f\n",medias(nt1,nt2,nt3));

System.out.printf("A media dos dois maiores numeros é: %.2f\n",medias(MAIOR,maior));
System.out.printf("A media dos dois menores numeros é: %.2f\n",medias(MENOR,menor));

System.out.printf("O maior numero é: %.2f\n",Math.max(MAIOR, maior));
System.out.printf("O menor numero é: %.2f\n",Math.min(MENOR, menor));


}

@E_krausz disse...

Boa tarde a todos, segue meu código do resultado:
import java.util.Scanner;
public class Prova{

//metodos média
public static float media(float...valores){
float media=0;
for(float valor: valores){
media+=valor;
}
return media/valores.length;
}
//método maior nota
public static float maiorNota(float nota1, float nota2, float nota3){
if(nota1>nota2 && nota1>nota3){
return nota1;
} else {
if (nota2>nota1 && nota2>nota3){
return nota2;
} else {
return nota3;
}
}
}
//método menor nota
public static float menorNota(float nota1, float nota2, float nota3){
if(nota1nota2 && nota2>nota3){
System.out.println("média da primeira e segunda prova " +media

(nota1,nota2));
} else {
if (nota2>nota1 && nota3>nota1){
System.out.println("Média da segunda e da terceira prova "+media

(nota2,nota3));
} else {
System.out.println("média da terceira e da primeira prova "+media

(nota3,nota1));
}
}
//Exibe maior e menor nota
System.out.println("Maior nota: "+maiorNota(nota1,nota2,nota3));
System.out.println("Menor nota: "+menorNota(nota1,nota2,nota3));


}
}
No começo dei muita cabeçada por erro bobo (to programando no bloco de notas do windows ¬¬') mas dpois de algum tempo começou a fazer sentido e então funcionou =).

Anônimo disse...

/* Um professor, muito legal, fez 3 provas durante um semestre mas só vai levar em conta as duas notas mais altas para calcular a média.
Faça uma aplicação em Java que peça o valor das 3 notas, mostre como seria a média com essas 3 provas, a média com as 2 notas mais altas,
bem como sua nota mais alta e sua nota mais baixa. Essas médias devem ser calculadas usando o mesmo método, pois você é
um programador Java e não vai ficar criando métodos à toa.
Crie outro método que receba as 3 notas e retorna a maior delas. E outro que retorna a menor.*/
package profmuitolegal;
import java.util.Scanner;
public class ProfMuitoLegal{

public static float calculaMedia(float... notas){
float media=0;

for(float nota:notas){
media +=nota;
}

return media/notas.length;
}

public static float maiorNota(float... notas){
float maior = 0;

for(float nota: notas){
if(nota > maior){
maior = nota;
}
}
return maior;
}

public static float menorNota(float... notas){
float menor = notas[0];

for(float nota: notas){
if(nota < menor){
menor = nota;
}
}
return menor;
}

public static void main(String[] args){
float nota1, nota2, nota3,segundaMaior;
Scanner entrada = new Scanner(System.in);

System.out.println("Digite a primeira nota: ");
nota1 = entrada.nextFloat();

System.out.println("Digite a segunda nota: ");
nota2 = entrada.nextFloat();

System.out.println("Digite a terceira nota: ");
nota3 = entrada.nextFloat();

segundaMaior = (nota1 + nota2 + nota3) - (maiorNota(nota1,nota2,nota3) + menorNota(nota1,nota2,nota3));

System.out.printf("A média das 3 notas é %.2f\n",calculaMedia(nota1,nota2,nota3));
System.out.printf("A maior nota foi %.2f\n", maiorNota(nota1,nota2,nota3));
System.out.printf("A menor nota foi %.2f\n", menorNota(nota1,nota2,nota3));
System.out.printf("A média das 2 maiores notas é %.2f\n", calculaMedia(maiorNota(nota1,nota2,nota3), segundaMaior));
}
}

Anônimo disse...

package Metodo;

import java.util.Scanner;

public class MaiorValor {

private static byte mV;

public static byte maiorValor(byte v1, byte v2, byte mV) {
if (v1 > v2) {
mV = v1;
} else {
mV = v2;
}
byte maiorValor = mV;
return maiorValor;
}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
byte v1, v2;

System.out.print("Digite o valor 1: ");
v1 = in.nextByte();
System.out.print("Digite o valor 2: ");
v2 = in.nextByte();

System.out.println("O maior valor é " + maiorValor(v1, v2, mV));

}

}

Victor Ferreira disse...

package media_maior_nota;
import java.util.Scanner;

public class Media_maior_nota {

public static float media(float... notas){

float max1 = 0, max2 = 0, media_final = 0;

for(float nota: notas){
/* através do loop for, começa a testar todas as notas passadas para o método.

Verifica se a nota em questão é maior ou igual à maior
nota, SE SIM: guarda a maior nota (até o momento) em 'max2' (max2 = 'max1')
e depois guarda a maior em 'max 1' (max1 = nota)
Isso ocorre para ficar com as duas maiores notas.

Se a 'nota' analisada não for maior ou igual a maior nota já
registrada (max1), entra no ELSE e então verifica se a nota
em questão é maior ou igual à segunda maior nota (max2).
Caso seja, guarda em 'max2' o valor de 'nota'
**** coloquei dois prinf para poder facilitar o entendimento.******/
if(nota >= max1){
max2 = max1; //Math.max(max1, max2);
max1 = nota; //Math.max(nota, max1);
System.out.printf("\n\n NOTA: %.2f\n MAX_1: %.2f\n MAX_2: %.2f\n\n",nota, max1, max2);
}else{
if(nota>= max2){
max2 = nota;// Math.max(nota, max2);
System.out.printf("\n\n (else!)NOTA: %.2f\n MAX_1: %.2f\n MAX_2: %.2f\n\n",nota, max1, max2);
}
}
}
return media_final = (max1+max2)/2;
}

public static void main(String[] args) {
float n1, n2, n3, n4, n5;
Scanner entrada = new Scanner(System.in);

// receber as notas
System.out.println("Insira a Nota 1: \n");
n1 = entrada.nextFloat();
System.out.println("Insira a Nota 2: \n");
n2 = entrada.nextFloat();
System.out.println("Insira a Nota 3: \n");
n3 = entrada.nextFloat();
System.out.println("Insira a Nota 4: \n");
n4 = entrada.nextFloat();
System.out.println("Insira a Nota 5: \n");
n5 = entrada.nextFloat();
// chamar o método e apresentar a média.
System.out.printf("\n\n MEDIA FINAL: %.2f\n\n", media(n1, n2, n3, n4, n5));
}

}

Anônimo disse...

Fiz o codigo de modo que meu metodo possa receber mais de tres variaveis. Caso eu queira usa-lo no futuro não preciso mudar nada.

public class TresNotas {

public static float maiorNota(float... nota){
float maior = 0, segunda=0;
for(float valor:nota){
if(valor > maior)
maior = valor;
}
return maior;

}
public static float menorNota(float... nota){
float menor = 999999999;
for(float valor:nota){
if(valor<menor)
menor = valor;
}
return menor;
}
public static float media(float... valores){
float media=0;
for(float valor:valores){
media +=valor;
}
return media/valores.length;
}
public static void main (String[] args){
Scanner in = new Scanner(System.in);
float nota1, nota2, nota3;

System.out.println("Entre com a 1° nota:");
nota1 = in.nextFloat();
System.out.println("Entre com a 2° nota:");
nota2 = in.nextFloat();
System.out.println("Entre com a 3° nota:");
nota3 = in.nextFloat();

System.out.println("Sua media com as três notas é: "+media(nota1,nota2,nota3));
System.out.println("Sua média com as duas maiores notas é: "+(nota1+nota2+nota3-menorNota(nota1,nota2,nota3))/2);
System.out.println("Sua nota mais alta foi: "+maiorNota(nota1,nota2,nota3));
System.out.println("Sua nota mais baixa foi: "+menorNota(nota1,nota2,nota3));

}
}

spektro disse...

Boa tarde, sou grande fan do seu blog, e tenho aprendido quase tudo sobre java no seu blog, mas tenho uma questão sobre o exercício..No enunciado pede que usemos o mesmo método da media para a media com as 3 notas como para as 2 notas mais altas, mas o que verifiquei na solução e que na media para as 2 notas mais altas não e usado o método da media, mas e feito sim directamente no output.

Agradeço desde já qualquer resposta

Dicas e Novidades de Java por e-mail

Sabe quanto custa um bom livro de java?
Entre R$ 100,00 e R$300,00

Sabe quanto custa um bom curso presencial de Java?
Entre R$ 1.500,00 até R$ 4.000,00

Sabe quanto custa estudar pelo Java Progressivo?
Absolutamente nada.

Porém, também precisamos de sua ajuda e apoio.
Para isso, basta curtir nossa Fan Page e clicar no botão G+ do Google.