Ir ao conteúdo

Posts recomendados

Postado
 
/*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;	

}

 

Postado
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

  • 2 anos depois...
Postado

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

 

Postado

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
     

 

 

 

Postado

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

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