Ir ao conteúdo
  • Cadastre-se

C Função de Saque de banco em C


Vitor Guilhen

Posts recomendados

Bom, estou com problemas num trabalho da faculdade.. onde tenho que fazer um código para conta em banco, que faça tudo, porém, tenho recursos limitados a coisas que o professor ensinou apenas, e está dando um erro na funçao "Saque", que sempre aparece na tela "Saque realizado", mesmo quando nao deveria acontecer.

 

Este é o código, tem um pouco mais de 500 linhas, mas o erro está na função "Saque", e tambem no switchcase 5 do menu principal, onde se encontra essa opção.

obrigado pra quem ajudar.

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

typedef struct no celula;

struct no
{
	int nmr;
	float saldo;
	struct no *prox;
};

int tamanho(celula *lista)
{
    int cont;
    celula *p;

    p = lista;
    cont = 0;

    while(p != NULL)
    {
        cont++;
        p = p->prox;
    }
    return cont;
}

void ordenaContas(celula *Lista)
{
	int i, j, n, troca;
	float troca2;
	celula *letra, *dpletra;

    n = tamanho(Lista);

	for(i=1; i<=n-1; i++)
	{
	    letra = Lista;
	    dpletra = letra->prox;

		for(j=0; j<n-i; j++)
		{
			if(letra->saldo > dpletra->saldo)
			{
				troca = letra->nmr;
				letra->nmr = dpletra->nmr;
				dpletra->nmr = troca;

				troca2 = letra->saldo;
				letra->saldo = dpletra->saldo;
				dpletra->saldo = troca2;
			}
			letra = dpletra;
			dpletra = letra->prox;
		}
	}
	if(Lista = NULL)
    {
        printf("Lista vazia!!");
    }
}

void ordenaSaldo(celula *Lista)
{
	int i, j, k, n, troca;
	float troca2;
	celula *letra, *dpletra;

    n = tamanho(Lista);

	for(i=1; i<=n-1; i++)
	{
	    letra = Lista;
	    dpletra = letra->prox;

		for(j=0; j<n-i; j++)
		{
			if(letra->nmr > dpletra->nmr)
			{
				troca = letra->nmr;
				letra->nmr = dpletra->nmr;
				dpletra->nmr = troca;

				troca2 = letra->saldo;
				letra->saldo = dpletra->saldo;
				dpletra->saldo = troca2;
			}
			letra = dpletra;
			dpletra = letra->prox;
		}
	}
	if(Lista = NULL)
    {
        printf("Lista vazia!!");
    }
}

void ordenaRico(celula *Lista)
{
	int i, j, k, n, troca;
	float troca2, saldoO;
	celula *letra, *dpletra, *P;

    n = tamanho(Lista);

	for(i=1; i<=n-1; i++)
	{
	    letra = Lista;
	    dpletra = letra->prox;

		for(j=0; j<n-i; j++)
		{
			if(letra->nmr < dpletra->nmr)
			{
				troca = letra->nmr;
				letra->nmr = dpletra->nmr;
				dpletra->nmr = troca;

				troca2 = letra->saldo;
				letra->saldo = dpletra->saldo;
				dpletra->saldo = troca2;
			}
			letra = dpletra;
			dpletra = letra->prox;
		}
	}

	if(Lista == NULL)
    {
        printf("Lista vazia!!");
    }

    P = Lista;
    for(i=0; i<3; i++)
    {
        printf("Conta: %d Saldo: %.2f\n", P->nmr, P->saldo);
        P = P->prox;
    }
}

void ordenaPobre(celula *Lista)
{
	int i, j, k, n, troca;
	float troca2, saldoO;
	celula *letra, *dpletra, *P;

    n = tamanho(Lista);

	for(i=1; i<=n-1; i++)
	{
	    letra = Lista;
	    dpletra = letra->prox;

		for(j=0; j<n-i; j++)
		{
			if(letra->nmr > dpletra->nmr)
			{
				troca = letra->nmr;
				letra->nmr = dpletra->nmr;
				dpletra->nmr = troca;

				troca2 = letra->saldo;
				letra->saldo = dpletra->saldo;
				dpletra->saldo = troca2;
			}
			letra = dpletra;
			dpletra = letra->prox;
		}
	}

	if(Lista == NULL)
    {
        printf("Lista vazia!!");
    }

    P = Lista;
    for(i=0; i<3; i++)
    {
        printf("Conta: %d Saldo: %.2f\n", P->nmr, P->saldo);
        P = P->prox;
    }
}

void imprimir(celula *lista)
{
	celula *p;
	for(p = lista; p != NULL; p = p->prox)
		printf(" %d - %.2f\n ", p->nmr, p->saldo);
}

celula *busca(celula *lista, int nmrConta)
{
	celula *p;
	p = lista;
	while(p != NULL && p->nmr != nmrConta)
		p = p->prox;

	return p;
}

void cadastrar(celula **Lista, int nmrConta, float saldoO)
{
	celula *novo;
	if(busca(*Lista, nmrConta) == NULL)
	{
		novo = (celula *)malloc(sizeof(celula));
		if(novo != NULL)
		{
			novo->nmr = nmrConta;
			novo->saldo = saldoO;
			novo->prox = *Lista;
			*Lista = novo;
		}
		else
			printf("Não há memoria disponivel!!!\n");
	}
	else
		printf("Essa conta já está cadastrada!!!\n");
}

void saldoNegativa(celula *Lista)
{
    int i=0;
    celula *P;
    P = Lista;
    while (P != NULL)
    {
        if(P->saldo < 0){
            i++;
        printf("Conta:%d Saldo:%.2f\n", P->nmr, P->saldo);
        }
        P = P->prox;
    }
    printf("Contas negativadas: %d\n", i);
}

void saldoPositivo(celula *Lista)
{
    int i=0;
    celula *P;
    P = Lista;
    while (P != NULL)
    {
        if(P->saldo > 0){
            i++;
        printf("Conta:%d Saldo:%.2f\n", P->nmr, P->saldo);
        }
        P = P->prox;
    }
    printf("Contas positivas: %d\n", i);
}

void buscaRemove(celula *Lista, celula **apt, celula **ant, int nmrConta)
{
	*ant = NULL;
	*apt = Lista;
	while(*apt != NULL && (*apt)->nmr != nmrConta)
	{
		*ant = *apt;
		*apt = (*apt)->prox;
	}
}

void removeConta(celula **Lista, int nmrConta)
{
	celula *apt, *ant;
	buscaRemove(*Lista, &apt, &ant, nmrConta);
	if(apt != NULL)
	{
		if(ant != NULL)
			ant->prox = apt->prox;
		else
			*Lista = apt->prox;

		free(apt);
		printf("Conta removida.");
	}
	else
		printf("Valor não encontrado!!!\n");
}

void saldoTotalB(celula *Lista)
{
    celula *P;
    float somaTotal = 0;
    for(P = Lista; P!=NULL; P = P->prox)
    {
        somaTotal = somaTotal + P->saldo;
    }
    printf("Dinheiro Total: %.2f\n", somaTotal);
}

void saque(celula *Lista, int nmrConta, float aux)
{
    celula *conta;
   	
   	for(conta = Lista; conta != NULL; conta = conta->prox)
	   {
	   	if(conta->nmr == nmrConta)
		   {
		   	conta->saldo = conta->saldo - aux;
		   	printf("Saque Realizado com sucesso!!");
		   }
	   }
}

/*void transfere(celula **lista, int nrmConta, float aux)
{
	celula *conta;
	
	if(busca(lista, nmrConta)== NULL)
	{
		
	}
}*/

int menu()
{
	int opcao;

	printf("\n\t\tMENU:\n");
	printf("1 - Cadastrar conta\n");
	printf("2 - Remover Conta\n");
	printf("3 - Verificar conta\n");
	printf("4 – Imprimir Relatórios\n");
	printf("5 – Operações (Saque, Depósito ou Transferência)\n");
	printf("6 – Sair (Limpar todas as contas - Finalizar o programa)\n");

	printf("\nInforme o opcao do menu:");
	scanf("%d",&opcao);

	return opcao;
}

int menurelatorio()
{
	int opcao;

	printf("\n\t\tMENU:\n");
	printf("1 - Mostrar ordenado (crescente) por contas\n");
	printf("2 - Mostrar ordenado (crescente) por saldo\n");
	printf("3 - Mostrar as três contas mais ricas\n");
	printf("4 - Mostrar as três contas mais pobres\n");
	printf("5 - Mostrar a quantidade e as contas negativas\n");
	printf("6 - Mostrar a quantidade e as contas positivas\n");
	printf("7 - Mostrar a quantidade de contas cadastradas\n");
	printf("8 - Mostrar o valor total de dinheiro no banco\n");
	printf("0 - Sair (Voltar ao Menu Principal)\n");

	printf("\nInforme o opcao do menu de impressão desejada:");
	scanf("%d",&opcao);

	return opcao;
}

int menuoperacao()
{
	int opcao;

	printf("\n\t\tMENU:\n");
	printf("1 – Saque\n");
	printf("2 – Deposito\n");
	printf("3 – Transferencia\n");
	printf("0 – Sair (Voltar ao Menu Principal)\n");

	printf("\nInforme o opcao do menu de operações desejada:");
	scanf("%d",&opcao);

	return opcao;
}


int main()
{
    setlocale(LC_ALL,"Portuguese");
	int opcao, nmrConta, opcaorelatorio, opcaooperacao, P;
	float saldoO, aux;
	celula *Lista, *auxBusca, *conta;
	Lista = NULL;

	opcao = menu();

	while(opcao != 0)
	{
		switch (opcao)
		{
			case 1:
				printf("Informe o número da conta: ");
				scanf("%d", &nmrConta);
                printf("Informe o saldo da conta: ");
                scanf("%f", &saldoO);
				cadastrar(&Lista, nmrConta, saldoO);
				break;

			case 2:
				printf("Digite a conta desejada a ser removida: \n");
				scanf("%d", &nmrConta);
				removeConta(&Lista, nmrConta);
				break;

			case 3:
				printf("Informe conta a ser buscada: ");
				scanf("%d", &nmrConta);
				auxBusca = busca(Lista, nmrConta);

				if(auxBusca != NULL)
					printf("O elemento %d JÁ esta na lista!\n", auxBusca->nmr);
				else
					printf("O elemento %d NÃO esta na lista!\n", nmrConta);
				break;

			 case 4:

                opcaorelatorio = menurelatorio();
                while(opcaorelatorio != 0)
                {
                    switch (opcaorelatorio)
                    {
                        case 1:
                                ordenaContas(Lista);
                                imprimir(Lista);
                                printf("Lista Ordenada!!!\n\n");
                                break;
                        case 2:
                                ordenaSaldo(Lista);
                                imprimir(Lista);
                                printf("Lista ordenadas por saldo!!!\n\n");
                                break;
                        case 3:
                                ordenaRico(Lista);
                                break;
                        case 4:
                                ordenaPobre(Lista);
                                break;
                        case 5:
                                saldoNegativa(Lista);
                                break;
                        case 6:
                                saldoPositivo(Lista);
                                break;
                        case 7:
                                P = tamanho(Lista);
                                printf("Contas cadastradas: %d\n", P);
                                break;
                        case 8:
                                saldoTotalB(Lista);
                                break;
                        default:
                                printf("Opção inválida!!");

                    }//switch
                    opcaorelatorio = menurelatorio();
                }//while

				break;
             case 5:
                opcaooperacao = menuoperacao();
                while(opcaooperacao != 0)
                {
                    switch (opcaooperacao)
                    {
                        case 1:
                        	printf("Digite o numero da sua conta:\n\n");
                        	scanf("%d", &nmrConta);
                        	
                        	printf("Informe o valor de saque: ");
							scanf("%f", &aux);
                        	
                        	conta = busca(Lista, nmrConta);
                        	
                        	if(conta == NULL)
                        		printf("Conta não encontrada!\n\n");
                        	else
							{
								if(conta->saldo < 0)
								{
									printf("Saldo negativo!\n");
								}
						   	   	if(aux > conta->saldo)
								{
									printf("Saldo insuficiente!\n");
								}
								 if(aux < 0)
								{
									printf("Digite um valor positivo.");
									
								}
								else
								{
									saque(Lista, nmrConta, aux);
								}								
							}

                                break;
                        case 2:

                                break;
                        case 3:

                                break;

                        default:

                                printf("\t\tOpcao do menu invalida!!!\n");

                    }
                     opcaooperacao = menuoperacao();
                }
			default:

				printf("\t\tOpcao do menu invalida!!!\n");

		}//switch

		opcao = menu();
	}//while


	return 0;
}

 

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

Acredito que estão faltando alguns "else" no seu código, pois do jeito que está, a função saque sempre é invocada.Tenta assim:

printf("Digite o numero da sua conta:\n\n");
scanf("%d", &nmrConta);
                     	
printf("Informe o valor de saque: ");
scanf("%f", &aux);
                        	
conta = busca(Lista, nmrConta);
                        	
if(conta == NULL) printf("Conta não encontrada!\n\n");
else if(conta->saldo < 0) printf("Saldo negativo!\n");
else if(aux > conta->saldo) printf("Saldo insuficiente!\n");
else if(aux < 0) printf("Digite um valor positivo.");
else saque(Lista, nmrConta, aux);
break;

 

  • Curtir 1
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!