Return two values using Return

Asked

Viewed 7,212 times

1

About splitting a program into methods, in a case of a method that runs two functions at the same time (value and total size) how do I use Return at both values? Both must be executed together, I see no possibility of dividing this method into two (one for the value and one for the size)

import java.util.Scanner;
public class Sistema_Bichara{
    public static int Menu(){
        Scanner in = new Scanner(System.in);
        System.out.println("Digite o o número referente ao tamanho da pulseira\n1.Pequena (17cm) - R$180,00\n2.Média (18cm) - R$200,00\n3.Grande (20cm) - R$240,00\n4.Sair");
        int digita = in.nextInt();
        return digita;
    }
    public static double valorPulseira(int digita){
        double valor = 0;
        switch(digita){
            case 1:
            valor += 180;
            System.out.println("Total: R$180,00\nAgora escolha o(s) pingente(s):");
            break;
            case 2:
            valor += 200;
            System.out.println("Total: R$200,00\nAgora escolha o(s) pingente(s):");
            break;
            case 3:
            valor += 240;
            System.out.println("Total: R$240,00\nAgora escolha o(s) pingente(s):");
            break;
        }
        return valor;
    }
    public static int tamanhoPulseira(int digita){
        int tamanhopulseira = 0;
        switch(digita){
            case 1:
            tamanhopulseira = 17;
            break;
            case 2:
            tamanhopulseira = 18;
            break;
            case 3:
            tamanhopulseira = 20;
            break;
        }
        return tamanhopulseira;
    }
    public static int menuAcessorio(){
        System.out.println("1.Bichinhos (1,3cm) - R$225,00\n2.Bonequinhos (1,5cm) - R$185,00\n3.Berloques (0,5cm) - R$200,00\n4.Cubinhos (1cm) - R$190,00\n5.Rolinho (2cm) - Prata, Pedra e Esmaltados\n6.Ir para o pagamento");
        Scanner in = new Scanner(System.in);
        int digita2 = in.nextInt();
        return digita2;
    }
    public static double suporte(double valor){
    Scanner in = new Scanner(System.in);
    System.out.println("\nDeseja adquirir um suporte de segurança pelo preço de R$95,00?\n1.Sim\n2.Não");
    int digita = in.nextInt();
    if(digita == 1){
        valor += 95;
    }
    return valor;
   }
   public static int menuPagamento(){
       System.out.println("\nA loja oferece os seguintes tipos de pagamento:");
       System.out.println("\n1. À vista com 5% de desconto");
       System.out.println("\n2. 3 vezes no cartão sem acrescimos");
       System.out.println("\n3. 5 vezes no cartão com acresimo de 10% no preço total");
       System.out.println("\n4. 10 vezes no cartão com acresimo de 20% no preço total");
       System.out.println("\nDigite o número da forma de pagamento escolhida.");
       Scanner in = new Scanner(System.in);
       int digita3 = in.nextInt();
       return digita3;
    }
   public static double pagamento(double valor, int digita3){
    Scanner in = new Scanner(System.in);
    double pagar = 0;
    double valor2 = 0;
    switch(digita3){
        case 1:
        valor = valor*0.95;
        break;
        case 2:
        pagar = valor/3;
        break;
        case 3:
        valor2 = (valor*110)/100;
        pagar = valor2/5;
        break;
        case 4:
        valor2 = (valor*120)/100;
        pagar = valor2/10;
        break;
    }
    //Condição para mostrar o valor total de acordo com o pagamento escolhido
    if (digita3 == 3){
        System.out.println("\nO valor total da compra ficou de: R$" +valor2);
    } else if (digita3 == 4){
        System.out.println("\nO valor total da compra ficou de: R$" +valor2);
    } else {
        System.out.println("\nO valor total da compra ficou de: R$" +valor);
    }
    //Condição para mostrar o valor total e o valor das parcelas se a pessoa escolheu parcelado
    if(digita3 == 2){
    System.out.println("\nForma de pagameto: 3 parcelas de R$" +pagar);
    System.out.println("\nA loja aceita os seguintes cartões:\n1.Visa\n2.MasterCard\n3.Rede Shop\n4.American Express\n5.Hipercard\n6.Diners Club International");
    int digita = in.nextInt();
    }  else if(digita3 == 3){
    System.out.println("\nForma de pagameto: 5 parcelas de R$" +pagar);
    System.out.println("\nA loja aceita os seguintes cartões:\n1.Visa\n2.MasterCard\n3.Rede Shop\n4.American Express\n5.Hipercard\n6.Diners Club International");
    int digita = in.nextInt();
    }else if(digita3 == 4){
    System.out.println("\nForma de pagameto: 10 parcelas de R$" +pagar);
    System.out.println("\nA loja aceita os seguintes cartões:\n1.Visa\n2.MasterCard\n3.Rede Shop\n4.American Express\n5.Hipercard\n6.Diners Club International");
    int digita = in.nextInt();
    }
    System.out.println("\nObrigado por comprar conosco!");
    return valor;
}
public static void main(String args[]){
    Scanner in = new Scanner(System.in);
    int digita=Menu();
    double valor = valorPulseira(digita);
    int tamanhopulseira = tamanhoPulseira(digita);
    double tamanhototal = 0;
    int digita2;
    do {
            digita2=menuAcessorio();
            switch(digita2){
            case 1:
            valor += 225;
            tamanhototal += 1.3;
            break;
            case 2:
            valor += 185;
            tamanhototal += 1.5;
            break;
            case 3:
            valor += 200;
            tamanhototal += 0.5;
            break;
            case 4:
            valor += 190;
            tamanhototal += 1;
            break;
            case 5:
            tamanhototal += 2;
            System.out.println("Escolha o material:\n1.Prata - R$150,00\n2.Pedras - R$220,00\n3.Esmaltados - R$198,00");
            int rolinho = in.nextInt();
            switch(rolinho){
                case 1:
                valor += 150;
                break;
                case 2:
                valor += 220;
                break;
                case 3:
                valor += 198;
                break;
            }
            }
            if(tamanhototal > tamanhopulseira){
                System.out.println("\nTamanho máximo da pulseira atingido\n1.Prosseguir para o pagamento.");
                int digita3 = in.nextInt();
            }
            if(digita==6){
                System.out.println("\nDigite 1 para prosseguir para o pagamento.");
                int digita4 = in.nextInt();
            }
        } while (digita2 != 6 && tamanhototal < tamanhopulseira);
    valor += suporte(valor);
    System.out.println("\nO preço total da compra fica de: R$" +valor);
    int digita3 = menuPagamento();
    double pagamento = pagamento(valor, digita3);
}
}

Values are in the main and I would like to separate them into a function that I can call on the main, as I did with others.

  • put only the part of the code that is relevant to the problem

  • I put the whole code because it has the other methods and I thought I could better understand the objective of the program (which is the division into methods)

1 answer

2


You can only change more than one variable by reference, and basically in Java it is not possible to pass parameters by reference.

To do this, you need a class that has the amount of values you want to return.

For example : Let’s assume that we want a function that adds 1 in two numbers passed as parameter.

You can’t do that:

    public void teste() { 
      int a = 1; 
      int b = 2; 
      incrementa(a,b); 
    } 

    public void incrementa(int a ,int b) { 
      a = a + 1; 
      b = b + 1; 
    } 

At that moment a = 1 , and b = 2 . If we expected a = 2, b = 3 , we get frustrated. In Java all parameters are passed by value, except objects, which are passed by reference.

To have in the scope of the test function a = 2 and b = 3 after the call of the incremental method, we must create the following class:

        /** 
        * 
        * @Classe que possui dois inteiros como atributos 
        */ 
     public class valores{ 
        int x; 
        int y; 
        /** Construtor da Classe*/ 
      public valores(int numero1, numero2) 
        { 
          this.x = numero1; 
          this.y = numero2; // Estamos atribuindo valores às variáveis x e y desta classe. 
        } 

    } 

And, going back to the initial example, we would have:

    public AlteraDoisValores incrementaValores(int a , int b) { 
              AlteraDoisValores alteraValores = new AlteraDoisValores(a,b); 
              alteraValores.x = alteraValores.x + 1 ; 
              alteraValores.y = alteraValores.y + 1 ; 
              return alteraValores; 
            } 
            //Esse método retorna um objeto do Tipo AlteraDoisValores, 
            //que contém seus atributos com os valores modificados. 

    public void teste() {
          int a = 1; 
          int b = 2; 
        AlteraDoisValores numeros; // Criamos uma variável do tipo numeros 
        numeros = incrementaValores(a,b); 
        // Dizemos que número aponta para a mesma 
        // *referência* do retorno da função alteraValores 
        a = numeros.x; 
        b = numeros.y; // Fazemos com que os nossos números primários sejam modificados 

        } // Agora temos a = 2 e b = 3 

Making it clear that, as stated at the beginning of the java text does not support return of multiple values, so what we did is considered gambiarra, and according to the project this might not be considered a good practice.

The most recommended to do is that each method, do only one sub-task, thus returning only one variable.

Source 1

Source 2

Browser other questions tagged

You are not signed in. Login or sign up in order to post.