lista_t* cliente_inclui(lista_t *clientes) { cliente_t *cliente = NULL; bool done = false; cliente = (cliente_t*)malloc(sizeof(cliente_t)); printf("--- Inserindo novo Cliente ---\n"); while (!done) { printf("CPF: "); cliente->cpf = string_get(CLIENTE_CPF_MAX_LEN); if (check_cancelar(cliente->cpf)) { free(cliente); return clientes; } if (lista_busca(clientes, cliente, compara_cliente)) { printf("O cliente de CPF %s ja existe.\n", cliente->cpf); continue; } printf("Nome: "); cliente->nome = string_get(CLIENTE_NOME_MAX_LEN); if (check_cancelar(cliente->nome)) { free(cliente); return clientes; } printf("Telefone: "); cliente->telefone = string_get(CLIENTE_TELEFONE_MAX_LEN); if (check_cancelar(cliente->telefone)) { free(cliente); return clientes; } printf("---\nDados fornecidos:\n"); printf("CPF: %s\n", cliente->cpf); printf("Nome: %s\n", cliente->nome); printf("Telefone: %s\n", cliente->telefone); if (true == confirmar_opcao()) { done = true; } else { done = false; } } return lista_insere(clientes, cliente); }
lista *lerFilmes(FILE *ficheiro) { char buffer[256], *nlptr; lista *filmes; if (ficheiro == NULL) return NULL; filmes = lista_nova(); while (!feof(ficheiro)) { fgets(buffer, 255, ficheiro); nlptr = strchr(buffer, '\n'); if (nlptr) *nlptr = '\0'; lista_insere(filmes, buffer, NULL); } return filmes; }
lista *pesquisa_destinos(grafo *rotas, lista *aeroportos, const char *origem) { /* prob 2.2 - a implementar */ int i=0, j; vetor *v; elemento *e; lista *l= lista_nova(); for(e=aeroportos->inicio;e!=NULL&& strcmp(e->str, origem);e=e->proximo){ i++; } v = v_sucessores(rotas, i); for(i=0;i<v->tamanho;i++){ e = aeroportos->inicio; for(j=0; j<vetor_elemento(v, i);j++){ e=e->proximo; } lista_insere(l, e->str, NULL); } vetor_apaga(v); return l; }
int main() { FILE *f; grafo *g = NULL; lista *aeroportos; char *buff; size_t n; setvbuf(stdout, NULL, _IONBF, 0); f = fopen("aeroportos.txt", "r"); aeroportos = lista_nova(); buff = NULL; n = 0; while (getline(&buff, &n, f) != -1) { buff[strlen(buff) - 1] = '\0'; lista_insere(aeroportos, buff, NULL); } free(buff); fclose(f); g = carrega_rotas(aeroportos, "rotas.txt"); /* teste problema 2.1 */ { FILE *f; char tempo[5], origem[10]; lista *tempos, *origens; printf("* Problema 2.1 *\n"); f = fopen("chegadas.txt", "r"); tempos = lista_nova(); origens = lista_nova(); while (fscanf(f, "%s\t%s", tempo, origem) == 2) { lista_insere(tempos, tempo, NULL); lista_insere(origens, origem, NULL); } if (proximas_n_chegadas(tempos, origens, aeroportos, 5) != 1) printf("Erro ao executar a funcao\n"); lista_apaga(tempos); lista_apaga(origens); fclose(f); } /* teste problema 2.2 */ { printf("\n* Problema 2.2 *\n"); const char *origem = "Lille (FR)"; elemento *elem; lista *l = pesquisa_destinos(g, aeroportos, origem); if (l == NULL) printf("Destinos diretos a partir de %s = 0\n", origem); else { printf("Destinos diretos a partir de %s = %d\n", origem, lista_tamanho(l)); for (elem = l->inicio; elem != NULL; elem = elem->proximo) printf("%s\n", elem->str); lista_apaga(l); } } grafo_apaga(g); lista_apaga(aeroportos); return 0; }
lista_t* operacao_inclui(lista_t *operacoes, lista_t *agencias, lista_t *contas) { operacao_t *operacao = NULL; agencia_t *agencia; conta_t *conta; bool done = false; bool operacao_tipo_ok = false; bool operacao_ok = false; bool agencia_ok = false; bool conta_ok = false; bool confirmar = false; char *str = NULL; operacao = (operacao_t*)malloc(sizeof(operacao_t)); operacao->montante = 0.0; operacao->conta_destino_numero = 0; agencia = (agencia_t*)malloc(sizeof(agencia_t)); conta = (conta_t*)malloc(sizeof(conta_t)); printf("--- Realizando nova tranzacao ---\n"); while (!done) { if (!operacao_ok) { printf("Codigo: "); str = string_get(OPERACAO_CODIGO_MAX_LEN); if (check_cancelar(str)) { free(str); return operacoes; } operacao->codigo = (unsigned int)atoi(str);; free(str); str = NULL; if (lista_busca(operacoes, operacao, compara_operacao)) { printf("A operacao de codigo %d ja existe. Use um numero diferente.\n", operacao->codigo); continue; } operacao_ok = true; } if (!agencia_ok) { printf("Agencia codigo: "); str = string_get(AGENCIA_CODIGO_MAX_LEN); if (check_cancelar(str)) { free(str); return operacoes; } agencia->codigo = (unsigned int)atoi(str); free(str); str = NULL; if (!lista_busca(agencias, agencia, compara_agencia)) { printf("A agencia de codigo %d nao existe.\n", agencia->codigo); continue; } agencia_ok = true; } if (!conta_ok) { printf("Numero da conta: "); str = string_get(CONTA_NUMERO_MAX_LEN); if (check_cancelar(str)) { free(str); return operacoes; } conta->numero = (unsigned int)atoi(str); free(str); str = NULL; if (!lista_busca(contas, conta, compara_conta)) { printf("A conta de numero %d nao existe.\n", conta->numero); continue; } conta_ok = true; operacao->agencia_codigo = agencia->codigo; } if (!operacao_tipo_ok) { printf("Tipo de operacao (saldo, pagamento, saque, transferencia): "); str = string_get(OPERACAO_TIPO_MAX_LEN); if (check_cancelar(str)) { free(str); return operacoes; } string_to_lower(str); if (compara_string("saldo", str)) operacao->tipo = Saldo; else if (compara_string("pagamento", str)) operacao->tipo = Pagamento; else if (compara_string("saque", str)) operacao->tipo = Saque; else if (compara_string("transferencia", str)) operacao->tipo = Transferencia; else { printf("Operacao desconhecida: %s. Tente novamente.\n", str); free(str); str = NULL; continue; } operacao_tipo_ok = true; operacao->conta_numero = conta->numero; } if ((operacao_tipo_ok) && (operacao->tipo == Transferencia)) { printf("Numero da conta de destino da transferencia: "); str = string_get(CONTA_NUMERO_MAX_LEN); if (check_cancelar(str)) { free(str); return operacoes; } conta->numero = (unsigned int)atoi(str); free(str); str = NULL; if (!lista_busca(contas, conta, compara_conta)) { printf("A conta de numero %d nao existe.\n", conta->numero); continue; } conta_ok = true; operacao->conta_destino_numero = conta->numero; } operacao->data = get_time(); printf("---\nDados fornecidos:\n"); operacao_imprime(operacao); if (true == confirmar_opcao()) { done = true; } else { done = false; operacao_ok = false; agencia_ok = false; conta_ok = false; operacao_tipo_ok = false; } } confirmar = false; if (operacao->tipo == Saldo) { operacao_saldo(operacao, contas); confirmar = true; } else if (operacao->tipo == Pagamento) { if (operacao_pagamento(operacoes, operacao, contas)) confirmar = true; } else if (operacao->tipo == Saque) { if (operacao_saque(operacoes, operacao, contas)) confirmar = true; } else if (operacao->tipo == Transferencia) { if (operacao_transferencia(operacoes, operacao, contas)) confirmar = true; } if (confirmar == true) return lista_insere(operacoes, operacao); else return operacoes; }
int main() { /* teste problema 1.1 */ { vetor *v; pilha *res; int i; char data[][11] = {"Estocolmo", "Oslo", "Helsinquia", "Copenhaga", "Reykjavik"}; printf("* Problema 1.1 *\n"); v = vetor_novo(); for(i=0; i<5; i++) vetor_insere(v, data[i], -1); printf("Vetor: "); for(i=0; i<v->tamanho; i++) printf("%s ", vetor_elemento(v, i)); printf("\n"); res = vetor_pilha(v); printf("Pilha: "); if(res) { while(!pilha_vazia(res)) { printf("%s ", pilha_top(res)); pilha_pop(res); } } printf("\n"); if(v->tamanho != 5) printf("ERRO: Vetor original nao deve ser alterado!\n"); else { for(i=0; i<5; i++) if(strcmp(data[i], vetor_elemento(v, i)) != 0) { printf("ERRO: Vetor original nao deve ser alterado!\n"); break; } } vetor_apaga(v); pilha_apaga(res); } printf("\n"); /* teste problema 1.2 */ { int res, i, ok; objeto obj; char data[][20] = { "Paul Atreides", "Leto Atreides", "Voran Atreides", "Vladimir Harkonnen", "Dmitri Harkonnen", "Hundro Moritani" }; tabela_dispersao td1, td2; printf("* Problema 1.2 *\n"); td1 = tabela_cria(11, hash_djbm); td2 = tabela_cria(7, hash_djbm); for(i=0; i<6; i++) { strcpy(obj.chave, data[i]); strcpy(obj.valor, data[i]); tabela_adiciona(td1, &obj); tabela_adiciona(td2, &obj); } res = tabela_redimensiona(td1, 7); if(td1->tamanho == 7) { elemento *aux1, *aux2; for(i=0; i<td1->tamanho; i++) { aux2 = td2->elementos[i]; while(aux2 != NULL) { ok = 0; aux1 = td1->elementos[i]; while(aux1 != NULL) { if(strcmp(aux1->obj->chave, aux2->obj->chave) == 0) { ok = 1; break; } aux1 = aux1->proximo; } if(!ok) { printf("ERRO: Elemento %s em posicao errada\n", aux2->obj->chave); break; } aux2 = aux2->proximo; } } if(ok) printf("Tabela de dispersao redimensionada corretamente.\n"); } else printf("ERRO: Tabela de dispersao deveria ter novo tamanho.\n"); tabela_apaga(td1); tabela_apaga(td2); printf("\n"); } /* teste problema 1.3 */ { int i; arvore_avl *avl; lista *res, *indicacoes; char data[][20] = { "prog2", "mt2", "trabalho", "e'", "muito", "zzzz...", "dificil", "facil", "nada", "verdade"}; avl = avl_nova(); printf("* Problema 1.3 *\n"); for(i=0; i<10; i++) avl_insere(avl, data[i]); indicacoes = lista_nova(); lista_insere(indicacoes, "esquerda", -1); lista_insere(indicacoes, "esquerda", -1); lista_insere(indicacoes, "direita", -1); res = descobre_segredo(avl, indicacoes); printf("Segredo: "); if(res) { for(i=0; i<res->tamanho; i++) printf("%s ", lista_elemento(res, i)); } printf("\n\nSegredo (impl. recursiva): "); descobre_segredo_recurs(avl->raiz, indicacoes); avl_apaga(avl); lista_apaga(indicacoes); lista_apaga(res); printf("\n\n"); } return 0; }
lista_t* conta_inclui(lista_t *contas, lista_t *agencias, lista_t *clientes) { conta_t *conta = NULL; agencia_t *agencia = NULL; cliente_t *cliente = NULL; bool done = false; bool conta_numero_ok = false; bool agencia_ok = false; bool cliente_ok = false; char *str = NULL; conta = (conta_t*)malloc(sizeof(conta_t)); agencia = (agencia_t*)malloc(sizeof(agencia_t)); cliente = (cliente_t*)malloc(sizeof(cliente_t)); printf("--- Inserindo nova Conta ---\n"); while (!done) { if (!conta_numero_ok) { printf("Numero: "); str = string_get(CONTA_NUMERO_MAX_LEN); if (check_cancelar(str)) { free(str); return contas; } conta->numero = (unsigned int)atoi(str);; free(str); str = NULL; if (lista_busca(contas, conta, compara_conta)) { printf("A conta ja de numero %d ja existe. Use um numero diferente.\n", conta->numero); continue; } conta_numero_ok = true; } if (!agencia_ok) { printf("Agencia codigo: "); str = string_get(AGENCIA_CODIGO_MAX_LEN); if (check_cancelar(str)) { free(str); return contas; } agencia->codigo = (unsigned int)atoi(str); free(str); str = NULL; if (!lista_busca(agencias, agencia, compara_agencia)) { printf("A agencia de codigo %d nao existe.\n", agencia->codigo); continue; } agencia_ok = true; } if (!cliente_ok) { printf("Cliente CPF: "); cliente->cpf = string_get(CLIENTE_CPF_MAX_LEN); if (check_cancelar(cliente->cpf)) { free(cliente); return contas; } if (!lista_busca(clientes, cliente, compara_cliente)) { printf("O cliente de CPF %s nao existe.\n", cliente->cpf); continue; } if (conta_busca_cliente_agencia(contas, cliente, agencia)) { printf("O cliente de CPF %s ja tem uma conta na Agencia de codigo %d.\n", cliente->cpf, agencia->codigo); agencia_ok = false; continue; } cliente_ok = true; } printf("Saldo: "); str = string_get(CONTA_SALDO_MAX_LEN); conta->saldo = (double)atof(str); free(str); str = NULL; printf("Limite: "); str = string_get(CONTA_LIMITE_MAX_LEN); conta->limite = (double)atof(str); free(str); str = NULL; conta->data_criacao = get_time(); printf("---\nDados fornecidos:\n"); printf("Conta numero: %d\n", conta->numero); printf("Agencia codigo: %d\n", agencia->codigo); printf("Cliente CPF: %s\n", cliente->cpf); printf("Data de criacao: %s\n", conta->data_criacao); printf("Saldo: %.2lf\n", conta->saldo); printf("Limite: %.2lf\n", conta->limite); if (true == confirmar_opcao()) { done = true; } else { done = false; conta_numero_ok = false; agencia_ok = false; cliente_ok = false; } } conta->cliente_cpf = cliente->cpf; conta->agencia_codigo = agencia->codigo; return lista_insere(contas, conta); }