Jump to content

Código programa de caixa eletrônico - C


Breno Rangel

Recommended Posts

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>
 

Link to comment
Share on other sites

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

Edited by fredericopissarra
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...