Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Apuntes de Fundamentos de Programación – Unidad 6 (página 2)




Enviado por FRANCISCO RIOS ACOSTA



Partes: 1, 2

tanto, el atributo _noControl sólo puede ser accesado por los métodos
AsignaNoControl() y RetNoControl(). Estos métodos han sido declarados con el modificador de acceso public, de
manera que ellos si pueden ser visibles o accedidos, desde o por otras partes del programa. Lo que significa que si queremos
modificar el atributo _noControl de un alumno determinado, deberíamos de llamar en un mensaje al alumno con el método
AsignaNoControl() aplicado a dicho alumno.

Hagamos una aplicación Windows para fortalecer la explicación de los modificadores de acceso : private y public. Lo que
esperamos que efectúe dicha aplicación –programa-, es la lectura y visualización del número de control para 2 alumnos.
Ambos alumnos son objetos que pertenecen a la clase Alumno.
Atributos

Métodos

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 5 de 44
objeto
label1
label2
label3
label4
label5
label6
textBox1
textBox2
button1
button2
button3
button4
propiedad
Text
Text
Text
Text
Text
Text
Text
Text
Text
Text
Text
Text
valor
ALUMNO 1
ALUMNO 2
No. control
No. control
label5
label6

LEER ALUMNO 1
LEER ALUMNO 2
VISUA ALUMNO 1
VISUA ALUMNO 2
La interfase gráfica Form1.cs[design] deberá quedar según se muestra en la figura #6.1.1. Notemos que las etiquetas label5 y
label6 tendrán la utilidad de visualizar los números de control leídos.

Agreguemos la clase Alumno usando la opción del menú Project | Add Class, tecleando en el diálogo el nombre de la clase
Alumno.cs. Después añadimos el código donde se definen los atributos y métodos según se ha indicado al inicio de esta
sección. La figura #6.1.2 muestra a la clase Alumno.cs.

Las clases por si mismas no sirven para efectos de programar en cambio, los objetos son los que reciben o envían mensajes
que son los ingredientes principales en la programación orientada a objetos. Es simple abstraer que debemos trabajar con 2
objetos de entrada pertenecientes a la clase Alumno, ya que ellos son los que recibirán el mensaje de asignación y de
visualización de su atributo _noControl. Llamemos a los objetos usando los identificadores oAlu1 y oAlu2.
Podemos decir fácilmente que el diagrama de casos de uso que representa las tareas a efectuar en este programa es :

LEER EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS

VISUALIZAR EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS

El Diagrama de clases es simple ya que sólo tenemos una clase involucrada en la solución del problema : la clase Alumno.

ALUMNO

– _noControl : string
– _nombre : string
– _calif : int

+ AsignaNoControl(string) : void
+ RetNoControl() : string

En el diagrama de clases recordemos que el – indica que el atributo o método es privado. El símbolo + indica que el atributo
o método es publico. Observemos que el método AsignaNoControl() tiene un parámetro string.

Ahora sí vayamos al ambiente de desarrollo Visual Studio C#, creamos una nueva aplicación y en la ventana con la forma
Form1.cs[Design] agregamos 6 componentes Label, 2 componentes TextBox y 4 componentes Button. Modificamos las
propiedades según la tabla siguiente :

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 6 de 44
Fig. No. 6.1.1 Interfase gráfica de usuario Form1.cs[Design].
Fig. No. 6.1.2 Clase Alumno.

¿Dónde deben ser definidos dentro de nuestra aplicación?. Recordemos que el código deberá insertarse dentro del archivo
Form1.cs. Los objetos y datos sean variables o sean constantes de un tipo predefinido, son declarados como atributos de la
clase Form1 definida en dicho archivo Form1.cs. Agreguemos loa definición de los objetos oAlu1 y oAlu2 según se indica en
la figura 6.1.3.

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 7 de 44
Fig. No. 6.1.3 Definición de los objetos oAlu1 y oAlu2 en la clase Form1.

Ejecutemos la aplicación sólo con el fin de conocer si no hemos cometido algún error de dedo, figura #6.1.4.
Fig. No. 6.1.4 Nuestra aplicación en ejecución.

Seguimos con la implementación del caso de uso : LEER EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS. La efectuaremos
insertando código en los botones button1 y button2 con leyendas LEER ALUMNO 1 y LEER ALUMNO 2 respectivamente. Lo que
deseamos es que cuando hagamos click en dichos botones, tomemos el número de control tecleado por el usuario en el
textBox1 o en el textBox2 según corresponda, y por medio del mensaje AsignaNoControl() al objeto sea el oAlu1, sea el
oAlu2, accedamos al atributo _noControl y le asignemos el valor de lo tecleado en el TextBox correspondiente. Recordemos
que para acceder a lo tecleado en un TextBox deberemos acceder a la propiedad Text del componente.
oAlu1.AsignaNoControl(textBox1.Text);
// mensaje al objeto oAlu1

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 8 de 44
oAlu2.AsignaNoControl(textBox2.Text); // mensaje al objeto oAlu2

Notemos que cada mensaje termina con el caracter (;). En C# todas las sentencias -un mensaje es una sentencia- terminan
con (;). Agreguemos estos mensajes en el evento Click de cada botón button1 y button2, figura #6.1.5. Observemos que los
métodos Click de cada botón residen dentro de la clase Form1.
Fig. No. 6.1.5 Inclusión de los mensajes para leer el número de control de un alumno.

Si ejecutamos la aplicación en este momento, si leemos lo tecleado en los componentes TextBox además de asignarlo a los
atributos _noControl del alumno, pero no hay manera de visualizar debido a que no hemos añadido los mensajes para
visualizar los números de control de los alumnos.

El segundo caso de uso : VISUALIZAR EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS es el que deberemos codificar para poder
realizar la visualización del número de control de los alumnos. ¿Qué es lo que debemos hacer?, pues acceder al atributo
_noControl del alumno mediante el uso de un método, en este caso RetNoControl() que como vemos retorna con la
sentencia return al atributo _noControl. Este valor lo debemos asignar a la propiedad Text del componente Label
correspondiente sea label5 para el oAlu1, sea label6 para el oAlu2. Dicha asignación la realizamos mediante un mensaje al
objeto correspondiente que involucre al método RetNoControl().
label5.Text = oAlu1.RetNoControl();

label6.Text = oAlu2.RetNoControl();
// visualización del número de control del alumno oAlu1

// visualización del número de control del alumno oAlu2
Estos mensajes debemos escribirlos en el evento Click de los botones button3 y button4 según la figura 6.1.6.

El ejercicio hecho de la forma en que lo hemos presentado, representa el ocultamiento típico de la programación orientada a
objetos, donde los atributos son definidos privados y la única forma de accederlos es mediante un método de la clase
llamado dentro de un mensaje al objeto.

Para comprobar que los atributos de los objetos oAlu1 y oAlu2 pertenecientes a la clase Alumno, no son visibles desde
cualquier parte del programa sino sólo son visibles a los métodos de la clase, hagamos el intento de acceder al atributo
_noControl con un mensaje involucrando al alumno oAlu1 :

oAlu1._noControl = textBox1.Text;

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 9 de 44
Fig. No. 6.1.6 Inclusión de los mensajes para visualizar el número de control de un alumno.
Fig. No. 6.1.7 Ejecución de la aplicación vista después de hacer click en los botones de lectura y de visualización.

En el mensaje anterior tratamos de asignar al atributo _noControl del alumno oAlu1 el valor ingresado en el componente
textBox1. Sustituyamos el mensaje oAlu1.AsignaNoControl() que se encuentra en el evento Click del botón button1, por el

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 10 de 44
mensaje donde accedemos al atributo _noControl de manera directa. La figura #6.1.8 muestra al mensaje previamente
escrito como un comentario –no es tomado en cuenta por la compilación-, y el nuevo mensaje que lo sustituye.

En el mensaje anterior tratamos de asignar al atributo _noControl del alumno oAlu1 el valor ingresado en el componente
textBox1. Sustituyamos el mensaje oAlu1.AsignaNoControl() que se encuentra en el evento Click del botón button1, por el
mensaje donde accedemos al atributo _noControl de manera directa. La figura #6.1.8 muestra al mensaje previamente
escrito como un comentario –no es tomado en cuenta por la compilación-, y el nuevo mensaje que lo sustituye.
Fig. No. 6.1.8 Acceso directo al atributo _noControl del objeto oAlu1.

Si compilamos y tratamos de ejecutar la aplicación obtenemos el error de el atributo _noControl no es accesible debido a su
nivel de protección especificado por el modificador de acceso private, figura #5.1.9
Fig. No. 6.1.9 ERROR al tratar de accesar al atributo _noControl del objeto oAlu1.
Ejercicio propuesto :

Cambia el modificador de acceso del método AsignaNoControl() o del método RetNoControl() de public a private de manera que
observes lo que sucede.
6.2 Entrada y salida de datos.
6.3 Interacción de la aplicación y la clase.
Tal y como hemos venido explicando en las aplicaciones construidas en la unidad 5 y en la sección 6.1 de esta unidad, la
entrada de datos en una aplicación Windows C# la hacemos utilizando el componente TextBox. La salida de datos la
implementamos mediante el uso del componente Label. Desde luego que estas maneras de implementar la entrada y salida
de datos, no son únicas. Aquí se han propuesto sólo estos 2 componentes, de manera que el alumno se sitúe en el
aprendizaje de los fundamentos de programación y no en los detalles de uso de los diferentes componentes que nos
proporciona un ambiente tan completo como es el Visual C#.
En cuanto a la interacción entre la clase y la aplicación C#, diremos que se efectúa de varias maneras :

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 11 de 44


Definiendo objetos en el archivo Form1.cs dentro de la clase class Form1, cuyo ámbito sea precisamente todos los
métodos de dicha clase. Al definir estos objetos dentro de la clase, realmente estamos estableciendo que dichos objetos
son atributos de la clase Form1. Recordemos que la clase Form1 representa a la aplicación Windows. En la figura #6.1.3
se muestra la definición de 2 objetos de la clase Alumno oAlu1 y oAlu2 dentro del cuerpo de la forma Form1.
Otra forma de interacción es el pasaje de parámetros a los métodos de nuestras clases definidas. Estos parámetros son
valores leídos en los componentes TextBox insertados en la aplicación Windows. Desde luego que los métodos son
parte de mensajes a los objetos definidos previamente. Generalmente es usado un componente Button para efectuar una
acción de lectura o de asignación. En las páginas 7 y 8 se muestran 2 mensajes donde se asignan los números de control
de 2 alumnos oAlu1 y oAlu2 que son ingresados por el usuario de la aplicación, en los componentes textBox1 y
textBox2. La propiedad Text de los componentes TextBox es la que contiene a los números de control ingresados.
oAlu1.AsignaNoControl(textBox1.Text);

oAlu2.AsignaNoControl(textBox2.Text);
// mensaje al objeto oAlu1

// mensaje al objeto oAlu2

Los objetos pueden también retornar valores que pueden ser asignados a las propiedades –o por métodos- de los
componentes que forman parte de la aplicación Windows. Los parámetros también pueden ser de entrada-salida tal y
como lo vimos en la sección 5.3.3 de la unidad 5. En la página 8 de esta unidad 6 tenemos 2 asignaciones a la
propiedad Text de 2 componentes Label, de los números de control de 2 alumnos oAlu1 y oAlu2 :
label5.Text = oAlu1.RetNoControl();

label6.Text = oAlu2.RetNoControl();
// visualización del número de control del alumno oAlu1

// visualización del número de control del alumno oAlu2
Para más sobre entrada y salida de datos, además de la interacción entre clase y aplicación, efectúa un repaso de la unidad 5.

6.4 Estructuras selectivas.

En esta sección desarrollaremos las sentencias de selección :





selectiva simple –si de una rama- if.
selectiva doble –si de dos ramas- if-else.
selectiva anidada –if-else if-.
selectiva múltiple –switch-case-default-.
selectiva intenta –try-catch-.
6.4.1 Selectiva simple –si de una rama-.

Esta sentencia se caracteriza por tener sólo una rama donde se efectúan instrucciones dado que la condición probada sea
verdadera. Su diagrama de flujo es :

if de una rama
true
cond ?

false
instr1;

instr2;

instrn;

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 12 de 44
La implementación en C# se realiza usando la palabra reservada if. Si se desea ejecutar mas de una instrucción en la rama
true del if, es necesario encerrar a dichas sentencias dentro de un bloque de código, es decir entre los caracteres { }. La
condición siempre debe ser acotada por los paréntesis circulares (cond).

if (cond)
instrucción;

if (cond)
{
instr1;
instr2;

instrn;
}

Ejercicio 6.4.1
Un niño requiere registrar la cantidad de canicas que recibe de parte de sus seres queridos. Las canicas pueden
ser azules, rojas y verdes. Le interesa saber cuántas canicas tiene azules, cuantas rojas y cuantas verdes,
además el total de las canicas que le han regalado.

Solución :
Iniciamos por el diagrama de casos de uso el cual tiene 3 tareas :



Leer el número de canicas recibidas y su color.
Calcular el acumulado de canicas para el color leído.
Visualizar el número de canicas por color y el total de ellas.
if de una rama con una sola sentencia.

if de una rama con mas de una sentencia.
NINO

– _noCanAzules : int
– _noCanRojas : int
– _noCanVerdes : int
+
+
+
+
Leer(noCan:int,colorCan:string) : void
RetNoCanAzules() : int
RetNoCanRojas() : int
RetNoCanVerdes() : int
LEER EL NÚMERO DE CANICAS Y SU COLOR

CALCULAR EL ACUMULADO DE CANICAS POR COLOR

VISUALIZAR EL NÚMERO DE CANICAS POR COLOR Y EL TOTAL

El diagrama de clase tiene 3 atributos : el número de canicas azules _noCanAzules, el número de canicas rojas _noCanRojas
y el número de canicas verdes _noCanVerdes.
Los métodos los abstraemos de acuerdo a las tareas identificadas en el
diagrama de casos de uso :

Leer(noDeCanicas, Color);
RetNoCanAzules()
RetNoCanRojas()
RetNoCanVerdes().
El cálculo del acumulado de canicas lo vamos a realizar dentro del
método Leer().
La visualización del total de canicas la efectuamos sumando el
resultado de las llamadas a los 3 métodos :

RetCanAzules()+RetCanRojas()+RetCanVerdes().

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 13 de 44
Sigamos con la construcción de la interfase gráfica que permite lograr las tareas en el diagrama de casos de uso. La figura
#6.4.1 contiene los componentes que integran la realización de todas las tareas abstraídas.
Fig. No. 6.4.1 Interfase gráfica.

Las etiquetas label3 a label6 servirán para la visualización del total de canicas y del número de canicas por color que ha
registrado el niño. Agreguemos a la clase Nino al proyecto. Sólo por ahora añadimos los atributos y el constructor que
inicializa el número de canicas de cada color a 0, figura #6.4.2.
Fig. No. 6.4.2 Clase Nino incluyendo su constructor.

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 14 de 44
Lo que sigue es agregar la definición del objeto oNino perteneciente a la clase Nino, en la clase Form1, según se muestra en
la figura #6.4.3.
Fig. No. 6.4.3 Definición del objeto oNino.

Veamos las siguientes consideraciones antes de iniciar con la codificación del evento Click del botón button1 con leyenda
LEER :


El usuario puede teclear valores negativos en el componente textBox1 que sirve para ingresar el número de canicas a
registrar. También puede teclear un 0 que significan 0 canicas a registrar. En ambos casos, no debemos mandar el
mensaje Leer() al objeto oNino, ya que sólo registramos cantidades de canicas mayores que 0. Aquí debemos aplicar
una validación del dato leído noDeCanicas.
El usuario puede teclear de manera diferente el color de las canicas, es decir “Azul”, “azules”, “rojas”, “rojo”, “verdes”,
“berde”, “asul”, etcétera. En este caso seguiremos el criterio de aceptar sólo las cadenas “AZUL”, “ROJO” y “VERDE”
el color en mayúscula y en singular. También aquí debemos efectuar una validación del dato leído color, de manera
que si no es igual a cualquiera de las 3 constantes cadenas anteriores, no debemos llamar al método Leer().

Teniendo en cuenta las anteriores consideraciones, procedemos a codificar el Click del button1, según se indica a
continuación.

private void button1_Click(object sender, EventArgs e)
{
int noCanicas = Convert.ToInt32(textBox1.Text);
string color = textBox2.Text;
if (noCanicas>0 && (color=="AZUL" || color=="ROJO" || color=="VERDE"))
oNino.Leer(noCanicas,color);
}
int noCanicas = Convert.ToInt32(textBox1.Text);

string color = textBox2.Text;
noCanicas>0&&(color=="AZUL"||color=="ROJO"||color=="VERDE")
oNino.Leer(noCanicas,color);
true
false
Flujo de ejecución para el
método button1_Click()

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 15 de 44
En el código anterior estamos empleando un if de una rama con el fin de realizar el mensaje oNino.Leer() sólo si se
cumplen valores válidos para las variables locales noCanicas y color.

El método Leer() debemos añadirlo en la clase Nino y tiene la siguiente definición :

public void Leer(int noCanicas, string color)
{
if (color == "AZUL")
_noCanAzules += noCanicas;
if (color == "ROJO")
_noCanRojas += noCanicas;
if (color == "VERDE")
_noCanVerdes += noCanicas;
}
color == "AZUL"
_noCanAzules += noCanicas;
color =="ROJO"
_noCanRojas += noCanicas;
color =="VERDE"
_noCanVerdes += noCanicas;
Flujo de ejecución para el
método Leer() de la clase
Nino.
Notemos que en el método Leer() de la clase Nino, la evaluación de las 3 condiciones siempre es efectuada no importando
que por ejemplo la variable color sea “AZUL”, la prueba de las condiciones a “ROJO” y a “VERDE” de la variable color
es realizada. Ésto sucede ya que el control de flujo regresa a la secuencia de ejecución de cada condición. Esta cuestión
puede corregirse usando if’s anidados que serán vistos en la sección 6.4.3. Lo lógico es que si ya se sabe que el color es
“AZUL” entonces la ejecución del método debería terminar sin llegar a probar las condiciones “ROJO” y “VERDE” de la
variable local color. Lo mismo podríamos decir para cuando color sea “ROJO” la prueba del “VERDE” debería no
ejecutarse.
Ejecutemos la aplicación Windows y observemos que ingresando valores válidos y no válidos el programa no retroalimenta
al usuario ningún mensaje que le ayude a saber el estado de su ejecución. Modifiquemos el if en el método button1_Click
de Form1 en la rama true, de manera que mostremos un mensaje al usuario que le indique que la operación de registro de
las canicas de un determinado color, se ha realizado.

private void button1_Click(object sender, EventArgs e)
{
int noCanicas = Convert.ToInt32(textBox1.Text);
string color = textBox2.Text;
if (noCanicas > 0 && (color == "AZUL" || color == "ROJO" || color == "VERDE"))
{
oNino.Leer(noCanicas, color);
MessageBox.Show("EL REGISTRO DE "+noCanicas.ToString()+" CANICAS COLOR "+color+" FUE
REALIZADO");
}
}

Observemos que se han agregado los caracteres { y } para acotar las 2 sentencias que se ejecutan
cuando la condición en el if es true. También hemos usado la clase MessageBox y su método
Show() para visualizar el mensaje al usuario.
true
true
true
false
false
false

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación –UNIDAD 6.
Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008.
pag. 16 de 44
Ejecutemos de nuevo la aplicación y demos valores válidos para observar la manera en que responde ahora nuestra
aplicación. La figura #6.4.4 muestra la respuesta para el registro de 10 canicas color ROJO.
Fig. No. 6.4.4 Comunicación de la aplicación con el usuario para datos leídos válidos.

Observemos que aún cuando los datos no sean válidos la aplicación NO responde con ningún mensaje al usuario, es decir el
usuario no sabe que pasó con su operación de registro ¿se hizo? o ¿no se hizo?, la aplicación es la que tiene la respuesta. La
aplicación podrá responder a las preguntas anteriores si el usuario hace click sobre el botón button2 con leyenda
VISUALIZAR, de manera que el usuario que tenga una cierta memoria podrá hacer sus cálculos y tal vez establezca que su
operación de registro se realizó.
Realmente lo que debemos hacer es de inmediato retroalimentar al usuario si su registro se realizó o no se realizó. Ya
hicimos lo primero, ahora debemos codificar la notificación cuando no se efectuó el registro. Aquí sería muy útil saber el
uso del if de 2 ramas, pero como sólo hasta ahora sabemos el uso del if de una rama, éste es el que utilizaremos. Modifica el
método button1_Click() de acuerdo al código siguiente :

private void button1_Click(object sender, EventArgs e)
{
int noCanicas = Convert.ToInt32(textBox1.Text);
string color = textBox2.Text;
if (noCanicas > 0 && (color == "AZUL" || color == "ROJO" || color == "VERDE"))
{
oNino.Leer(noCanicas, color);
MessageBox.Show("EL REGISTRO DE "+noCanicas.ToString()+" CANICAS COLOR "+color+" FUE
REALIZADO");
}
if (noCanicas 0&&(color=="AZUL"||color=="ROJO"||color=="VERDE")
true
Flujo de ejecución para el
método button1_Click()
con la inclusión de mensajes
de retroalimentación al
usuario.
oNino.Leer(noCanicas,color);

MessageBox.Show("EL REGISTRO DE " + noCanicas.ToString()+
" CANICAS COLOR "+color+" FUE REALIZADO");

true

MessageBox.Show("ERROR … EL NUMERO DE CANICAS DEBE SER
MAYOR QUE 0");
false

noCanicas

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter