Return two values using return

1

I'm trying to get the value of a method in a method that runs two functions at the same time (value and total size) how do I return the two values? Both must be run 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);
}
}

The values are in the main and I would like to break them down into a function that I can call in main, as I did with the others.

    
asked by anonymous 23.04.2015 / 00:50

1 answer

2

You can only change more than one variable per 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 suppose that we want a function that adds 1 in two numbers passed as a parameter.

Can not do this:

    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 this point a = 1 , and b = 2 . If we were expecting a = 2 , b = 3 , we were frustrated. In Java all parameters are passed by value, except objects, .

In terms of the scope of the test function a = 2 and b = 3 after the invocation of the increment 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, returning 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 said at the beginning of the text java does not support multiple values return, so what we did is considered gambiarra, and according to the project this might not be considered a good practice.

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

Source 1

Font 2

    
23.04.2015 / 01:14