Ir ao conteúdo
  • Cadastre-se

Programa caça palavras


wagzaum

Posts recomendados

Mano, (na minha opinião) já que a função localiza_horizontal() irá procurar apenas as linhas ela não precisa receber o número de colunas como parametro... e tambem não precisa criar dois loop's, apenas um que conte as linhas.Tambem não entendi o porque de você passar o parametro assim "matriz[j]" , já que isto representa um caractere e não uma string (o que deve ter acarretado em um erro de compilação porque o primeiro parametro de strstr() tem que ser uma string/ponteiro), para pegar a linha i seria assim : "matriz"...

Fiz duas funções que acredito que irão te ajudar, e corrigi a sua localiza_horizontal()...


...
//função que tranforma a coluna "indice_col" em string q será gravada na str_saida
//esta função é necessária porque 'strstr()' recebe como primeiro parametro uma string
//então primeiro tranforma-se a coluna em string e depois procura a palavra na string
void tranf_coluna_em_string(char **matriz,char *str_saida,int indice_col,int total_de_linhas){
int i;
for(i=0;i<total_de_linhas;i++) *(str_saida++) = matriz[i][indice_col];
*str_saida = 0;
}
//modifiquei um pouco...
void localiza_horizontal(char **matriz,char *z,int x){ /* Recebe os parâmetros para localizar na horizontal*/
int i;
char *local;
for(i=0;i<x;i++){
local = strstr(matriz[i],z);
if(local != NULL)
printf("\nA palavra foi encontrada na linha %d",(i+1));
}
}
//procura a palavra nas colunas
void localiza_vertical(char **matriz,char *z,int x,int y){ /* Recebe os parâmetros para localizar na horizontal*/
int i;
char *local;
char str[0xFF];//string que receberá o conteudo de cada coluna no loop
for(i=0;i<x;i++){//loop que vai de coluna em coluna procurando a palavra
tranf_coluna_em_string(matriz,str,i,y);//chamada da função q implementei
local = strstr(str,z);//testa se a palvra é encontrada no conteudo da coluna 'i' que está na string 'str'
if(local != NULL)
printf("\nA palavra foi encontrada na coluna %d",(i+1));
}
}
...

Cara fiz apenas alguns testes rápidos aqui, mas acredito que não haja erro...

explicação dos parametros:

void tranf_coluna_em_string(char **matriz,char *str_saida,int indice_col,int total_de_linhas)

char *str_saida : é a string onde irá ser gravado o contúdo da coluna

int indice_col : é o indice da coluna que se deseja saber o conteúdo

int total_de_linhas : é o total de linha da sua matriz, na tua main() é a variavel b, na função que fiz (void localiza_vertical()) é a variavél y.

void localiza_horizontal(char **matriz,char *z,int x)

tirei o último parametro, porque não é necessário passar para a função n número de colunas da matriz...

void localiza_vertical(char **matriz,char *z,int x,int y)

matriz e z você já sabe....

int x : é o número de colunas da matriz, na tua main() é a variável b.

int y : é o número de linhas da matriz, na tua main() é a variável a.

testa aí... e qualquer dúvida é só postar...

falou.

Link para o comentário
Compartilhar em outros sites

Mano fico feliz por ter ajudado aê!!! em relação a "char str[0xFF]" é o mesmo que "char str[255]", 0xFF é o hexadecimal que equivale a 255 em decimal, declarei a string com tamanho de 255 caracteres porque acredito que ninguém irá colocar um número de linhas maior que este...

Falou...

Abraço!

Link para o comentário
Compartilhar em outros sites

Mano sobre a "localiza_vertical_rev()" acredito que o erro ocorra quando você tenta achar alguma palavra que está na primeira coluna, pois no loop você declarou assim: for(i=y;i>0;i--), suponhamos que a matriz tenha 3 colunas, as colunas serão a coluna com indice 0,1 e 2, porém com este código você pega o conteudo da coluna com indice 3 (que nem da pra saber onde o programa lerá) , 2 e 1... o loop correto seria "for(i=(y-1);i>=0;i--)"...


void localiza_vertical_rev(char **matriz,char *z,int y,int x){
int i;
char *local;
char str[x+1];//string que receberá o conteudo de cada coluna no loop
for(i=(y-1);i>=0;i--)
{//loop que vai de coluna em coluna procurando a palavra
tranf_coluna_em_string(matriz,str,i,x);//chamada da função q implementei
strrev(str);
local = strstr(str,z);//testa se a palvra é encontrada no conteudo da coluna 'i' que está na string 'str'
if(local != NULL)
printf("\nA palavra foi encontrada na coluna %d",(i+1));
}
}

Ahh, e outra coisa, você tirou esta parte do código que te passei:


void tranf_coluna_em_string(char **matriz,char *str_saida,int indice_col,int total_de_linhas){
int i;
for(i=0;i<total_de_linhas;i++) *(str_saida++) = matriz[i][indice_col];
[B][U]*str_saida = 0;[/U][/B]
}

Esta parte é para colocar a terminação nula na string (o '\0'), sem isto é como se a string não tivesse fim (E na tua função "tranf_diagonal_em_string_inferior()" você tambem não colocou)...Mas não é isto que está causando o erro...

E falando na tua função "tranf_diagonal_em_string_inferior()" o loop for poderia ser simplificado um pouco:


char tranf_diagonal_em_string_inferior(char **matriz,char *str_saida,int indice_linha,int total_de_linhas){
int i,k;//K será o indice da coluna
for(i=indice_linha,k=0;i<total_de_linhas;i++,k++)// o indice da linha q vai me dizer a próxima diagonal
*(str_saida++) = matriz[i][k];
*str_saida = 0;
return *str_saida;
}

Bom, e sobre a "void localiza_diagonal()", até que ela retornou de boa a localização das palavras (abaixo da diagnal central), exceto quando declarei uma matriz (1x2, ou 2x4 ou 3x6), ainda não percebi o erro, mas acredito que não seja o compilador, aliás qual IDE e compilador você usa?

Falou amanhã dou outra olhada no teu código e posto aqui se eu tiver alguma novidade...

falou...

abraço.

Link para o comentário
Compartilhar em outros sites

Aê Wagzaum, bom mano dei uma boa olhada no teu código... E realmente achei alguns erros que antes não tinha percebido...

Entãovamos lá:

nas funções "loaliza_horizontal()" e "localiza_horizontal_rev()" o útimo parametro é o número total de linhas da metriz, representado pela váriavel "a" e não pela "b"(que é o úmero de colunas), isto que está causando o erro de quando usamos matrizes com maior diferença entre o número de linhas e colunas (tipo 1x2, ou 3x6...).

Outro erro mano, você usou:


void localiza_horizontal_rev(char **matriz,char *z,int y){
int i;
char *local;
for(i=0;i<y;i++){
[b]strrev(matriz[i])[/b];
local = strstr(matriz[i],z);
if(local != NULL)
printf("\nA palavra foi encontrada na linha %d",(i+1));
}
}

Cara assim, com o strrev() e este loop, você está invertendo todas as linhas da matriz (da matriz original já que ela foi passada por referencia), e depois quando você for procurar as diagonais, todas as linhas estarão invertidas, e você já sabe o resto...o correto seria assim:


void localiza_horizontal_rev(char **matriz,char *z,int y){ /* Recebe os parâmetros para localizar na horizontal REVERSA*/
int i;
char *local,str[0xFF];
for(i=0;i<y;i++){
strcpy(str,matriz[i]);//copia o conteúdo da linha na string "str"
strrev(str);//inverte só a cópia...
local = strstr(matriz[i],z);
if(local != NULL)
printf("\nA palavra foi encontrada na linha %d",(i+1));
}
}

Mano e passe para a função "tranf_diagonal_em_string_inferior()" tambem o número de colunas pois se a matriz não for quadrada nem todas as diagonais inferiores Iirão terminar apenas quando terminarem as linhas, por exemplo uma matriz de 4 linhas e 2 colunas, e caso o programa force a ler uma diagonal até o fim do número de linhas com certeza irá dar overflow... faça assim:


char tranf_diagonal_em_string_inferior(char **matriz,char *str_saida,int indice_linha,int total_de_linhas, int total_cols){
int i,k;//K será o indice da coluna
for(i=indice_linha,k=0;i<total_de_linhas&&k<total_cols;i++,k++)// o indice da linha q vai me dizer a próxima diagonal
*(str_saida++) = matriz[i][k];
*str_saida = 0;
return *str_saida;
}

e na "tranf_diagonal_em_string_centro_superior()" também:


char tranf_diagonal_em_string_centro_superior(char **matriz,char *str_saida2,int indice_coluna,int total_de_coluna,int total_lin){
int i,k,n;//K será o indice da coluna
for(i=indice_coluna,k=0;i<total_de_coluna&&k<total_lin;i++,k++)// o indice da linha q vai me dizer a próxima diagonal
*(str_saida2++) = matriz[k][i];
*str_saida2 = 0;
return *str_saida2;
}

Bom mano aqui acredito que com estas correções os erros acabarão.... ahh, e teu erro na "tranf_diagonal_em_string_centro_superior()" acredito que seja porque as linhas estavão invertidas... Teste assim:


char tranf_diagonal_em_string_centro_superior(char **matriz,char *str_saida2,int indice_coluna,int total_de_coluna,int total_lin){
int i,k,n;//K será o indice da coluna
for(i=indice_coluna,k=0;i<total_de_coluna&&k<total_lin;i++,k++)// o indice da linha q vai me dizer a próxima diagonal
*(str_saida2++) = matriz[k][i];
*str_saida2 = 0;
return *str_saida2;
}
void localiza_diagonal_centro_superior(char **matriz,char *z,int y,int x){
int k=0,j;
char *local;
char str[200];//string que receberá o conteudo de cada coluna no loop
for(j=0;j<y;j++){//loop que vai receber o conteúdo de cada diagonal incrementando o indice da coluna para fazer cada diagonal
tranf_diagonal_em_string_centro_superior(matriz,str,j,y,x);//chamada da função q implementei
[b]printf("\n%s",str);////////aqui irá imprimir a string retornada das diagonais...[/b]
local = strstr(str,z);//testa se a palvra é encontrada no conteudo da diagonal 'j' que está na string 'str'
if(local != NULL)
printf("\nA palavra foi encontrada na diagonal de inicio [%d][%d]",k+1,j);
}
}

Bom mano, por enquanto é isto aí...

ahh,quanto a "perder tempo",alem de ser divertido, to precisando melhorar minha lógica... intão pode mandar que se eu souber te ajudar, pode crer que o farei...

Testa aê...

E posta os resultados...

Falou.

Link para o comentário
Compartilhar em outros sites

Cara, sobre não entrar no loop "for" é porque a condição "j=0" nunca será veradeira, pois isto é apenas uma atribuição de valor.... ficaria assim:


void localiza_diagonal_centro_superior_2(char **matriz,char *z,int y,int x){
int k=1;
int j;
char* local;
char str[y+1]; //string que receberá o conteudo de cada coluna no loop
[b]for(j=y-1;j>=0;j--)[/b]{ //loop que vai receber o conteúdo de cada diagonal incrementando o indice da coluna para fazer cada diagonal
tranf_diagonal_em_string_centro_superior_2(matriz, str,j,y,x); //chamada da função q implementei
local = strstr(str,z); //testa se a palvra é encontrada no conteudo da diagonal 'j' que está na string 'str'
if(local != NULL)
printf("\nA palavra foi encontrada na diagonal de inicio [%d][%d]",k,j);
}
}
void localiza_diagonal_centro_superior_2_rev(char **matriz,char *z,int y,int x){
int k=1;
int j;
char* local;
char str[y+1]; //string que receberá o conteudo de cada coluna no loop
[b]for(j=y-1;j>=0;j--)[/b]{ //loop que vai receber o conteúdo de cada diagonal incrementando o indice da coluna para fazer cada diagonal
tranf_diagonal_em_string_centro_superior_2(matriz, str,j,y,x); //chamada da função q implementei
strrev(str);
local = strstr(str,z); //testa se a palvra é encontrada no conteudo da diagonal 'j' que está na string 'str'
if(local != NULL)
printf("\nA palavra foi encontrada na diagonal de inicio [%d][%d]",k,j);
}
}

Ahh, e outro erro que encontrei foi na função "tranf_diagonal_em_string_inferior_2()",o loop dela está assim: "for(i=indice_linha,k=(total_cols-1);i<total_de_linhas&&k>0;i++,k--)"... Assim o loop não vai ser executado caso "k" seja 0, e a primeira coluna da matriz tem índice 0, ou seja ele não lerá os caracteres da primeira coluna... Faça assim:


char tranf_diagonal_em_string_inferior_2(char **matriz,char *str_saida,int indice_linha,int total_de_linhas, int total_cols){
int i,k;//K será o indice da coluna
for(i=indice_linha,k=(total_cols-1);i<total_de_linhas&&k>=0;i++,k--)// o indice da linha q vai me dizer a próxima diagonal
*(str_saida++) = matriz[i][k];
*str_saida = 0;
return *str_saida;
}

Mano acredito que com isso resolverá...

Qualquer dúvida, só postar...

Falou, abraço.

Link para o comentário
Compartilhar em outros sites

Falaa W_neto! Cara... funcionou perfeito. Depois eu só arrumei uns detalhes nas variáveis k e i, e deu certo.

Muito obrigado mesmo!!

Quando precisar de algo me chame.

Ahh... não estranha que tirei as mensagens porque tinha gente q tava copiando os códigos daq kkkkkkkkkkkk

abraçoo!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...