Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

foxton

Caixa Eletrônico, C

Recommended Posts

Olá pessoal, preciso de uma ajuda com um trabalho para a faculdade. Pelo visto esse problema é bem conhecido pelo pessoal, mas ainda não encontrei a resposta para minha duvida. Preciso de uma maneira para calcular quantas notas de 100,50,10,5 e 1 para o valor sacado.

 

segue oque eu já fiz:

 


#include <stdio.h>
#include <conio.h>

main ()
{ 
     int n1, n5, n10, n50, n100, calc, saldo,op,depo,d1=0,d5=0,d10=0,d50=0,d100=0,saque,valor;
     printf("\nEntre com a quantidade inicial de notas de 100:\n-->");
     scanf("%d",&n100);
     printf("\nEntre com a quantidade inicial de notas de 50:\n-->");
     scanf("%d",&n50);
     printf("\n Entre com a quantidade inicial de notas de 10:\n-->");
     scanf("%d",&n10);
     printf("\n Entre com a quantidade inicial de notas de 5:\n-->");
     scanf("%d",&n5);
     printf("\n Entre com a quantidade inicial de notas de 1:\n-->");
     scanf("%d",&n1);
     printf("\n\nSituacao atual: %d %d %d %d %d",n100, n50, n10, n5, n1);
     saldo= (n100 * 100) + (n50 * 50) + (n10 * 10) + (n5 * 5) + (n1 * 1);
     printf("\tSaldo atual %d", saldo);
     
     printf("\n\nDigite 1 para saque, 2 para deposito:\n-->");
     scanf("%d",&op);
     if(op==2){
     printf("\n\nVoce escolheu a opcao 2 - Deposito:");
     printf("\n\nEntre com a quantidade de notas de 100:\n-->");
     scanf("%d",&d100);
     printf("\nEntre com a quantidade de notas de 50:\n-->");
     scanf("%d",&d50);
     printf("\n Entre com a quantidade de notas de 10:\n-->");
     scanf("%d",&d10);
     printf("\n Entre com a quantidade de notas de 5:\n-->");
     scanf("%d",&d5);
     printf("\n Entre com a quantidade de notas de 1:\n-->");
     scanf("%d",&d1);
     saldo= ((d100 * 100) + (d50 * 50) + (d10 * 10) + (d5 * 5) + (d1 * 1) )+saldo;
     n1=n1+d1;
     n5=n5+d5;
     n10=n10+d10;
     n50=n50+d50;
     n100+=d100;
     printf("\nSituacao atual %d %d %d %d %d",n100,n50,n10,n5,n1);
     printf("\t Saldo Atual %d",saldo);
     }
     else if(op==1){
     printf("\n\nVoce escolheu a opcao 1 - Saque:");
     printf("\nDigite o Valor do Saque:\n-->");

     
     
     
     
     
getch();
}

 

Obrigado pela ajuda =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja bem,se você tem que calcular quantas notas de 100,50,5 e 1 para um valor sacado você tem que:

100x + 50y + 5z + w = S

Onde:

S -> saldo

x -> quantidade de notas de 100

y -> quantidade de notas de 50

z -> quantidade de notas de 5

w -> quantidade de notas de 1

Se trocarmos a soma de duas parcelas por uma variavel,teremos por exemplo:

a = 100x + 50y

b = 5z + w

=> a + b = S

Como S é um número natural,temos em mãos uma equação diofantina.

Uma equação diofantina da forma ax + by = w tem solução se w|mdc(a,B) onde suas soluções inteiras são dadas por:

x = x0 + (b/d)k

y = y0 - (a/d)k

d = mdc(a,B)

Onde k é um inteiro arbitrario.

Chega-se nas soluções naturais fazendo-se x > 0 e y > 0 para descobrir o intervalo de k válido.

Descobre-se então as soluções naturais para a e b,e para cada solução tenta-se achar a solução natural para o sub-sistema.Se não acharmos criamos mais sub-sistemas de a e b diversificando os mesmos (ao invés de a = 100x + 50y, fazemos por exemplo a = 100x + w).

 

Por exemplo:

100x + 50y + 5z + w = 15

->

a = 100x + 50y

b = 5z + w

 

a + b = 15

a0 = 0

b0 = 15

Para b = 15 procuramos uma solução do sub-sistema 5z + w = 15.

Temos uma solução válida que é z0 = 2,w0 = 5.

Para a = 0 procuramos uma solução natural do sub-sistema 100x + 50y = 0.

É um sistema linear homogeneo,logo de cara aceita a solução (0,0).

Logo temos como uma das possiveis soluções (0,0,2,5).

Se não achassemos,tentariamos para os outros valores de a e b.Se ainda não achassemos,diversificariamos a e b e repetiriamos o processo.

---

É dificil de te explicar,não sou muito bom em me comunicar.

O que eu falo é que é pura matemática aplicada.Estude teoria dos números e equações diofantinas lineares que conseguirá.

Existem meios (até relativamente simples) de melhorar bastante o desempenho do descrito acima.

Abraço!

 

Ps: se quiser mais exemplos,até na programação,favor postar.

Ps²: se quiser também te dou uma mãozinha extra no programa final,sei que para quem está iniciando e não tem tanto conhecimento matemático é um programa bem complicadinho.

Ps³: tantos sub-sistemas e blah blah blah porque o método de diofante só funciona para sistemas de k+1 icógnitas e k equações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eibon, obrigado pela sua ajuda, mas achei o método matemático muito complicado para implementar. Até pq não entendi direito ^^

 

Consegui fazer do jeito abaixo:

 

ETAPAS
1.a definir a quantidade de notas no caixa
1.b definir o saldo atual do caixa
1.c imprime a quantidade atual do caixa

2.a solicita a operacao
2.b verificar operacao

3. deposito
3.a solicita as notas que serao depositadas
3.b soma a quantidade informada a quantidade atual
3.c imprime o saldo atual

4. saque
4.a le a quantidade a ser sacada
4.b verifica se tem o valor requisitado em saldo
4.c entrega o minimo de notas possiveis
4.d recalcula o saldo atual
4.e imprime o saldo atual

*********************************************/
#include <stdio.h>
#include <conio.h>

int main()
{
	// quantidade de notas no caixa
	int n1, n5, n10, n50, n100;
	
	// notas informadas no deposito
	int d1, d5, d10, d50, d100;
	
	// notas sacadas
	int s1 = 0, s5 = 0, s10 = 0, s50 = 0, s100 = 0;
	
	// variaveis auxiliares
	int saque, saldo, op;
	
	// 1.a definir a quantidade de notas no caixa
	printf("\nEntre com a quantidade inicial de notas de 100:\n-->");
	scanf("%d",&n100);
	
	printf("\nEntre com a quantidade inicial de notas de 50:\n-->");
	scanf("%d",&n50);
	
	printf("\n Entre com a quantidade inicial de notas de 10:\n-->");
	scanf("%d",&n10);
	
	printf("\n Entre com a quantidade inicial de notas de 5:\n-->");
	scanf("%d",&n5);
	
	printf("\n Entre com a quantidade inicial de notas de 1:\n-->");
	scanf("%d",&n1);
	
	printf("\n\nSituacao atual: %d %d %d %d %d",n100, n50, n10, n5, n1);
	
	// 1.b definir o saldo atual do caixa
	saldo = (n100 * 100) + (n50 * 50) + (n10 * 10) + (n5 * 5) + (n1 * 1);
	
	// 1.c imprime a quantidade atual do caixa
	printf("\tSaldo atual %d", saldo);
	
	// 2.a solicita a operacao
	printf("\n\nDigite 1 para saque, 2 para deposito:\n-->");
	scanf("%d",&op);
	
	// 2.b verificar operacao
		
	// 3. deposito
	if(op==2){
		printf("\n\nVoce escolheu a opcao 2 - Deposito:");
		// 3.a solicita as notas que serao depositadas
		printf("\n\nEntre com a quantidade de notas de 100:\n-->");
		scanf("%d",&d100);
		
		printf("\nEntre com a quantidade de notas de 50:\n-->");
		scanf("%d",&d50);
		
		printf("\n Entre com a quantidade de notas de 10:\n-->");
		scanf("%d",&d10);
		
		printf("\n Entre com a quantidade de notas de 5:\n-->");
		scanf("%d",&d5);
		
		printf("\n Entre com a quantidade de notas de 1:\n-->");
		scanf("%d",&d1);
		
		// 3.b soma a quantidade informada a quantidade atual
		saldo = ((d100 * 100) + (d50 * 50) + (d10 * 10) + (d5 * 5) + (d1 * 1) ) + saldo;
		n1   += d1;
		n5   += d5;
		n10  += d10;
		n50  += d50;
		n100 += d100;
		
		// 3.c imprime o saldo atual
		printf("\nSituacao atual %d %d %d %d %d", n100, n50, n10, n5, n1);
		printf("\t Saldo Atual %d", saldo);
	
	// 4. saque
	} else if(op == 1){
		printf("\n\nVoce escolheu a opcao 1 - Saque:");
		
		// 4.a le a quantidade a ser sacada
		printf("\nDigite o Valor do Saque:\n-->");
		scanf("%d", &saque);
		
		// 4.b verifica se tem o valor requisitado em saldo
		if(saldo < saque){
			printf("Saldo atual insuficiente");
			return 0;
		}
		
		// 4.c entrega o minimo de notas possiveis
		if(saque >= 100){
			s100 = saque / 100;
			if(n100 - s100 < 0) {
				printf("Numero de notas de 100 insuficiente, dirija-se ao caixa ao lado");
				getch();
				return 0;
			}

			n100 = n100 - s100;
			saque = saque % 100;
		}
		
		if(saque >= 50){
			s50 = saque / 50;
			if(n50 - s50 < 0) {
				printf("Numero de notas de 50 insuficiente, dirija-se ao caixa ao lado");
				getch();
				return 0;
			}
			n50 = n50 - s50;
			saque = saque % 50;
		}
		
		if(saque >= 10){
			s10 = saque / 10;
			if(n10 - s10 < 0) {
				printf("Numero de notas de 10 insuficiente, dirija-se ao caixa ao lado");
				getch();
				return 0;
			}
			n10 = n10 - s10;
			saque = saque % 10;
		}

		if(saque >= 5){
			s5 = saque / 5;
			if(n5 - s5 < 0) {
				printf("Numero de notas 5 insuficiente, dirija-se ao caixa ao lado");
				getch();
				return 0;
			}
			n5 = n5 - s5;
			saque = saque % 5;
		}

		if(saque >= 1){
			s1 = saque / 1;
			if(n1 - s1 < 0) {
				printf("Numero de notas 1 insuficiente, dirija-se ao caixa ao lado");
				getch();
				return 0;
			}
			n1 = n1 - s1;
			saque = saque % 1;
		}
		
		printf("\nForam usadas:\n%d notas de 100\n%d notas de 50\n%d notas de 10\n%d notas de 5\n%d notas de 1",
			s100, s50, s10, s5, s1);
		
		
		// 4.d recalcula o saldo atual
		saldo = (n100 * 100) + (n50 * 50) + (n10 * 10) + (n5 * 5) + (n1 * 1);
		
		// 4.e imprime o saldo atual
		printf("\n\nSituacao atual %d %d %d %d %d", n100, n50, n10, n5, n1);
		printf("\t Saldo Atual %d", saldo);
	}
	
	// fim
	getch();
}

 

Se alguém tiver alguma sujestão, ela será bem vinda : )

 

Até mais e obrigado pela ajuda o/

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>

int main() {

unsigned int valor;
scanf("%ud", &valor);


puts("São necessárias ");
do {
if (valor >= 100) {
	printf("%d notas de 100\n", valor / 100);
	valor %= 100;
} else if (valor >= 50) {
	printf("%d notas de 50\n", valor / 50);
	valor %= 50;
} else if (valor >= 10) {
	printf("%d notas de 10\n", valor / 10);
	valor %= 10;
} else if (valor >= 5) {
	printf("%d notas de 5\n", valor / 5);
	valor %= 5;
} else if (valor > 0){
	printf("%d notas de 1\n", valor);
	valor = 0;
}
} while (valor > 0);
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.