Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda con arreglo.

Estas en el tema de Ayuda con arreglo. en el foro de C/C++ en Foros del Web. Hola de una vez gracias a los que me puedan ayudar. lo que pasa es que haciendo un pekenho programa no c por que no ...
  #1 (permalink)  
Antiguo 28/09/2009, 15:14
 
Fecha de Ingreso: septiembre-2009
Mensajes: 4
Antigüedad: 14 años, 7 meses
Puntos: 0
Ayuda con arreglo.

Hola de una vez gracias a los que me puedan ayudar.
lo que pasa es que haciendo un pekenho programa no c por que no puedo guardar las palabras que leo de una archivo de texto en un arreglo. cuando imprimo el arreglo en consola, me sale que todas las posisicones tienen la misma palabra que siempre es la ultima, aca les dejo el codigo para que me entiendan mejor, esta hecho en dev++ y se supone que es una sopa de letras que lee la lista de las palabras de un archivo de texto, al igual que la sopa de letras.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
FILE * archivo;
FILE * lista;
char cadena[1024];
char *cc;
char sopa[1024][1024];
char *palabras[200];
int n = 1024;
int c;
char arreglo[200];
int i;

//Abre los archivos donde esta la informacion de la sopa de letras y las palabras
archivo = fopen("./sopa.txt", "r+");
lista = fopen("./lista.txt", "r+");

//Verifica que los archivos se puedan abrir correctamente
if (archivo == NULL || lista == NULL)
{
printf("No se pudo abrir el archivo\n");
system("pause");
return 0;
}

printf(" Sopa de Letras \n\n");


//Le muestra al usuario la sopa de Letras en mayusculas, y ademas llena la matriz "sopa" con los caracteres correspondientes
int contador = 0;
while(fgets(cadena, n, archivo) != NULL)
{
for(int i = 0; i<strlen(cadena); i++)
{
char l = cadena[i];
sopa[contador][i] = l;

}
contador++;

cc = strupr(cadena);
printf(" %s",cc);
}


//Muestra al usuario las palabras que se deben encontrar y guarda las palabras en un arreglo de strings

printf("\n\n\n\n Lista de Palabras: \n\n");




for(int f=0; fgets(cadena, n, lista) != NULL; f++)
{


palabras[f] = cadena;


}

for(int y=0; y<strlen(cadena);y++)
{

printf("%s++",palabras[y]);
}



fclose(archivo);
fclose(lista);
system("pause");
return 0;

}

cualquier ayuda seria perfecto Gracias


por cierto el formate de los archivos de texto es:

para la lista de palabras:
palabra1
palabra2
.
.
.
.
palabra n

el problema es en la ultima iteracion imprime n veces la ultima palabra.

por ejemplo mi archivo de texto lista es:

perro
casa
cama
gato
mesa
silla


y el archivo llamado sopa es:

tendreperro
slocsojosma
iuylamacejs
losyusncige
larrilaloem
antrelabios

y lo que me imrprime es:

sopa de letras

tendreperro
slocsojosma
iuylamacejs
losyusncige
larrilaloem
antrelabios

Lista de Palabras

silla
++silla
++silla
++silla
++silla
++silla
++Presiones una tecla para terminar...

Última edición por juanda89; 28/09/2009 a las 15:21
  #2 (permalink)  
Antiguo 28/09/2009, 18:14
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con arreglo.

Que tal Juanda,
lo que sucede es que para igualar cadenas no se usa "=", sino strcpy().
No se usa "=" porque lo que se hace ahí es igualar el puntero de inicio de cadena, por eso en
Cita:
for(int f=0; fgets(cadena, n, lista) != NULL; f++)
{


palabras[f] = cadena;


}
lo que se hizo fue apuntar todas las palabras[f] al puntero de cadena, y cadena tenía escrito al final "silla", entonces por eso imprime todos como "silla".

Lo que hay que hacer ahí es:
Código:
for(int f=0; fgets(cadena, n, lista) != NULL; f++){
   palabras[f] = new char[strlen(cadena)+1];      
   strcpy(palabras[f],cadena);
}
Ahí, a cada puntero de palabras se le han asignado varios caracteres según el tamaño de "cadena", y para copiarlo se usa strcpy().

Por otro lado, cuando estés imprimiendo la lista
Cita:
for(int y=0; y<strlen(cadena);y++)
{

printf("%s++",palabras[y]);
}
el for no debe ir hasta "strlen(cadena)" porque ese es el tamaño de la última palabra, debe ir hasta "f", entonces la "f" hay que declararla fuera del for.

Saludos.
  #3 (permalink)  
Antiguo 28/09/2009, 20:10
 
Fecha de Ingreso: septiembre-2009
Mensajes: 4
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Ayuda con arreglo.

Hombre Muxisimas gracias, no sabes todo lo q me ha ayudado, lo que pasa es que normalmente manejo java por lo que aun no entiendo muy bn lo de lo apuntadores.

Gracias!.
  #4 (permalink)  
Antiguo 29/09/2009, 05:47
 
Fecha de Ingreso: septiembre-2009
Mensajes: 4
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Ayuda con arreglo.

Bno tengo otro problemita si alguien tiene la paciencia de mirarlo serio de gran ayuda, básicamente el programa carga una sopa de letras y las palabras a buscar desde 2 archivos de texto. ya casi todo esta hecho, excepto porque el programa debe encontrar las palabras y decir las coordenadas de la primero y ultima letra de cada palabra, sin embargo cuando utilizo el metodo srtsrt y comparo lo que tengo en el arreglo palabras con las lineas de la sopa de letras algunas las encuentra pero otras no, lo cual es un error xq si estan y si todo las palabras que quiero buscar no desde el arreglo palabras sino que las escribo como se suponen deben estar escritas si las encuentra, por lo que creo que es un problema al leer el archivo y ponerlo en los arreglos creo que anhade caracteres que no se ven. Gracias!!!

//Funciones de busqueda
void buscarHorizontal();
void buscarVertical();
void buscarD1();
void buscarD2();
int posicion(char *cadena, char *subcadena);



FILE * archivo;
FILE * lista;
char cadena[1024];
char sopa[500][500];
char *palabras[400];
char *palabrasI[400];
int n = 1024;
char *LineasH[500];
char *LineasV[500];
char *LineasD1[500];
char *LineasD2[500];
int filas;
int columnas;
int diagonales;
int numeroPalabras;
char cont;

int main(){



//Abre los archivos donde esta la informacion de la sopa de letras y las palabras
archivo = fopen("./sopa.txt", "r+");
lista = fopen("./lista.txt", "r+");

//Verifica que los archivos se puedan abrir correctamente
if (archivo == NULL || lista == NULL)
{
printf("No se pudo abrir el archivo\n");
system("pause");
return 0;
}


//del archivo saca el numero de filas y columnas de la sopa de letras

char *ccc = fgets(cadena, n, archivo);
char ccc2[1024];
///elimina los espacios de la primera linea
int kk = 0;
for(int t=0; t< strlen(cadena)-1; t++)
{
char hj = cadena[t];

if(hj != ' ')
{
ccc2[kk]=hj;
kk++;
}


}


// mira el numero de columnas y filas de la sopa de letras

char *t1;
t1 = strtok(ccc2,"x");
filas = atoi (t1);
t1 = strtok(NULL, "x") ;
columnas = atoi (t1);


//imprime el titulo
printf(" Sopa de Letras \n\n");


//Le muestra al usuario la sopa de Letras en mayusculas, y ademas llena la matriz "sopa" con los caracteres correspondientes
int contador = 0;
while(fgets(cadena, n, archivo) != NULL)
{
for(int i = 0; i<columnas; i++)
{
char l = cadena[i];
sopa[contador][i] = l;

}

// En el arreglo LineasH coloca las filas de la sopa de letras
LineasH[contador] = new char[strlen(cadena)+1];
strcpy(LineasH[contador],cadena);




contador++;
char *cc = strupr(cadena);
printf(" %s",cc);
}




// En el arreglo LineasV coloca las columnas de la sopa de letras

int numero = 0;
char pal[filas];
for(int f=0 ; f<columnas;f++)
{
for(int ff=0; ff< filas; ff++)
{
char karacter = sopa[ff][f];
pal[ff]=karacter;
}

pal[filas] = '\0';

LineasV[f] = new char[filas +1];
strcpy(LineasV[f],pal);

numero++;
}


// En el arreglo LineasD1 coloca las lineas diagonales en direccion \ de la sopa de letras

int boolean = 0;
numero = 0;
int kkontador = 0;
char pala[n];
for(int f=0 ; f<columnas-1;f++)
{
int col = f;
for(int ff=0; boolean==0; ff++)
{
char karacter = sopa[ff][col];
if (karacter == 0)
boolean =1;

else
{
pala[ff]=karacter;
col ++;
numero =ff;
}

}

pala[numero+1] = '\0';
boolean = 0;

LineasD1[f] = new char[n];
strcpy(LineasD1[f],pala);
kkontador++;

}


boolean = 0;
numero = 0;


for(int f=0 ; f<filas-1;f++)
{
int col = f;
for(int ff=0; boolean==0; ff++)
{
char karacter = sopa[col][ff];

if (karacter == 0)
boolean =1;

else
{
pala[ff]=karacter;
col ++;
numero =ff;
}

}

pala[numero+1] = '\0';
boolean = 0;
LineasD1[kkontador] = new char[n];
strcpy(LineasD1[kkontador],pala);
kkontador++;


}

diagonales =kkontador;

// En el arreglo LineasD2 coloca las lineas diagonales en direccion / de la sopa de letras

boolean = 0;
numero = 0;
kkontador = 0;
int pos = 0;
pala[n];
for(int f=columnas-1 ; f>0;f--)
{
int col = f;
for(int ff=0; boolean==0; ff++)
{
char karacter = sopa[ff][col];

if (karacter == 0)
{
boolean =1;

}

else
{
pala[ff]=karacter;
col --;
numero =ff;


}

}

pala[numero+1] = '\0';
boolean = 0;


LineasD2[pos] = new char[n];
strcpy(LineasD2[pos],pala);
kkontador++;
pos++;

}

boolean = 0;
numero =0;

for(int f=0 ; f<filas;f++)
{

int fil = f;
for(int ff=columnas-1; boolean==0; ff--)
{
char karacter = sopa[fil][ff];

if(sopa[fil][ff] == 0)
{
boolean =1;

}

else
{

pala[numero]=karacter;
fil++;
numero++;

}
}
pala[numero] = '\0';
boolean =0;
numero = 0;
LineasD2[pos] = new char[n];
strcpy(LineasD2[pos],pala);
pos++;
}




//-------------------------------------------------------------------------------------------

//Muestra al usuario las palabras que se deben encontrar y guarda las palabras en un arreglo

printf("\n\n\n\n Lista de Palabras: \n\n");

//inicializa la variable numeroPalabras con el numero de las palabras a buscar
fgets(cadena, n, lista);
numeroPalabras = atoi (cadena);

//Muestra las palabras en mayusculas y las guarda en un arreglo llamado palabras
int kon = 0;
while(fgets(cadena, n, lista) != NULL)
{


palabras[kon] = new char[n];
strcpy(palabras[kon],cadena);

char *cc = strupr(cadena);
printf(" - %s",cc);
kon++;
}



//agrega a la lista de palabras las inversas de las mismas sin mostrarlas al usuario


for(int u = 0; u<numeroPalabras; u++)
{
char *palabra;
palabra = new char[n];
strcpy(palabra,palabras[u]);


char *pf = palabra;
char *pi = palabra;
char aux;

// Buscar final de cadena
while(*pf) pf++;

pf--;
// invertir cadena
while(pi < pf)
{
aux = *pi;
*pi = *pf;
*pf = aux;
pi++;
pf--;
}
// guarda las palabras al reves
palabras[kon] = new char[n];
strcpy(palabras[kon],palabra);

kon++;
}



for (int s=0 ; s<2*numeroPalabras ; s++)
{
printf("%s",palabras[s]);

}




// pregunta si desea que la sopa de letras sea resuelta

printf(" \n Desea ver el el resultado? (s/n) ");
fflush(stdin);
scanf("%c", &cont);

if(cont == 's')
{
buscarHorizontal();
printf("si");

}

if(cont == 'n')
{
fclose(archivo);
fclose(lista);
return 0;
}


fclose(archivo);
fclose(lista);
system("pause");
return 0;

}
  #5 (permalink)  
Antiguo 29/09/2009, 05:48
 
Fecha de Ingreso: septiembre-2009
Mensajes: 4
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Ayuda con arreglo.

void buscarHorizontal()
{

for(int i = 0; i<2*numeroPalabras; i++)
{

for(int j = 0; j<filas; j++)
{

char *palabraBuscada = palabras[i];

char *dondeBuscar = LineasH[j];
char *cc= strstr(dondeBuscar, palabraBuscada);

if(cc!=NULL)
{
int kk = posicion(dondeBuscar ,palabraBuscada);

printf("Palabra: %s. Posicion: (%i,%i) a (%i,%i)",palabraBuscada,j+1,kk+1,j+1,kk+strlen(pal abraBuscada));
}




if(cc==NULL)
printf("\nnoooooooo\n");
}
}
}

int posicion(char *cadena, char *subcadena)
{
int i, j;

for(i=0; i<strlen(cadena); i++)
{

if(cadena[i]==subcadena[0])
{
// Si el numero de caracteres restantes en la cadena es menor al numero de caracteres de la subcadena

if(strlen(cadena)-i < strlen(subcadena))
return -1;

// Se compara uno a uno los caracteres
for(j=0; j<strlen(subcadena); j++)
// Si encuentra algun caracter distinto
if(cadena[i+j]!=subcadena[j])
break;

// Si todas las comparaciones son exitosas, entonces se ha encontrado la subcadena en la posicion i

if(j==strlen(subcadena))
return i;
}
}

// No se ha encontrado la subcadena
return -1;
}
  #6 (permalink)  
Antiguo 29/09/2009, 10:59
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con arreglo.

El cuento es este:
cuando usted lee el archivo de la lista de palabras con la función fgets(), esta función lo que hace es leer la palabra completa junto con el retorno de línea (o enter, que se compone de 2 caracteres, el 13 y el 10).

Por eso cuando las busca en la sopa, busca que también tenga el retorno de línea y ahí es donde no va a encontrar.
Eso también pasa cuando lee el archivo sopa.txt, pero en este caso no hay problema porque usted va a buscar palabras contenidas ahí, o sea que no importa que éste tenga los retornos de línea.

Lo que hay que hacer es, que cuando lea, antes de copiarlo a la lista de palabras escriba
Código:
cadena[strlen(cadena)-2]=0;
Así trunca cadena quitando los 2 últimos caracteres y luego sí lo copia a palabras[].

Saludos.
  #7 (permalink)  
Antiguo 29/09/2009, 11:06
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con arreglo.

Siendo así, en el archivo lista.txt todas las palabras deben ir con un enter al final, incluido la última.
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 08:23.