Error en programa en C (Resuelto)

Iniciado por joanj94, 2 Enero 2014, 13:11 PM

0 Miembros y 2 Visitantes están viendo este tema.

joanj94

Hola, bien estoy haciendo una practica en la universidad en la que me piden, guardar palabras (10 como maximo) y luego ir metiendo palabras i comprovar si la palabra metida es anagrama de alguna de las guardadas anteriormente.

No se porque no funciona bien, creo que trabaja mal las palabras la funcion "llegir_comparar" pero no lose, aqui os dejo el pastebin y me decis que es lo que puede fallas.

Gracias de antemano :)

S

(PD: los comentarios y enunciado estan en catalan)


-> Traducido e.e


leosansan

#1
Cita de: joanj94 en  2 Enero 2014, 13:11 PM
(PD: los comentarios y enunciado estan en catalan)

¡¡¡Chacho!!!, afloja un punto. No cuesta tanto castellanizar un código simple y nos ahorras un esfuerzo adicional. ;) ;) ;)

De entrada el código no furula, vamos no compila. Eso porque creo te falta la librería  <stdbool.h>, además de un "return" al final de la función main.

Lo he mirado sólo por encima y me parece poco clara la explicación de lo que hay que introducir y muy rebuscada la solución que planteas.

Los diez nombres que hay que introducir, ¿seguro que pueden llevar espacios y además acabar con punto?. Me parece muy raro si lo que pretendes es buscar anagramas.

Me parece que lo más lógico es que los diez nombres sean simples palabras, sin espacios ni ná de ná, y que la cadena, que es la que parece que puede contener 50 caracteres como máximo, o sea que sí pueda tener espacios y acabar con un punto y ya luego buscar si alguna de las palabras posee anagrama o no en la cadena. ¿Me equivoco?. ¿Puedes sacarme de la duda?.


¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:




joanj94

Si tienes razon en lo de los comentarios jajaja, perdon, el programa compila perfectamente, lo que no da bien los anagramas


joanj94

#3
Ahora traduzco

Aqui esta  traducido


ah si, es en C++ por los bool y eso, pero la programacion de este es en C ya que no uso punteros ni clases ni nada mas del C++


amchacon

Los punteros son de C no de C++, y los bools se pueden representar con un char perfectamente. Yo lo que he hecho es poner esto al principio del código:
#define bool char
#define false 0
#define true 1


Y ya con eso compila con el compilador de C.

En cuanto al código, te recomendaría quitar el "." como identificador de final de la línea. Para eso ya está caracter nulo '\0'.

Y hablando de caracteres nulos, no me parece muy adecuado tu forma de leer. Lo que puedes hacer es leer la línea entera con fgets:
http://www.cplusplus.com/reference/cstdio/fgets/

(el FILE* es el stdin, que es el archivo del teclado).

Y después ir guardando las palabras una a una en un array, separandolas con un espacio. Otra forma es leerlas una a una con el scanf y finalizar cuando la palabra introducida sea "Terminar".

Y bueno tu problema es:
while(d_c!='.')

¿Has dado arrays? Pues d_c debe tratarse como un array bidimensional, lo que estás haciendo es comparar la dirreción de memoria donde está el array (d_c funciona como un puntero si no usas los operadores []). Eso siempre va a ser un bucle infinito.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

joanj94

#5
Bien, dije que era C, porque aun no he dado punteros, ni usar memoria y eso, solo di las tablas o arrays multidimensionales etc

Prove usando el condicional while(strlen(txt)!=0) y tampoco


joanj94

He provado de todo, y no hay manera estoy desesperao xD


leosansan

Cita de: joanj94 en  2 Enero 2014, 21:08 PM
He provado de todo, y no hay manera estoy desesperao xD

¡¡¡Chacho!!!, tranquilito.

No me convence del todo tu código así que lo he "variado" un poquitito.

Y ya que no usas para entrar las cadenas ninguna función -scanf, gets, fgets, etc-, da la sensación que no quieres usar las funciones más habituales. Eso me lleva a que en este caso tampoco tendría sentido usar strcpy, strlen, isupper, bool, isblank, strcmp , vamos "ná de ná" y mucho menos las correspondientes librerías <ctype.h>, <string.h> y<stdbool.h>.

Así que sólo uso la mísera librería <stdio.h> y su función asociada getchar. ¡¡¡Todo un reto!!!.

Y opara que veas que funciona, un pantallazo:



Código (cpp) [Seleccionar]

#include <stdio.h>

void pillo_cadena (char cad[600],int flag);
int con_pal,con_frase,cont_l_on_palabras,lon_frase;
void palabras_en_palabras (char palabras[],char frase[]);
void ordenar (char cadena[10]);
int comparar (char temp1[10],char temp2[10]);
int longitud_cadena (char cadena[10]);
char convertidor(char caracter);

char palabras[10],n_palabras[10][51],temp [10],frase[600];

int main (){

    char palabras[]="leon San noel.";
    char frase[]="NeoL aSN sAn Nas LeoN.";
    /*
    Acticva lo que sigue para introducir a mano
    los datos y desactiva entonces los dos anteriores
    */

    /*int flag=0;
    char palabras[10],frase[600];
    palabras[0]=frase[0]='\0';
     flag=1;
    printf("Introduce un seguido de palabras (10 max) de 50 caracteres como mucho, terminando con un '.'\n");
    pillo_cadena (palabras,flag);
    flag=2;
    printf("Introduce el texto, separando las palabras con especios i terminando con un '.', las palabras deben de ser de 50 letras max\n");
    pillo_cadena (frase,flag);*/
    palabras_en_palabras (palabras,frase);
    return 0;
}

void pillo_cadena (char cad[600],int flag){
    int i=0;
    int pillo_cad;
    cad[0]='\0';
    do{
        pillo_cad=getchar();
        cad[i]=pillo_cad;
        if (flag ==1)
            palabras[i]=cad[i];
        if (flag ==2)
            frase[i]=cad[i];
        i++;
    } while (pillo_cad != '\n');
    cad[i-1]='\0';
    if (flag ==1)
        palabras[i-1]=cad[i-1];
    if (flag ==2)
        frase[i]=cad[i-1];
}

void palabras_en_frase (char frase[],int con_pal,char temp[]){
    int i,cont=0,cont2=0;
    char aux [10],ch;
    aux [0]='\0';
    for (i=0;frase[i];i++){
        aux[cont]=frase[i];
        ch=frase[i];
        aux[cont]=convertidor (ch);
        cont++;
        if (frase[i]==' ' || frase[i]=='.'){
            aux[cont-1]='\0';
            ordenar  (n_palabras[con_pal]);
            ordenar  (aux);
            if (comparar (aux,n_palabras[con_pal])==0)
                cont2++;
            cont=0;
            aux [0]='\0';
        }
    }
    printf ("\nLa palabra %s tiene %d anagramas " ,temp,cont2);
    printf ("en: %s" ,frase);
}
void palabras_en_palabras (char palabras[],char frase[]){
    int i,j,cont=0,con_pal=0;
    char aux1 [10],temp [10],ch ;
    aux1 [0]=temp [0]='\0';
    for (i=0;palabras[i];i++){
        temp[cont]=palabras[i];
        ch=palabras[i];
        aux1[cont]=convertidor (ch);
        cont++;
        if (palabras[i]==' ' || palabras[i]=='.'){
            aux1[cont-1]=temp[cont-1]='\0';
            for (j=0;aux1[j];j++)
                n_palabras[con_pal][j]=aux1[j];
            n_palabras [con_pal][j]='\0';
            palabras_en_frase (frase,con_pal,temp);
            cont=0,con_pal++;
            aux1 [0]='\0';
        }
    }
}

void ordenar (char cadena[10]){
    int i,j,lon;
    char temp1;
    lon=longitud_cadena (cadena);
    for (i = 1; i < lon; i++){
        for (j = 0 ; j < lon-i; j++){
            if (cadena[j] > cadena[j+1]){
                temp1 = cadena[j];
                cadena[j] = cadena[j+1];
                cadena[j+1] = temp1;
            }
        }
    }
}

int comparar (char temp1[10],char temp2[10]){
    int i,si_o_no=0;
    if (longitud_cadena(temp1) != longitud_cadena(temp2))
        si_o_no=1;
    else {
        for(i=0;temp1[i];i++)
            if (temp1[i]!=temp2[i])
                si_o_no=1;
        si_o_no=0;
    }
    return si_o_no;
}

int longitud_cadena (char cadena[10]){
    int i;
    for (i=0;cadena[i];i++);
    return i;
}
char convertidor(char caracter){
    if (caracter>96 && caracter<123)
            caracter-=32;
    return (caracter);
}


Es muy mejorable usando las funciones que mencioné, como para que se puedan introducir números, más espacios entre palabras -como está sólo admite un espacio entre palabras- etc. Pero bueno, creo que lo que te pongo es lo que pedías. Al menos espero te sirva de orientación. ;)

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:

joanj94

Gracias por la ayuda :D, pero por asi decirlo los conocimientos que me permiten usar en este programa son los que habeis visto en el codigo, es en C++(porque uso bool) pero simplon, sin class, ni punteros, ni uso de funciones utiles mas de las que he usado.

Igualmente voy a provar algunas cosas que has dicho haber si se usarlas bien y lo arreglo :)


joanj94

#9
Por cierto, el texto que se introduce despues de los anagramas, se debe tractar cada palabra sin guardarla en memoria, no termino de ver si el codigo que has hecho lo hace asi, esque me cuesta un poco entendrerlo  :rolleyes:

Y se dicen segun se van encontrando anagramas al introducir palabras del texto, y si se encuentra uno se suma 1 al contador de anagramas indistintamente que sean el mismo o no.