Viernes 8 de Noviembre de 2024, 13:35
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Sopa de letras
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Sopa de letras (Leído 6181 veces)
kitiaralane
Nuevo Miembro
Mensajes: 1
Sopa de letras
«
en:
Lunes 23 de Mayo de 2011, 10:48 »
0
Hola gente! Soy nueva por aquí y mi intención al registrarme aquí es el de ayudar a aquellos, que como yo, nos cueste un poco programar. Hace poco me pidieron que realizara un programa en C que consistía en el juego de sopa de letras y la verdad es que mirando por internet he visto que hay muy pocos sitios donde te resulvan este ejercicio. Así que os dejo aquí el que hice yo para ayudaros a salir de cualquier apuro
/*Desarrollar un programa en C que pida al usuario el nombre de un archivo
que contiene una sopa de letras. El programa imprimirá la sopa de letras y
le preguntará al usuario que palabra desea buscar. A continuación, saldrá
un mensaje por pantalla indicando si se ha encontrado o no la palabra, en
qué sentido y su posición.Se le deberá preguntar al usuario si desea seguir
buscando más palabras.*/
Condiciones:
1El programa deberá crear un archivo de salida que guarde todas las palabras probadas,de modo que se pueda analizar posteriormente lo ocurrido durante la ejecución.
2. El uso de reserva dinámica de memoria.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCHAR 90
//Función que nos permite acceder a un fichero concreto y también el de crearlo
FILE* abrir_fichero(char *modo)
{
FILE*fichero;
char nfichero [MAXCHAR];
do
{
scanf("%89s", nfichero);
fichero=fopen(nfichero,modo);
//Control del error de apertura
if (fichero==NULL)
{
printf ("aHey!Te has equivocado!Ese fichero no existe!.Introduce otro nombre:n");
}
}
while (fichero==NULL);
return fichero;
}
// Función que nos permite liberar memoria una vez finalizado el juego
char **libera_matriz(char **matriz, int *nfil)
{
int i;
if (matriz != NULL)
{
for (i = 0; i < *nfil; i++)
{
if (matriz
!= NULL)
{
free(matriz
);
}
}
free(matriz);
}
return NULL;
}
//Función que lee la cabecera de la sopa de letras
void lee_cabecera (FILE* fichero, int *nfil, int *ncol)
{
char cab[MAXCHAR];
fscanf (fichero, "%s%i", cab, nfil);
fscanf (fichero, "%s%i", cab, ncol);
}
// Función que lee la sopa de letras y guarda de forma dinámica
char **leer_fichero (FILE* fichero, int *nfil, int *ncol)
{
int i, j;
char **sop;
sop=malloc(*nfil*sizeof(char*));
if (sop!=NULL)
{
for (i=0; i<*nfil; i++)
{
sop
=malloc(*ncol*sizeof(char));
}
fscanf (fichero,"n");
for (i=0; i<*nfil; i++)
{
for (j=0; j<*ncol; j++)
{
fscanf (fichero,"%c ", &sop
[j]);
}
}
}
return sop;
}
// Función que imprime la sopa de letras
void muestra_sopa (char **sop, int nfil, int ncol)
{
int i,j;
printf("nSopa de letras leida:nn");
for (i=0; i<nfil; i++)
{
for (j=0; j<ncol; j++)
{
printf("%c ", sop
[j]);
}
printf ("n");
}
printf ("nn");
}
//Lectura horizontal
int busqueda_horizontal(FILE*fichero,char **sop, int nfil, int ncol, char palabra[MAXCHAR])
{
int i,j,k;
char aux[MAXCHAR];
int tam;
int encontrada=0;
tam=strlen(palabra);
for (i=0; i<nfil&&encontrada==0; i++)
{
for (j=0; j<=(ncol-tam)&&encontrada==0; j++)
{
for (k=0; k<tam; k++)
{
aux[k]=sop
[j+k];
}
aux[k]=' ';
if (stricmp(palabra,aux)==0)
encontrada=1;
}
}
if (encontrada==1)
{
printf("nResultado de la busqueda:n"
"nPalabra: %snSentido: HorizontalnPosicion:nFila %inColumna %in",palabra, i, j);
fprintf(fichero,"nResultado de la busqueda:n"
"nPalabra: %snSentido: HorizontalnPosicion:nFila %inColumna %in",palabra, i, j);
}
return encontrada;
}
//Lectura vertical
int busqueda_vertical (FILE*fichero,char **sop,int nfil,int ncol, char palabra[MAXCHAR])
{
int i,j,k;
char aux[MAXCHAR];
int tam;
int encontrada=0;
tam=strlen(palabra);
for (i=0; i<=(nfil-tam)&&encontrada==0; i++)
{
for (j=0; j<ncol&&encontrada==0; j++)
{
for (k=0; k<tam; k++)
{
aux[k]=sop[i+k][j];
}
aux[k]=' ';
if (stricmp(palabra,aux)==0)
encontrada=2;
}
}
if (encontrada==2)
{
printf("nResultado de la busqueda:n"
"nPalabra: %snSentido: VerticalnPosicion:nFila %inColumna %in",palabra, i, j);
fprintf(fichero,"nResultado de la busqueda:n"
"nPalabra: %snSentido: VerticalnPosicion:nFila %inColumna %in",palabra, i, j);
}
return encontrada;
}
int busqueda_diagonal(FILE*fichero,char**sop,int nfil,int ncol, char palabra [MAXCHAR])
{
int i,j,k;
int encontrada=0;
int tam;
char aux[MAXCHAR];
tam=strlen(palabra);
for (i=0; i<=(nfil-tam)&&encontrada==0; i++)
{
for (j=0; j<=(ncol-tam)&&encontrada==0; j++)
{
for (k=0; k<tam; k++)
{
aux[k]=sop[i+k][j+k];
}
aux[k]=' ';
if (stricmp(palabra,aux)==0)
encontrada=3;
}
}
if (encontrada==3)
{
printf("nResultado de la busqueda:n"
"nPalabra:%snSentido:diagonalnPosicion:nFila %inColumna %in",palabra, i, j);
fprintf(fichero,"nResultado de la busqueda:n"
"nPalabra:%snSentido:horizontalnPosicion:nFila %inColumna %in",palabra,i,j);
}
return encontrada;
}
int main()
{
//Declaración de variables
FILE* fich;
char **sopa;
int nfil, ncol, encontrada=0;
char opcion,palabra[MAXCHAR];
//Entrada de datos
printf ("nQue fichero deseas abrir?:n");
fich=abrir_fichero("r");
lee_cabecera(fich, &nfil, &ncol); //Llamada de la función que lee la cabecera
sopa=leer_fichero(fich, &nfil, &ncol);//Llamada de la función que lee la sopa de letras
muestra_sopa(sopa,nfil,ncol);// Llamada de la función que imprime la matriz por pantalla
fclose(fich); //Cierra el fichero que contenia la sopa de letras pedida por el usuario
if (sopa==NULL)
{
printf("naError reservando memorian");//Control de error, si el puntero devuelto apunta a nulo no reserva memoria
}
else
{
// Cálculos
printf("nIntroduce el nombre del archivo de log (seguido de .txt):n");
fich=abrir_fichero("w");// Crea un nuevo archivo en el cual se guardarán los resultados
do
{
printf ("nQue palabra deseas buscar?");
scanf("%s", palabra);
encontrada=busqueda_horizontal(fich, sopa, nfil, ncol, palabra);//Llamada de la función que busca horizontalmente
if (encontrada!=1)
{
encontrada=busqueda_vertical(fich, sopa, nfil, ncol, palabra);//Llamada de la función que busca verticalmente
if (encontrada!=2)
{
encontrada=busqueda_diagonal(fich,sopa,nfil,ncol,palabra);
if (encontrada!=3)
{
printf ("n%s no se encuentra en la sopa de letrasn", palabra);
fprintf(fich,"n%s no se encuentra en la sopa de letrasn",palabra);
}
}
}
do
{
printf ("nQuieres seguir jugando?S/N:n");
getchar();
scanf ("%c", &opcion);
}
while((opcion!='S')&&(opcion!='N'));
}
while (opcion=='S');
fclose(fich); //Cierra el archivo que creamos para guardar los datos del juego
libera_matriz(sopa, &nfil);// Al finalizar el juego libera la memoria usada
}
return 0;
}
Si teneis algún tipo de duda os la reslveré encantada.
Un saludo!
Tweet
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Sopa de letras