Foros del Web » Programación para mayores de 30 ;) » Programación General »

Programa q busca en un dicc. (en C)

Estas en el tema de Programa q busca en un dicc. (en C) en el foro de Programación General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/04/2005, 16:38
Avatar de loka-por-racing  
Fecha de Ingreso: noviembre-2002
Ubicación: buenos aires
Mensajes: 55
Antigüedad: 21 años, 5 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
  #2 (permalink)  
Antiguo 28/04/2005, 06:06
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Si buscas palabras desordenadas debes hacer un for que calcule la siguiente posibilidad. Dale un valor número a las posiciones iniciales

Jaja
1234

Y luego ve cambiando las posiciones...

1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431

etc

¿Entiendes la sucesión?
  #3 (permalink)  
Antiguo 28/04/2005, 07:48
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 4 meses
Puntos: 0
En tu programa asumes que cada palabra del diccionario termina con el caracter ',' lo que es correcto en todos los casos con excepcion de la ultima palabra que (obviamente) termina con el caracter '\0'. Es por eso que tu programa genera un error en tiempo de ejecucion.

En la funcion 'comparac' estas incrementando dos veces la variable 'i':
Código:
while (i < N) {
   if ((diccionario[j] != ',') && (cadena[i] != '\0')) {
      j++;
      i++;
   }
   i++;
}
Cuando deberia ser:
Código:
while (diccionario[j] != ',' && diccionario[j] != '\0' && cadena[i] != '\0'){
   j++;
   i++;
}
if ((diccionario [j] == ',' || diccionario [j] == '\0') && cadena[i] == '\0')
   return 1; //la cantidad de letras es igual en ambos
else
   return 0; //la cantidad de letras es distinta en ambos
Tambien habria que clarificar la funcion 'sacar_en' ya que esta solo elimina (si lo hubiera) el caracter '\n' al final de la cadena mientras que el comentario indica otra cosa (eliminacion de ' ' y '\n').

Tal vez haya (o no) otros errores en tu programa pero solo lo revise de forma superficial.

Por cierto una forma de verificar si dos cadenas estan formadas por los mismos caracteres (incluyendo las repeticiones) pero con un orden distinto es simplemente ordenar ambas cadenas y compararlas utilizando la funcion strcmp.

Un saludo
  #4 (permalink)  
Antiguo 28/04/2005, 16:00
Avatar de loka-por-racing  
Fecha de Ingreso: noviembre-2002
Ubicación: buenos aires
Mensajes: 55
Antigüedad: 21 años, 5 meses
Puntos: 0
GRacias x contestar!!!.. Ya logre q me funq.. Aca dejo el codigo x si alguien lo necesita.
Saludos
Yas


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,asca,cosita,colorado,";
	char cadena [N];
	char aux1[M]="";
	int pos=0;

    printf ("Ingrese una cadena de caracteres: ");
	fgets (cadena,N,stdin);
	fflush(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,aux1,&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]!='\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.\n");
	return 0;
}

/* Verifica si tiene la misma cantidad de letras */
int comparac (char diccionario [M], char cadena [N], int pos)
{
	int i=0;   // para la cadena
	int j=pos; // para el diccionario
	while (diccionario[j] != ',' && cadena[i] != '\0')
	{
		j++;
		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
}

/* compara las letras entre la cadena y el diccionario apartir de la posicion de dicc
   y la concatena en aux1 donde se guardan todas las palabras validas */
void comparal (char diccionario [M], char cadena[N], char aux1[M], int* pos)
{
	int i=0;
	int j=*pos, k=0;
	int cont=0;
	char aux[9], auxcadena[9];
	strcpy(auxcadena,cadena);

	while ((auxcadena[i]!='\0') && (diccionario[j]!=','))
	{	
		if (diccionario[j]==auxcadena[i]) 
		{
			aux[k] = auxcadena[i]; 
			auxcadena[i] = '@';  
			j++;
			*pos=j;
			i=0;
			k++;
		}
		else
			i++;
	}
   	aux[k]='\0';
	if ((auxcadena[i]=='@') && (diccionario[j]==',')) /* tonces esa palabra coincidia */
	{
		strcat(aux1, " ");
	    strcat(aux1, aux);
	}
	pasar_letra(diccionario, pos); 
}

/* pasa de palabra en diccionario para comparar la proxima */
void pasar_letra (char diccionario [M], int* pos)
{
	while (diccionario[*pos]!= ',')
		(*pos)++;
	(*pos)++;
}

/* saca el enter */
void sacar_en (char *cadena)  
{
	while(*cadena!='\0' && *cadena!='\n')
		cadena++;
	*cadena='\0';
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:37.