Gose Posted October 14, 2009 at 11:08 AM Report Share #291642 Posted October 14, 2009 at 11:08 AM Boas pessoal. Tenho uma duvida em C. Estou a desenvolver um trabalho para visualizar frases encriptadas. Tive de criar uma pilha pa visualizar o respectivo numero de ocorrencia de cada palavra k o ultilizador insere e verificar se essa msm palavra existe na pilha, mas está a dar-me alguns erros. o prog corre mas sempre que introduza uma nova palavra ela vai sp para a posição zero, coisa que n pode acontecer, e quando introduzo uma palavra para pesquisar diz sempre que ela não existe. Se alguem me puder ajudar agradecia. O codigo que tenho é o seguinte: void imprime_pilha() { int x = top; //saber o top para depois por o top como no inicio //char palavra[] = ""; int i=0, j=0; for (i=top ; i>=0 ; i--) { //palavra = pilha[top]; //strcat (palavra, pilha[top]); printf("Top: %d - %s\n", top, pilha[top]); top--; } top = x; } void pesquisa_palavras() { char find_pal[20]; int i; char op2[5]; int cont; printf("\nInsira a palavra que pretende procurar\n"); gets(find_pal); //for(top=0;top<=pilha[top];top++) for(i=0;i<top;i++) { //if((gets(pilha[top]) == find_pal)) if(strcmp(find_pal,pilha[top])) cont++; /*printf("|******************************************|"); printf("|--- Pesquisa e respectivas ocorrencias ---|"); printf("|******************************************|"); printf("A palavra %s existe na pilha\n",find_pal); printf("A palavra esta posicionada na posicao %d da pilha\n",top);*/ } if(cont>0) { printf("|******************************************|\n"); printf("|--- Pesquisa e respectivas ocorrencias ---|\n"); printf("|******************************************|\n\n"); printf("A palavra %s existe na pilha\n",find_pal); }else if(cont<0){ top++; printf("A palavra nao existe na pilha!!\n"); printf("Procure outra palavra...\n"); Link to comment Share on other sites More sharing options...
forcewill Posted October 14, 2009 at 11:13 AM Report Share #291643 Posted October 14, 2009 at 11:13 AM porque não usas um hash map para guardar as palavras ? Link to comment Share on other sites More sharing options...
Gose Posted October 14, 2009 at 11:17 AM Author Report Share #291644 Posted October 14, 2009 at 11:17 AM porque não usas um hash map para guardar as palavras ? um hash map requer a ultilização de estruturas certo? Não posso usar estruturas no trabalho..apenas pilhas e filas. Não posso usar listas nem estruturas. Link to comment Share on other sites More sharing options...
forcewill Posted October 14, 2009 at 04:38 PM Report Share #291669 Posted October 14, 2009 at 04:38 PM sim uma hash map é uma estrutura, mas também os são as stacks e quees (pilhas e filas), então é uma condição do trabalho usar apenas pilhas e filas ? Até porque a forma como estás a usar a pilha ai, viola o interface de uma pilha... uma pilha é caracterizada por permitir apenas 2 operações push e pop. for (i=top ; i>=0 ; i--) { //palavra = pilha[top]; //strcat (palavra, pilha[top]); printf("Top: %d - %s\n", top, pilha[top]); top--; } De qualquer forma em resposta á tua pergunta o iterador (index) que estás usar é o i ( for int i = ....) no entanto ao acederes á tua "pilha" estás a usar top, ou seja neste pedaço de código estás sempre a comparar sempre no topo da pilha em vez de procurares na pilha toda pela palavra pedida for(i=0;i<top;i++) { //if((gets(pilha[top]) == find_pal)) if(strcmp(find_pal,pilha[top])) assim á primeira vista é um dos erros lógicos que encontro. Link to comment Share on other sites More sharing options...
Gose Posted October 15, 2009 at 10:51 AM Author Report Share #291740 Posted October 15, 2009 at 10:51 AM sim uma hash map é uma estrutura, mas também os são as stacks e quees (pilhas e filas), então é uma condição do trabalho usar apenas pilhas e filas ? Até porque a forma como estás a usar a pilha ai, viola o interface de uma pilha... uma pilha é caracterizada por permitir apenas 2 operações push e pop. for (i=top ; i>=0 ; i--) { //palavra = pilha[top]; //strcat (palavra, pilha[top]); printf("Top: %d - %s\n", top, pilha[top]); top--; } [/Code] De qualquer forma em resposta á tua pergunta o iterador (index) que estás usar é o i ( for int i = ....) no entanto ao acederes á tua "pilha" estás a usar top, ou seja neste pedaço de código estás sempre a comparar sempre no topo da pilha em vez de procurares na pilha toda pela palavra pedida [Code] for(i=0;i<top;i++) { //if((gets(pilha[top]) == find_pal)) if(strcmp(find_pal,pilha[top])) [/Code] assim á primeira vista é um dos erros lógicos que encontro. Sim é uma condição do trabalho usar apenas pilhas e filas, mas sem estruturas as pilhas. Com estruturas já encontrei bastantes exemplos em como poderia fazer mas sem estruturas não ha praticamente nada. Sim eu sei que viola, mas então sem estruturas como é que era possivel fazer a pilha? Acho que já resolvi um dos erros com essa dica que me deste. Outra coisa..consegues dizer-me porque é que quando insiro a frase só me empilha a 1ra palavra da frase? eu queria que empilha-se todas(uma a uma) e n tou a conseguir ver onde está o erro. [code=c] char palavra[50]; //char palavraFinal[] = ""; int tamanho=0, tamanho2=0, tamanho3=0; int z=0,i,y=0; gets(frase); tamanho = strlen(frase); printf("%d\n\n",tamanho); for(i=0 ; i<tamanho ; i++) //percorre a frase toda ate ao fim { if(frase[i]==' ') { tamanho2 = strlen(palavra); printf("tamanho da palavra antes do respectivo espaco: %d\n", tamanho2); /*if(frase[i]>' ') { tamanho3 = strlen(palavra); printf("tamanho da palavra dps do 1ro espaço: %d\n",tamanho3); }*/ Push(palavra); imprime_pilha(); for (y=0 ; y <= 50 ; y++) //serve para apagar a palavra que está antes de ter encontrado o espaco. { palavra[y] = '\0'; } z=0; //se tirar isto imprime a frase toda mas sem espaço pesquisa_palavras(); } else { palavra[z] = frase[i]; puts(palavra); z++; } Push (void *pal) { if( top >= N ) // pilha cheia printf("\n pilha cheia\n"); else { printf("\n"); printf("|*********************|\n"); printf("|- Insercao na pilha -|\n"); printf("|*********************|\n"); printf("Vou inserir: %s\n",pal); top++; pilha[top] = pal; printf("Inseri: %s\n", pilha[top]); printf("Palavra inserida com sucesso na pilha\n"); } } Link to comment Share on other sites More sharing options...
forcewill Posted October 15, 2009 at 01:56 PM Report Share #291750 Posted October 15, 2009 at 01:56 PM 2 coisas que estou a ver mal 1º: O strlen funciona por contar o numero de caracteres até encontrar um '\0', e tu logo na primeira iteração estás a substituir a primeira palavra por '\0's por exemplo "isto e uma frase blah blah" o que estás a fazer é alterar a frase para "\0\0\0\0 e uma frase blah blah" logo na segunda iteração o strlen devolve 0 de comprimento.... 2º na função push recebes por referencia (apontador) o endereco inicial da tua palavra e estás a fazer o que se chama uma shallow copy pilha[top] = palavra logo em seguida no teu ciclo for estás a alterar essa mesma palavra como referido acima para '\0\0\0\0' o que precisas de fazer é uma das 2 soluções ou n alteras a palavra inicial, ou copias por valor usando strcpy espero ter ajudado n estou c mt tempo se mesmo assim tiveres duvidas mais tarde ajudo.te de kk forma tens umafunção excelente para isso chamada strtok Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now