Ir ao conteúdo
  • Cadastre-se

C Sacar valores R$11, 00, R$13, 00, R$16,00 e R$18, 00 no caixa eletrônico


ArieviloAgarf

Posts recomendados

 
/*Esse terminal opera saques em cédulas de R$ 2,00, R$ 5,00, R$ 10,00, R$ 20,00, R$ 50,00 e R$ 100,00, além disso, 
  permite saques no valor entre R$10,00 e R$ 800,00, inclusive.
  Escreva um algoritmo que receba a solicitação de saque do cliente e determine quantas cédulas de cada valor serão 
  necessárias para compor o valor de saque solicitado.
  Exemplo:
  Valor de saque solicitado: R$ 150,00
  Cédulas necessárias: 1 cédula de R$ 50,00 e uma cédula de R$ 100,00 

  COMO FAÇO PARA QUE O CÓDIGO ENTENDA A SOLICITAÇÃO ABAIXO ? 
  E se o cliente solicitar R$13,00 reais, deve sair uma cédula de R$ 5,00 e quatro cédulas de R$2,00
*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
	
	// Declaracao das variaveis
	int notas_1 = 0, notas_2 = 0, notas_5 = 0, notas_10 = 0, notas_20 = 0, notas_50 = 0, notas_100 = 0, valor = 0, valor_sacado = 0;

	// Recebe o valor do saque
	printf("Qual eh o valor que deseja sacar ? ");
	scanf("%d", &valor);
	valor_sacado = valor;
     if((valor >= 10) && (valor <= 800))
     {
     	printf("Seja Bem-Vindo ao Tabajara Bank\n");
     	printf("Saque Autorizado:\n");
	 }
	 
	// Verifica se o valor solicitado é menor ou maior que o mínimo e máximo permitido neste terminal
	if ((valor % 2 != 0) || (valor < 10) || (valor > 800))
	
	{
		printf("\nObserve os Limites de Saque Neste Terminal:\n");
	    printf("\nValor Minimo p/Saque R$ 10,00 Max R$ 800,00\n");
	
	}
	
	// Verifica as notas de 100
	while (valor >= 100)
	{
		valor = valor - 100;
		notas_100++;
	}

	// Verifica as notas de 50
	while (valor >= 50)
	{
		valor = valor - 50;
		notas_50++;
	}

	// Verifica as notas de 20
	while (valor >= 20)
	{
		valor = valor - 20;
		notas_20++;
	}

	// Verifica as notas de 10
	while (valor >= 10)
	{
		valor = valor - 10;
		notas_10++;
	}

	// Verifica as notas de 5. Verifica tambem se o resto que sobrou
	// e divisivel por 2, ja que nao temos notas de 1
	while (valor >= 5 && (valor - 5 % 2 != 0))
	{
		valor = valor - 5;
		notas_5++;
	}
	
	// Verifica as notas de 2
	while (valor >= 2)
	{
		valor = valor - 2;
		notas_2++;
	}
    
	// Exibe o resultado
	printf("\n\nValor sacado: %d\n", valor_sacado);
	printf("Notas de 100: %d\n", notas_100);
	printf("Notas de 50: %d\n", notas_50);
	printf("Notas de 20: %d\n", notas_20);
	printf("Notas de 10: %d\n", notas_10);
	printf("Notas de 5: %d\n", notas_5);
	printf("Notas de 2: %d\n", notas_2);
	
   
	return 0;	

}

 

Link para o comentário
Compartilhar em outros sites

19 minutos atrás, ArieviloAgarf disse:


 

/*Esse terminal opera saques em cédulas de R$ 2,00, R$ 5,00, R$ 10,00, R$ 20,00, R$ 50,00 e R$ 100,00, além disso, 
  permite saques no valor entre R$10,00 e R$ 800,00, inclusive.
  Escreva um algoritmo que receba a solicitação de saque do cliente e determine quantas cédulas de cada valor serão 
  necessárias para compor o valor de saque solicitado.
  Exemplo:
  Valor de saque solicitado: R$ 150,00
  Cédulas necessárias: 1 cédula de R$ 50,00 e uma cédula de R$ 100,00 


  E se o cliente solicitar R$13,00 reais, deve sair uma cédula de R$ 5,00 e quatro cédulas de R$2,00
*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
	
	// Declaracao das variaveis
	int notas_1 = 0, notas_2 = 0, notas_5 = 0, notas_10 = 0, notas_20 = 0, notas_50 = 0, notas_100 = 0, valor = 0, valor_sacado = 0;

	// Recebe o valor do saque
	printf("Qual eh o valor que deseja sacar ? ");
	scanf("%d", &valor);
	valor_sacado = valor;
     if((valor >= 10) && (valor <= 800))
     {
     	printf("Seja Bem-Vindo ao Tabajara Bank\n");
     	printf("Saque Autorizado:\n");
	 }
	 
	// Verifica se o valor solicitado é menor ou maior que o mínimo e máximo permitido neste terminal
	if ((valor % 2 != 0) || (valor < 10) || (valor > 800))
	
	{
		printf("\nObserve os Limites de Saque Neste Terminal:\n");
	    printf("\nValor Minimo p/Saque R$ 10,00 Max R$ 800,00\n");
	
	}
	
	// Verifica as notas de 100
	while (valor >= 100)
	{
		valor = valor - 100;
		notas_100++;
	}

	// Verifica as notas de 50
	while (valor >= 50)
	{
		valor = valor - 50;
		notas_50++;
	}

	// Verifica as notas de 20
	while (valor >= 20)
	{
		valor = valor - 20;
		notas_20++;
	}

	// Verifica as notas de 10
	while (valor >= 10)
	{
		valor = valor - 10;
		notas_10++;
	}

	// Verifica as notas de 5. Verifica tambem se o resto que sobrou
	// e divisivel por 2, ja que nao temos notas de 1
	while (valor >= 5 && (valor - 5 % 2 != 0))
	{
		valor = valor - 5;
		notas_5++;
	}
	
	// Verifica as notas de 2
	while (valor >= 2)
	{
		valor = valor - 2;
		notas_2++;
	}
    
	// Exibe o resultado
	printf("\n\nValor sacado: %d\n", valor_sacado);
	printf("Notas de 100: %d\n", notas_100);
	printf("Notas de 50: %d\n", notas_50);
	printf("Notas de 20: %d\n", notas_20);
	printf("Notas de 10: %d\n", notas_10);
	printf("Notas de 5: %d\n", notas_5);
	printf("Notas de 2: %d\n", notas_2);
	
   
	return 0;	

}

 

 

adicionado 3 minutos depois

Preciso que o código permita sacar os valores 11, 00, 13, 00, 16, 00 e 18, 00 reais ou seja

no caso de 11, 00 reais deve liberar uma nota de 5,00 e três notas de 2´00 reais. Eu não estou conseguindo entender esa parte. VALEU

Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...

Faz um tempinho que postaram a dúvida, mas fica pra posteridade kkkk, tenho um exemplo em c# pra sacar esses valores, se adicionar uma nota de 3, a regra de pegar o menor número de notas possível passa a não funcionar muito bem, mas é ajustável =/

 

using System;
using System.Collections.Generic;

class MainClass {
  public static void Main (string[] args) {
    while (true) {
        Console.WriteLine("Insira a quantia desejada:");
        var amount = int.Parse(Console.ReadLine());

        var notes = new int[7] { 200, 100, 50, 20, 10, 5, 2 };
        var wallet = new Dictionary<int, int> {
            { 200, 0 },
            { 100, 0 },
            { 50, 0 },
            { 20, 0 },
            { 10, 0 },
            { 5, 0 },
            { 2, 0 }
        };

        foreach (var note in notes) {
            if (note > amount) {
                continue;
            }

            var diff = amount - note;
            var rest = amount % note;
            var restIsOneOrTree = rest == 1 || rest == 3;

            var amountIsEven = amount % 2 == 0;
            var noteIsEven = note % 2 == 0;

            if (!amountIsEven && noteIsEven) {
                if (restIsOneOrTree && diff < 10) {
                    continue;
                }
            }

            if (amountIsEven && !noteIsEven) {
                continue;
            }

            if (restIsOneOrTree) {
                amount -= note;
                wallet[note]++;    
                continue;
            }

            int numberOfNotes = amount / note;

            amount -= numberOfNotes * note;
            wallet[note] += numberOfNotes;
        }

        foreach(var entry in wallet) {
            if (entry.Value > 0) {
                Console.WriteLine($"{entry.Value} notes of {entry.Key}");
            }
        }
    }
  }
}

 

Link para o comentário
Compartilhar em outros sites

Há muitas maneiras de fazer isso. 

 

Você tem um problema de design, não no programa, mas no enunciado, por não ter notas de 1 ---  ou moedas, ou títulos do tesouro porque não faz diferença, apenas o valor importa --- tem valores que você não consegue entregar usando o algoritmo simples. Como entregar 3 reais, por exemplo? Por isso o enunciado determina o valor como maior, entre 10 e 800.

 

O simples:
 

O algoritmo normal é gastar as notas do valor mais alto para o mais baixo, considerando o que tem no dispensador. As máquinas de verdade em geral tem até 4 gavetas de notas, e nem sempre estão todas abastecidas. Algumas vezes se oferece a chance de o cliente receber um número maior de notas, para comodidade. Exemplo: algumas versões permitem que se retire 100 reais em uma nota ou 5x20 ou o que tenha mais fracionado na gaveta, por opção do cliente na tela. E muitas vezes o valor pedido é rejeitado: Pode tentar 90 reais num momento em que só tem notas de 50 e 100 por exemplo.

 

Mas o problema no seu caso é o saque de um valor ímpar. Você tem 6 notas na sua máquina, mas a única de valor ímpar é 5. Precisa contornar esse problema. Só isso. Pode focar em valores entre 10 e 20 reais, e depois entregar o resto. Não tem nenhuma restrição em seu enunciado.

 

  • Se o valor do saque é par, pode entregar do jeito normal, usando as notas da maior para a menor até dar o valor.
  • Se o valor do saque é múltiplo de 5 pode fazer a mesma coisa, já que a única nota ímpar é a de 5 reais.
  • Agora no resto dos casos pode entregar o que tem até 780 do jeito normal e o restante usando
    • se 11 então vai usar 5 + 2 + 2 + 2
    • se 13 vai sacar 5 + 2 + 2 + 2 + 2
    • se 17 vai sacar 10 + 5 + 2 
    • se 19 vai sacar 10 + 5 + 2 + 2
    • são só esses 4 casos que precis
    • a tratar.

Há outras maneiras mas acho que assim já está bem.

 

Exemplo: 799 reais

  • 780 do modo normal:
    • 7 x 100, porque 8 ia estourar
    • 1 x 50, porque duas daria 800
    • 1 x 20, porque duas daria 790
    • 1 x 10,e tem os 780: 7 x 100 + 50 + 20 + 10
  • restam 19 e está resolvido na lista
     

 

 

 

Link para o comentário
Compartilhar em outros sites

Problema interessante resolvi tratando os casos com 7, 9, 11, 13, 6 e 8

 

#include <stdio.h>
#include <assert.h>

struct saque
{
    int valor;
    union
    {
        int notas[6];
        struct { int notas_100, notas_50, notas_20, notas_10, notas_5, notas_2; };
    };
};

void sacar_7(struct saque* s)
{
    assert(s->valor % 10 == 7);
    s->valor -= 7;
    s->notas_2 += 1;
    s->notas_5 += 1;
}

void sacar_9(struct saque* s)
{
    assert(s->valor % 10 == 9);
    s->valor -= 9;
    s->notas_2 += 2;
    s->notas_5 += 1;
}

void sacar_11(struct saque* s)
{
    assert(s->valor >= 11 && s->valor % 10 == 1);
    s->valor -= 11;
    s->notas_2 += 3;
    s->notas_5 += 1;
}

void sacar_13(struct saque* s)
{
    assert(s->valor >= 13 && s->valor % 10 == 3);
    s->valor -= 13;
    s->notas_2 += 4;
    s->notas_5 += 1;
}

void sacar_6_ou_8(struct saque* s)
{
    assert(s->valor % 10 == 6 || s->valor % 10 == 8);
    int n_notas = (s->valor % 10) / 2;
    s->valor -= (n_notas * 2);
    s->notas_2 += n_notas;
}

void sacar_restante(struct saque* s)
{
	// implemente o saque restante 
}

int main()
{
    int valor;
    scanf("%d", &valor);
    assert(valor > 1 && valor != 3);

    struct saque s = { valor, 0, 0, 0, 0, 0, 0 };

    if (s.valor % 10 == 1)
        sacar_11(&s);
    else if (s.valor % 10 == 3)
        sacar_13(&s);
    else if (s.valor % 10 == 7)
        sacar_7(&s);
    else if (s.valor % 10 == 9)
        sacar_9(&s);
    else if (s.valor % 10 == 6 || s.valor % 10 == 8)
        sacar_6_ou_8(&s);

    sacar_restante(&s);

    printf("Saque no valor: %d\n", valor);
    printf("Notas 100:      %d\n", s.notas_100);
    printf("Notas 50:       %d\n", s.notas_50);
    printf("Notas 20:       %d\n", s.notas_20);
    printf("Notas 10:       %d\n", s.notas_10);
    printf("Notas 5:        %d\n", s.notas_5);
    printf("Notas 2:        %d\n", s.notas_2);

    return 0;
}

 

  • Curtir 1
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...