Ir ao conteúdo
  • Cadastre-se
gramosiri

C Exercicio Caixa eletrônico com Notas

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esquece um pouco a programação.

Pensa comigo: "Como chegar no número 11, somando apenas os números [2, 5, 10, 20, 50, 100]?"

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AdrianoSiqueira Sim, ele tera que usar uma nota de 5 e tres notas de 2, a duvida é como chegar ai

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

Compartilhar este post


Link para o post
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 ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

++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 (+=, -=, *=, /=, %=).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!