Ir para conteúdo
Fórum Script Brasil

Minduca

Membros
  • Total de itens

    10
  • Registro em

  • Última visita

Sobre Minduca

Últimos Visitantes

621 visualizações

Minduca's Achievements

0

Reputação

  1. Olá a todos, após a tabela hash com lista encadeada, estou agora em arvore binária. Fiz um código com menu e tudo mais, ele insere as chaves ok, mas quando vou listá-las não aparece nada?? Gostaria que atentassem para a criação da arvore vazia e da chave RAIZ no antes do Main e depois eu tenho a funçao insere que é a opção 1 e recebe o novo valor e também a arvore raiz criada anteriormente, esta correto isso? segue código: #include<stdio.h> #include<stdlib.h> #include<malloc.h> /*============================================================================*/ /* PROGRAMA PARA GERENCIAR DADOS NUMA ÁRVORE */ /*============================================================================*/ struct arv { char chave; struct arv *esq; struct arv *dir; }; typedef struct arv Arv; /* ----------------------------- Protótipos ----------------------------------*/ Arv *criar_v(void); Arv *cria_raiz(char v, Arv *sae, Arv *sad); Arv *insere(char v, Arv *a); void pesquisa_um_imprime(char v, Arv *a); void pesquisa_todos_imprime(Arv *a); int pesquisa_todos(Arv *a, int achou); Arv *limpa_arv(Arv *a); /* Arv *deleta(char c, Arv *a); */ /* --------------------------------- MAIN ------------------------------------*/ main(void) { /* abre MAIN */ int cont, n, achou=0; char opcao, v; Arv *raiz; Arv *a; Arv *sae, *sad; printf("\nEntre com a RAIZ da Arvore = "); scanf("%s",&v); a = criar_v(); /* ------> AQUI ESTA CERTO O CRIAR A ARVORE VAZIA??? */ raiz = cria_raiz(v,a,a); /* ----> crio a arvore com o valor RAIZ */ /* -------------------------------- INÍCIO -----------------------------------*/ do { /* abre do while */ system("cls"); printf("\n\n GERENCIAMENTO DE ÁRVORE \n\n"); printf("1. Inserir\n"); printf("2. Deletar\n"); printf("3. Pesquisar Um\n"); printf("4. Pesquisa Todos\n"); printf("5. Limpa Arv\n"); printf("0. Sair\n"); printf("\nEntre com sua opcao: "); scanf("%s", &opcao); switch(toupper(opcao)) { /* abre switch */ case '1': { printf("\nEntre com a chave = "); scanf("%s",&v); a = insere(v,raiz); /* --> AQUI RECEBO A ARVORE INICIALIZADA com */ /* a raiz para entrar com o 2º valor, ESTA CORRETO?? */ } break; case '2': { achou = pesquisa_todos(raiz,achou); if (achou == 0) printf("\n\n Arvore não contem Registros!"); else { printf("\nEntre com o valor da chave a ser deletada = "); scanf("%d",&v);} /* i = deleta(v,a);} */ } getch(); break; case '3': { achou = pesquisa_todos(a,achou); if (achou == 0) printf("\n\n Arvore não contem Registros!"); else { printf("\nEntre com o valor da chave a ser pesquisada = "); scanf("%d",&v); pesquisa_um_imprime(v,a); } } getch(); break; case '4': { achou = pesquisa_todos(a,achou); if (achou == 0) printf("\n\n Arvore não contem Registros!"); else pesquisa_todos_imprime(a); getch(); break; } case '5': { achou = pesquisa_todos(a,achou); if (achou == 0) printf("\n\n Arvore não contem Registros!"); else { limpa_arv(a); printf("\n Arvore Limpa!"); } getch(); break; } case '0': { return(0); } default : printf("\nOpcao invalida"); getch(); } /* fecha switch */ } while(opcao != '0'); /* fecha do while */ getch(); } /* fecha MAIN */ /* ---------------------------------------------------------------------------*/ /* FUNÇÕES */ /* ---------------------------------------------------------------------------*/ /* ------------------------------função insere--------------------------------*/ Arv *insere(char v, Arv *a) { Arv *p = a; if(p != NULL) /* faz uma busca na arvore */ { if (p->chave == v) { printf("\n A chave %d já existe",v); return a;} else { if(p->chave < v) insere(v,p->dir); else insere(v,p->esq); } } if (p == NULL) /* chave não encontrada ---> CRIANDO o NÓ -----------------*/ { p = (Arv *)malloc(sizeof(Arv)); p->chave = v; p->esq = NULL; p->dir = NULL; a = p; return a; } } /* ----------------------função pesquisa todos recursiva ---------------------*/ int pesquisa_todos(Arv *a, int achou) { Arv *p = a; while(p != NULL) { achou = 1; } return achou; } /* --------------------------função pesquisa um imprime recursiva-------------*/ void pesquisa_um_imprime(char v, Arv *a) { Arv *p = a; while(p != NULL) { if (p->chave == v) { printf("\n Chave encontrada = %d",p->chave); break; } else if(p->chave < v) pesquisa_um_imprime(v,p->dir); else pesquisa_um_imprime(v,p->esq); } if (p == NULL) printf("\n A Chave = %d não existe na Tabela ",v); } /* ------------------função pesquisa todos imprime recursiva -----------------*/ void pesquisa_todos_imprime(Arv *a) { Arv *p = a; if(p != NULL) { printf("\t chave = %s",p->chave); pesquisa_todos_imprime(p->esq); pesquisa_todos_imprime(p->dir); } } /* -------------------------------função criar--------------------------------*/ Arv *criar_v(void) { return NULL; } /* -------------------------------função deleta-------------------------------*/ /* A SER IMPLEMENTADA - estudarei exemplos da NET. */ /* -------------------------------função limpa arvore ------------------------*/ Arv *limpa_arv(Arv *a) { if (a != NULL) { limpa_arv(a->esq); limpa_arv(a->dir); free(a); } return NULL; } /* -------------------------------função limpa cria raiz ---------------------*/ Arv *cria_raiz(char v, Arv *sae, Arv *sad) { Arv *raiz = (Arv *)malloc(sizeof(Arv)); raiz->chave = v; raiz->esq = sae; raiz->dir = sad; return raiz; } /* --------------------------------FIM FUNÇÕES--------------------------------*/ valeu Minduca
  2. Opa Douplus, Agora sim deu uma bela clareada, pois nestes processos de passar parâmetros e de onde usar a função hash estava perdidão mesmo!!! Já deu uma bela clareada... Valeu mesmo, a ajuda cara! Minduca obs. assim que conseguir posto o código aqui pra todos poderem consultar, mesmo que demore, como não é para entregar a ninguém e sim para meu conhecimento, tempo é o que não me falta!!... abraço Olá a Todos, conforme dito segue o código de INSERÇÃO de registros em tabela Hash: #include<stdio.h> #include<stdlib.h> #include<malloc.h> /*============================================================================*/ /* PROGRAMA PARA INSERIR DADOS NUMA TABELA HASH */ /*============================================================================*/ struct lista_no { int chave; struct lista_no *prox; }; typedef struct lista_no LISTA; /* ----------------------------- Protótipos ----------------------------------*/ LISTA *criar(void); LISTA *insere(LISTA *a, int v, char op); int hash(int v,int n); void imprimir(LISTA *a); /* --------------------------------- MAIN ------------------------------------*/ main(void) { int v, n, x, cont, i =0; char op; LISTA *p; /* --------------------------- CRIANDO A TABELA ------------------------------*/ printf("\nEntre com a quantidade de linhas da tabela = "); scanf("%d",&n); LISTA *tab[n]; for (i = 0; i < n; i++) tab[i] = criar(); /* ---------------------------------------------------------------------------*/ /* ENTRO COM O VALOR DA CHAVE */ printf("\nDeseja inserir as chaves no inicio ou no final da lista ?(i/f): "); scanf("%s",&op); for(cont=0;cont<n;cont++) { printf("\nEntre com o valor da chave = "); scanf("%d",&v); tab[hash(v,n)] = insere(tab[hash(v,n)],v,op); } /* ---------------------------------------------------------------------------*/ /* DESCARREGO A TABELA */ for(x=0;x<n;x++){ printf("\n Tab[%d]:%p\n",x,tab[x]); imprimir(tab[x]); } getch(); return (0); } /* ---------------------------------------------------------------------------*/ /* FUNÇÕES */ LISTA* insere(LISTA * a, int v, char op) { LISTA *ant = NULL; /* aponta para lista anterior */ LISTA *p = a; while (p != NULL) /* faz uma busca na tabela */ { if (p->chave == v) { printf("\n registro %d já existe",v); break; } ant = p; p = p->prox; } if (p == NULL) /* chave não encontrada ---> CRIANDO o NÓ -----------------*/ { p = (LISTA *)malloc(sizeof(LISTA)); p->chave = v; p->prox = NULL; if (ant == NULL) /* inserção quando a lista esta vazia */ {a = p; return a;} else /* quando a lista tem registros, verifica opção de inserção */ if(op == 'i') /* se a op = i, insere no início, senão, insere no final */ {a = p; a->prox = ant; return a; } else {ant->prox = p; return ant;} } } /* -------------------------------função hash---------------------------------*/ int hash(int v, int n) { return (v%n); } /* --------------------------função imprimir recursiva -----------------------*/ void imprimir(LISTA *a) { LISTA *p = a; if (p != NULL){ printf("\t chave = %d",p->chave); imprimir(p=p->prox); } } /* -------------------------------função criar--------------------------------*/ LISTA *criar() { return NULL; } Agradecimentos ao Sr. Douplus que muito me ajudou nesta experiência, Valeu Douplus!!! abraços a todos Minduca
  3. Opa Douplus, Agora sim deu uma bela clareada, pois nestes processos de passar parâmetros e de onde usar a função hash estava perdidão mesmo!!! Já deu uma bela clareada!!! Até entendo que o p4t0X possa ter me interpretado como uma pessoa que estivesse querendo que ele fizesse algo pra mim, mas repito, cara se tivesse grana estaria ou fazendo um curso ou uma faculdade... então às vezes vejo algo que não consigo compreender de início, até comecei uma facul, mas meu pai perdeu o trampo e tive de fechar a matrícula e foi nesta faculdade mesmo que me interessei pela linguagem C que havia começado a estudar. Espero que esta crise acabe logo e que eu e meu pai consigamos um trampo. Valeu mesmo, a ajuda cara! Minduca obs. assim que conseguir posto o código aqui pra todos poderem consultar, mesmo que demore, como não é para entregar a ninguém e sim para meu conhecimento, tempo é o que não me falta!!... abraço
  4. Olá p4t0X, Seguinte, não tem data de entrega nehuma, cliquei no link que sugeriu, e verifiquei que é um link que já havia consultado o que estou fazendo é isso, busco na net o que estou interessado em aprender passo pro meu devc++ para poder analisar e entender o código depois tento fazer um baseado no que tenho entendido do exemplo que consegui sobre aquele assunto. Eu até tenho alguns códigos de exemplo de colisões com listas encadeadas, só que não estou conseguindo entendê-los, e de mais a mais, se fosse algo para entrega, seria porque estou estudando em algum curso, aí bastaria eu pedir a meu instrutor que explicasse o funcionamento do código que já tenho e o problema estaria resolvido e não precisaria passar por nehum constrangimento. O que ocorre é que lista eu até entendi, o que fiquei perdido é com relação a tabela hash com colisões, eu teria que fazer uma lista encadeada dentro da própria tabela hash?? ou seja, seria uma tabela dentro de outra tabela?? Estou confundindo-me na pratica com relação ao conceito e se estivesse estudando isso, não era pra ter dificuldade, pelo menos com a relação ao conceito, entende? De qualquer forma, sigo meu auto estudo, acho legal isso, porque com certeza quando conseguir, será uma coisa que não esquecerei jamais por causa das confusões e dificuldades que estou tendo. Valeu mesmo, ao menos você retornou meu chamado. Minduca
  5. Olá p4t0X, o que fiz aqui foi a inclusão inserção deleção lista encadeada, porem sem o tal do tratamento de colisão para uma tabela hash, ok? veja abaixo: #include<stdio.h> #include<malloc.h> #include<stdlib.h> struct lista_no { /* representação do nó */ int info; struct lista_no *ant; struct lista_no *prox; }; typedef struct lista_no LISTA; LISTA* criar(void); LISTA* insert(LISTA* l, int v); LISTA* buscar(LISTA* l, int v); LISTA* remover(LISTA* l, int v); main(void) { inv v; printf("\nEntre com a chave: "); scanf("%d",&v); LISTA *p; p=criar(); p=inserir(p,v); printf("Fim P -->%p\n",p); /* dou um print no endereço da inserção */ system("PAUSE"); getch(); return (0); } LISTA* criar(void) /* aqui é a inicialização da Lista */ { return NULL; } LISTA* inserir(LISTA* l, int,v) /* Inserindo o registro no início da lista */ { LISTA* novo = (LISTA*) malloc(sizeof(LISTA)); novo->info = v; novo->prox = l; novo->ant = NULL; if(l != NULL) /* verifico a lista não vazia */ l->ant = novo; return novo; } LISTA* buscar(LISTA* l, int v) /* busca a chave digitada v */ { LISTA* p; for(p=l;p!=NULL;p=p->prox) { if(p->info == v) return p; /* endereço encontrado */ } return NULL; /* endereço não encontrado */ } LISTA* remover(LISTA* l, int v) /* remover chave digitada */ { LISTA* p = buscar(l,v); /* uso primeiro a função buscar */ if(p == NULL) return l; /* não encontrou */ if(l == p) /* verifica se é 1º elemento */ l = p->prox; else p->ant->prox = p->prox; if(p->prox != NULL) /* verifica se é o último elemento */ p->prox->ant = p->ant; free(p); return l; } Minhas dúvidas estão sendo as seguintes: 1 - quero fazer o tratamento hash utilizando o método da divisão, ok? 2 - neste caso como seria esta código dentro do que já fiz? faço a função para obter o endereço hash onde? 3- faço somente na função de inclusão, pois é aí que precisarei verificar se há colisão dos endereços das chaves? 4 - Se for isso, como faço este código para implementar neste que já construí? Em suma, não sei como será o código para implemento da colisão e nem onde exatamente aplicá-lo?? Na teoria?, após encontrado a chave cujo endereço hash tiver colidido com um já existente, tenho que apontar para lista encadeada este endereço colidido, estou perdidão!!!! o que uso para apontar é o VALOR da chave digitada ou o endereço da função hash encontrado?? Agradeço desde já Minduca.
  6. Olá a todos, Estou com uma dificuldade em entender(implementar em C) um código que trata de colisão numa tabela hash utilizando lista encadeada, não estou conseguindo montar o código, sei que o princípio e fazer com que as chaves que tiveram o enderço hash colididos vão para uma lista encadeada através de um ponteiro?!!...mas como seria isso em C ?? estou estudando C para conhecer por conta própria mas esta parte de tabelas hash não estou conseguindo visualizar estou TENTANDO fazer um código para consulta, inserção e remoção, mas não estou conseguindo!!! att Minduca
  7. Olá ! Já solucionei o problema do rewind questionado acima, utilizei o fseek(p, 0, SEEK_SET); funcionou legal. Tenho um outro problema ocorrendo, utilizo um break quando vou Cadastrar um novo código no arquivo que é pra não deixar entrar com códigos duplicados, só que quando encontro o código e informo ao usuário que o mesmo já existe, o break não interrompe a sequencia, ou seja, a mensagem é exibida ao usuário mas o programa continua e pede o proximo campo?? porque o break não funciona?? segue a parte do código da inclusão onde os comandos break não funcionam: printf("\n\n\t-- == Digite 0 pra Sair ==--"); printf("\n\tDigite o Codigo do Veiculo: "); scanf ("%d", &Veic.Cod_veic); fflush(stdin); Codveic = Veic.Cod_veic; Verifica_cod(Codveic); /* chamada da função que verifica o codigo */ fseek(p, cont, SEEK_END); /* caso não encontre o códio volto a posição do arquivo para o ultimo reg. */ if (Veic.Cod_veic == 0) break; /* ESTE BREAK também não esta funcionando !!!! ????? */ printf("\n\tDigite a Marca: "); /* EXECUTA mesmo com o código encontrado ou se digitado 0 para finalizar */ gets(NovaMarca); fflush(stdin); segue a função Verifica_cod : void Verifica_cod(int long Codveic) { int i; fseek(p, 0, SEEK_SET); /* posicionando o arquivo no início */ for(i=0 ;i<cont ;i++) { fread(&Veic,sizeof(struct Veiculo),1,p); /* Lê a struct no Arquivo */ if (Codveic == Veic.Cod_veic) { printf("\n\n\tO Codigo de Veiculo %d já existe ",Veic.Cod_veic); /* O Codigo do Veiculo Foi Encontrado */ printf("\n\tDigite ENTER para entrar com outro registro "); break; } } } Agradeceria a ajuda neste caso !! Valeu Minduca
  8. Ok Durub, valeu!!! Tenho outra dúvida, tenho uma função alterar e não estou conseguindo executar o rewind, não da erro de compilação, mas quando debugo o programa o campo Veic.Cod_veic não posiciona no 1, veja o código abaixo e, se puder, me de uma luz do que estou errando: void Alterar(void) { struct Veiculo *Dados; char a; int i,Achar=0,Opcao=1; int Codveic; /*.........................................................................................................................*/ p = fopen(str,"rb"); /* Abre Arquivo para Leitura */ do { system("cls"); printf("\n\n\tDigite o Codigo do Veiculo:\n\t->"); scanf("%d",&Codveic); rewind(p); for(i=0 ;i<cont ;i++) { fread(&Veic,sizeof(struct Veiculo),1,p); /* Lê a struct no Arquivo */ if (Codveic == Veic.Cod_veic) { Achar=1; /* O Código Foi Encontrado */ Opcao=0; break; } } Obs: o campo Veic.Cod_veic, aparece o cod de número 2, uma vez que o arquivo tem 2 registros ou seja, o rewind não esta posicionando o arquivo no início, senão este campo estaria com o código 1. Como estou começando agora em C, talvez esteja fazendo algo errado. Vi na internet algo sobre definir o FILE *p, utilizei este procedimento porém o campo continuou no último registro!!!! Se der, me de a dica do que pode ser?? Abraço Minduca
  9. Olá a todos, fiz uma função de alterar um arquivo e quando executo-a apenas alguns campos alteram, segue o código para análise: switch(Opcao) { case 0: printf("\n\n\tFim de Alteracao."); break; case 1: printf("\n\n\tDigite a Nova Marca:\n\t-> "); gets(Dados.Marca); fflush(stdin); /* Lendo Nova Marca */ strcpy(Veic.Marca,Dados.Marca); break; case 2: printf("\n\n\tDigite o Novo Modelo:\n\t-> "); gets(Dados.Modelo); fflush(stdin); /* Lendo Novo Modelo */ strcpy(Veic.Modelo,Dados.Modelo); break; case 3: printf("\n\n\tDigite o Novo Cambio:\n\t-> "); gets(Dados.Cambio); fflush(stdin); /* Lendo Novo Cambio */ strcpy(Veic.Cambio,Dados.Cambio); break; case 4: printf("\n\n\tDigite a Nova Cor:\n\t-> "); gets(Dados.Cor); fflush(stdin); /* Lendo Nova Cor */ strcpy(Veic.Cor,Dados.Cor); break; case 5: printf("\n\n\tDigite o Novo Combustivel:\n\t-> "); gets(Dados.Combu); fflush(stdin); /* Lendo Novo Combustivel */ strcpy(Veic.Combu,Dados.Combu); break; case 6: printf("\n\n\tDigite o Novo Ano de Fabricacao:\n\t-> "); scanf ("%d", &Veic.Ano_fabri); fflush(stdin); /* Lendo Novo Ano de Fabricacao */ Veic.Ano_fabri = Dados.Ano_fabri; break; case 7: printf("\n\n\tDigite o Novo Ano do Modelo:\n\t-> "); scanf ("%d", &Veic.Ano_modelo); fflush(stdin); /* Lendo Novo Modelo */ Veic.Ano_modelo = Dados.Ano_modelo; break; case 8: printf("\n\n\tDigite o Novo Numero de Portas:\n\t-> "); scanf ("%d", &Veic.Num_porta); fflush(stdin); /* Lendo Novo Numero de Portas */ Veic.Num_porta = Dados.Num_porta; break; case 9: printf("\n\n\tDigite a Nova Kilometragem:\n\t-> "); scanf ("%d", &Veic.Km); fflush(stdin); /* Lendo Nova Kilometragem */ Veic.Km = Dados.Km; break; case 10:printf("\n\n\tDigite o Novo numero da Placa:\n\t-> "); scanf ("%d", &Veic.Num_placa); fflush(stdin); /* Lendo Nova Placa */ Veic.Num_placa = Dados.Num_placa; break; case 11:printf("\n\n\tDigite o Numero do Novo Chassi:\n\t-> "); scanf ("%d", &Veic.Num_chassi); fflush(stdin); /* Lendo Novo Chassi */ Veic.Num_chassi = Dados.Num_chassi; break; case 12:printf("\n\n\tDigite o Novo preço de Custo:\n\t-> "); scanf ("%f", &Veic.Preco_custo); fflush(stdin); /* Lendo Novo preço de Custo */ Veic.Preco_custo = Dados.Preco_custo; break; case 13:printf("\n\n\tDigite o Novo preço de Venda:\n\t-> "); scanf ("%f", &Veic.Preco_venda); fflush(stdin); /* Lendo Novo preço de Venda */ Veic.Preco_venda = Dados.Preco_venda; break; }/*.....Fim switch......*/ Obs1: até o Case 5, que tem os comandos strcpy, os campos alteram legal, nos demais Case 6 ao Case 13, que estão em vermelho não!!?? Obs2: Quando faço o DEBUG e o cursor para no campo para entrar com o novo valor, este campo simplesmente não me dixa digitar o valor, ou seja, fica bloqueado e não consigo digitar nada???? O que ocorreu foi o seguinte: Todos os campos estavam com o comando strcpy, mas o compilador acusava erro devido aos campos do case 6 ao case 13 serem long int e float, o comando strcpy não aceita campos assim!!então troquei o strcpy simplesmente atribuindo um campo sendo igual ao outro. O que poderia estar havendo, será que terei q deixar todos os campos definidos como char, para poder usar o strcpy?? Lembrando que a função funciona, pois os 5 primeiros cases, fazem a alteração normalmente!! Se puderem ajudar, já agradeço. Minduca
  10. Olá a todos!! Estou num dilema há alguns dias... não tenho um conhecimento tão avançado e estou fazendo um progrma em C. Talvez possam achar q estou complicando o que é fácil, mas notem que o que estou tentando é, além de saber se existe o que pretendo, poder usar em vários outros pontos do programa, bem, vamos lá: em uma das parte do programa, eu faço um aumento em um salário de acordo com o nº de dependes de determinado funcionário: Ex: se o funcionário digita 3 dependentes, 3% de aumento, se 4 dependentes, 4% de aumento.... forma tradiocional: main() {float sl; /* valor do salário */ int qd; /* quantidade de dependentes */ printf("Entre com o valor do Salario:"); scanf("%f",&sl); printf("Entre com a quantidade de Dependentes:"); scanf("%d",&qd); sl += ( sl * qd ) / 100; printf("Seu Salario com aunmento é de: %.2f",sl); getch(); return (0); } minha idéia seria fazer de uma forma que se elimine o cálculo com divisão por 100 para se atribuir na variável sl, o valor já acumulado: 1 - como se é sabido, se multiplicarmos o valor do salário diretamente por (1.03), obteríamos o salario já com os 3(três) por cento de aumento. 2 - como sabemos, podemos usar também em C este cáculo de maneira fixa => sl = ( sl * 1.03 ), que não seria o meu caso; mas também teríamos o valor com o aumento. Agora vem minhas perguntas: - Em primeiro lugar, teria que definir uma variável, que quando o usuário digitasse o número de dependes, esta me salvasse como valor 03, ou 04, ou 05... ou seja, precisaria que o valor da variável qd tenha o 0(zero) da esquerda de qualquer maneira!!!... mesmo que eu tenha que informar ao usuário para entrar com dígitos neste campo, o que interessa é que se mantenha o 0(zero) da esquerda que ele irá digitar. - Feito isso, ou seja, conseguindo ter essa variável com este valor 01, ou 02, ou 03.... vem a segunda parte: tem alguma forma de quando for fazer este cáculo, eu utilizar um comando da seguinte forma? sl = ( sl * 1.qd); ou seja, que o C ou seu complidaor, entenda que o qd esta sendo o valor 03 que foi inserido pelo usuário?? desta forma teria o valor já atualizado e sem a necessidade da divisão por 100?? Não sei se ficou claro, mas se alguém puder ajudar!!??? Valeu Minduca
×
×
  • Criar Novo...