• Sábado 14 de Diciembre de 2024, 22:36

Autor Tema:  Sopa de letras  (Leído 6204 veces)

kitiaralane

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
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!