Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/04/2005, 16:38
Avatar de loka-por-racing
loka-por-racing
 
Fecha de Ingreso: noviembre-2002
Ubicación: buenos aires
Mensajes: 55
Antigüedad: 22 años, 4 meses
Puntos: 0
Pregunta Programa q busca en un dicc. (en C)

Hola.. hice un programa en C q busca en un diccionario (string de char) q ya esta predeterminado (x ahora con pocas palabras) si esta la secuencia de palabras desordenadas q ingresa el usuario en el dicc. digamos q si escribe x ej. asca y en el dicc esta casa .. entonces la muestre por pantalla y asi con todas las del dicc. Pero no me encuentra ninguna.. y no se como hacer.. x ahi no me modifica o no recorre los strings.. y no se q hacer.... Si alguien me puede ayudar se los agradeceriaa!!!! aca les dejo el cod.

Gracias de antemanooo!!!

Código:
#include <stdio.h>
# define M 40
# define N 40


int comparac (char [], char [], int);
void comparal (char [], char [], char[], int*);
void pasar_letra (char [], int* );
void intercambiar (char [], char []);
void sacar_en(char *);

int main ()
{
	char diccionario [M]= "saca,casa,cosa,cosita,colorado";
	char cadena [N];
	char aux1[M];
	int pos= 0;
	char *aux11=aux1;

	aux1[0]='#'; /* si no llega a haber palabra valida entonces el · siempre esta en la 1º pos */
    printf ("Ingrese una cadena de caracteres: ");
	fgets (cadena,N,stdin);
	sacar_en(cadena);
	while (diccionario[pos]!='\0') /* mientras no termine el dicc */
	{
	  if (comparac(diccionario,cadena,pos)==1) /* comparo si tienen el mismo largo */
		  comparal(diccionario, cadena,aux11, &pos);  /* si son = comparo las letras una x una */
	  else
		  pasar_letra(diccionario,&pos); /* si no tiene la misma cant. paso a la pal siguiente en dicc */

	}
	if (aux1[0]!='#') /* si encontro alguna(s) palabra(s) entonces la(s) muestro(s) */
		printf("%s",aux1);
	else
		printf("No se encontro ninguna palabra en el diccionario.");
	return 0;
}


int comparac (char diccionario [M], char cadena [N], int pos)
{
	int i=0; // para la cadena
	int j=pos; // para el diccionario

	while (i<N)
	{
		if ((diccionario[j]!= ',') && (cadena[i]!='\0'))
		{
			j++;
			i++;
		}
		i++;		
	}
	if ((diccionario [j]==',')&&(cadena[i]=='\0'))
		return 1; //la cantidad de letras es igual en ambos
	else 
		return 0; //la cantidad de letras es distinta en ambos

}

void comparal (char diccionario [M], char cadena[N], char aux1[], int* pos)
{
	int i=0;
	int j=*pos;
	char aux[9];
	while ((cadena[i]!='\0') && (diccionario[j]!=','))
	{
		if (diccionario[j]==cadena[i]) /* comparo si la letra en cadena es = a la de dicc */
		{
			aux[j] = cadena[i]; /* si es igual la guardo en la aux */
			cadena[i] = '@';  /* y la "saco" de cadena para que no la compare de nuevo */
			j++;
			*pos=j;
		}
		i++;
	}
	if ((cadena[i]!='\0') && (diccionario[j]!=',')) /* entonces esa palabra coincidia */
	{
		i=0;
		if (diccionario[j]==',')
			(*pos)++;
		while (i!='\0') /* la copio en aux1 */
		{
			aux1[i]=aux[i];
			i++;
		}
		aux1[i]='\b'; /* separo las palabras con espacio */
	}
	pasar_letra(diccionario, pos);  /* paso para comparar la palabra sig en dicc */
	intercambiar(cadena, aux); /* vuelvo a incluir todas las letras en la cadena para comparar con las otras */
}

void pasar_letra (char diccionario [M], int* pos)
{
	while (diccionario[*pos]!= ',')
		(*pos)++;
	(*pos)++;
}

void intercambiar (char cadena[N], char aux[M])
{
	int i=0;
	int j=0;
	while (cadena[i]!='\0' && aux[j]!='\0')  /* cambio los @ x las letras que corresponden */
	{
		if (cadena[i]=='@')
		{
			cadena[i]=aux[j];
			j++;
		}
		i++;
	}
}

void sacar_en (char *cadena) /* saca los espacios y el enter */ 
{
	while(*cadena!='\0' && *cadena!='\n')
		cadena++;
	*cadena='\0';
}

Última edición por loka-por-racing; 27/04/2005 a las 16:49