Ir ao conteúdo

C Exercicio Caixa eletrônico com Notas


Ir à solução Resolvido por AdrianoSiqueira,

Posts recomendados

Postado

Exercicio Caixa eletrônico com Notas.

 

Ola, estou tentando fazer um ex. aqui de um caixa eletrônico, onde precisa ser feito o saque apenas com as determinadas notas: 2, 5, 10, 20, 50 e 100 reais. Porém quando tento sacar 11 por exemplo ele soma uma nota de 10 apenas, acho que vai ter que tirar o mod, alguma ideia??

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
	
	int n100=0,n50=0,n20=0,n10=0,nota5=0,nota2=0;
    float valor=0;
    int op;
    
	printf("-> Quanto deseja sacar? R$");
    scanf("%f",&valor);    

    while(valor>=100){
        valor=valor-100;
        n100=n100+1;
    }
    while(valor>=50){
        valor=valor-50;
        n50=n50+1;
    }
    while(valor>=20){
        valor=valor-20;
        n20=n20+1;
    }
    while(valor>=10){
        valor=valor-10;
        n10=n10+1;
    }
    while(valor>=5){
        valor=valor-5;
        nota5=nota5+1;
    }
    while(valor>=2){
        valor=valor-2;
        nota2=nota2+1;
    }
    
    printf("SAQUE:\n");
    printf("%d nota(s) de R$ 100.00\n",n100);
    printf("%d nota(s) de R$ 50.00\n",n50);
    printf("%d nota(s) de R$ 20.00\n",n20);
    printf("%d nota(s) de R$ 10.00\n",n10);
    printf("%d nota(s) de R$ 5.00\n",nota5);
    printf("%d nota(s) de R$ 2.00\n",nota2);    
    
    return 0;
}

 

Postado

Vish, você tem razão!!! Nem pensei nessa possibilidade. Foi mal...

 

Tenta o seguinte: analisa a entrada do usuário, caso seja par, comece a contar a partir da nota mais alta normalmente. Caso seja ímpar, comece do 5 e caso esse 5 apareça mais uma vez, troque por 10.

Postado

@AdrianoSiqueira

#include <stdio.h>
#include <stdlib.h>

int main()
{
	
	int n100=0,n50=0,n20=0,n10=0,nota5=0,nota2=0;
    float valor=0;
    int valor2=0;
    int op;
    
	printf("-> Quanto deseja sacar? R$");
    scanf("%f",&valor);  
	valor2=(int) valor;  

		if(valor2%2==0){
		while(valor>=100){
        valor=valor-100;
        n100=n100+1;
    }
    while(valor>=50){
        valor=valor-50;
        n50=n50+1;
    }
    while(valor>=20){
        valor=valor-20;
        n20=n20+1;
    }
    while(valor>=10){
        valor=valor-10;
        n10=n10+1;
    }
    while(valor>=2){
        valor=valor-2;
        nota2=nota2+1;
    }
		}
		
		
	if(valor2%2==1){
	if(nota5<=1){
		while(valor>=5){
        valor=valor-5;
        nota5=nota5+1;
        if(nota5>=1){
        	while(valor>=2){
        valor=valor-2;
        nota2=nota2+1;
    }
			break;
		}
        }
        
    }
    while(valor>=2){
        valor=valor-2;
        nota2=nota2+1;
    }
	}
    
    
    printf("SAQUE:\n");
    printf("%d nota(s) de R$ 100.00\n",n100);
    printf("%d nota(s) de R$ 50.00\n",n50);
    printf("%d nota(s) de R$ 20.00\n",n20);
    printf("%d nota(s) de R$ 10.00\n",n10);
    printf("%d nota(s) de R$ 5.00\n",nota5);
    printf("%d nota(s) de R$ 2.00\n",nota2);    
    
    return 0;
}

Consegue fazer assim, deu certo até o saque de valor 13, dai pra frente ele entrega os valores impares em notas de 2 e 5 rsrs

  • Solução
Postado

@gramosiri Rapaz, que trabalho! Mas parece que deu certo. Testa aí com o máximo de valores ímpares possíveis e veja se está tudo certo:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int nota_2 = 0;
    int nota_5 = 0;
    int nota_10 = 0;
    int nota_20 = 0;
    int nota_50 = 0;
    int nota_100 = 0;

    int valor = 21;                 // Pode receber do usuário
    int valorCalculado = valor;     // É usado para determinar a quantidade de notas de 2 e 5 sem perder o valor original

    // Se o valor for ímpar, então começa a contar da nota de 5.
    if (valor % 2 != 0) {
        if (valor < 5) {
            printf("Não é possível calcular esse valor.");
            return 1;
        } else if (valor % 5 == 0) {
            // Se o valor for múltiplo de cinco, então apenas notas de 5 já resolvem.
            while (valorCalculado > 0) {
                ++nota_5;
                valorCalculado -= 5;
            }
        } else {
            /*
             * Se for ímpar, precisamos tirar notas de 5 até que ele se torne par,
             * depois as notas de 2 resolvem o resto.
             *
             * O -2 da primeira condição verifica se, reservando uma nota de 2,
             * ainda tem a possibilidade de remover alguma nota de 5.
             *
             * Já a segunda condição verifica se reservando uma nota de 2, o valor
             * resultante é ímpar. Porque se não for, as notas de 2 resolvem.
             */
            while ((valorCalculado - 2) >= 5 && (valorCalculado - 2) % 2 != 0) {
                ++nota_5;
                valorCalculado -= 5;
            }
        }
    }

    /*
     * Se o valor for par, ele será totalmente calculado com notas de 2 e
     * posteriormente, se houver a possibilidade, essas notas serão trocadas
     * por notas mais altas.
     */
    while (valorCalculado >= 2) {
        ++nota_2;
        valorCalculado -= 2;
    }

    /*
     * A partir daqui começa o processo de troca das notas por notas mais altas.
     * A cada cinco notas de 2 trocamos por uma nota de 10.
     */
    while (nota_2 >= 5) {
        nota_2 -= 5;
        ++nota_10;
    }

    // A cada duas notas de 5 trocamos por uma de 10.
    while (nota_5 >= 2) {
        nota_5 -= 2;
        ++nota_10;
    }

    // A cada duas notas de 10 trocamos por uma de 20.
    while (nota_10 >= 2) {
        nota_10 -= 2;
        ++nota_20;
    }

    // A cada duas notas de 20 com uma nota de 10 trocamos por uma de 50.
    while (nota_20 >= 2 && nota_10 >= 1) {
        nota_20 -= 2;
        nota_10 -= 1;
        ++nota_50;
    }

    // A cada cinco notas de 20 trocamos por uma de 100.
    while (nota_20 >= 5) {
        nota_20 -= 5;
        ++nota_100;
    }

    // A cada duas notas de 50 trocamos por uma de 100.
    while (nota_50 >= 2) {
        nota_50 -= 2;
        ++nota_100;
    }

    printf("Valor: R$ %i \n", valor);
    printf("%i de R$ 2 (= R$ %i) \n", nota_2, (nota_2 * 2));
    printf("%i de R$ 5 (= R$ %i) \n", nota_5, (nota_5 * 5));
    printf("%i de R$ 10 (= R$ %i) \n", nota_10, (nota_10 * 10));
    printf("%i de R$ 20 (= R$ %i) \n", nota_20, (nota_20 * 20));
    printf("%i de R$ 50 (= R$ %i) \n", nota_50, (nota_50 * 50));
    printf("%i de R$ 100 (= R$ %i) \n", nota_100, (nota_100 * 100));

    return 0;
}

 

Postado
Em 14/05/2019 às 09:18, AdrianoSiqueira disse:

@gramosiri Rapaz, que trabalho! Mas parece que deu certo. Testa aí com o máximo de valores ímpares possíveis e veja se está tudo certo:


#include <stdio.h>
#include <stdlib.h>

int main() {
    int nota_2 = 0;
    int nota_5 = 0;
    int nota_10 = 0;
    int nota_20 = 0;
    int nota_50 = 0;
    int nota_100 = 0;

    int valor = 21;                 // Pode receber do usuário
    int valorCalculado = valor;     // É usado para determinar a quantidade de notas de 2 e 5 sem perder o valor original

    // Se o valor for ímpar, então começa a contar da nota de 5.
    if (valor % 2 != 0) {
        if (valor < 5) {
            printf("Não é possível calcular esse valor.");
            return 1;
        } else if (valor % 5 == 0) {
            // Se o valor for múltiplo de cinco, então apenas notas de 5 já resolvem.
            while (valorCalculado > 0) {
                ++nota_5;
                valorCalculado -= 5;
            }
        } else {
            /*
             * Se for ímpar, precisamos tirar notas de 5 até que ele se torne par,
             * depois as notas de 2 resolvem o resto.
             *
             * O -2 da primeira condição verifica se, reservando uma nota de 2,
             * ainda tem a possibilidade de remover alguma nota de 5.
             *
             * Já a segunda condição verifica se reservando uma nota de 2, o valor
             * resultante é ímpar. Porque se não for, as notas de 2 resolvem.
             */
            while ((valorCalculado - 2) >= 5 && (valorCalculado - 2) % 2 != 0) {
                ++nota_5;
                valorCalculado -= 5;
            }
        }
    }

    /*
     * Se o valor for par, ele será totalmente calculado com notas de 2 e
     * posteriormente, se houver a possibilidade, essas notas serão trocadas
     * por notas mais altas.
     */
    while (valorCalculado >= 2) {
        ++nota_2;
        valorCalculado -= 2;
    }

    /*
     * A partir daqui começa o processo de troca das notas por notas mais altas.
     * A cada cinco notas de 2 trocamos por uma nota de 10.
     */
    while (nota_2 >= 5) {
        nota_2 -= 5;
        ++nota_10;
    }

    // A cada duas notas de 5 trocamos por uma de 10.
    while (nota_5 >= 2) {
        nota_5 -= 2;
        ++nota_10;
    }

    // A cada duas notas de 10 trocamos por uma de 20.
    while (nota_10 >= 2) {
        nota_10 -= 2;
        ++nota_20;
    }

    // A cada duas notas de 20 com uma nota de 10 trocamos por uma de 50.
    while (nota_20 >= 2 && nota_10 >= 1) {
        nota_20 -= 2;
        nota_10 -= 1;
        ++nota_50;
    }

    // A cada cinco notas de 20 trocamos por uma de 100.
    while (nota_20 >= 5) {
        nota_20 -= 5;
        ++nota_100;
    }

    // A cada duas notas de 50 trocamos por uma de 100.
    while (nota_50 >= 2) {
        nota_50 -= 2;
        ++nota_100;
    }

    printf("Valor: R$ %i \n", valor);
    printf("%i de R$ 2 (= R$ %i) \n", nota_2, (nota_2 * 2));
    printf("%i de R$ 5 (= R$ %i) \n", nota_5, (nota_5 * 5));
    printf("%i de R$ 10 (= R$ %i) \n", nota_10, (nota_10 * 10));
    printf("%i de R$ 20 (= R$ %i) \n", nota_20, (nota_20 * 20));
    printf("%i de R$ 50 (= R$ %i) \n", nota_50, (nota_50 * 50));
    printf("%i de R$ 100 (= R$ %i) \n", nota_100, (nota_100 * 100));

    return 0;
}

 

@AdrianoSiqueira Cara, show de bola seus comentários, porém não entendi o que essa parte do codigo faz "valorCalculado -= 5;" e essa também "++nota_5;" tem alguma diferença de "variavel++" para "++variavel" ??? Esse valorCalculado ai, seria isso: valorCalculado = valorCalculado - 5 ??

Postado

++x é o mesmo que x++, geralmente a diferença só é vista em algumas situações, no caso desse projeto não faz diferença de qual usar.

 

x -= y é a abreviação de x = x - y. E a lógica segue para todas as variantes (+=, -=, *=, /=, %=).

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...