lista_t* conta_remove_agencia(lista_t* contas, agencia_t* agencia) { conta_t *conta; lista_t *item; item = contas; while (!lista_vazia(item)) { conta = (conta_t*)item->dado; if (conta->agencia_codigo == agencia->codigo) { printf("Aviso: A conta %d da agencia %d sera removida.\n", conta->numero, agencia->codigo); contas = lista_remove(contas, conta, compara_conta); } item = item->prox; } return contas; }
void imprimi_lista(Celula* cel, int op){ Celula *tmp = cel->prox; if(lista_vazia(cel)){ printf("A lista esta vazia!\n"); }else{ if(op == 1){ printf("info\tendereco do prox\n"); while(tmp != NULL){ printf("%d\t%d\n", tmp->info, &(tmp->prox)); tmp = tmp->prox; } system("pause"); }else{ while(tmp != NULL){ printf("%d", tmp->info); tmp->prox != NULL ? printf("->") : printf(".\n"); tmp = tmp->prox; } } } }
lista_t* operacao_remove_conta(lista_t* operacoes, conta_t *conta) { operacao_t *operacao; lista_t *item; bool teste_transferencia = false; while (!lista_vazia(item)) { operacao = (operacao_t*)item->dado; // Se a conta recebeu uma transferencia, a operação também é removida. teste_transferencia = (operacao->tipo == Transferencia) && (operacao->conta_destino_numero == conta->numero); if (teste_transferencia || (operacao->conta_numero == conta->numero)) { printf("Aviso: A operacao %d da conta %d sera removida.\n", operacao->codigo, conta->numero); operacoes = lista_remove(operacoes, operacao, compara_operacao); } item = item->prox; } return operacoes; }
/* Como a lista é representado por nodos simplesmente bastar criar um novo nodo e colocá-lo no início da lista se ela estiver vazia */ Lista* lista_insere (Lista* lst, infotype valor, infotype peso){ Lista* aux = (Lista *) malloc(sizeof(Lista)); aux -> info = valor; aux -> peso = peso; if (lista_vazia(lst)){ aux -> prox = aux; } else { aux -> prox = lst -> prox; lst -> prox = aux; } return aux; }
double montante_diario_usado(lista_t *operacoes, conta_t *conta, operacao_tipo_t tipo) { char *data = get_time(); double soma = 0.0; lista_t *item; operacao_t *operacao; item = operacoes; while (!lista_vazia(item)) { operacao = (operacao_t*)item->dado; if ((operacao->tipo == tipo) && (operacao->conta_numero == conta->numero)) { if (compara_data(data, operacao->data)) { soma += operacao->montante; } } item = item->prox; } return soma; }
bool operacao_pagamento(lista_t *operacoes, operacao_t *operacao, lista_t *contas) { char *str; double pagamento = 0.0; double limite_diario_disponivel = 0.0; bool done = false; lista_t *conta_item; conta_item = contas; conta_t *conta; while (!lista_vazia(conta_item)) { conta = (conta_t*)conta_item->dado; if (operacao->conta_numero == conta->numero) { limite_diario_disponivel = LIMITE_DIARIO_PAGAMENTO - montante_diario_usado(operacoes, conta, Pagamento); printf("Limite diario disponivel para pagamentos: %.2lf\n", limite_diario_disponivel); while (!done) { printf("Digite o valor do pagamento: "); str = string_get(OPERACAO_MONTANTE_MAX_LEN); if (check_cancelar(str)) { free(str); return false; } pagamento = atof(str); free(str); str = NULL; if ((conta->saldo + conta->limite) < pagamento) { printf("Nao ha dinheiro suficiente na conta para efetuar esta tranzacao.\n"); printf("Saldo em conta: %.2lf\n", conta->saldo); printf("Limite da conta: %.2lf\n", conta->limite); printf("Total disponivel: %.2lf\n", conta->saldo + conta->limite); continue; } if (pagamento > limite_diario_disponivel) { printf("Limite insuficiente. O pagamento nao pode ser realizada.\n"); printf("Limite diario disponivel: %.2lf\n", limite_diario_disponivel); continue; } conta->saldo -= pagamento; operacao->montante = pagamento; done = true; } printf("Efetuando pagamento...\n"); printf("Saldo em conta: %.2lf\n", conta->saldo); } if (done) break; conta_item = conta_item->prox; } return true; }
bool operacao_transferencia(lista_t *operacoes, operacao_t *operacao, lista_t *contas) { char *str; double transferencia = 0.0; double limite_diario_disponivel = 0.0; bool done = false; lista_t *conta_item; conta_item = contas; conta_t *conta; conta_t *conta_destino; while (!lista_vazia(conta_item)) { conta = (conta_t*)conta_item->dado; if (operacao->conta_numero == conta->numero) { limite_diario_disponivel = LIMITE_DIARIO_TRANSFERENCIA - montante_diario_usado(operacoes, conta, Transferencia); printf("Limite diario disponivel para transferencias: %.2lf\n", limite_diario_disponivel); while (!done) { printf("Digite o quanto deseja transferir: "); str = string_get(OPERACAO_MONTANTE_MAX_LEN); if (check_cancelar(str)) { free(str); return false; } transferencia = atof(str); free(str); str = NULL; if ((conta->saldo + conta->limite) < transferencia) { printf("Nao ha dinheiro suficiente na conta para efetuar esta tranzacao.\n"); printf("Saldo em conta: %.2lf\n", conta->saldo); printf("Limite da conta: %.2lf\n", conta->limite); printf("Total disponivel: %.2lf\n", conta->saldo + conta->limite); continue; } if (transferencia > limite_diario_disponivel) { printf("Limite insuficiente. A transferencia nao pode ser realizada.\n"); printf("Limite diario disponivel: %.2lf\n", limite_diario_disponivel); continue; } conta->saldo -= transferencia; operacao->montante = transferencia; done = true; } printf("Transferindo dinheiro...\n"); printf("Saldo em conta: %.2lf\n", conta->saldo); } if (done) break; conta_item = conta_item->prox; } // Deposita o dinheiro na conta de destino conta_item = contas; while (!lista_vazia(conta_item)) { conta_destino = (conta_t*)conta_item->dado; if (operacao->conta_destino_numero == conta_destino->numero) { conta_destino->saldo += transferencia; printf("Depositando %.2lf na conta %d.\n", transferencia, conta_destino->numero); break; } conta_item = conta_item->prox; } return true; }