0% encontró este documento útil (0 votos)
858 vistas33 páginas

C# Ejercicios

Este documento contiene dos secciones. La primera sección presenta una serie de 15 preguntas sobre conceptos básicos de .NET y C#, incluyendo características del CLR, JIT, ensamblados, ASP.NET y más. La segunda sección proporciona instrucciones paso a paso para depurar un programa C# utilizando las herramientas del depurador como puntos de interrupción y la inspección de variables.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
858 vistas33 páginas

C# Ejercicios

Este documento contiene dos secciones. La primera sección presenta una serie de 15 preguntas sobre conceptos básicos de .NET y C#, incluyendo características del CLR, JIT, ensamblados, ASP.NET y más. La segunda sección proporciona instrucciones paso a paso para depurar un programa C# utilizando las herramientas del depurador como puntos de interrupción y la inspección de variables.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 33

C#

EJERCICIOS

CENTRO NACIONAL DE FORMACIN


PROFESIONAL DE LANGREO

ESTHER FERREIRO

1..NET
1) Explica qu significa que .NET sea multilenguaje.
2) Si tenemos un fichero .exe producto de la compilacin de un fichero fuente escrito
en C# podemos ejecutar ese fichero en Windows XP? Explica la respuesta.
3) En que se diferencia y en que se parece un ensamblado a una DLL.
4) Explcame para que se utiliza:
a. ASP.NET
b. Windows Forms
5) Qu es el CLR? Indica tres de sus caractersticas.
6) Qu funcin tiene el JIT? Indica cules son sus entradas y cuales sus salidas.
7) En la plataforma .NET: es necesario eliminar los objetos cuando stos ya no son
necesarios?
8) Dnde se almacenan los metadatos? En que consisten?
9) Qu es necesario para instalar una aplicacin en C#?
10) Qu reglas tienen que cumplir los ficheros escritos en distintos lenguajes de la
plataforma .NET para poder colaborar?
11) De qu clase hereda, en ltimo trmino, todos los datos?
12) Qu es la BCL?
13) Cmo se denominan las libreras en .NET?
14) Todas las libreras de .NET se engloban dentro del espacio de nombres..
15) Indica el namespace que contiene las herramientas para trabajar con
a. ADO.NET
b. Colecciones de datos
c. Aplicaciones Windows
d. Interfaces para aplicaciones Web
e. Datos en formato XML

2. INTRODUCCIN A C#
PRCTICA DEPURACIN (I)
Dado el programa siguiente:
static void Main(string[ ] args)
{
string miNombre;
Console.WriteLine("Por favor, escriba su nombre");
miNombre = Console.ReadLine( );
Console.WriteLine("Hola {0}", miNombre);
}

Puntos de interrupcin
1. Pulse en el margen izquierdo sobre la lnea en que aparece por primera vez
Console.WriteLine en la el mtodo Main.
En el margen aparecer un punto de interrupcin (u punto grande y rojo).
2. En el men Debug, seleccione Start (o pulse F5).
Al iniciarse la ejecucin del programa, se abrir una ventana de consola y luego el
programa se detendr en el punto de interrupcin.

Inspeccionar el valor de una variable


1. En el men Debug, pulse Windows, luego Watch y finalmente Watch 1.
2. En la ventana Watch, aada la variable miNombre a la lista de variables
inspeccionadas.
3. La variable miNombre aparecer en la ventana Watch con un valor de null.

Ejecutar el cdigo paso a paso


1. En el men Debug, seleccione Step Over (o pulse F10) para ejecutar la primera
instruccin Console.WriteLine.
2. Pulse F10 para saltar a la siguiente lnea que contiene la instruccin
Console.ReadLine.
3. Vuelva a la ventana de consola y escriba su nombre, y a continuacin pulse la tecla
INTRO.
Regrese a Visual Studio. Su nombre ser el valor de la variable miNombre en la
ventana Watch.
4. Pulse F10 para saltar a la siguiente lnea que contiene la instruccin
Console.WriteLine.
5. Ponga en primer plano la ventana de consola. Aparecer el saludo.

6. Regrese a Visual Studio. En el men Debug, seleccione Continue (o pulse


F5) para ejecutar el programa hasta el final.

PRCTICA DEPURACIN (II)


Esta pgina ha sido extrada de los archivos de ayuda locales instalados con Visual C#
Express. El propsito de este tema es familiarizarnos con los aspectos bsicos de uso del
depurador de Visual C# Express. No buscaremos un error real, sino que utilizaremos el
depurador para obtener informacin sobre el Kit de Salvapantallas.

PROCEDIMIENTO
Para empezar a depurar el Kit de Bienvenida de Visual C#, haremos lo siguiente:
1. Iniciar Visual C# Express.
2. En el men File, hacer clic en New, y a continuacin hacer clic en Project.
3. Seleccionar el tipo de aplicacin haciendo clic en Kit de Salvapantallas..
4. En el men Debug, hacer clic en Step Into. En lugar de ejecutarse normalmente,
el cdigo se detiene en la primera lnea de cdigo.
Esto es lo que hace Step Into: nos permite desplazarnos por el cdigo lnea a
lnea. Cuando se interrumpe la ejecucin de nuestro cdigo, se encuentra en un
estado de interrupcin. Si la prxima sentencia es una llamada a funcin, el
depurador saltar hacia ella.
5. Observemos la lnea de cdigo resaltada. En el margen izquierdo, podemos ver
una flecha amarilla. Esto nos muestra la prxima sentencia que se ejecutar,
tambin denominada punto de ejecucin.
6. Ahora, observemos la ventana Locals.
Si no est visible, podemos abrirla en el men Debug-Windows-Locals.
La ventana Locals muestra las variables locales para la funcin actual. Vemos
que hay una entrada en la lista: arg. Observemos cmo la ventana Locals nos
muestra el valor y el tipo de la variable.
7. En la parte inferior de la ventana Locals hay una ficha denominada Watch.
Observar que la ventana Watch no tiene ninguna entrada. Mientras que el
depurador rellena la ventana Locals automticamente, la ventana Watch es un
lugar dnde podemos aadir nuestras propias entradas.
8. Hacer clic en la primera fila de la ventana Watch bajo el encabezado Name, y
escribir:
args.

Tras escribir el punto, aparece una lista con todos los miembros de args.
9. Hacer clic en el miembro Length y ahora args.Length aparece en la columna
Name. Ahora podemos visualizar el valor y el tipo del tamao del array.
10. Hacer clic en la siguiente fila de la columna Name y aadir args.IsReadOnly a
la ventana Watch.

Introduccin a C#. Ejercicios

11. Desplazarse una fila hacia abajo en la columna Name y hacer clic de nuevo.
Esta vez, escribir args.Length+20, y presionar Enter.
Como podemos ver, Name puede contener expresiones, as como nombres de
variables.
12. Ahora, podemos mover el puntero del ratn hacia atrs hasta la ventana de
cdigo fuente Program.cs. Ubicar el cursor del ratn directamente sobre
args.Length en la lnea resaltada, y mantenerla all durante un instante.
Casi inmediatamente, veremos un pequeo cuadro que muestra el nombre y el
valor de la variable. Este cuadro se denomina sugerencia de datos, o DataTip.
Los DataTips son un modo rpido y fcil de obtener informacin sobre nuestro
cdigo. Utilizar un DataTip es ms rpido que aadir una entrada a la ventana
Watch, pero la ventana Watch nos permite mantener una lista de variables y
expresiones a la que nos podemos referir ms adelante.
13. En el men Debug, hacer clic en Step Into de nuevo, o presionar la techa F11.
Observar que la siguiente sentencia ha cambiado. Como args.Length es igual a
cero, la prueba if ha fallado y la ejecucin prosigue hacia abajo hasta la clusula
else.
Evaluar los pasos siguientes para averiguar qu habra pasado si la prueba
(args.Length > 0) hubiese funcionado.
14. Desplazarse hacia arriba hasta encontrar la primera lnea de cdigo tras
if (args.Length > 0)
Su aspecto es similar al siguiente:
string arg = args [0].ToLower(CultureInfo.InvariantCulture).Trim
15. Hacer clic con el botn secundario sobre esa lnea de cdigo y hacer clic en Set
Next Statement que aparece en el men contextual.
Observar que la sentencia sobre la que hemos hecho clic se ha convertido en la
prxima sentencia.
16. Hacer clic en Step Into, o presionar F11 una vez ms.
Algo no est bien. Aparece un cuadro de dilogo, indicndonos que hemos
obtenido una excepcin IndexOutOfRange.
Este cuadro se denomina Asistente de Excepciones. Observemos la informacin
que nos muestra. Nos indica que la excepcin se ha producido porque un ndice
estaba fuera de los lmites de la matriz y no se ha capturado la excepcin; dicho
de otro modo, que no ha sido capturada y corregida por un procesador de
excepciones.
El comando Set Next Statement es muy potente como herramienta para la
depuracin, por lo que debe ser utilizado con mucho cuidado.
Ahora podemos arreglar este desorden, siguiendo los prximos pasos.
17. Hacer clic en la casilla de cierre para eliminar el Asistente de Excepciones.

Introduccin a C#. Ejercicios

18. Desplazarse de nuevo hacia abajo a la clusula else, hacer clic con el botn
secundario en la llamada a ShowScreenSaver, y elegir Set Next Statement.
La llamada a ShowScreenSaver se resalta de nuevo como la siguiente sentencia.
19. Hacer clic en Step Into, o presionar F11.
La siguiente sentencia cambia de nuevo. Hemos pasado de Main a la funcin
static void ShowScreenSaver.
Observar la ventana Watch. Las variables y la expresin que introdujimos estn
en gris y aparece un signo de exclamacin. Esto indica que uno de los valores
que queremos examinar no estn actualizados. En este caso, se debe a que
hemos introducido una nueva funcin y las variables estn fuera del rango.
20. Observar la siguiente lnea de cdigo, que crea un nuevo objeto
ScreenSaverForm.
ScreenSaverFrom screenSaver = new ScreenSaverForm();
21. Seleccionar Step Into, o presionar F11.
Nos encontramos ahora en el constructor de ScreenSaverForm.
No queremos depurar este constructor, por lo que salimos de aqu.
22. Desde el men Debug, hacer clic en Step Out.
Nos encontramos de nuevo en la funcin ShowScreenSaver.
Podamos haber evitado acceder a la llamada seleccionando Step Over en lugar
de Step Into.
Como podemos ver, nos hemos detenido varias veces. No es necesario depurar
un largo programa lnea por lnea. Utilizaremos otra caracterstica ms del
depurador: los puntos de interrupcin.
23. Hacer clic con el botn secundario sobre la siguiente lnea de cdigo.
24. Desde el men de acceso directo, seleccionar Breakpoint y hacer clic en Insert
Breakpoint.
Aparece al margen un punto rojo que representa un glifo de punto de
interrupcin. Si hicisemos clic con el botn secundario en el glifo del punto de
interrupcin, podramos eliminar o deshabilitarlo. Sin embargo, no lo haremos.
25. En el men Debug, hacer clic en Stop Debugging.
De esta forma, finalizar la sesin de depuracin. A continuacin, empezaremos
una nueva.
26. En el men Debug, hacer clic en Start.
Observar cmo la aplicacin se inicia y se ejecuta hasta llegar al punto de
interrupcin que hemos establecido. Los puntos de interrupcin son a la
depuracin lo que los marcadores son a la lectura. Podemos establecer un punto
de interrupcin en el lugar de nuestra aplicacin que queramos interrumpir.
Podemos establecer tantos puntos de interrupcin como queramos.
27. En el men Debug, hacer clic en Continue.
Se ejecuta el salva pantallas. Seleccionar Continue durante una sesin de
depuracin es similar a seleccionar Start para empezar una sesin de
depuracin.
El salva pantallas debera finalizar su ejecucin por s mismo. Si no lo hace, en el men
Debug, hacer clic en Break All, o escribir Ctrl+Alt+Break, y a continuacin hacer clic

Introduccin a C#. Ejercicios

en Stop Debugging.

EJERCICIOS
1. Explica tres caractersticas de C# de forma sencilla y con tus palabras.
2. Explica la diferencia entre un namespace y una clase.
3. Cul es la clase imprescindible en todo programa escrito en C#? Explica lo que
consideres su caracterstica principal.
4. Qu son los caracteres UNICODE? En qu se diferencia del ASCII? Si no lo
sabes bscalo en Internet y escribe sus caractersticas.
5. Dada la siguiente definicin de clase
class caballo
string color;
string raza;
void AsignarNombre (string n)
{
string nombre=n;
}

Indica la condicin de visibilidad/acceso que tienen los siguientes elementos:


a) class caballo
b) string color
c) string raza
d) AsignarNombre
e) nombre
6. Escribe una clase en el papel con las siguientes caractersticas:
La clase ser pblica y se llamar Libro.
a) Tendr dos atributos uno pblico (nombre) y otro privado (precio).
b) A la derecha de cada definicin existir un comentario indicando que tipo
de acceso se aplica en cada definicin.
7. El siguiente programa pide un nombre y lo muestra por pantalla.
using System;
class Saludar
{
static void Main()
{
string miNombre;
Console.WriteLine("Por favor, escriba su nombre");
miNombre = Console.ReadLine();
Console.WriteLine("Hola {0}", miNombre);
Console.ReadKey();
}
}

Introduccin a C#. Ejercicios

Escribe el anterior programa en Visual C# Express Edition y crea un proyecto (en un


directorio distinto que la solucin) llamado Ejercicio1. Complalo y ejectalo.
8. Depura el programa anterior paso a paso.
9. Aade al programa anterior control de excepciones.
10. En el anterior proyecto fjate en los ficheros y carpetas que se ven en el Explorador
de Soluciones y descrbelos.
11. Accede al proyecto desde el Explorador de Windows e indica que ficheros y
carpetas se ven en l y describe cada uno de ellos.
12. Aade control de excepciones en el siguiente cdigo
static void Main(string[] args)
{
string temp;
int i, j,k;
Console.WriteLine("Escriba el primer entero");
temp = Console.ReadLine();
i = Int32.Parse(temp);
Console.WriteLine("Escriba el segundo entero");
temp = Console.ReadLine();
j = Int32.Parse(temp);
k = i / j;
Console.WriteLine("El resultado de dividir {0} por {1} es {2}", i, j, k);
Console.ReadKey();
}

alias_tipo.Parse(string) convierte el string en el tipo alias_tipo.


Se debe incluir al final del programa la instruccin Console.ReadKey() para poder
leer desde consola el ltimo mensaje.

Introduccin a C#. Ejercicios

3. VARIABLES DE TIPO VALOR


1) Representar distintos tipos de cuentas bancarias (cuentas corrientes y de ahorro).
Utilizar el tipo enum para crear dos variables a las que asignar los valores
Corriente y Ahorro. Finalmente emplear la funcin System.Console.WriteLine para
imprimir los valores de las variables.
2) Definir una struct que se pueda usar para representar una cuenta bancaria. Utilizar
los siguientes campos:
a. nmero de cuenta (long),
b. saldo de la cuenta (decimal) y
c. tipo de cuenta (el enum creado anteriormente).
Crear una variable de tipo struct, asignarle algunos datos de ejemplo e imprimir el
resultado.
3) Utilizar la entrada por pantalla para introducir
a. el nmero de cuenta
b. el saldo de la cuenta
c. el tipo de cuenta
Para convertir un string a un tipo numrico se utiliza la funcin Parse se su tipo,
por ejemplo, para convertir un string a un long se utiliza:
long.Parse (string) devuelve un tipo valor tipo long.

Para convertir un entero a un cardinal del enumerado se debe utilizar un cast del
tipo enum.
tipoEnum tipo=(tipoEnum)0;

4) Realizar un ejercicio similar al 3) pero utilizando para ello los tipos adecuados para
almacenar de cada libro
a. ISBN
b. precio
c. tipo de libro: histrico, viajes, policaco.
5) Implementa un programa que pida dos nmeros reales por pantalla, los sume y
muestre el resultado por pantalla. Uno de los nmeros debe ser double y el otro
nmero y el resultado float.
6) Implementa un programa que pida dos nmeros enteros por pantalla y almacene el
resultado en un nmero de tipo float.
7) Implementa un programa que pida dos nmeros reales por pantalla y almacene el
resultado en un nmero entero.
8) Ejecuta el programa ejemplo del apartado Checked/Unchecked. Realiza las
modificaciones sugeridas en los apuntes.

4. INSTRUCCIONES Y EXCEPCIONES
1) Conversin de un da del ao en un par de mes y da. En este ejercicio se
implementar un programa que lea de la consola un nmero entero de da (entre 1 y
365) y lo almacene en una variable entera. El programa convertir este nmero en un
mes y un da del mes e imprimir el resultado en la consola. Por ejemplo, el resultado de
introducir 40 debe ser Febrero 9. (En este ejercicio se ignora el efecto de los aos
bisiestos.)
Realizar una mejora al programa permitiendo realizar la operacin mltiples veces hasta
que se introduce el 0.
Realizar una mejora creando una excepcin propia que lance un error en el caso de que
el da no est en el rango correcto (1:365).
2) Escribir dos versiones (una usando for y otra usando while) de un programa que
imprima una escala de temperatura de -30C a +45C, en la que varen de 5 en 5
C.
3) Escribir un programa que imprima las tablas de multiplicar del nmero 1 al 10.
Cada tabla debe ir separada por una lnea en blanco.
4) Escribir un programa que genere, de modo aleatorio, 10 nmeros entre 1 y 100.
Nota:
Para crear un nmero aleatorio se debe crear un objeto de System.Random
System.Random aleatorio= new System.Random();
y despus ya podemos llamarlo de la siguiente manera:
int num=aleatorio.Next();
El mtodo Next() est sobrecargado y puede ser:
Next()-> genera un nmero entero aleatorio
Next(int maxValor)->genera un nmero aleatorio entre 1 y maxValor
Next(int minValor, int maxValor)->genera un nmero aleatorio entre minValor
(incluido) y maxValor.
5) Escribir un programa genere nmeros aleatorios (entre 1 y 100) y verifique si son
pares o impares, mostrando el resultado en la pantalla.
Nota:
Recordar que el operador % nos muestra el resto de dos nmeros enteros
6) Escribir un programa que genere aleatoriamente un nmero como nota de un
alumno, y muestre su calificacin segn la siguiente tabla: (fijar un rango entre 0 y
150)
De 0 a 50 puntos -> Suspenso
De 51 a 75 puntos -> Recuperar
De 76 a 90 puntos -> Aprobado
De 91 a 100 puntos -> Aprobado con mrito
Menor que 0 o mayor que 100 -> puntuacin invlida.

7) Escribir un programa que detecte e imprima en la pantalla nmeros mltiplos de


3. Esos nmeros deben variar de 1 a 100. Controlar que el nmero est en el rango
establecido. Los nmeros se deben introducir por teclado.
Modificacin: Despus de escribir el programa crear una excepcin y lanzarla si el
nmero no est en el rango establecido.
8) Crear un programa que reproduzca el juego de Adivina mi nmero.
1. El ordenador deber generar un nmero aleatorio entre 0 y 100.
2. A continuacin nos pide que adivinemos su nmero, para lo que
tendremos que teclear uno.
3. Aparecer un mensaje en pantalla dicindonos si nuestro nmero es
mayor o menor o felicitndonos si hemos acertado.
4. Si hemos fallado, nos volver a pedir otro hasta que lo acertemos.
5. Cuando acertemos, tambin nos dir cuntos intentos hemos realizado.
9) Escriba un programa que nos calcule el cambio que debe dar la caja de un
supermercado: Dado un precio y una cantidad de dinero, el programa nos dir
cuntas monedas deben darse como cambio de tal forma que el nmero total de
monedas sea mnimo.
10) Modificar el ejemplo anterior y, utilizando control de excepciones correspondiente
controlar el error de introducir un string en la entrada.

Instrucciones y Excepciones. Ejercicios

12

5. MTODOS Y PARMETROS
1)

Crear un programa que indique si dos nmeros son iguales y, en caso contrario,
cual es el mayor. Desde Main se introducirn los nmeros y una funcin devolver
el resultado a Main que lo mostrar por pantalla.

2)

Modificar el programa para que la entrada de valores por teclado y la salida sea
realizada tambin por una funcin. Poner todos los mtodos en una clase distinta a
la clase donde est Main().

3)

Hacer un programa que calcule el factorial. Se debe incluir una funcin que
reciba un valor int y calcule el factorial, que ser devuelto a Main. No usar
recursividad.
a) Controlar los posibles errores de introducir un valor errneo y de
desbordamiento

4)

Crear un programa que cree una estructura con los datos de una persona:
nombre, edad, nivel de estudios, curso. Hacer un programa que pida todos los datos
por pantalla, excepto el curso que se calcular en funcin del nivel de estudios.
Despus se debe mostrar toda la informacin de la estructura por pantalla.
El nivel de estudios debe ser un enumerado con al menos tres niveles.
Los cursos a realizar deben ser otro enumerado, uno para cada nivel de estudios
Cada nivel de estudios tendr asignado un curso.
Debe haber mtodos para:
a. Introducir los datos por teclado
b. Asignar los cursos
c. Mostrar toda la informacin por pantalla

5)

Hacer un programa que permita hacer la media de una cantidad de nmeros,


stos pueden ser 2, 3 o 4. Utilizar para ello la sobrecarga de mtodos.

6)

Hacer un mtodo esttico que sume dos nmeros que se pasan por parmetros:
uno debe ser int y otro float, el mtodo devolver el resultado a la funcin principal.
Sobrecargar el mtodo intercambiando los parmetros. Probar su funcionamiento
con diversos datos de llamada.

7)

Construir una aplicacin que cumpla con los requisitos siguientes:


a) Declarar un tipo estructura Persona que contenga informacin como:
nombre, apellido, edad y DNI
b) Implementar un mtodo que reciba dos estructuras Persona y devuelva la
ms antigua.
Poner todos los mtodos en una clase distinta a la clase donde est Main().

6. VARIABLES DE TIPO REFERENCIA


TABLAS
1) Hacer un programa que sume dos matrices de enteros de 2 dimensiones y la muestre
por pantalla en dos dimensiones.
a) Hacer un mtodo para pedir la dimensin de las matrices
b) Hacer un mtodos para introducir los datos de las dos matrices (un mtodos
llamado dos veces).
c) Hacer un mtodo para sumar las matrices
d) Hacer un mtodo para mostrar el resultado.
e) Realizar control de excepciones y utilizar chequed en la suma. Comprobar la
excepcin de desbordamiento.
2) Se desea calcular las notas finales de los alumnos de un curso, as como tambin el
promedio, mnimo y mximo de stas. Se introducir el nmero de alumnos de un curso
y las notas parciales de cada uno de stos junto con la nota del examen final. La nota
final de cada alumno se calcular en funcin de la siguiente frmula:
NM= (P1+P2+P3+P4)/4
// Media de los exmenes parciales
NF=0.7*NM+0.3*EX//Clculo de la nota final: nota media y examen
Se desea saber al final la nota media de todas las notas finales, la mxima y la
mnima.
3) Construir la siguiente aplicacin
a) Declarar una estructura de tipo Persona que contenga la siguiente informacin:
nombre, apellidos, edad, DNI
b) Declarar un array que almacene la estructura anterior por medio de un mtodo
que nos dice el tamao en tiempo de ejecucin
c) Implementar un mtodo para introducir los datos.
d) Implementar un mtodo para ordenar la matriz por edad.
Mtodo de ordenacin de la burbuja.
Los pasos a seguir utilizando este mtodo son los siguientes, imaginando que deseamos
realizar una ordenacin creciente:
1.- Se compara el primer elemento con el segundo. Si estn desordenados se intercambian.
Luego se mira el segundo con el tercero, intercambiando tambin si es necesario. As hasta
que llegamos al ltimo elemento. De esta forma tenemos en la ltima posicin de nuestra
tabla el elemento ms grande.
2.- Repetimos lo mismo que antes pero ahora con todos los elemento, menos el ltimo, que
ya est ordenado.
3.- Repetimos el primer paso pero esta vez con otro elemento menos, ya que este tambin
est ordenado. Este mtodo finaliza en el momento en el que se han realizado tantas pasadas
como objetos - 1 hay en la lista. Su hace menos 1 pasadas porque el primero de los objetos,
como es lgico si pensamos que los dems ya estn ordenados, ya est ordenado

e) Implementar un mtodo para mostrar los datos que contiene el array.

STRING
1. Implementar un mtodo que tome como parmetro un string y lo devuelva invertido
2. Hacer un programa que valide un email, las reglas son las siguientes:
a. Eliminar posibles espacios al principio y al final.
b. Que todos los caracteres sean vlidos (hacer una cadena con todos los
caracteres vlidos y comprobar que todos los caracteres del email estn
incluidos dentro de ella). Slo permite letras, dgitos, y los smbolos _ - @ y
el punto.
c. Que tenga un smbolo @, ni ms ni menos.
d. Que tengan al menos un punto a la derecha de @, pero puede ser ms de uno
e. Que el lado izquierdo sea ms largo que 0
Suponemos que Main() est definido en una clase llamada Program y debemos crear
otra clase llamada Email donde implementaremos el mtodo Validar.
3. Manejar un diccionario incluyendo bsqueda de palabras.
a. Crear una clase llamada Enciclopedia que contenga:

Un array de strings de dos dimensiones inicializado a, por lo menos, 10


nombres de animales, cada uno con alguna caracterstica propia. Incluir
algn animal que tenga nombres como OSO POLAR, OSO PARDO
(parte igual y parte diferente). Los nombres deben estar en maysculas.

Un mtodo no esttico que busque una palabra dada en el diccionario,


est puede ser una subcadena del nombre del animal almacenado. Debe
devolver un array de strings bidimensional que contenga los pares
animal-caractersticas localizados, si no es as el array estar vaco (esta
es slo una idea puede devolverse otro tipo de objetos ms eficiente)

b. Crear una clase llamada Program que contenga el mtodo Main() desde
donde se realizarn las operaciones que permitan al usuario introducir una
palabra, buscarla en la enciclopedia y mostrarla por pantalla. El usuario puede
introducir la palabra en maysculas o minsculas, adems pueden tener
espacios en blanco al principio o al final.
4. Implementacin de Find-Replace de los Editores de Texto
Entre las funcionalidades que ofrecen los editores de texto hoy en da se encuentra la
bsqueda y reemplazo de una palabra por otra, todas las veces que sta aparezca en el
texto.
Hacer un programa que implemente la bsqueda y reemplazo utilizando las funciones y
conceptos de string, con las siguientes condiciones:
El contenido del texto se almacena en la clase Texto como un string.
Se incluye el mtodo BuscarReemplazar(str1,str2) donde el primer parmetro
(str1) es el string a buscar y el segundo (str2) es el string por el cual reemplazar
el string encontrado.
En la bsqueda se consideran idnticas las maysculas de las minsculas, es
decir, "CASA" es totalmente equivalente a "Casa".

Vbles de Tipo Referencia. Ejercicios

16

La bsqueda no considera palabras acotadas, es decir, al buscar "el", se


considera que se encontr en "el", "ellos", "aquel".
Al encontrar la palabra buscada, se reemplaza el texto de ella por el texto
indicado. Si el texto encontrado es parte de otra palabra, slo se reemplaza la
porcin correspondiente al texto encontrado. Es decir, si se busca "la" y se
reemplaza por "el", entonces la frase "la cola del pescado", quedar como "el
coel del pescado".
Al final de la operacin se debe mostrar el texto con las modificaciones.

Nota:
string Remove(int posicin, int nmero) :

Devuelve la cadena resultante de eliminar el nmero


de caracteres indicado que hubiese en la cadena sobre la que se aplica a partir de la
posicin especificada.
El ejercicio debe realizar lo que la siguiente funcin implementa:
string Replace (string aSustituir, string sustitua) :

Devuelve la cadena resultante de sustituir


en la cadena sobre la que se aplica toda aparicin de la cadena aSustituir indicada por la
cadena sustituta especificada como segundo parmetro.

Vbles de Tipo Referencia. Ejercicios

17

7. CONCEPTOS DE LA POO.
EJERCICIOS
1. Crear una clase llamada CGgrados que contenga: public float gradoC
Crear otra clase llamada Program que contenga:
a) Una instruccin que cree un objeto de tipo CGgrados en Main()
b) Un mtodo esttico llamado PasarGrados al que se le pasa por parmetro
un objeto DGgrados y un valor para asignar al campo gradoC.
c) Un mtodo esttico llamado SacarGrados que muestre los grados del objeto
d) Llamadas a los mtodos desde Main().
e) Ejecutar el programa paso a paso y fijarse en las variables locales
f) Convertir el dato gradoC en private. Ejecutar y analizar los errores. Poner
como comentario los mtodos creados en b) y c) y las llamadas en d).
g) Crear un mtodo esttico en CGgrados llamado
PasarGrados (Cggrados, float) que de valor al campo privado.
h) Crear un mtodo esttico en CGgrados llamado SacarGrados (Cggrados)
que muestre los grados por pantalla.
i) Introducir las llamadas correctas a estos mtodos en Main()
j) Ejecutar el programa paso a paso y fijarse en las variables locales en cada
mtodo en el que se entra.
k) Modificar la clase CGgrados y eliminar el modificador static de todos los
mtodos y dejarlos pblicos. Compilar y ver que errores hay pues los
mtodos no pueden ser llamados como hasta ahora.
l) Modificar las llamadas a los mtodos para que funcionen correctamente.
m) Eliminar al objeto del paso por parmetros en los mtodos y utilizar this en
su lugar
FIJARSE EN QUE HAN QUEDADO LOS DATOS PRIVADOS Y LOS MTODOS PBLICOS

2) Crear exclusivamente los siguientes mtodos y tipos tal y como se describen a


continuacin:
a) Definir una enumeracin que contenga los siguientes componentes: Ahorro,
Corriente y que se llame TipoCuenta
b) Definir una estructura que contenga los siguientes componentes y que se llame
CuentaBancaria
a. long numCuenta
b. decimal saldoCuenta
c. TipoCuenta tipoCuenta
c) Definir una clase llamada Cuentas que contenga un mtodo Main() que cree
dos estructuras de la siguiente forma
CuentaBancaria cuenta1 = NuevaCuentaBancaria();
Escribe (cuenta1);
CuentaBancaria cuenta2 = NuevaCuentaBancaria();
Escribe (cuenta2)

Toda estructura siempre tiene definido un constructor sin parmetros que lo que hace es
darle en esos casos un valor por defecto a los objetos declarados. Ese valor consiste en
poner a cero toda la memoria ocupada por el objeto, lo que tiene el efecto de dar como
valor a cada campo el cero de su tipo.
Por ello se puede construir un tipo struct utilizando new
Ejemplo:
struct Punto{ int x; int y}
.
Punto p = new Punto();
Console.WriteLine(p.X);
Imprime un 0 por pantalla ya que utilizando new todos los campos se inicializan a su
valor por defecto.
NuevaCuentaBancaria() es un mtodo que pide por pantalla los datos del
struct y los devuelve con return. Crear el struct utilizando new.
Escribe() es un mtodo que toma una variable CuentaBancaria y la muestra
por pantalla.
Compilar el programa hasta que no exista ningn error
3) Modificar CuentaBancaria para que en lugar de un struct sea una clase. Es
necesario realizar alguna modificacin en el programa para que funcione?. Compilar y
comprobar que todo funciona correctamente. Explicar en el papel que es lo que ha
cambiado internamente al cambiar el tipo de struct a class.
4) El objetivo es encapsular la clase CuentaBancaria para ello se deben definir los
campos como privados. Compilar y analizar dnde y por qu da errores (no solucionar,
por ahora) Explicar en el papel cuales son los problemas.
5) Para acceder a los datos privados de una clase debemos implementar un mtodo
pblico no esttico llamado Popular(). Este mtodo devolver void y recibir dos
parmetros: un entero largo (el nmero de cuenta bancaria), un decimal (el saldo de la
cuenta bancaria) y un entero que se asignar de la manera adecuada a tipoCuenta. Es
importante que a los parmetros del mtodo se les llame como a los campos (qu
tenemos que utilizar para diferenciar los campos de los parmetros?).
Nota: Recordar que se aconseja poner primero elementos pblicos y despus privados
Realizar las modificaciones adecuadas en el mtodo NuevaCuentaBancaria() para que
no de errores en este mtodo (los seguir dando en Escribir()).
6) Ya hemos solucionado la forma de asignar valores al objeto pero tenemos que
resolver como acceder a los campos privados para mostrar sus datos en el mtodo
Escribir(). Para ello debemos crear un mtodo pblico por cada campo que devuelva
el campo en cuestin en la clase CuentaBancaria y llamarlos desde Escribir().
a) crear Numero() que devuelva el campo numCuenta
b) crear Saldo() que devuelva el campo saldoCuenta
c) crear Tipo() que devuelva el campo tipoCuenta

Conceptos de la POO. Ejercicios

20

7) El objetivo de este ejercicio es modificar el proyecto anterior para que genere


automticamante los nmeros de cuenta. Para ello debemos
1) Aadir un entero largo privado llamado numSiguiente a la clase CuentaBancaria.
Debe ser un dato esttico.
2) Aadir un mtodo pblico esttico llamado SiguienteNumero() que devuelva un
tipo long que ser numSiguiente despus de incrementarle 1.
3) Comentar las lneas donde se pide y se asigna el nmero de cuenta.
4) Introducir una nueva lnea que asigne como nmero de cuenta una llamada al
mtodo esttico creado.
5) Guardar y Probar.
8) El objetivo es encapsular an ms la clase CuentaBancaria. Para ello debemos:
a) Modificar el mtodo CuentaBancaria.Popular() para que slo reciba el
parmetro saldoCuenta y tipoCuenta.
b) Dentro del mtodo CuentaBancaria.Popular() debemos asignar el campo
numeroCuenta utilizando el mtodo esttico SiguienteNumero().
c) Convertir el mtodo SiguienteNumero() en privado. Fijarse en que tenemos un
mtodo esttico y privado lo que implica que slo se podr utilizar dentro de la
clase.
d) Marcar como comentario la declaracin e inicializacin del nmero de cuenta en
NuevaCuentaBancaria().
e) Cambiar la llamada al mtodo Popular() del mtodo NuevaCuentaBancaria()
para que slo recoja el saldo de la cuenta y el tipo .
f) Compilar y corregir los posibles errores.
g) Analizar en el punto 2.1.a la diferencia entre poner numSiguiente++ o +
+numSiguiente en el return.
Hasta aqu tenemos un programa que crea dos cuentas a las que les asigna un nmero
de forma automtica y permite al usuario hacer un ingreso inicial y determinar si
queremos que sea una cuenta corriente o de ahorro.
9) Ahora aadiremos al programa la posibilidad de ingresar o retirar dinero despus de
crear la cuenta bancaria. Para ello
a) Crear un mtodo en la clase CuentaBancaria llamado Retirar() que recibir un
parmetro decimal y deducir del saldo la cantidad indicada despus de
comprobar que el saldo es suficiente para realizar la operacin. El mtodo debe
devolver un bool que determine si la operacin se pudo realizar o no.
b) Crear en la clase Cuentas un mtodo esttico llamado CrearRetirar(). Este
mtodo devolver void y recibir como parmetro un objeto CuentaBancaria.
El mtodo escribir por consola un mensaje que pregunte por la cantidad a
retirar y llamar al mtodo creado anteriormente para realizar la operacin. Si no
hay saldo suficiente emitir el mensaje adecuado y si lo hay mostrar el saldo
actual de la cuenta
c) Crear un mtodo en la clase CuentaBancaria llamado Ingresar() que recibir
un parmetro decimal y aadir al saldo la cantidad indicada.

Conceptos de la POO. Ejercicios

21

d) Crear en la clase Cuentas un mtodo esttico llamado CrearIngreso(). Este


mtodo devolver void y recibir como parmetro un objeto CuentaBancaria.
El mtodo escribir por consola un mensaje que pregunte por la cantidad a
ingresar y llamar al mtodo creado anteriormente para realizar la operacin. Al
final nos mostrar el saldo actual
e) Crear en la clase Cuentas un mtodo esttico llamado ElegirOpcion(). Este
mtodo preguntar por consola si se quiere ingresar o retirar dinero de la cuenta
y devolver la opcin elegida
f) Llamar al mtodo ElegirOpcion() desde Main y en funcin de la opcin elegida
llamar a CrearIngreso() o a CrearRetirar() para cada una de las cuentas que se
crean en Main().
10) Vamos a dar la posibilidad de hacer transferencias de una cuenta a otra, para ello
debemos crear un mtodo llamado TransferirDe en CuentaBancaria que tome como
parmetro un objeto que representar la cuenta del la que se va a retirar el dinero y la
cantidad implicada en esta operacin. En el cuerpo del mtodo se llamar al mtodo
Retirar() de forma adecuada para que retir dinero de la cuenta que se pasa como
parmetro (si tiene saldo) e ingrese en la otra cuenta (la que llamar al mtodo);
11) A continuacin se debe incluir las instrucciones necesarias en Main() para permitir
hacer transferencias de una a otra cuenta despus de haberles dado un saldo a cada una
de ellas.

Conceptos de la POO. Ejercicios

22

8. CREACIN DE OBJETOS
EJERCICIOS
1. En la prctica CuentaBancaria creada en prcticas anteriores se deben eliminar los
mtodos que asignan valores a las variables de instancia para el saldo y el tipo de
cuenta y los sustituir por los siguientes constructores:
a. El primero debe inicializar el saldo a 0 y el tipo de cuenta Ahorro. Adems
deber asignar un nmero de cuenta por medio del mtodo creado para ello
b. El segundo ser igual que el anterior pero recibir un decimal que asignar
al saldo.
c. El tercero ser igual que el anterior pero recibir adems el tipo de cuenta.
Probar los distintos constructores.
2. En la prctica anterior sustituir los mtodos que acceden a los campos privados por
propiedades que realicen la misma operacin. Cambiar aquello que sea necesario
para que el programa llame correctamente a estas propiedades.
Aadir funcionalidad para que se pueda cambiar el tipo de cuenta utilizando
propiedades y llamadas desde Main();
3. Se trata de construir un programa que simule una maquina de venta de tabaco.
El programa en funcionamiento tendra el siguiente aspecto:

a) Planificacin del trabajo.


Para realizar la aplicacin construiremos una solucin con dos proyectos:
- Un proyecto de librera, donde pondremos la clase MakinaTabako.
- Un proyecto de consola, para probar la clase.
Una vez generada la solucin, tendr el siguiente aspecto:

b) Diseo de la clase MakinaTabako.


En esta clase encapsularemos toda la funcionalidad de la mquina de venta de
tabaco. El otro proyecto utilizar esta clase para mostrar su funcionamiento por
consola.
Es importante definir las cosas en el siguiente orden:
1. Definir los mtodos de la clase. Documentar todos los parmetros, retornos y
posibles situaciones de error. Escribir primero los mtodos pblicos y despus
los privados (si los hubiese)
- Constructor
- AcumularCredito: Recoge un parmetro entero y lo acumula en el crdito
- Credito: propiedad get del campo credito
- Devolucion: devuelve lo que resta del crdito y pone ste a 0
- Comprar: Recoge un parmetro que le indica el producto a comprar y
mira si tiene crdito para comprar y devuelve lo que resta, pone el crdito a 0
- Precio: devuelve el precio del tipo de tabaco elegido (parmetro: la
eleccin)
- Nombre: devuelve el nombre del tipo de tabaco elegido (parmetro: la
eleccin)
- NumTabacos: devuelve el nmero de tipos de cajetillas que hay
2. Definir la estructura de datos necesaria para la clase, es decir disear los
atributos. Escribir primero los atributos pblicos y despus los privados (si los
hubiese)
- precios: array que contiene los precios
- nombres: array que contiene las marcas de tabaco

Creacin de Objetos.Ejercicios

24

- credito: entero que contiene el dinero introducido, inicialmente es 0


3. Implementar los mtodos de la clase, sin controlar errores y suponiendo que
todo va bien y despus introducir todos los controles de errores que sean
necesarios, definiendo las excepciones que hagan falta.
c) Diseo del programa de pruebas en modo consola.
Este programa permitir comprobar el funcionamiento correcto de la clase
definida, y bsicamente ser un men que permitir llamar a las funciones
implementadas.
4. Implementar un proyecto que permita manipular una agenda. Debemos crear las
siguientes clases:
-

clase Entrada a partir de la cual se crearn los objetos que contiene una agenda

clase Agenda que almacena un array de entradas y

clase Program donde residir Main() y todas las llamadas a los mtodos
Utilizar constructores y propiedades.
Utilizar un campo de solo lectura que almacene un nombre de agenda (privado,
trabajo, familia, etc)
Permitir introducir entradas, mostrar todas las entradas, modificar y buscar una
entrada.

Creacin de Objetos.Ejercicios

25

9. HERENCIA. EJERCICIOS
1) Implementar la siguiente jerarqua en la cual hay dos interfaces: IMedidaInglesa,
IMedidaMetrica y una clase llamada Caja que implementa las interfaces.

IMedidaInglesa

IMedidaMetrica

+ float Largo_I()
+ float Ancho_I()

+ float Largo_M()
+ float Ancho_M()

Caja
- float largoPulgadas
- float anchoPulgadas
+ Caja (float,float)
El constructor de Caja debe dar valor a los atributos privados.
La implementacin de Largo_I() y Ancho_I() debe devolver el valor los atributos
privados respectivos.
La implementacin de Largo_M() y Ancho_M() debe devolver el valor los atributos
privados respectivos multiplicados por 2.54.
Desde Main() Crear un objeto caja1 al que se le pasarn dos valores en su constructor y
luego mostrar los valores de retorno de todos los mtodos implementados en Caja (con
el texto adecuado: mtrico o pulgadas);
2) Modificar la jerarqua de tal manera que la clase Caja sea abstracta, en la que los
mtodos de la interfaz estn implementados como mtodos abstractos (sin cuerpo) y los
atributos se definan como protected. Aadir a la jerarqua una clase llamada Cajn que
hereda de Caja y que ser la que contendr los cuerpos de los mtodos implementados.
Notar que no permite poner el nombre de la interfaz delante del nombre del mtodo a
implementar, por lo que los mtodos deben tener distinto nombre (poner como en el
ejercicio 1).

Herencia.Ejercicios

26

3)
Producto

+ Producto()
+ MCodigo()
+ MDescripcion()
+ MPrecio()

Libro

+ Libro()
+ MAutor()
+ MISBN

CompactDisc

+ CompactDisc()
+ MArtista()
+ MDiscografica()

Una tienda que vende libros y CDs pretende catalogar sus productos indicando su
cdigo, descripcin, precio, autor, artista, nmero ISBN y discogrfica. Usando el
concepto de generalizacin podemos crear una clase base Producto, que deber
presentar cdigo, descripcin y precio. La clase derivada Libro deber presentar
autor e ISBN. La clase derivada CompactDisc deber presentar el artista y la
discogrfica.
Vamos a implementar el cdigo que permita crear este sistema:
public class Producto
{
//Constructor
public Producto (int codigo, double precio, string descripcion)
{
Codigo = codigo;
Precio = precio;
Descripcion = descripcion;
}
//Mtodos y propiedades
public int MCodigo
{
get { return Codigo; }
set { Codigo = value; }
}
public double MPrecio
{
get { return Precio; }
set { Precio = value; }
}
public string MDescripcion
{
get { return Descripcion; }

Herencia.Ejercicios

27

set { Descripcion = value; }


}
//Atributos
private int Codigo;
private double Precio;
private string Descripcion;
}
public class Libro : Producto
{
//Constructor
public Libro (int codigo, double precio, string descripcion, string autor,
string isbn): base(codigo, precio, descripcion)
{
Autor = autor;
Isbn = isbn;
}
//Mtodos y Propiedades
public string MAutor
{
get { return Autor; }
set { Autor=value; }
}
public string MIsbn
{
get { return Isbn; }
set { Isbn=value; }
}
//Atributos
private string Autor;
private string Isbn;
}
public class CompactDisc : Producto
{
//Constructor
public CompactDisc (int codigo, double precio, string descripcion,
string aritsta, string discografica): base(codigo, precio, descripcion)
{
Artista = artista;
Discografica = discografica;
}
//Mtodos y Propiedades
public string MArtista
{
get { return Artista; }
set { Artista=value; }
}
public string MDiscografica
{
get { return Discografica; }
set { Discografica= value; }
}
//Atributos
private string Artista;

Herencia.Ejercicios

28

private string Discografica;


}

REDEFINICIN DE MTODOS
Vamos a utilizar las posibilidades de conversin de los objetos de hijos a padres.
Estas operaciones estn dentro de la idea de polimorfismo de las referencias. Las
referencias polimrficas se definen cuando creamos un objeto, o utilizamos como
parmetro la referencia de un objeto, que haya sido construido a partir de una
referencia de su clase base.
En este ejemplo vamos a crear un mtodo que cree un catlogo de productos, e
incluir tanto libros como DVDs.
Vemos primero la definicin de la clase catlogo
public class Catalogo
{
public void AnadeProducto (Producto producto)
{
catalogo.Add (producto);
}
public void VerCatalogo()
{
foreach (Producto arg in catalogo)
{
Console.WriteLine(arg.MCodigo+"-"+arg.MDescripcion);
if (arg is Libro) Console.WriteLine("libro");
else Console.WriteLine("CD");
Console.ReadKey();
}
}
private ArrayList catalogo = new ArrayList();
}

Las llamadas a esta clase seran de la siguiente forma (fijarse en los tipos de los
parmetros)
class Program
{
static void Main(string[] args)
{
Producto producto1 = new Libro(1, 55.0, "Aprendiendo C#", "Ana
Garca", "1212212");
Producto producto2 = new CompactDisc(2,5.0,"portugal-flamenco",
"Sueos ibricos", "Rao Kiao");
Catalogo catalogo = new Catalogo();
catalogo.AnadeProducto(producto1);
catalogo.AnadeProducto(producto2);
catalogo.VerCatalogo();
}
}

Otra caracterstica que el polimorfismo permite es la sobreescritura de mtodos,


que consiste en alterar el comportamiento de determinado mtodo en una clase
Herencia.Ejercicios

29

derivada, manteniendo esa misma declaracin en su clase base. En otras palabras,


la sobreescritura confiere comportamientos distintos a un mismo concepto.
Un ejemplo clsico de sobreescritura es aquel en que se reescribe el mtodo ToString()
en las clases hijas (todo tipo deriva de object y ToString es un mtodo de object).
La definicin del mtodo en System.Object se corresponde con la siguiente:
public virtual string ToString();

Podemos redefinir ToString() Este mtodo convierte a string el contenido de un objeto


public override string ToString()
{
return Descripcion;
}

Que podra se llamado desde Main() y nos mostrara la descripcin del producto ya sea
libro o CD.
Console.WriteLine(producto2.ToString());

Tambin podemos redefinir Equals(). Este mtodo se utiliza para comparar el objeto
sobre el que se aplica con cualquier otro que se le pase como parmetro. Devuelve true
si ambos parmetros son iguales y false en caso contrario
public virtual bool Equals (object o)

La implementacin que por defecto se ha dado a este mtodo consiste en usar igualdad
por referencia para los tipos por referencia e igualdad por valor para los tipos por valor.
Es decir, si los objetos a comparar son de tipos por referencia slo se devuelve true si
ambos objetos apuntan a la misma referencia en memoria dinmica, y si los tipos a
comparar son tipos por valor slo se devuelve true si todos los bits de ambos objetos
son iguales, aunque se almacenen en posiciones diferentes de memoria.
Hay que tener en cuenta que es conveniente que toda redefinicin del mtodo Equals()
que hagamos cumpla con una serie de propiedades que muchos de los mtodos
incluidos en las distintas clases de la BCL esperan que se cumplan. Estas propiedades
son:
-

Reflexividad: Todo objeto ha de ser igual a s mismo. Es decir, x.Equals(x)


siempre ha de devolver true.
Simetra: Ha de dar igual el orden en que se haga la comparacin. Es decir,
x.Equals(y) ha de devolver lo mismo que y.Equals(x) .

Transitividad: Si dos objetos son iguales y uno de ellos es igual a otro,


entonces el primero tambin ha de ser igual a ese otro objeto. Es decir, si
x.Equals(y) e y.Equals(z) entonces x.Equals(z) .

Consistencia: Siempre que el mtodo se aplique sobre los mismos objetos


ha de devolver el mismo resultado.

Tratamiento de objetos nulos: Si uno de los objetos comparados es nulo


(null), slo se ha de devolver true si el otro tambin lo es.

Una posible redefinicin de Equals() para este ejemplo sera:


public override bool Equals(object obj)
{
return (Codigo == ((Producto)obj).Codigo);

Herencia.Ejercicios

30

Y su llamada sera tal que


if (producto1.Equals(producto2))
Console.WriteLine("son iguales");
else
Console.WriteLine("son diferentes");

CLASES SELLADAS
Las clases selladas no pueden derivar, o sea, ninguna clase puede heredar de ellas.
En el ejemplo podemos fijar como clases selladas Libro y CDDs en el caso de que esto
sea as
public sealed class CompactDisc : Producto
public sealed class Libro : Producto

CLASES ABSTRACTAS
De la misma forma que delimitamos las ramas finales de una jerarqua de clases,
debemos especificar cuales son las clases bases ms generales del modelo, para
garantizar que ese conjunto de clases se defina bien en los procesos de generalizacin y
especializacin.
Las clases muy genricas generalmente no tienen objetos asociados. En el caso del
modelo del ejemplo, no se venden productos poro si libros y CDs. Por tanto tendra ms
sentido marcar la clase Producto como abstracta, haciendo que no se pudiesen generar
objetos a partir de ella.
Una clase abstracta puede contener mtodos con comportamiento bien definido y/o
mtodos abstractos, que sirvan solamente como concepto para un determinado
comportamiento.
Cuando una clase derivada especializa una clase abstracta, est obligada a reescribir
todos los mtodos abstractos de la clase base, para garantizar que tengan una
implementacin correcta.
En el caso de la tienda de CDs y libros, podemos definir la clase Producto como
abstracta e incluir en ella el mtodo abstracto getDescripcionCompleta(), haciendo que
sus subclases reescriban ese mtodo y estipulen una implementacin especfica para
cada tipo de producto.
Definicin de la propiedad del mtodo
public abstract string getDescripcionCompleta();

Definicin del mtodo en las clases derivadas


public override string getDescripcionCompleta()
{
return "Libro=" + base.MDescripcion + " Autor " + Autor + " isbn " + Isbn;
}
public override string getDescripcionCompleta()
{
return "CD=" + base.MDescripcion + " Artista " + Artista + " Discogrfica
" + Discografica;

Herencia.Ejercicios

31

INTERFACES Y MTODOS ABSTRACTOS


Definir una interfaz como modelo garantiza que las clases que la implementan
contendrn, como mnimo, los mtodos que la interfaz modeliza.
Para el ejemplo, podemos definir una interfaz llamada IVendible que posee el mtodo
abstracto getValorVenta()
interface IVendible{
double getValorVenta();
}

A continuacin debemos hacer que las clases Libro y CDs implementen esta interfaz
En la clase Libro
public double getValorVenta(){
return MPrecio * 1.2;
}

En la clase CompactDisc
public double getValorVenta(){
return MPrecio * 1.1;
}

Las interfaces definen tipos, stos se pueden usar como referencia de objetos. As,
podemos utilizar el tipo de una interfaz como parmetro de mtodos o constructores, sin
utilizar el concepto de polimorfismo. Por medio de ese mecanismo, podemos incluir, en
el modelo de nuestra tienda de libros y DCs, un sistema de carrito de compras, que
almacene los productos vendibles y calcule el valor de las compras a partir del precio de
venta.
class Carrito {
public Carrito()
{
vendibles = new IVendible[10];
counter = 0;
}
public IVendible[] Pvendibles
{
get{ return vendibles; }
}
public int AdicionaVendible (IVendible vendible)
{
vendibles[counter++] = vendible;
return counter;
}
public IVendible getVendible(int index)
{
return vendibles[index];
}
public double CalculoCompras()
{
double valor = 0;
for (int i=0;i<counter;i++){
valor+=vendibles[i].getValorVenta();
}
return valor;

Herencia.Ejercicios

32

private IVendible[] vendibles;


private int counter;

Vamos a ver como se utilizara este carrito. Fijarse en el tipo del valor que se le da al
parmetro. Recordar que entre una clase derivada y una clase base siempre hay
conversin implcita.
Carrito carrito = new Carrito();
carrito.AdicionaVendible(producto1);
carrito.AdicionaVendible(producto2);
Console.WriteLine("Valor de las compras " + carrito.calculoCompras());

Cuando ejecuto estas instrucciones desde Main() me da problemas pues las instancias
producto1 y producto2 son de tipo Producto que no implementa IVendible.
Para solucionar esto puede haber dos soluciones, o bien realizo un cast a producto1 y
producto2 para convertirlos en instancias de la clase Libro y CompactDisc o bien hago
que la clase Producto sea la que implemente IVendible y no las clases derivadas.
Probar las dos soluciones.
Para finalizar poner todas las clases en un proyecto llamado Tienda y Program en
otro. Realizar las modificaciones necesarias para que funcione bien. Se debe dar
incluir en Program un men para permitir realizar todas las operaciones que
hemos implementado.
Carrito

DIAGRAMA DE CLASES

- counter:int

Catalogo
- counter:int
+verCatalogo()
+anadeProducto()
+verProducto()

+Carrito()
+Pvendible()
+AdicionaVendible()
+ getVendible()
+ CalculoCompras

Producto
<<abstract>

-codigo: int
-precio: double
-descripcion: string
+ Producto()
+ PCodigo()
+ PDescripcion()
+ PPrecio()
+ getDescripcionCompleta()

Libro

IVendible
<<interface>>

+getValorVenta()

CompactDisc

-autor:string
-isbn:string

-artista:string
-discogrfica: string

+ Libro()
+ PAutor()
+ PIsbn()
+ getDescripcionCompleta()
+Herencia.Ejercicios
getValorVenta()

+ CompactDisc()
+ getArtista()
+ getDiscografica()
+ getDescripcionCompleta()
+ getValorVenta()
33

Ejercicio 1
Implementar una estructura de clases que contemple un modelo de gestin de Recursos
Humanos que englobe los siguientes elementos:
-

Empleado: cdigo y nombre (abstracto)

Ingeniero: departamento y especialidad (especializacin de Empleado)

Gerente: rea y bonos (especializacin de Empleado)

Presidente: valor de la cuota de acciones (especializacin final de Empleado)

En este sistema a cada tipo de empleado debe corresponder una forma diferente de
clculo de salario:
-

Todo empleado debe tener un salario base

El ingeniero debe tener un complemento adicional de 50% sobre el salario


base

El gerente debe tener adems del salario-base, el valor de bonos

El presidente debe tener adems del salario base, el valor de su cuota de


acciones

Ejercicio2
Implementar una estructura de clases tal que permita gestionar un aula, para ello
debemos almacenar la informacin de los alumnos y los profesores, as como calcular
las notas (3 parciales y un examen final). Tambin habr materias a las que asistirn
alumnos y que impartirn profesores.

Herencia.Ejercicios

34

Herencia.Ejercicios

35

EJERCICIO CESTA DE LA COMPRA


Hacer una aplicacin para que simule la compra de objetos con una cesta de la compra.
Hacer previamente un diagrama de clases.
Utilizar para la cesta un ArrayList para almacenar los productos.
Tener en cuenta que la clase ArrayList se encuentra dentro del espacio de nombres
System.Collections

Herencia.Ejercicios

36

También podría gustarte