Ir ao conteúdo
  • Cadastre-se

C Código de caixa eletrônico - C


Breno Rangel
Ir à solução Resolvido por devair1010,

Posts recomendados

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 possível 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:

<CODE>

#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 possível 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;
}

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

@Breno Rangel    use o botão code "<> "  que está desenhado lá na barra de ferramentas da janela de postar ,   e você está fazendo uma chama recursiva da função main ,  isso não é boa ideia ,  melhor usar um lalo de repetição qq , como while ou do / while , e seu código ficaria assim  :

#define _WIN32_WINNT 0x600
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int prototipo(int , int , int* );
int realizarSaque(int valor, int *cedulas);
int main()
{
  HANDLE _h = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute( _h , 15 + (12 << 4 ) );
  int valor, cedulas[7] = {200, 100, 50, 20, 10, 5, 2};
  do
  {
    printf("Digite o valor a ser sacado: ");
    scanf("%d", &valor);

    if(valor == 1 || valor == 3)
    {
      printf("não e possível sacar o valor solicitado");
      return 0;
    }
    if(valor > 0)
    {
      realizarSaque(valor, cedulas);
      /// return 0;
    }
    if(valor <= 0)
    {
      printf("Informe um valor maior que 0");
      break;
    }
  }while( 1 );
  SetConsoleTextAttribute( _h , 7 + ( 0 << 4 ) );
  printf("\n\n\n");
  return 0;
}
int prototipo(int a , int b , int* c )
{
  return 0;
}
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("\a                        \n\
        \r%3d cedula(s) de R$ 200.00\n\
        \r%3d cedula(s) de R$ 100.00\n\
        \r%3d cedula(s) de R$  50.00\n\
        \r%3d cedula(s) de R$  20.00\n\
        \r%3d cedula(s) de R$  10.00\n\
        \r%3d cedula(s) de R$   5.00\n\
        \r%3d cedula(s) de R$   2.00\n",
        n200,n100,n50,n20,n10,n5,n2   ); /// apenas um printf eh mais rápido
  return 0;
}

 

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!