Caixa Eletronico (Trabalho da Facul)

esse processo que vc colocou…

olhar para 53, sabendo que vai ter q tirar um 5… e ficar tentando tirar 50, vendo q não da… depois tirar 20 e 20, e tentar tirar 10, vendo que não vai dar… pra só ai tirar o 5, é algo q axo sem sentido… qualquer número impar, vc vai tirar um 5, e apenas um 5…

a não ser que vc tenha limite de cada uma das notas, ai vc terá que saber, que pra sua conta da certo, depois q tirar 1x5, depois so poderar tirar eles em pares, para manter a conta final em um número impar

[code]import java.util.ArrayList;
import java.util.List;

public class Testes {
public static void main(String[]args){
int valor=288 ,p;
List notas =new ArrayList();

    if(String.valueOf(valor).length()>=3){
        p=valor/100;
        for(int i=0;i<p;i++)notas.add(100);
        valor=valor%100;
    }
    if((String.valueOf(valor).length()==2) && ((Integer.parseInt(String.valueOf(valor).substring(0,1)))>=5)){
        p=valor/50;
        for(int i=0;i<p;i++)notas.add(50);
        valor=valor%50;
    }
    if((isPar((Integer.parseInt(String.valueOf(valor).substring(0,1)))))==true){
        p=valor/20;
        for(int i=0;i<p;i++)notas.add(20);
        valor=valor%20;
    }
    if(String.valueOf(valor).length()==2){
        p=valor/10;
        for(int i=0;i<p;i++)notas.add(10);
        valor=valor%10;
    }
    if(valor>=5){
        p=valor/5;
        for(int i=0;i<p;i++)notas.add(5);
        valor=valor%5;
    }
    if(valor%2==0){
        p=valor/2;
        for(int i=0;i<p;i++)notas.add(2);
        valor=valor%2;
    }


  if(((String.valueOf(valor).substring(0,1)).equals("1")) || ((String.valueOf(valor).substring(0,1)).equals("3")) || ((String.valueOf(valor).substring(0,1)).equals("6")) || ((String.valueOf(valor).substring(0,1)).equals("8"))){
      int sumNota=0;
      for(int i:notas)sumNota+=i;
      System.out.println("O valor digitado não pode ser sacado \nsugestão de valor: "+sumNota);
  }else{
    System.out.println(notas);
}
}
static boolean isPar(int val){
    return ((val%2==0)? true:false);
}

}[/code]

Espero ter ajudado…

OBSERVAÇÃO: se no seu codigo, inserir o valor em uma string pode economiza com String.valueOf(), lembrando que assim teria de retornar o valor da string para o proximo teste e não com fiz, retornando o valor inteiro. :?

o que vc precisa responde é… seu caixa eletronico é real ?? ele tem limites de notas dentro dele ?? ou vc pode conciderar que as notas dentro do caixa rapido são infintos ??se forem infinitos, faz as contas como te falei, no fim, ve se tem + de 30 notas, se tiver, diz q o saldo não é permitido por excesso de notas… e pronto ta feito seu programa…

se teu programa tiver limite de notas, vc precisa ter recipient contabilizar elas… e a diferença… é que as notas cinco, terão comportamento especial, quando vc tiver tratando impares e pares…

se o numero for impar… vc só pode ter notas cinco em somas impares… 1 nota, 3 notas, 5 notas, 7 notas … etc
se o numero for par … vc só pode ter notas cinco em somas pares… 0 notas, 2 notas, 4 notas, 6 notas…

pode ter certeza… quando for impar… conte primeiro a 1° nota 5, depois faça o resto das contas… e seja feliz

Obs.: essa parte de contagem de notas, tem milhoes de exemplos aki no guj… e a unica diferença pro seu problema é essa questão de impar/par para a nota 5

Cara… põe o enunciado aí… vou quebrar cabeça com essa birosca aqui… gostei do desafio…

Falows :wink:

Quebrar a cabeça?

Se é impar dá 5, se não é não dá.

De resto faz uma divisão normal com as notas de 100, 50, 20, 10 e 2

[quote=adriano_si]Cara… põe o enunciado aí… vou quebrar cabeça com essa birosca aqui… gostei do desafio…

Falows ;)[/quote]

poem ai o enunciado ?? e enunciado esta no 1° post … O.o

Aquele lá é o enunciado completo ??? Então blz…

[quote=pmlm]Quebrar a cabeça?

Se é impar dá 5, se não é não dá.

De resto faz uma divisão normal com as notas de 100, 50, 20, 10 e 2[/quote]

Não lí e nem vou ler… hehehehehe por isso falei em quebrar a cabeça, com o enunciado vou tentar fazer do zero, tendo em vista que ainda nem pensei numa solução, ví o problema, achei legal, ainda não pensei em nada e imaginei que o enunciado era alguma coisa mais elaborda do que… sei lá, quero fazer assim e assado, mas o que o professor quer na verdade é… etc. etc.

Mas valew, acho que com o que está no 1º post dá pra fazer…

Fui :wink:

ops! Ta ai agora sem bugs:

import java.util.ArrayList;
import java.util.List;

public class CaixaEletronico {
    public static void main(String[]args){
        int valor=3 ,p;
        List<Integer> notas =new ArrayList<Integer>();

        if(String.valueOf(valor).length()>=3){
            p=valor/100;
            for(int i=0;i<p;i++)notas.add(100);
            valor=valor%100;
        }
        if((String.valueOf(valor).length()==2) && ((Integer.parseInt(String.valueOf(valor).substring(0,1)))>=5)){
            p=valor/50;
            for(int i=0;i<p;i++)notas.add(50);
            valor=valor%50;
        }
        if((isPar((Integer.parseInt(String.valueOf(valor).substring(0,1)))))==true){
            p=valor/20;
            for(int i=0;i<p;i++)notas.add(20);
            valor=valor%20;
        }
        if(String.valueOf(valor).length()==2){
            p=valor/10;
            for(int i=0;i<p;i++)notas.add(10);
            valor=valor%10;
        }
        if(valor>=5){
            p=valor/5;
            for(int i=0;i<p;i++)notas.add(5);
            valor=valor%5;
        }
        if((String.valueOf(valor).length()==1) && (valor>=2)){
            p=valor/2;
            for(int i=0;i<p;i++)notas.add(2);
            valor=valor%2;
        }


      if(((String.valueOf(valor).substring(0,1)).equals("1")) || ((String.valueOf(valor).substring(0,1)).equals("3")) || ((String.valueOf(valor).substring(0,1)).equals("6")) || ((String.valueOf(valor).substring(0,1)).equals("8"))){
          int sumNota=0;
          for(int i:notas)sumNota+=i;
          System.out.println("O valor digitado não pode ser sacado \nsugestão de valor: "+sumNota);
      }else{
        System.out.println(notas);
    }
    }
    static boolean isPar(int val){
        return ((val%2==0)? true:false);
    }

}

Testa ai! a lógica ta certa. Pode implementar agora a classe diacoro o uso. O quem fiz não foi nada mais que avaliar o problema parte por parte.
se quizer imprimir o número de notas é ainda mais fácio:
é so pegar o valor “p” que é a quantidade.

Outra forma… só não testei bastante e fiz rápido aqui no trampo, depois dou uma olhada com calma…

package caixaeletronico;

import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Main {

    static String[] notas = {"100","50","20","10","5","2"};
    static ArrayList notasUsadas = new ArrayList();
    static int valorResult;

    public static void main(String[] args) {

        // Vou considerar so inteiros por nao ter enunciado exato.
        int valorSacar = Integer.parseInt(JOptionPane.showInputDialog(null, "Entre com o valor para saque"));

        sacar(valorSacar);

        for(int i = 0; i < notasUsadas.size(); i++) {
            System.out.println(notasUsadas.get(i));
        }
    }

    static void sacar(int valorSacar) {

        valorResult = valorSacar;

        // So faz alguma coisa se o Usuario quiser sacar no minimo R$ 10,00
        // Convençao minha
        if(valorSacar >= 10) {
                while(valorResult >= 100 && verificaMod(valorResult, 100)) {
                        notasUsadas.add(notas[0]);
                        valorResult -= 100;
                }

                while(valorResult >= 50 && verificaMod(valorResult, 50)) {
                        notasUsadas.add(notas[1]);
                        valorResult -= 50;
                }

                while(valorResult >= 20 && verificaMod(valorResult, 20)) {
                    notasUsadas.add(notas[2]);
                    valorResult -= 20;
                }

                while(valorResult >= 10 && verificaMod(valorResult, 10)) {
                    notasUsadas.add(notas[3]);
                    valorResult -= 10;
                }

                while(valorResult >= 5 && verificaMod(valorResult, 5)) {
                    notasUsadas.add(notas[4]);
                    valorResult -= 5;
                }

                while(valorResult >= 2 && verificaMod(valorResult, 2)) {
                    notasUsadas.add(notas[5]);
                    valorResult -= 2;
                }
        }
    }

    static boolean verificaMod(int resultado, int base) {
        int valor = resultado % base;
        if((valor == 1 || valor == 3) && (resultado/2) < (base)) {
            return false;
        } else {
            return true;
        }
    }
}

Qualquer melhoria… podem postar…

Ah sim… não usei o for aperfeiçoado porque estava marcando um tracinho vermelho na compilação do NetBeans e não tava com saco pra verificar o porque…

Falows :wink:

David… não gostei de sua solução por eu não poder sacar valores impares… acho que não era bem isso que ele queria… Ele queria que as notas fossem combinadas de uma forma tal que qualquer valor pudesse ser sacado, sempre dizendo primeiro qual a maior nota, pra depois dizer quais as menores…

Não sei, acho que entendi errado então… quando chegar em casa avalio melhor…

Abraços :wink:

Consertei agora…

Aqui…

static ArrayList<String> notasUsadas = new ArrayList();

e Aqui…

for(String lista : notasUsadas) { System.out.println(lista.toString()); }

FALOWS :wink:

nmelhr ainda no lugar do For… Agora vou trabalhar que o chefe já tá mandando trampo pra KCTI aqui…

 JOptionPane.showMessageDialog(null, "Valor Sacado: " + valorSacar + "\nRetire seu dinheiro: " + notasUsadas.toString());

Abraços :wink:

Amigo da uma olhada no código que eu fiz, os unicos valores que impossivel para saque é valor 1 e 3. Todos os demais são possiveis, para valores maiores que 10 terminado em 3 ou 1, o código faz o seguinte no caso de terminado 3 o
algoritmo deduz 5 do valor, teremos uma nota 5 para esse valor. E no caso de terminar em 1 deduz 6 teremos 3 notas de 2 nesse valor.


import java.util.Scanner;

public class Saque {
	private final Integer[] notas = new Integer[] { 100, 50, 20, 10, 5, 2 };
	private int valor;

	public int getValor() {
		return valor;
	}

	public void setValor(int valor) {
		this.valor = valor;
	}

	public String sacar() {
		String mostraNota = "";
		int resultado = 0;
		int divisao = 0;

		if (valor == 1 || valor == 3)
			return "Valor de saque invalido";
		for (Integer nota : notas) {
			if (valor >= nota) {
				resultado = valor % nota;
				divisao = valor / nota;
				if (resultado != 3 && resultado != 1) {
					mostraNota += " " + (valor / nota) + "x" + nota;
					valor = valor - (nota * (valor / nota));
				}
				if (nota >= 10 && resultado == 3) {
					valor = valor - 5;
					mostraNota += " " + "1x5";

				}

				if (nota >= 10 && resultado == 1) {
					valor = valor - 6;
					mostraNota += " " + "3x2";

				}

			}
		}
		return mostraNota;
	}

	public static void main(String args[]) {
		int valor = 1000;
		Saque saque = new Saque();
		Scanner scanner = new Scanner(System.in);
		while (valor != 0) {
			System.out.println("Digite um Valor ou 0 para sair:");
			valor = scanner.nextInt();
			if (valor != 0) {
				saque.setValor(valor);
				System.out.println(saque.sacar());
			}
		}

	}
}

JCMIRD, seu algoritmos com valores acima de 200, por exemplo, 1001, 201, 603, simplesmente ignora as notas de 100…

Dá uma verificada aí…

Falows :wink:

eu fico impressionado como vcs conseguem fazer um programa 0% OO (Orientado a Objetos)

Faça um e seja feliz… só creio que para a situação, era disso que ele estava precisando… bom não vou perder meu tempo com isso, mas se incomodar, faz aí…

Abraços :wink:

Faça um e seja feliz… só creio que para a situação, era disso que ele estava precisando… bom não vou perder meu tempo com isso, mas se incomodar, faz aí…

Abraços ;)[/quote]

para situação o q precisava era uma ajuda pra conseguir iniciar, e não que alguem fizesse pela pessoa… agora c for fazer, que se faça com conceitos OO… e não uma linha procedura… eu axo impressionante como muita gente ainda continua pensando e escrevendo programas sem nem ao menos dividir corretamente as responsabilidades em métodos e essas coisas…

o.O … ainda mais quando esta se tentando ajudar alguem q esta iniciando, ai sim, que tem mesmo q mostrar com fazer com conceitos OO

[quote]para situação o q precisava era uma ajuda pra conseguir iniciar, e não que alguem fizesse pela pessoa… agora c for fazer, que se faça com conceitos OO… e não uma linha procedura… eu axo impressionante como muita gente ainda continua pensando e escrevendo programas sem nem ao menos dividir corretamente as responsabilidades em métodos e essas coisas…

o.O … ainda mais quando esta se tentando ajudar alguem q esta iniciando, ai sim, que tem mesmo q mostrar com fazer com conceitos OO[/quote]

Ok…