Ir ao conteúdo
  • Cadastre-se

C Exercicio Caixa eletrônico com Notas


gramosiri
Ir à solução Resolvido por AdrianoSiqueira,

Posts recomendados

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;
}

 

Link para o comentário
Compartilhar em outros sites

@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

Link para o comentário
Compartilhar em outros sites

  • Solução

@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;
}

 

Link para o comentário
Compartilhar em outros sites

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 ??

Link para o comentário
Compartilhar em outros sites

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...