Ejercicios de POO en C#
Ejercicios de POO en C#
Compendio de POO-C#
EJERCITARIO DE C#
MSC. RUBÉN SANABRIA
2016 |
Introducción a C#
Comandos y sentencias
// Ejemplo_02_01_06a.cs
// Condiciones con if: comparación incorrecta
// Introducción a C#
using System;
public class Ejemplo_02_01_06a {
public static void Main()
{
int numero;
Console.WriteLine("Introduce un número");
numero = Convert.ToInt32(Console.ReadLine());
if (numero = 0)
Console.WriteLine("El número es cero.");
else
if (numero < 0)
Console.WriteLine("El número es negativo.");
Else
Console.WriteLine("El número es positivo.");
}
}
using System;
public class Ejemplo_02_02_01_01a
{
public static void Main()
{
int numero;
Console.Write("Teclea un número (0 para salir): ");
numero = Convert.ToInt32(Console.ReadLine());
while (numero != 0)
{
if (numero > 0)
Console.WriteLine("Es positivo");
Else
Console.WriteLine("Es negativo");
Console.WriteLine("Teclea otro número (0 para salir): ");
numero = Convert.ToInt32(Console.ReadLine());
}
}
}
Utilización del do..while
// Ejemplo_02_02_02a.cs // La orden "do..while" (repetir..mientras) //
Introducción a C#
using System;
public class Ejemplo_02_02_02ª
{
public static void Main()
{
int valida = 711;
int clave;
do
{
Console.Write("Introduzca su clave numérica: ");
clave = Convert.ToInt32(Console.ReadLine());
if (clave != valida)
Console.WriteLine("No válida!");
}
while (clave != valida);
Console.WriteLine("Aceptada.");
using System;
public class Ejemplo_02_02_05a
{
public static void Main()
{
int tabla, numero;
for (tabla=1; tabla<=5; tabla++)
for (numero=1; numero<=10; numero++)
Console.WriteLine("{0} por {1} es {2}", tabla, numero,
tabla*numero);
}
}
using System;
using System;
public class Ejemplo_04_01_03a {
public static void Main() {
int[] numeros = {200, 150, 100, -50, 300};
int suma; // Un entero que será su suma
suma = 0; // Valor inicial de la suma: 0
for (int i=0; i<=4; i++) // Y calculamos la suma repetitiva
suma += numeros[i];
Console.WriteLine("Su suma es {0}", suma);
}
}
Clases
La clase es el elemento fundamental de la programación orientada a objetos con el lenguaje C#. Aunque,
dentro de este modelo de programación, existen muchas definiciones válidas para el concepto de clase, en
la práctica una clase no es más que una plantilla de software que sirve para construir cualquier cantidad de
objetos. Por ejemplo, en .NET existe una clase llamada Form que sirve como molde para construir cualquier
ventana que necesite una aplicación tipo Windows. Las ventanas que nosotros observamos en la pantalla
de nuestro computador, son los objetos generados con esa plantilla. Pueden haber muchos objetos
generados con esa plantilla, pero lo que los puede hacer diferentes a unos de otros, son los valores que se
asignan a sus atributos como: alto, ancho, color, título, etc.
Pero, por ahora volvamos a nuestra realidad que nos exige a nosotros definir los tipos o clases que el
entorno de desarrollo no haya definido, o que siendo tantos, no sepamos que ya existen, y que los
necesitemos para nuestros programas. En C# una clase se define mediante la palabra clave class y una
sintaxis básica que encontramos para definirla, es la siguiente:
class NombreClase
{
//Miembros
}
Sin embargo, las clases deben cumplir unos niveles de seguridad que exigen el manejo del control de
accesibilidad a ellas, sobre todo por parte de agentes externos al proyecto de software donde se hayan
definido. Es por esto que la definición de cualquier clase debe ir antecedida de una palabra clave que
determina la accesibilidad que admite dicha clase. La sintaxis C# para definir una clase es la siguiente:
class NombreClase {
La sección entre corchetes, que indica las palabras clave de accesibilidad, public, private, protected,
internal, que pueden utilizarse en la definición de una clase, es opcional e indica cual es el nivel de acceso
que se va a permitir sobre la clase. Si no se especifica ningún nivel de accesibilidad, el compilador la define
por defecto como internal, lo cual significa que solo se permite el acceso a las clases que hacen parte del
mismo ensamblado. Mediante las palabras de accesibilidad se pueden especificar los siguientes cinco
niveles de protección para una clase:
Objetos
Cuando se diseña y programa una aplicación de software con el modelo de programación orientada a objetos,
lo que se hace en la práctica es construir un conjunto de plantillas de objetos, o lo que se conoce como clases,
las cuales permiten definir variables en memoria que se conocen con el nombre de objetos o instancias1 de
clase.
Desde esta perspectiva, el término clase gana mayor significado, ya que se puede definir como una plantilla
que permite generar una clase de objetos.
Para crear un objeto de una determinada clase, se procede básicamente en dos pasos:
primero se declara una variable con el tipo que representa la clase y luego se le asigna memoria con el
operador new. Por ejemplo, tomando la clase Complejo definida anteriormente, la siguiente línea crea un
objeto a partir de esta plantilla:
Complejo z;
Cuando el programa ejecuta esta línea, solo posee una dirección de memoria donde se inicia la estructura de
la variable z. Para asignarle la memoria total conforme al tamaño de la estructura que describe la clase, es
necesario aplicar el operador new, así:
z = new Complejo();
A partir de aquí, el sistema conoce con exactitud la ubicación y tamaño ocupado en memoria por la
variable z y estará en condiciones de colocar en el sitio que corresponda cada uno de los datos y demás
elementos que conforman el objeto.
En C#, tanto la declaración como la asignación de memoria para un objeto puede hacerse en una sola línea
de código, como se muestra enseguida para nuestro ejemplo:
namespace poo1
{
public class Clase
{
static int atributo1,atributo2;
static int sumar;
Console.ReadKey();
}
private void calcular()
{
atributo1 = 15;
atributo2 = 17;
sumar = atributo1+atributo2;
}
}
}
namespace poo1
{
public class Dos
{
public static void Main(string[] args)
{
int aa, bb, suma;
aa = 20;
bb = 34;
suma = aa+bb;
Console.Write("La suma es..{0}",suma);
Console.ReadKey(true);
}
}
}
Resultado
using System;
namespace poo1
{
public class tres
{
static int x1,y1,x2,y2;
static double raiz;
}
private void calcular()
{
raiz = Math.Sqrt(Math.Pow((x2-x1),2)+Math.Pow((y2-y1),2));
Console.WriteLine("La distancia hallada es {0}",raiz);
}
}
}
Resultado
using System;
namespace poo1
{
/// <summary>
/// Description of Cuatro.
/// </summary>
public class Cuatro
{
static double perimetro,area,lado;
Resultado
Una clase estática es básicamente igual que una clase no estática, pero existe una diferencia: no se pueden
crear instancias de una clase estática. En otras palabras, no puede utilizar la palabra clave new para crear
una variable del tipo clase. Dado que no hay ninguna variable de instancia, el acceso a los miembros de
una clase estática se realiza mediante el propio nombre de clase. Por ejemplo, si cuenta con una clase
estática que se denomina UtilityClass e incluye un método público denominado MethodA, la llamada al
método se realiza tal como se muestra en el ejemplo siguiente:
UtilityClass.MethodA();
Una clase estática se puede utilizar como un contenedor adecuado para los conjuntos de métodos que solo
funcionan en parámetros de entrada y no tienen que obtener ni establecer campos internos de
instancia. Por ejemplo, en la biblioteca de clases .NET Framework, la clase estática System.Math contiene
varios métodos que realizan operaciones matemáticas, sin ningún requisito para almacenar o recuperar
datos únicos de una instancia determinada de la clase Math. Es decir, los miembros de la clase se aplican
especificando el nombre de la clase y del método, como se muestra en el ejemplo siguiente.
// Output:
// 3.14
// -4
// 3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace estructuraencsharp
{
class Estatico
{
static float altura, bases;
static void Main()
{
bases = 10;
altura = 15; Clase estática
area_triangulo();
//llamo a la clase figura geometrica
figura_geometrica.altura = 12;
Otra forma de
figura_geometrica.bases = 5; Clase estática
figura_geometrica.area_triangulo();
//llamo a la clase figura_geometrica -->dinamica
figura_geometrica2 objeto = new figura_geometrica2();
objeto.altura = 27;
Clase dinámica,
objeto.bases = 32; se crea la clase
objeto.area_triangulo(); con la instancia
new
Console.ReadKey();
}
static void area_triangulo()
{
Console.WriteLine("area del triangulo es " + (bases * altura) / 2);
}
}
class figura_geometrica
{
public static float altura, bases;
class figura_geometrica2
{
public float altura, bases;
5. Declarar una clase llamada Circunferencia que tenga como atributo privado el radio
de tipo real y los siguientes métodos:
a) Calcular el área.
b) Calcular el perímetro.
c) Método para modificar el radio
d) Método para consultar el valor del radio
6. Definir una clase para manejar los artículos de un supermercado cuyo diagrama de
UML se muestra a continuación:
Declare y cree un objeto, modifique sus valores e imprima el valor del IVA
correspondiente.
7. Implemente una clase para almacenar una temperatura dada en grados centígrados y la
convierta a grados Fahrenheit, de acuerdo a la fórmula (despeje la variable):
1- -Ingrese el tamaño de un vector, también ingrese los elementos de dicho vector, luego imprimir
los elementos del vector creado.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace estructuraencsharp
{
class Array1
{
static int n;
static int[] a;
public static void Main()
{
Array1 vec = new Array1();
vec.tamanio();
vec.cargar_datos();
vec.mostrar_datos();
Console.ReadKey();
}
private void tamanio()
{
Console.WriteLine("Ingrese el tamanio del vector: ");
n = Convert.ToInt32(Console.ReadLine());
if(n>0)
a = new int[n];
else
tamanio();
}
public void cargar_datos(){
for(int x=0; x<n; x++)
{
Console.WriteLine("Ingrese el valor["+x+"]: ");
int num = Convert.ToInt32(Console.ReadLine());
if (num > 0)
a[x] = num;
else
x--;
}
}
public void mostrar_datos(){
for(int x=0; x<n; x++)
Console.WriteLine(a[x]+" ");
}
}
}
MATRICES
1- Crear una matriz de 3 filas por 5 columnas, con elementos de tipo int, cargar dicha matriz, luego
imprimir la matriz nueva.
using System;
namespace poo1
{
public class Matriz1
{
private int[,] mat;
public static void Main(string[] args)
{
Matriz1 ma = new Matriz1();
ma.Cargar();
ma.Imprimir();
}
2- Crear y cargar una matriz de 4 filas por 4 columnas. Imprimir la diagonal principal.
using System;
namespace poo1
{
public class Matriz2
{
private int[,] mat;
public static void Main(string[] args)
{
Matriz2 ma = new Matriz2();
ma.Cargar();
ma.verDiagonalPrincipal();
}
HERENCIA
La herencia, junto con la encapsulación y el polimorfismo, es una de las tres características principales
(o pilares) de la programación orientada a objetos. La herencia permite crear nuevas clases que reutilizan,
extienden y modifican el comportamiento que se define en otras clases. La clase cuyos miembros se
heredan se denomina clase base y la clase que hereda esos miembros se denomina clase derivada. Una
clase derivada solo puede tener una clase base directa. Sin embargo, la herencia es transitiva. Si ClassC se
deriva de ClassB y ClassB se deriva de ClassA, ClassC hereda los miembros declarados en ClassB y ClassA.
Gráfico de ejemplo
Ejemplo de herencia
using System;
using poo1;
namespace poo1
{
public class Herencia
{
static void Main(string[] args)
{
Suma objetosuma = new Suma();
objetosuma.Valor1 = 16;
objetosuma.Valor2 = 42;
objetosuma.Sumar();
Console.WriteLine("La suma de " + objetosuma.Valor1 + " y " +
objetosuma.Valor2 + " es " + objetosuma.Resultado);
//
Resta objetoresta = new Resta();
Console.ReadKey();
}
}
} //fin encapsulado
La operación de refactorización Encapsular campo (Encapsulate Field) permite crear rápidamente una
propiedad a partir de un campo existente y, a continuación, actualizar sin problemas el código con
referencias a la nueva propiedad.
Cuando un campo es público, los otros objetos tendrán acceso directo a ese campo y podrán modificarlo,
sin que el objeto que posee el campo lo detecte. Mediante propiedades que encapsulen ese campo, se
puede deshabilitar el acceso directo a los campos.
Para crear la nueva propiedad, la operación Encapsular campo cambia el modificador de acceso del campo
que desea encapsular a privado y, a continuación, genera descriptores de acceso get y set para ese campo.
En algunos casos solo se genera un descriptor de acceso get, como cuando el campo se declara de solo
lectura.
} //fin encapsulado
En tiempo de ejecución, los objetos de una clase derivada pueden ser tratados como objetos de una clase
base en lugares como parámetros de métodos y colecciones o matrices. Cuando ocurre, el tipo declarado
del objeto ya no es idéntico a su tipo en tiempo de ejecución.
Las clases base pueden definir e implementar métodos virtuales y las clases derivadas pueden
invalidarlos, lo que significa que pueden proporcionar su propia definición e implementación. En tiempo
de ejecución, cuando el código de cliente llama al método, CLR busca el tipo en tiempo de ejecución del
objeto e invoca esa invalidación del método virtual. Por lo tanto, en el código fuente puede llamar a un
método en una clase base y hacer que se ejecute una versión del método de la clase derivada.
Los métodos virtuales permiten trabajar con grupos de objetos relacionados de manera uniforme. Por
ejemplo, supongamos que tiene una aplicación de dibujo que permite a un usuario crear varios tipos de
formas en una superficie de dibujo. En tiempo de compilación, no sabe qué tipos específicos de formas
creará el usuario. Sin embargo, la aplicación tiene que realizar el seguimiento de los distintos tipos de
formas que se crean, y tiene que actualizarlos en respuesta a las acciones del mouse del usuario. Para
solucionar este problema en dos pasos básicos, puede usar el polimorfismo:
1. Crear una jerarquía de clases en la que cada clase de forma específica deriva de una clase base
común.
2. Usar un método virtual para invocar el método apropiado en una clase derivada mediante una sola
llamada al método de la clase base.
Ejercicio
1-Se tiene un vehículo al que se le pasa diferentes valores, como color, marca, cantidad de puertas
using System;
namespace poo1
{
}
}
2-Una institución educativa quiere saber las calificaciones de alumnos, ingrese datos a un libro de
calificaciones, visualícelo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Polimorfismo1
{
class Program
{
static void Main(string[] args)
{
Libros miNota1 = new Libros();
List<int> calificacion = new List<int>();
//imprime notas
Console.WriteLine("Mis notas son: ");
foreach (int misNotas in calificacion)
{
Console.WriteLine(misNotas);
}
Console.ReadKey();
}
}
}
Y en la clase Libros.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Polimorfismo1
{
class Libros
{
private int notas;
public int Notas
{
get { return notas; }
set { notas = value; }
}
}
El resultado es :
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace POO2
{
public partial class MainForm : Form Aquí vemos como esta
{ heredando de la
public MainForm() superclase Form
{
InitializeComponent();
}
}
}
Ejercicio 1
Ingresar datos en los campos de textos, luego sumarlos, visualizar en otro campo resultado,
mediante el evento click() del botón ejecutar.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace POO2
{
public partial class MainForm : Form
{
static double nro1,nro2,resultado;
public MainForm()
Ejercicio 2
Agregar Datos a una lista mediante un listview, uitilizando windowsform, con el botón agregar,
borrar y salir
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace form01
{
Resultado
Esta aplicación nos permite ingresar el nombre del producto, precio anterior y precio actual,
luego nos permite calcular el alza en Guaraníes y el alza en porcentajes. El alza en porcentaje
es igual al alza en Guaraníes por 100 entre el precio anterior.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace dos
{
public partial class MainForm : Form
{
static double vant,vact,valz,valp;
public MainForm()
{
InitializeComponent();
}
void Button3Click(object sender, EventArgs e)
{
Close();
}
void Button1Click(object sender, EventArgs e)
{
limpiartxt();
textBox1.Focus();
}
private void limpiartxt(){
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
}
void Button2Click(object sender, EventArgs e)
{
valz = Convert.ToDouble(textBox3.Text)-Convert.ToDouble(textBox2.Text);
valp = (valz * 100)/Convert.ToDouble(textBox2.Text);
textBox4.Text = Convert.ToString(valz);
textBox5.Text = Convert.ToString(valp);
}
}
}
Ejercicio 3
MVC acrónimo de Modelo Vista Controlador mejor conocido en ingles como Model View
Controller, aunque hoy en día la definición de este varía entre distintos autores y/o tecnologías sobre
la que se implemente, es decir mientras para algunos es un patrón de diseño o un tipo de arquitectura
de software o incluso hasta un framework, para Microsoft en lo particular ASP.NET es un todo en
uno, ya que cuenta con un framework para desarrollar aplicaciones Web eficaces, altamente
testables y fáciles de mantener, todo esto sacando provecho del patrón de diseño MVC.
De igual manera se le conoce como una arquitectura, siendo que separa nuestras aplicaciones en tres
componentes principales, tales como un Modelo de datos, las Vista y los Controladores.
a) - Diagrama MVC
MVC es un patrón arquitectónico cuyo principal propósito es establecer una separación clara entre la interfaz
de usuario que presenta la aplicación y la lógica de negocio que maneja la aplicación. Se trata de un patrón
antiguo, se remonta a los años a finales de los años 70, pero que ahora vive una nueva época de esplendor
gracias a su intensa utilización en los entornos de desarrollo web.
ASP.NET MVC es el framework que propone Microsoft para el desarrollo web utilizando el patrón MVC
sobre la tecnología ASP.NET. Esto, que a priori puede parecer evidente tiene una consecuencia inmediata:
Nota: ASP.NET MVC dispone de varios motores de renderización – Razor, aspx, - , en este tutorial
utilizaremos Razor.
Es por tanto, el controlador el encargado de coordinar la ejecución, generar el modelo y devolver la vista.
Y las clases contenidas dentro de cada carpeta, como vemos los principales son el Modelo, Vistas,
Controladores :
Vistas:
- Referencia a los formularios utilizados en el
sistema.
Modelos :
- Referencia a los atributos del sistema,
próximos a las tablas, del sistema.
MENU PRUNCIPAL
namespace sueldos1.Modelos
{
public class CargosBean
{
Public int Cod{get;set;}
Public string Nom{get;set;}
public CargosBean()
{
}
}
}
Clase DConexión.cs
using System;
namespace sueldos1.capaDatos
{
public class DConexion
{
public static string conex = "DSN=sueldo";
}
}
Clase CargosDAO.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Odbc;
using sueldos1.Modelos;
namespace sueldos1.Controladores
{
public class CargosDAO
{
OdbcConnection cone = new OdbcConnection(Conexion.conex);
public void insertar(CargosBean obj)
{
try
{
CargosBean bean = new CargosBean();
string sql = "Insert into cargos (codigo,descripcion) "
+"VALUES ('"+obj.Cod+"','"+obj.Nom+"')";
OdbcCommand cmd = new OdbcCommand(sql);
cmd.Connection = cone;
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
cone.Close();
}
}
//delete
public void eliminar(CargosBean obj)
{
try
{
CargosBean bean = new CargosBean();
string sql = "DELETE FROM cargos WHERE codigo='"+obj.Cod+"'";
OdbcCommand cmd = new OdbcCommand(sql);
cmd.Connection = cone;
cmd.CommandType = CommandType.Text;
cone.Open();
cmd.ExecuteNonQuery();
cone.Close();
}
//buscar
public List<CargosBean> leeCargo()
{
List<CargosBean> lista = new List<CargosBean>();
try
{
OdbcCommand cmd = new OdbcCommand();
cmd.Connection = cone;
cmd.CommandText = "select * from cargos";
cone.Open();
OdbcDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
CargosBean bean = new CargosBean();
bean.Cod = Convert.ToInt32(reader["codigo"]);
bean.Nom = Convert.ToString(reader["descripcion"]);
lista.Add(bean);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
{
cone.Close();
}
}
return lista;
}
EN LA CAPA VIEWS
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;
using sueldos1.Controladores;
using sueldos1.Modelos;
using sueldos1.Reportes;
namespace sueldos1
{
public frmCargos()
{
InitializeComponent();
}
void FrmCargosLoad(object sender, EventArgs e)
{
leer_tabla();
}
case 3: {
DialogResult result = MessageBox.Show("Seguro que desea
Modificar?", "Sistema de Stock", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
bean.Cod = int.Parse(textBox1.Text);
bean.Nom = textBox2.Text;
dao.modificar(bean);
}
else { }
break;
}
}
leer_tabla();
tabPage1.Show();
}
void Button3Click(object sender, EventArgs e)
{
ban = 3;
textBox1.Focus();
}
}
void Button6Click(object sender, EventArgs e)
{
Close();
}
void Button2Click(object sender, EventArgs e)
{
ban = 2;
textBox1.Focus();
}