|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Temas - kitiaralane
Páginas: [1]
1
« en: Lunes 23 de Mayo de 2011, 10:48 »
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!
Páginas: [1]
|
|
|