Ir para conteúdo

Posts Recomendados

Postado

Olá! Estou iniciando na programação no curso de Sistemas de Informação e possuo uma dúvida em um código de caixa eletrônico.

Minha dúvida: O meu código possui um problema que não consigo resolver. Em certos valores como 123, 196, 111 e 121 o programa imprime a quantidade errada de notas. Para 123, por exemplo, ele imprime uma nota de 100, uma de 20 e uma de 2, sendo que deveria imprimir uma nota de 100, uma de 10, uma de 5 e 4 notas de 2 reais.

Requisitos do código:
O código deve receber um valor do tipo inteiro a ser sacado e, caso ele seja possível, retornar a quantidade de cédulas que a pessoa irá pegar. Deve-se usar a menor quantidade de cédulas possíveis. As cédulas disponíveis no caixa eletrônico são de 200, 100, 50, 20, 10, 5 e 2.
O programa deve possuir uma assinatura" void realizarSaque(int valor, int* cedulas) " onde: 
- valor: corresponde ao valor lido na função main para ser sacado
- cedulas: vetor de tamanho 7 contendo o valor das cédulas disponíveis.


Nenhuma variável global poderá ser utilizada dentro da função realizarSaque.

Para casos impossíveis o programa deve retornar a mensagem:
" não e possivel sacar o valor solicitado "

Para valores inseridos menores que 0 o programa deve retornar a mensagem:
" Informe um valor maior que 0 "

Meu código:
 

#include<stdio.h>

int realizarSaque(int valor, int *cedulas){
    int n200,n100,n50,n20,n10,n5,n2;

    n200=valor/200;
    n100=(valor%200)/100;
    n50=((valor%200)%100)/50;
    n20=(((valor%200)%100)%50)/20;
    n10=((((valor%200)%100)%50)%20)/10;
    n5=(((((valor%200)%100)%50)%20)%10)/5;
    n2=((((((valor%200)%100)%50)%20)%10)%5)/2;
    
    printf("%d cedula(s) de 200.00",n200);
    printf("\n%d cedula(s) de 100.00",n100);       
    printf("\n%d cedula(s) de 50.00",n50);
    printf("\n%d cedula(s) de 20.00",n20);
    printf("\n%d cedula(s) de 10.00",n10);
    printf("\n%d cedula(s) de 5.00",n5);
    printf("\n%d cedula(s) de 2.00",n2);
    return 0;
    }

int main()
{
    int valor, cedulas[7] = {200, 100, 50, 20, 10, 5, 2};
    
    printf("Digite o valor a ser sacado: ");
    scanf("%d", &valor);
    
    if(valor == 1 || valor == 3){
        printf("não e possivel sacar o valor solicitado");
        return 0;
    }
    if(valor > 0){
    realizarSaque(valor, cedulas);
    return 0;
    }
    if(valor <= 0){
        printf("Informe um valor maior que 0");
        return 0;
    }
    else{
        main();
    }
    return 0;
}

Não copiar essa parte:
<CODE>
 

Postado (editado)

Para sua avaliação:
 

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

int saque ( unsigned int *restrict notas,
            const unsigned int *restrict valores,
            unsigned int nvalores,
            unsigned int valor )
{
  // Zera os contadores.
  memset ( notas, 0, nvalores * sizeof ( int ) );

  for ( int i = 0; i < nvalores; i++ )
  {
    // casos especiais
    // Problemas com R$ 6,00 e R$ 8,00 restantes...
    if ( valores[i] == 5 )
    {
      // Assume que o último elemento equivale às
      // notas de R$ 2,00... revise isso se não for o caso.
      if ( valor == 6 )
      {
        notas[nvalores - 1] = 3;
        valor = 0;
        break;
      }
      else if ( valor == 8 )
      {
        notas[nvalores - 1] = 4;
        valor = 0;
        break;
      }
    }

    while ( valor >= valores[i] )
    {
      notas[i]++;
      valor -= valores[i];
    }
  }

  return valor == 0;
}

int main ( void )
{
  static const unsigned int valores[7] = { 200, 100, 50, 20, 10, 5, 2 };
  unsigned int notas[7];
  unsigned int valor;

  fputs ( "Quantidade desejada: ", stdout );
  fflush ( stdout );

  if ( scanf ( "%u", &valor ) == 1 )
  {
    if ( ! saque ( notas, valores, 7, valor ) )
    {
    error:
      fputs ( "Valor inválido.\n", stdout );
      return EXIT_FAILURE;
    }

    // Mostrar notas.
    for ( int i = 0; i < 7; i++ )
      printf ( "R$ %3u,00 -> %u notas.\n", valores[i], notas[i] );
  }
  else
    goto error;

  return EXIT_SUCCESS;
}

[]s
Fred

Editado por fredericopissarra

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...