elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Importante-Curioso
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Importante-Curioso  (Leído 2,021 veces)
ElfoArdiente

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Importante-Curioso
« en: 27 Agosto 2019, 04:23 am »

Buenas estoy haciendo un ejercicio de la Facultad :silbar: y tengo una curiosidad
Código
  1.  
  2. #include<stdio.h>
  3. #include<stdbool.h>
  4.  
  5. #define max 10
  6.  
  7. typedef float tPila[max];
  8. tPila pila;
  9.  
  10. int i, tope, acum = 0;
  11.  
  12. int menu(int eleccion);
  13. bool CrearPilaVacia();
  14. bool PilaVacia();
  15. bool PilaLlena();
  16. void Apilar(int);
  17. void Desapilar();
  18. int cima();
  19. void VisualizarElementos();
  20. void sumaPila();
  21.  
  22. int main()
  23. {
  24. int eleccion;
  25.  
  26. menu(eleccion);
  27. }
  28. int menu(int eleccion)
  29. {
  30.   int pElementos;
  31.  
  32. while(eleccion != -1)
  33. {
  34.    printf("\n--BIENVENIDO--\n");
  35.    printf("1.- CrearPilaVacia\n");
  36.    printf("2.- Pila vacia? \n");
  37.    printf("3.- Pila Llena? \n");
  38.    printf("4.- Apilar \n");
  39.    printf("5.- Desapilar \n");
  40.    printf("6.- Visualizar Elementos \n");
  41.    printf("7.- Suma Elementos \n");
  42.    printf("-1.- Salir\n\n");
  43.    printf(".- Elige una opcion..\n");
  44.    scanf("%d",&eleccion);
  45. switch(eleccion)
  46. {
  47. case 1:
  48.    CrearPilaVacia();
  49.    printf("Has Creado una pila vacia? %s\n",CrearPilaVacia() ? "si" : "no");
  50.    break;
  51.  
  52.    case 2:
  53.    PilaVacia();
  54.    printf("Pila vacia? %s\n",PilaVacia() ? "si" : "no");
  55.    break;
  56.  
  57. case 3:
  58. PilaLlena();
  59. printf("Pila Llena? %s\n",PilaLlena() ? "si" : "no");
  60. break;
  61.  
  62. case 4:
  63. Apilar(pElementos);
  64. break;
  65.  
  66. case 5:
  67. Desapilar();
  68.    break;
  69.  
  70.    case 6:
  71.    VisualizarElementos();
  72.    break;
  73.  
  74.    case 7:
  75.    sumaPila();
  76.    break;
  77. }
  78. }
  79. }
  80. bool CrearPilaVacia()
  81. {
  82. tope = -1;
  83. }
  84. bool PilaVacia()
  85. {
  86. if(tope == -1)
  87. {
  88. return true; /* Tiene elementos.*/
  89. }
  90. else
  91. {
  92. return false; /* No tiene elementos.*/
  93. }
  94. }
  95. bool PilaLlena()
  96. {
  97. if(tope == (max-1))
  98. {
  99. return true;
  100. }
  101. else
  102. {
  103. return false;
  104. }
  105. }
  106. void Apilar(int pElementos)
  107. {
  108. if(PilaLlena() != true)
  109. {
  110. tope = tope + 1;
  111. pila[tope] = pElementos;
  112. printf("Ingrese un elemento! \n");
  113. scanf("%f",&pila[tope]);
  114. printf("Elemento insertado! %.2f\n",pila[tope]);
  115. }
  116. else
  117. {
  118. printf("Pila Llena!\n");
  119. }
  120. }
  121. void Desapilar()
  122. {
  123. if(PilaVacia() == true)
  124. {
  125. printf("Pila Vacia!!\n");
  126. }
  127. else
  128. {
  129. pila[tope] = 0;
  130. tope = tope - 1;
  131. printf("Elemento eleminado!!\n");
  132. }
  133. }
  134. int cima()
  135. {
  136. return pila[tope];
  137. }
  138. void VisualizarElementos()
  139. {
  140. int i;
  141. printf("Elemento en pila: \n");
  142. for(i=0; i<=tope; i++)
  143. {
  144. printf("\t%.2f",pila[i]);
  145. }
  146. printf("\n\n");
  147. }
  148. void sumaPila()
  149. {
  150. int i;
  151. float suma=0;
  152.  
  153. printf("Suma de elementos en la pila: \n");
  154.  
  155. // Suma los elementos de una pila.
  156. for(i=0; i<=tope; i++)
  157. {
  158. suma = suma + pila[i];
  159. acum = suma + 0;
  160.    }
  161.    printf("\t%.2f",acum);
  162. printf("\n\n");
  163. }
  164.  
  165.  

Al compilar me da un resultado muy raro, pues nose por que se genera
Al mostrar los elementos de la pila, me da el siguiente resultado.

0.00 4,50 4,30 4.90 5.90

Pues el 0.00 nose por que esta hay y nose como quitarlo
Si me pueden ayudar porfavor a resolver este curioso problema, les agradeceria muchisimo


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Importante-Curioso
« Respuesta #1 en: 27 Agosto 2019, 17:55 pm »

Pues tu problema es porque estás introduciendo valores (opción 4) sin crear la pila vacía primero (opción 1).
Pero vamos que aparte de ese problema, ese código es muy mejorable (pero MUY MUCHO)... Tienes:
  • Variables globales
  • Variables sin inicializar
  • Variables repetidas
  • Parametros innecesarios
  • Funciones a las que les falta el <return>
  • Funciones mal utilizadas
Como no sé si te interesa saber más sobre esto o no y no me apetece explicarme para nada, si quieres saber más detalles sobre el porqué del problema o algunos consejos para mejorar ese código, házmelo saber. AVISO: no te lo voy a dar todo ya hecho. Y si no lo necesitas, tema zanjado. :-X :-X


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
ElfoArdiente

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Importante-Curioso
« Respuesta #2 en: 28 Agosto 2019, 05:19 am »

Hola te lo agradeceria muchisimo que me ayudaras a entender cómo puedo mejorar , pues no entiendo nada de Pilas, ni de colas ni de listas, el problema es que estoy aprendiendo mal, en mi universidad no me enseñan la parte práctica de programación, este código MAL HECHO, lo estuve tratando de resolver y me llevo un dia entero.

En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Importante-Curioso
« Respuesta #3 en: 28 Agosto 2019, 15:44 pm »

Una pila o stack es un contenedor LIFO (last in first out), es decir, que el último que entra es el primero que sale. Imagina para esto una "pila" de platos, tú los vas amontonando uno encima de otro y cuando vas a coger uno, coges el de arriba del todo. Puedes fijarte en el contenedor <stack> de la STL para C++ para crear una pila en C lo más parecida posible a lo que existe. Entonces necesitas un contenedor de datos ordenado (en tu caso un array) y las siguiente funciones por lo menos (más o menos ya las tienes):
Código:
T top(); // devuelve el ultimo elemento de la pila del tipo que sea (int/float/char/...)
void push(T elemento); // introduce un nuevo elemento
void pop(); // saca el ultimo elemento de la pila
bool empty(); // devuelve true/false dependiendo de si la pila esta vacia o no
int size(); // devuelve el numero de elementos que contiene la pila

Una cola o queue es lo contrario a la pila, un contenedor FIFO (first in first out) donde el primero que entra es el primero que sale. Imagina una cola de personas que se ponen en un cajero, el primero que llega es el primero que usa el cajero y se va. En C++ también existe una cola de la STL <queue> y tiene los siguiente elementos además de un contenedor ordenado (que en tu caso usarías un array):
Código:
T front(); // devuelve el elemento que antes se inserto en la cola
void pop(); // elimina el elemento que antes se inserto
T back(); // devuelve el elemento que se inserto el ultimo
// No existe un pop() para eliminar el ultimo ya que entonces no seria una cola ya que dejaria de ser FIFO
void push(T elemento); // introduce un nuevo elemento a la cola
bool empty(); // devuelve true/false dependiendo de si la cola esta vacia o no
int size(); // devuelve el numero de elementos que contiene la cola

Una lista o list es como una mezcla, es un contenedor que permite insertar y eliminar elementos tanto por delante como por detrás. Al igual que para las otras, en C++ tenemos el contenedor <list> de la STL que tiene además del propio contenedor de valores las siguientes funciones:
Código:
void push_back(T elemento); // inserta un elemento al final de la lista
void push_front(T elemento); // inserta un elemento al comienzo de la lista
void pop_back(); // elimina el ultimo elemento de la lista
void pop_front(); // elimina el primer elemento de la lista
T front(); // devuelve el primer elemento de la lista
T back(); // devuelve el ultimo elemento de la lista
bool empty(); // devuelve true/false dependiendo de si la lista esta vacia o no
int size(); // devuelve el numero de elementos de la lista

Ahora respecto a las mejoras de tu programa. Algunas buenas prácticas son:
  • Evitar el uso de variables globales siempre que se pueda
  • Evitar mostrar mensajes dentro de las funciones a no ser que la función se encargue justo de eso, de mostrar un mensaje (ej; un menú).
  • Las constantes en mayúsculas. Por ejemplo <max> -> <MAX>
Supongo que si estás aprendiendo ahora, todavía no te habrán enseñado el uso de <struct> para agrupar variables o el paso de arrays como parámetros por eso lo usas de forma global y por separado <pila> y <tope>. Para el caso de esas dos variables lo dejaré pasar por lo dicho, aún no te habrán dicho cómo se hace de otra forma.
Sin embargo, la variable <i> de la línea 10 es global y luego en las líneas 140 y 150 vuelves a declarar una variable <i> para cada función de forma local. En este caso te recomiendo borrar la de la línea 10 para evitar una variable global.
También tienes en la línea 10 una variable <acum> que sólo usas dentro de la función <sumaPila()> y que contiene lo mismo que la variable <suma> que declaras dentro de la función. Entonces la variable <acum> sobra también.
Otra cosa importante es el uso de funciones. Una función sirve para agrupar un grupo de código y poder reutilizarlo por lo que hay que crear funciones fáciles de reutilizar. Tú pregúntate que programa se entiende mejor, el primero o el segundo:
Código
  1. int main(){
  2.    int eleccion;
  3.    menu(eleccion);
  4. }
  5.  
  6. int main(){
  7.    int eleccion = mostrarMenu();
  8.    while(eleccion != -1){
  9.        switch(eleccion){
  10.            case 1:
  11.                pilaNueva();
  12.                break;
  13.            case 2:
  14.                if(pilaVacia()) printf("La pila esta vacia");
  15.                else printf("La pila no esta vacia");
  16.                break;
  17.            // y asi con todos que me canso de seguir...
  18.        }
  19.        eleccion = mostrarMenu(); // al acabar lo que sea volvemos a dar a elegir
  20.    }
  21. }
Como ves en el primer caso delegas TODO el trabajo a otra función <menu()> por lo que te ves en las mismas. El <main> no te dice nada y todo el código está en <menu()>. La cosa está en que leyendo el <main> entiendas lo que el programa hace pero no hace falta que entiendas cómo lo hace. En el segundo ejemplo, se ve que muestras un menú y ese menú devuelve una opción, luego según la opción ves lo que el programa hace (por ejemplo, crear una pila nueva) pero si quieres saber CÓMO es cuando tienes que ir a la función <pilaNueva()>. Así el código queda limpio pero a la vez comprensible.

Paso de parámetros:
Tú tienes que pasar una variable como parámetro a una función cuando necesites esa variable fuera de la función y el valor de esa variable condicione algo de la función.
En tu función <menu()> recibes un parámetro <eleccion> que:
  • 1. No tiene ningún valor definido,
  • 2. No sirve para nada fuera de la función.
Necesitas ese parámetro? NO.
En la función <apilar()> sin embargo es al revés.
  • Objetivo de la función: insertar un elemento en la pila.
  • Parámetro: el elemento a insertar.
Hasta aquí todo perfecto pero resulta que lo que luego haces en la función es insertar el elemento, pedir uno nuevo y sobreescribir el primero por el nuevo... Para qué mandas un elemento como parámetro si no lo usas para nada "productivo"??

Respecto al resto de funciones:
La función <menu()> hace demasiadas cosas y recibe parámetros innecesarios.
Recomendación: hacer una función <int mostrarMenu()> que sólo muestre las opciones, de al usuario una a elegir y devuelva ese valor.

La función <crearPilaVacia()> tiene que retornar un <bool> y no retorna nada. Por tanto lo que retorna es -1 que es el valor de la asignación de la función. Y -1 traducido a <bool> es siempre <true>. No dejes la tarea de adivinar el valor de retorno. Deja bien claro qué devuelve una función (si tiene que devolver algo, claro, yo en este caso lo veo innecesario...).
Recomendacion: una función <void pilaNueva()> que lo único que haga sea poner el <tope> a -1.

Las funciones <pilaVacia()> y <pilaLlena()> podrías ahorrártelas ya que conoces el tamaño de la pila <MAX> y el número de elementos <tope>. Pero tampoco es un problema grave, si prefieres usar esas funciones eres libre de hacerlo pero se pueden acortar:
Código
  1. bool pilaVacia(){
  2.    if(tope == -1){ // comprueba si lo de dentro del parentesis es true o false...
  3.        return true; // ... si el parentesis vale true, devuelve true
  4.    }
  5.    else{ //... si el parentesis vale false...
  6.        return false; // ... devuelve false
  7.    }
  8. }
  9. // Al final lo que haces es devolver lo mismo que el resultado del parentesis
  10. // No sera mejor entonces devolver directamente el resultado del parentesis?
  11. bool pilaVacia(){
  12.    return (tope == -1);
  13. }
Recomendación: acortar ambas funciones como se ve en el ejemplo.

La función <apilar()>, como antes te he explicado, no tiene fundamento lo que haces. Además como antes decía es mejor evitar mostrar mensajes dentro de las funciones.
Recomendación: una función <bool apilar(int elemento)> que compruebe si se puede insertar el elemento. Si es posible, lo inserta y devuelve true y si no es posible no lo inserta y devuelve false. Así sin mostrar mensajes tú puedes saber si el elemento se insertó o no.

Para la función <desapilar()> más de lo mismo. Se pueden evitar los mensajes haciendo lo mismo que en <apilar()>
Recomendación: una función <bool desapilar()> que compruebe si la pila está vacía. Si está vacía devuelve false y si no está vacía, elimina el elemento (restar 1 a <tope>) y devuelve true. (No es necesario poner el elemento a 0 antes de eliminarlo).

En la función <visualizarElementos()> se podría eliminar el mensaje que sirve de "titulillo" y dejar únicamente los elementos. En caso de querer que se vea el titulillo ese siempre puedes ponerlo antes de llamar a la función.
Código
  1. printf("Los elementos de la pila son: ");
  2. visualizarElementos();
Recomendación: dejar la función igual <void visualizarElementos()> pero quitando el primer mensaje.

Y para la última función, <sumaPila()>, que también muestra los mensajes en pantalla tenemos que evitar esto.
Recomendación: una función <int sumaPila()> que calcule la suma y en vez de mostrarla por pantalla, la devuelva. Entonces para mostrar la suma haríamos:
Código
  1. printf("La suma de los elementos de la pila es: %d", sumaPila());

Unos consejos extra:
Código
  1. // Cuando se repite la misma variable justo antes y justo despues del = se puede acortar:
  2. suma += otro; // equivale a: suma = suma + otro
  3. resta -= otro; // equivale a: resta = resta - otro
  4. producto *= 2; // equivale a: producto = producto * 2
  5. // etc...
  6. // Para incrementar variables en una unidad se puede hacer:
  7. ++numero; // equivale a: numero = numero + 1
  8. numero++; // equivale a: numero = numero + 1
  9. // Para decrementar variables en una unidad se puede hacer:
  10. --numero; // equivale a: numero = numero - 1
  11. numero--; // equivale a: numero = numero - 1
Y para los condicionales:
Código
  1. // Poner:
  2. if(condicion == true){...}
  3. // ...es lo mismo que poner:
  4. if(condicion){...}
  5. // Al igual que para:
  6. if(condicion == false){...}
  7. // ...es lo mismo que poner:
  8. if(!condicion){...}
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
ElfoArdiente

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Importante-Curioso
« Respuesta #4 en: 29 Agosto 2019, 07:55 am »

Hola te agradezco un montón todo lo que me dijiste, ayer intente poner en práctica todo, la verdad no me salio casi nada y es por que no tengo claro los fundamentos ni la práctica aun, pero mi profe me aprobó el trabajo, y todavia no me doy por vencido estoy intentando nuevas cosas como por ejemplo mostrar el último elemento de la pila o mostrar el elemento eliminado de la pila, estoy si viendo si puedo agregar elementos de distinto tipo de dato, fuaa un montón de cosas en fin mira mi codigo, para mi esta muy cambiado pero nose, en fin muchas gracias enserio.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4.  
  5. #define max 10
  6.  
  7. typedef float tPila[max];
  8. tPila pila;
  9.  
  10. int tope;
  11.  
  12. int menu(int eleccion);
  13. bool CrearPilaVacia();
  14. bool PilaVacia();
  15. bool PilaLlena();
  16. bool Apilar(float pElementos);
  17. bool Desapilar();
  18. float cima();
  19. float VisualizarElementos();
  20. float sumaPila();
  21.  
  22. int main()
  23. {
  24. int eleccion = menu(eleccion);
  25. }
  26. int menu(int eleccion)
  27. {
  28.    float pElementos, acum = 0;
  29. while(eleccion != -1)
  30. {
  31.    printf("\n--BIENVENIDO--\n");
  32.    printf("1.- CrearPilaVacia\n");
  33.    printf("2.- Pila vacia? \n");
  34.    printf("3.- Pila Llena? \n");
  35.    printf("4.- Apilar \n");
  36.    printf("5.- Desapilar \n");
  37.    printf("6.- Visualizar Elementos \n");
  38.    printf("7.- Suma Elementos \n");
  39.    printf("8.- Elemento en el tope \n");
  40.    printf("-1.- Salir\n\n");
  41.    printf(".- Elige una opcion..\n");
  42.    scanf("%d",&eleccion);
  43. switch(eleccion)
  44. {
  45. case 1:
  46.    CrearPilaVacia();
  47.    printf("Has Creado una pila vacia? %s\n",CrearPilaVacia() ? "si" : "no");
  48.    break;
  49.  
  50.    case 2:
  51.    PilaVacia();
  52.    printf("Pila vacia? %s\n",PilaVacia() ? "si" : "no");
  53.    break;
  54.  
  55. case 3:
  56. PilaLlena();
  57. printf("Pila Llena? %s\n",PilaLlena() ? "si" : "no");
  58. break;
  59.  
  60. case 4:
  61. Apilar(pElementos);
  62. printf("Ingrese un elemento! \n");
  63.    scanf("%f",&pila[tope]);
  64.    printf("Elemento insertado! %.2f\n",pila[tope]);
  65. break;
  66.  
  67. case 5:
  68. Desapilar();
  69.    break;
  70.  
  71.    case 6:
  72.    printf("Elementos en la pila\n");
  73.    VisualizarElementos();
  74.    break;
  75.  
  76.    case 7:
  77.    sumaPila();
  78.    printf("\tLa suma de los elementos de la pila es: %.2f",sumaPila());
  79.        printf("\n\n");
  80.    break;
  81.  
  82.    case 8:
  83.    printf("El elemento en el tope es: %.2f",cima());
  84.    break;
  85. }
  86. }
  87. }
  88. bool CrearPilaVacia()
  89. {
  90. tope = -1;
  91. }
  92. bool PilaVacia()
  93. {
  94. if(tope == -1)
  95. {
  96. return true; /* Tiene elementos.*/
  97. }
  98. else
  99. {
  100. return false; /* No tiene elementos.*/
  101. }
  102. }
  103. bool PilaLlena()
  104. {
  105. if(tope == (max-1))
  106. {
  107. return true;
  108. }
  109. else
  110. {
  111. return false;
  112. }
  113. }
  114. bool Apilar(float pElementos)
  115. {
  116. if(PilaLlena() != true)
  117. {
  118. tope = tope + 1;
  119. pila[tope] = pElementos;
  120. }
  121. else
  122. {
  123. printf("Pila Llena!\n");
  124. }
  125. }
  126. bool Desapilar()
  127. {
  128. if(PilaVacia() == true)
  129. {
  130. printf("Pila Vacia!!\n");
  131. }
  132. else
  133. {
  134. pila[tope] = 0;
  135. tope = tope - 1;
  136. printf("Elemento eleminado!!\n");
  137. }
  138. }
  139. float cima()
  140. {
  141. return pila[tope];
  142. }
  143. float VisualizarElementos()
  144. {
  145. int i;
  146. for(i=0; i<=tope; i++)
  147. {
  148.   printf("\t %.2f",pila[i]);
  149. }
  150. }
  151. float sumaPila()
  152. {
  153. float suma=0, acum = 0;
  154. int i;
  155. // Suma los elementos de una pila.
  156. for(i=0; i<=tope; i++)
  157. {
  158. suma = suma + pila[i];
  159. acum = suma + 0;
  160.    }
  161.    return acum;
  162. }
  163.  
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Importante-Curioso
« Respuesta #5 en: 29 Agosto 2019, 16:03 pm »

  • La función <menu()> sigue haciendo demasiadas cosas y algunas mal... Y sigue recibiendo un parámetro inútil... Además de que le sobran variables...
  • La función <crearPilaVacia()> sigue retornando un <bool> y en tu caso no retorna nada...
  • Las funciones <pilaLlena()> y <pilaVacia()> las puedes acortar a una sola línea como te comenté...
  • A la función <apilar()> le falta el <return> y aunque la función está mejor, cuando la llamas en el <case> vuelves a hacerla inútil...
  • Las funciones <cima()> está bien.
  • La función <visualizarElementos()> debe retornar un <float> y no lo hace...
  • La función <sumaPila()> tiene dos variables para hacer lo que se puede hacer con una...
Lo único bueno con lo que me quedo es que teniendo el trabajo aprobado sigues intentando comprenderlo y la verdad, un profesor que ve este programa debería saber al instante que no se tienen los conceptos claros y debería aclararlos. Si te ha aprobado sin más... Diría que se la suda lo que sus alumnos aprendan...

La única forma que se me ocurre para poder ayudarte sin tener que volver a escribir un mensaje como el anterior es que me expliques tu razonamiento para:
  • Mandar <eleccion> como parámetro en <menu()> (línea 24)
  • Crear la variable <acum> en <menu()> (línea 28)
  • Llamar a la función <crearPilaVacia()> en el <printf()> (línea 47)
  • LLamar a las funciones <pilaVacia()> y <pilaLlena()> (líneas 51 y 56)
  • El bloque del <case 4> (líneas 62 - 64)
  • La llamada a la función <sumaPila()> (línea 77)
  • Los valores de retorno <return> que le has asignado a cada función
Igual entendiendo por qué haces lo que haces pueda ayudarte ya que de momento no hemos avanzado demasiado.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Proyecto Muy curioso...
Electrónica
nazka 2 3,126 Último mensaje 7 Julio 2005, 00:13 am
por nazka
curioso
Sugerencias y dudas sobre el Foro
rockernault 9 3,744 Último mensaje 22 Febrero 2009, 04:38 am
por Pablo Videla
Curioso
Foro Libre
simorg 5 2,810 Último mensaje 24 Mayo 2010, 02:12 am
por Constance
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines