C/Visual C - PILAS Y ARCHIVOS POR FA..

 
Vista:

PILAS Y ARCHIVOS POR FA..

Publicado por Lety (1 intervención) el 17/01/2003 21:29:37
HOLA tengo el siguiente problema, necesito capturar una string y guardarlo en un archivo1.txt y despues leer el contenido de ese archivo y guardarlo en otro archivo2.txt pero de forma inversa si la palabra fue "amor" en el segun archivo se guardara "roma", ya solucione la escritura y lectura de archivos, estoy ahora tratando de invertir el contenido con una pila, pero estoy hecha nudo con el concepto de pila, bueno cualquier ayuda es bien agradecida
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:PILAS Y ARCHIVOS POR FA..

Publicado por Endos (58 intervenciones) el 17/01/2003 22:11:07
Las pilas son bastante sencillas de entender con un ejemplo simple:
Imagina que vas a apilar libros sobre una mesa. Primero coges el libro titulado A y lo colocas, sobre este colocas otro libro titulado M. Luego coges el siguiente que va encima titulado O y por ultimo colocas encima del todo el ultimo que se titula R.
Ahora tienes que has colocado los libros sobre la mesa en el orden A-M-O-R.

Ahora piensa que necesitas coger de nuevo esos libros de uno en uno. Evidentemente el que esta encima del todo es el titulado R y deberas coger ese el primero. Debajo esta el O, luego viene el M y debajo de todo el ultimo que es el titulado A.

De forma que esta vez los has recogido en el orden R-O-M-A.

Como ves, cuando apilas, el ultimo en colocarse es el primero en quitarse , o en otras palabras, el primero en entrar es el ultimo en salir.

Asi que para hacer lo que quieres debes crear dos funciones, una Colocar y otra Recoger:

int PosicionDeLaPila=0;
char BufferPila[128]; // puedes alojarlo dinamicamente una vez sabes el tamaño del string

void Colocar(char Dato)
{
BufferPila[PosicionDeLaPila]=Dato;
PosicionDeLaPila++; // Siguiente posicion
}

char Recoger(void)
{
char Dato=NULL; // Si no quedan datos retornar NULL

if(PosicionDeLaPila!=0) // Mirar que no este vacia
{
PosicionDeLaPila--; // Posicion anterior
Dato=BufferPila[PosicionDeLaPila];
}

return Dato;
}

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PILAS Y ARCHIVOS POR FA..

Publicado por lety (1 intervención) el 17/01/2003 22:39:48
pero como declaro la pila ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PILAS Y ARCHIVOS POR FA..

Publicado por Endos (58 intervenciones) el 17/01/2003 22:54:37
Está en el código de ejemplo. La pila sería "BufferPila", que no es otra cosa que la memoria donde se almacenan los datos.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PILAS Y ARCHIVOS POR FA..

Publicado por Lety (1 intervención) el 18/01/2003 08:22:39
gracias, pero creo que eso es un arreglo o no ?
de todos modos gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PILAS Y ARCHIVOS POR FA..

Publicado por Endos (58 intervenciones) el 18/01/2003 11:52:36
Claro que es un arreglo. Pero un arreglo no es otra cosa que una porción de memoria indexada y una pila es una forma de guardar y recuperar los datos. Por eso el arreglo se llama BufferPila, porque es un buffer de memoria para la pila. La pila en sí es el ejemplo de los libros, o sea, la memoria para meter los datos y la forma de guardarlos y recuperarlos. Diríamos que la pila es el conjunto de BufferPila (arreglo) y las funciones Colocar y Recoger. Ese conjunto definiría en este caso una pila de tipo ascendente (existen muchos otros tipos de pilas, pero esta, con el ejemplo de los libros, es de las más fáciles de explicar).
Evidentemente podrías sustituir el arreglo por asignación dimámica de memoria (como ya indico en el comentario del código) usando malloc() y el conjunto seguiría siendo una pila.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PILAS Y ARCHIVOS POR FA..

Publicado por la mismisima (1 intervención) el 19/01/2003 03:33:05
perdon de nuevo, estoy capturando el string de la siguiente manera

...
char cadena[80];

printf("escribe la cadena ");

while (strlen(gets(cadena))>0)

....

como puedo hacerlo de manera dinamica no solo de 8 sino del la longitud del string, asi como dices dinamicamente, solo eso como creo, como meto y como saco los datos de la pila...uff gracias y perdon por seguir molestandoo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PILAS Y ARCHIVOS POR FA..

Publicado por Endos (58 intervenciones) el 19/01/2003 13:03:13
La solución casi la tienes en tu propio código. Una vez la cadena a sido introducida ya sabes lo que mide usando strlen(), así que puedes alojar la memoria justa para meterla sin problemas:

char *BufferPila;

void CrearPila(int Size)
{
BufferPila=malloc(Size); // Alojar memoria
}

void DestruirPila(void)
{
free(BufferPila);
}

void ColocarCadena(char *Cadena)
{
CrearPila(strlen(Cadena)); // Crear la pila

if(BufferPila) // Mirar que pudo alojar la memoria
{
while(*Cadena) // Hasta que no termine la cadena
{
Colocar(*Cadena);
Cadena++; // Siguiente caracter
}
}
}

void RecogerCadena(char *BufferCadena)
{
char Caracter;
if(BufferPila) // Mirar que pudo alojar la memoria
{
do
{
Caracter=Recoger();
*(BufferCadena)=Caracter;
BufferCadena++; // Siguiente posicion
}
while(Caracter);

DestruirPila();
}
}

El código sería similar a ese y la llamada sería algo así:

ColocarCadena(cadena); // Pasar la cadena que obtienes en tu código
RecogerCadena(cadena); // Recoger la nueva cadena desde la pila

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar