Ir para conteúdo

POWERED BY:

Arquivado

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

jholxd

Programa de busca de palavras de uma matriz usando ponteiros

Recommended Posts

Bom peço a a ajuda dos senhores com um código que estou tendo dificuldade

o programa você pede para pessoa quantos nomes você vai jogar na matriz

voce vai digitar o nome e o local onde você quer que comece o nome

depois ele limpa a tela e exibe a matriz com caracteres aleatórios

eu preciso digitar uma palavra e se a palavra estiver na matriz ele mostra a palavra na tela

se alguem pudesse me mostrar como posso trabalha com a matriz do fonte usando ponteiro sobre ponteiro agradeceria muito

 

segue o código

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#define num 6

//Definindo as funções a serem usadas
int receber(char *pvet);
void mostrar(char *pvet, char *pletra);
void zeramatriz(char *pmat, char *pletra);
void procura(char *pletra,char *pvet,char *pmat);
int conclusao(char *pvet,char *pmat);

//variavel global
int erro=0;

int main(int argc, char *argv[])
{
	int i , j = 0, tentativas = num + 5 , chance = 0 , ident;
	char matriz[num][num], vet[num][num], letra[15];

	zeramatriz(matriz, letra);
	i = receber(vet);
	if(i!=0)
	{
		zeramatriz(matriz,letra);
		mostrar(matriz,letra);
	}

	do
	{
		printf("você possui %i tentativas\n\n",tentativas);
		printf("você errou %i vezes\n\n",erro);

		procura(letra,vet,matriz);

		mostrar(matriz,letra);
		tentativas--;
	   /* if (tentativas<1)
		{
			return 0;
			getch();
		}*/

		chance++;
		j++;
		ident=conclusao(vet,matriz);
		printf("\n\n%i\n\n",ident);
		if(ident==1)
		{
			system("cls");
			chance=num*num+6;
			printf("Parabens você achou as palavras!!!\n\n");
			mostrar(matriz,letra);
  }

  }while(chance<=num*num+5);

	getch("Pressione 'espaco' para finalizar o programa");
}

void zeramatriz(char *pmat, char *pletra)
{
	int i;
	for(i=0;i<15;i++)
	*(pletra+i)=rand();

	*(pletra+14)='\0';

	for(i=0;i<num*num;i++)
	*(pmat+i)=rand();
}
int receber(char *pvet)
{
	int i,l,c,tam,a,qtd;
	char palavra[num+1],*ppalavra,*t;
	ppalavra=palavra;

	a=0;
	printf("\t\t\t>>>>>> Programa de Caca Palavras <<<<<<\n\n");
	printf("Digite um numero de (1) ate (%i),\n caso digite '0' o programa encerrara\n\n",num);
	printf("Digite o numero de palavras que deseja esconder: ");
	scanf("%i",&qtd);

	while(qtd>10)
	{
		printf("Quantidade não valida");
		printf("Digite o numero de palavras que deseja esconder: ");
		scanf("%i",&qtd);
	}

	if(qtd>0 && qtd<=num)
	{
	do
	{
	fflush(stdin);
	printf("Digite a palavra a ser escondia\n");
	fgets(ppalavra,num+2,stdin);
	ppalavra[strlen(ppalavra)-1]='\0';
	tam=strlen(ppalavra);
	ppalavra[strlen(ppalavra)]='*';

	do	//coordenadas da matriz a ser amarmazenado
	{
		printf("digite a linha em que deseja armazenar:  ");
		scanf("%i",&l);

		printf("\ndigite a coluna em que deseja armazenar:  ");
		scanf("%i",&c);

		//verifica se as coordenadas estão certas
		if((c+tam)>num || l>num)
			printf("\n\n !!! As coordenadas não são validas !!!\n\n");
	} while((c+tam)>num || l>num-1 || c>num-1);

	for(i=0;i<=tam;i++)
		*(pvet+(l*num)+c+i)=*(ppalavra+i);

	//verifica c deseja colocar mais uma palavra
	fflush(stdin);
	if(a!=(qtd-1) || qtd!=1)
	{
		printf("\nPalvra inserida com sucesso:  \n\n\n");
	}
	a++;
	}   while(a<qtd);
	}
	else

	return 0;
}

void mostrar(char *pvet,char *pletra)
{
	int i,j;
	system("cls");

	printf("\n\n\t >>>>> Palavras escondidas <<<<<\n\n");

	for(i=0;i<num;i++)
		printf("\t%i",i);
		for(i=0;i<num;i++) //Se não fizer isso não da pra imprimir direito
		{
			printf("\n%i",i);
			for(j=0;j<num;j++)
			{
				printf("\t%c",*(pvet+(i*num)+j));

			}
		}
		printf("\n\n");

}

void procura(char *pletra,char *pvet,char *pmat)
{
	int i,error=0;

	//tabela asc => a = 97 A=65
	fflush(stdin);
	printf("digite a palavra que deseja procurar: ");
	fgets(pletra,15,stdin);
	//conversão

	for(i=0;i<num*num;i++)
	{
	if(*(pletra+i)>=65 && *(pletra+i)<=90)
		*pletra=*pletra+32;
	}
	//verifica se o usuario errou ou acertou
	for(i=0;i<num*num;i++)
	{
		if(*(pletra+i) == *(pvet+i) || (*(pletra+i)) == (*(pvet+i))+32)
		{
			*(pmat+i)=*(pletra+i);
		}
	}
}

int conclusao(char *pvet,char *pmat)
{
	int i,j,acerto=0;

	for(j=0;j<num*num;j++)
		if(*(pvet+j) == *(pmat+j))
		acerto++;

		printf("%i", acerto);
			if(acerto==num*num)
			i=1;
	else

	i=0;

	return i;
}

Sugestões são bem vindas XD

Compartilhar este post


Link para o post
Compartilhar em outros sites

você qr usar ponteiro msm?

poderia deixar assim:

int receber(char pvet[]);

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

qnd c tem muitas duvidas num algoritmo é interessante você ir montando seu programa parte por parte!

assim comente algumas funções e va testando uma de kd vz até achar onde naum esta funcionando legal!

 

continue postando !

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites
assim comente algumas funções e va testando uma de kd vz até achar onde naum esta funcionando legal!

 

A melhor coisa é instalar um debugger.Dependendo do código,ficar comentando e descomentando e enchendo de printf é trabalhoso demais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aki está o código dei uma comentada um pouco melhor acredito que fique mais facil de enchergar

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#define num 6

//Definindo as funções a serem usadas
int receber(char *pvet);
void mostrar(char *pvet, char *pletra);
void zeramatriz(char *pmat, char *pletra);
void procura(char *pletra,char *pvet,char *pmat);
int conclusao(char *pvet,char *pmat);

//variavel global
int erro=0;

int main(int argc, char *argv[])
{
	int i , j = 0, tentativas = num + 5 , chance = 0 , ident; //configura qtas tentativas você vai começar
	char matriz[num][num], vet[num][num], letra[15];

	zeramatriz(matriz, letra); //zerando a matriz
	i = receber(vet);
	if(i!=0)
	{
		zeramatriz(matriz,letra);
		mostrar(matriz,letra);
	}

	do
	{
		printf("você possui %i tentativas\n\n",tentativas);
		printf("você errou %i vezes\n\n",erro);

		procura(letra,vet,matriz);

		mostrar(matriz,letra);  //se as tentativas chegar a 0 fecha o programa
		tentativas--;
	   /* if (tentativas<1)
		{
			return 0;
			getch();
		}*/

		chance++;
		j++;
		ident=conclusao(vet,matriz); 
		printf("\n\n%i\n\n",ident); // se ident for verdadeiro você ganha o jogo
		if(ident==1)
		{
			system("cls");
			chance=num*num+6;
			printf("Parabens você achou as palavras!!!\n\n");
			mostrar(matriz,letra);
  }

  }while(chance<=num*num+5);

	getch("Pressione 'espaco' para finalizar o programa");
}

void zeramatriz(char *pmat, char *pletra)
{
	int i;
	for(i=0;i<15;i++)
	*(pletra+i)=rand();

	*(pletra+14)='\0';

	for(i=0;i<num*num;i++)
	*(pmat+i)=rand();
}
int receber(char *pvet)
{
	int i,l,c,tam,a,qtd;
	char palavra[num+1],*ppalavra,*t;
	ppalavra=palavra;

	a=0;
	printf("\t\t\t>>>>>> Programa de Caca Palavras <<<<<<\n\n");
	printf("Digite um numero de (1) ate (%i),\n caso digite '0' o programa encerrara\n\n",num);
	printf("Digite o numero de palavras que deseja esconder: ");
	scanf("%i",&qtd);

	while(qtd>10) //verifica se a quantidade de letras da string não ultrapassara 10
	{
		printf("Quantidade não valida");
		printf("Digite o numero de palavras que deseja esconder: ");
		scanf("%i",&qtd);
	}

	if(qtd>0 && qtd<=num)
	{
	do
	{
	fflush(stdin);
	printf("Digite a palavra a ser escondia\n");
	fgets(ppalavra,num+2,stdin); //recebe o conteudo do ponteiro palavra
	ppalavra[strlen(ppalavra)-1]='\0';
	tam=strlen(ppalavra);
	ppalavra[strlen(ppalavra)]='*';

	do	//coordenadas da matriz a ser amarmazenado
	{
		printf("digite a linha em que deseja armazenar:  ");
		scanf("%i",&l);

		printf("\ndigite a coluna em que deseja armazenar:  ");
		scanf("%i",&c);

		//verifica se as coordenadas estão certas
		if((c+tam)>num || l>num)
			printf("\n\n !!! As coordenadas não são validas !!!\n\n");
	} while((c+tam)>num || l>num-1 || c>num-1);

	for(i=0;i<=tam;i++)
		*(pvet+(l*num)+c+i)=*(ppalavra+i);

	//verifica c deseja colocar mais uma palavra
	fflush(stdin);
	if(a!=(qtd-1) || qtd!=1)
	{
		printf("\nPalvra inserida com sucesso:  \n\n\n");
	}
	a++;
	}   while(a<qtd);
	}
	else

	return 0;
}

void mostrar(char *pvet,char *pletra)
{
	int i,j;
	system("cls");

	printf("\n\n\t >>>>> Palavras escondidas <<<<<\n\n");

	for(i=0;i<num;i++)
		printf("\t%i",i);
		for(i=0;i<num;i++) //Se não fizer isso não da pra imprimir os numeros da matriz 
		{
			printf("\n%i",i);
			for(j=0;j<num;j++)
			{
				printf("\t%c",*(pvet+(i*num)+j)); //mostra a matriz do ponteiro pvet

			}
		}
		printf("\n\n");

}

void procura(char *pletra,char *pvet,char *pmat)
{
	int i,error=0;

	//tabela asc => a = 97 A=65
	fflush(stdin);
	printf("digite a palavra que deseja procurar: ");
	fgets(pletra,15,stdin);
	//conversão

	for(i=0;i<num*num;i++)
	{
	if(*(pletra+i)>=65 && *(pletra+i)<=90)
		*pletra=*pletra+32;
	}
	//verifica se o usuario errou ou acertou
	for(i=0;i<num*num;i++)
	{
		if(*(pletra+i) == *(pvet+i) || (*(pletra+i)) == (*(pvet+i))+32)
		{
			*(pmat+i)=*(pletra+i);
		}
	}
}

int conclusao(char *pvet,char *pmat)
{
	int i,j,acerto=0;

	for(j=0;j<num*num;j++)
		if(*(pvet+j) == *(pmat+j))
		acerto++;

		printf("%i", acerto);
			if(acerto==num*num) //se todos os elementos das matriz estiverem corretos ele retorna 1
			i=1;
	else

	i=0;

	return i;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não cheguei a compilar!

Ele esta rodando certinha ow ainda esta com duvidas?

Compartilhar este post


Link para o post
Compartilhar em outros sites
ib03@macalan:~/src\:gcc -g caca-palavras.c

caca-palavras.c: In function âmainâ:

caca-palavras.c:22: warning: passing argument 1 of âzeramatrizâ from incompatible pointer type

caca-palavras.c:23: warning: passing argument 1 of âreceberâ from incompatible pointer type

caca-palavras.c:26: warning: passing argument 1 of âzeramatrizâ from incompatible pointer type

caca-palavras.c:27: warning: passing argument 1 of âmostrarâ from incompatible pointer type

caca-palavras.c:35: warning: passing argument 2 of âprocuraâ from incompatible pointer type

caca-palavras.c:35: warning: passing argument 3 of âprocuraâ from incompatible pointer type

caca-palavras.c:37: warning: passing argument 1 of âmostrarâ from incompatible pointer type

caca-palavras.c:47: warning: passing argument 1 of âconclusaoâ from incompatible pointer type

caca-palavras.c:47: warning: passing argument 2 of âconclusaoâ from incompatible pointer type

caca-palavras.c:54: warning: passing argument 1 of âmostrarâ from incompatible pointer type

caca-palavras.c:196:2: warning: no newline at end of file

/tmp/ccx63D5k.o: In function `main':

/home/bcc/ib03/src/caca-palavras.c:59: undefined reference to `getch'

collect2: ld returned 1 exit status

 

Deviam abolir getch.

 

 

getch("Pressione 'espaco' para finalizar o programa");

 

????????????????

Gafanhoto,getch não leva parâmetro nenhum.

 

 

Tirando o getch:

 

ib03@macalan:~/src\:gcc -g caca-palavras.c

caca-palavras.c: In function âmainâ:

caca-palavras.c:22: warning: passing argument 1 of âzeramatrizâ from incompatible pointer type

caca-palavras.c:23: warning: passing argument 1 of âreceberâ from incompatible pointer type

caca-palavras.c:26: warning: passing argument 1 of âzeramatrizâ from incompatible pointer type

caca-palavras.c:27: warning: passing argument 1 of âmostrarâ from incompatible pointer type

caca-palavras.c:35: warning: passing argument 2 of âprocuraâ from incompatible pointer type

caca-palavras.c:35: warning: passing argument 3 of âprocuraâ from incompatible pointer type

caca-palavras.c:37: warning: passing argument 1 of âmostrarâ from incompatible pointer type

caca-palavras.c:41: warning: passing argument 1 of âconclusaoâ from incompatible pointer type

caca-palavras.c:41: warning: passing argument 2 of âconclusaoâ from incompatible pointer type

caca-palavras.c:48: warning: passing argument 1 of âmostrarâ from incompatible pointer type

 

 

 

caca-palavras.c:22: warning: passing argument 1 of âzeramatrizâ from incompatible pointer type

 

O protótipo declara char* e você está passando char **. void zeramatriz(char (*pmat)[num], char *pletra) ou void zeramatriz(char pmat[][num], char *pletra);

 

 for(i=0;i<15;i++)
*(pletra+i)=rand();

 

Como o array vai de 0 até 14,você esta fazendo um passo a mais do que o necessario (i<14).

 

 

caca-palavras.c:23: warning: passing argument 1 of âreceberâ from incompatible pointer type

 

De novo erro de tipos:

Protótipo: int receber(char *pvet);

Chamada: i = receber(vet);

E vet é char [] []...

 

 

caca-palavras.c:35: warning: passing argument 2 of âprocuraâ from incompatible pointer type

caca-palavras.c:35: warning: passing argument 3 of âprocuraâ from incompatible pointer type

 

Chamada:procura(letra,vet,matriz);

Protótipo: void procura(char *pletra,char *pvet,char *pmat);

 

 

caca-palavras.c:37: warning: passing argument 1 of âmostrarâ from incompatible pointer type

 

Protótipo: void mostrar(char *pvet, char *pletra);

Chamada: mostrar(matriz,letra);

 

 

caca-palavras.c:41: warning: passing argument 1 of âconclusaoâ from incompatible pointer type

caca-palavras.c:41: warning: passing argument 2 of âconclusaoâ from incompatible pointer type

 

Protótipo:int conclusao(char *pvet,char *pmat);

Chamada: ident=conclusao(vet,matriz);

 

 

 

Tudo erro de tipagem.Onde é pra passar um char* você ta passando um char** e vice-versa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma observação, não seria getchar() ao invés de getch()?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então na hora de jogar na função tipo pvet e pmat tem que colocar **pvet e **pmat? me falaram que quando uso ponteiro de ponteiro eu posso trabalhar com ele como fosse um vetor

Compartilhar este post


Link para o post
Compartilhar em outros sites

indexar memória é o que você faz com um array...

Mas não espere que 1 pedaço de memória que contém apenas 1 endereço de alguma variável seja a mesma coisa que vários pedaços de memória contendo,cada um,o endereço de uma variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

alguem tem algum material ou tópico para me ajudar no tratamento de ponteiro para ponteiro, e jogar um return em ponteiro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.