Verificando las herramientas de Webmaster (Google) entre mis resultados de busqueda me percate que aparece como resultado el como se puede realizar un programa que realice cálculos de figuras geométricas, podemos decir que es un problema común en la programación, y puede ser una buena oportunidad para practicar tus habilidades de programación en C#. En este artículo, vamos a revisar un ejemplo de código que permite calcular area de figuras geometricas en c# asi como el perímetro de un círculo, un cuadrado y un triángulo.
using System;
classProgram{
staticvoid Main(string[] args)
{
Console.WriteLine("Ingrese el radio del círculo:");
double radio = double.Parse(Console.ReadLine());
MostrarResultados("círculo", radio, CalcularAreaCirculo(radio), CalcularPerimetroCirculo(radio));
Console.WriteLine("\nIngrese el lado del cuadrado:");
double ladoCuadrado = double.Parse(Console.ReadLine());
MostrarResultados("cuadrado", ladoCuadrado, CalcularAreaCuadrado(ladoCuadrado), CalcularPerimetroCuadrado(ladoCuadrado));
Console.WriteLine("\nIngrese la base y altura del triángulo:");
double baseTriangulo = double.Parse(Console.ReadLine());
double alturaTriangulo = double.Parse(Console.ReadLine());
MostrarResultados("triángulo", baseTriangulo, alturaTriangulo, CalcularAreaTriangulo(baseTriangulo, alturaTriangulo), CalcularPerimetroTriangulo(baseTriangulo, alturaTriangulo));
}
static double CalcularAreaCirculo(double radio)
{
returnMath.PI * Math.Pow(radio, 2);
}
static double CalcularPerimetroCirculo(double radio)
{
return2 * Math.PI * radio;
}
static double CalcularAreaCuadrado(double lado)
{
returnMath.Pow(lado, 2);
}
static double CalcularPerimetroCuadrado(double lado)
{
return4 * lado;
}
static double CalcularAreaTriangulo(double baseTriangulo, double alturaTriangulo)
{
return (baseTriangulo * alturaTriangulo) / 2;
}
static double CalcularPerimetroTriangulo(double baseTriangulo, double alturaTriangulo)
{
double lado = Math.Sqrt(Math.Pow(baseTriangulo / 2, 2) + Math.Pow(alturaTriangulo, 2));
return baseTriangulo + 2 * lado;
}
staticvoid MostrarResultados(string figura, double medida1, double medida2, double medida3)
{
Console.WriteLine($"Área del {figura}: {medida2}");
Console.WriteLine($"Perímetro del {figura}: {medida3}");
}
staticvoid MostrarResultados(string figura, double medida1, double medida2, double medida3, double medida4)
{
Console.WriteLine($"Área del {figura}: {medida3}");
Console.WriteLine($"Perímetro del {figura}: {medida4}");
}
}
Lenguaje del código:JavaScript(javascript)
El diseño del programa es bastante sencillo, pero abarca todo lo necesario para que puedas iniciar.
Tienes dudas, decime y podemos siempre ver juntos.
Aprenderemos como implementar la herencia en C#,con este ejemplo pretendo que quede mas claro el concepto aplicado a c#. lo que haremos sera un proyecto para calcular el area de las ya conocidas figuras geometricas:circulo,cuadrado,rectangulo y triangulo.
Un poco de teoria(muy breve)
Como ya sabemos la herencia nos permite tomar partes de una clase padre y poder usarla en lo que llamamos subclases,eso permite ahorrarnostener que escribir nuevamente el mismo codigo en varias clases…ahora pensemos un momento,en el caso de una figura geometrica como puedo aplicar la herencia? Facil! si recordamos un poco como calcular areas(sino hay que ir de nuevo a secundaria).
Ahora que tienen en comun, bueno podriamos partir del hecho que todas las figuras geometricas tienen al menos un lado(sea radio,base,altura..),entonces podriamos crear una clase llamada Figura que tenga como atributo Lado e ir haciendo la especialización de cada subclase derivada,agregandole la informacion que sea necesaria, de igual manera podriamos tener un metodo llamado areaen la clase principal y para cada figura irlo adecuando(lo que se llamaria sobreescritura de metodo o override en POO) lo mismo que su perimetro.
Manos a la obra
para verlo de forma mas grafico en un diagrama de clases,nuestra implementacion sera algo como esto
Ya teniendo el panorama bien explicado,al menos lo intente, abramos visual studio y creamos un nuevo proyecto de formulario en c#, le pondremos de nombre Tarea3Figuras(era una tarea ), y de momento realizaremos la interfaz grafica,nos debera quedar como la siguiente figura
Ademas cambiamos en la propiedad name de cada control ,tal como aparece en la figura.
En el control toolstrip agregamos cuatro imagenes,las adjuntare al final del post para cada figura geometrica,la idea es que al hacer click solo muestre lo necesario,en el caso del circulo un solo lado,para el triangulo dos,y para el triangulo tres(por el perimetro)
Creando las clases
Desde el explorador de soluciones necesitamos crear las clases para cada figura geometrica ademas de la clase padre,la llamaremos Figura. Sobre el proyecto damos clic derecho y en el menu contextual seleccionamos agregar>Nuevo elemento y seleccionamos clase, debera aparecernos lla nueva clase en el explorador de soluciones, luego agregamos las otras 4 clases: Triangulo,Cuadrado,Rectangulo y Circulo. nos quedara como la siguiente imagen
Editando las clases
comenzaremos a escribir codio en la clase padre, Figura, para luego ir haciendo la especialziacion en cada clase. en el explorador de soluciones damos doble clic Sobre Figura.cs y agregaremos este codigo.
[highlight]
using System;
using System.Collections.Generic;
using System.Text;
namespace Tarea3Figuras
{
abstract class Figura
{
private int lado1;
public int Lado1 {
set {
if (value < 0) {
lado1 = 0;
}
else
{
lado1 = value;
}
}
get{
return lado1;
}
}
public abstract float area();
public abstract float perimetro();
}
}
[/highlight]
Explicacion del codigo
si observan hemos declarado al clase como abstract la explicacion es es que cuando no queremos instanciar objetos de una clase es decir usar algo como clase nombre=new clase(parametros..) lo que hacemos es anteponer la sentencia abtsract al nombre de la clase, para nuestro caso como la clase Figura solo nos servira como un molde para las clases derivadas entonces anteponemos abstract al nombre de la clase.
el siguiente bloque de codigo
[highlight]
public int Lado1 {
set {
if (value < 0) {
lado1 = 0;
}
else
{
lado1 = value;
}
}
get{
return lado1;
}
}
[/highlight]
sirve para declarar los atributos de clase con sus respectivos metodos modificadores y de acceso, get y set observen que el atributo lado1 esta como private debido a que no queremos acceder a el desde fuera de la clase Figura.
las ultimas dos lineas
[highlight]
public abstract float area();
public abstract float perimetro();
[/highlight]
Son los dos metodos que nos serviran como base para calcular el area y perimetro de cada figura dependiendo la cantidad de lados que tenga. al igual que la clase estan declarados como abstract en su modificador de acceso, para evitar asignarlos a instancias .
Bien con eso ya tenemos nuestro modelo basico,como pudieron ver solo delclaramos un solo lado, ya que como minimo las figuras tienen un lado,en el caso del circulo, luego iremos haciendo la especializacion para cada clase.
La clase Circulo
Siguiendo con nuestro ejemplo ahora vamos a trabajar sobre la clase Circulo, de manera que podamos asignarle sus atributos y metodos partiendo de la clase Figura. Damso doble clic sobre Circulo.cs, agregamos el siguiente codigo.
[highlight]
using System;
using System.Collections.Generic;
using System.Text;
namespace Tarea3Figuras
{
class Circulo:Figura
{
public Circulo(int radio) {
Lado1 = radio;
}
public override float area()
{
return 3.141516F * Lado1 * Lado1;
}
public override float perimetro()
{
return 3.141516F * 2 * Lado1;
}
}
}
[/highlight]
Explicacion
o primero que notamos es que estamos aplicando la herencia de la clase Figura. class Circulo:Figura esta notacion indica que la clase circulo Hereda los atributos de la clase Figura si programas en java es lo mismo que usar la sentencia extend, como hemos heredado todos lso atributos y metodos,ya no es necesario volver a delclararlos, lo siguiente que tenemos es el constructor
[highlight]
public Circulo(int radio) {
Lado1 = radio;
}
[/highlight]
el cual se caracteriza por tener el mismo nombre de la clase y ademas ser publico. el constructor se utiliza para iniciarlizar los objetos cada vez que creamos un objeto derivado de Circulo, aqui estamos diciendo que el objeto circulo recibira un parametro radio y debera ser asignado al atributo Lado1, como el circulo solo tiene un lado, ya no hacemos nada mas,lo siguiente es trabajar sobre los metodos y aqui aplicamos otro concepto de POO llamados sobreescritura de metodos, el cual nos sirve para usar un metodo para varias cosas
en lugar de llamar al metodo por ejemplo areacirculo y perimetroCirculo usamos los mismos nombres que utilizamos en las clase Figura, con la salvedad de que agregamos la sentencia override para indicar que vamos a cambiar el comportamiento del metodo,como sabemos que calcular el area de un circulo es diferente a la de un cuadrado,cada vez que se llame a este metodo retornaremos el cuadrado del lado multiplicado por pi, y en el caso del perimetro 2*pi*lado
La clase Rectangulo
bien si ya comprendiste de que va la herencia, aqui veamos algo un tanto diferente,que pasa si nuestra figura tuviese 4 lados y no 1 como en el rectangulo?, pues deberíamos agregar otro atributo mas aparte del que ya teniamos.
[highlight]
using System;
using System.Collections.Generic;
using System.Text;
namespace Tarea3Figuras
{
class Rectangulo:Figura
{
private int lado2;
public int Lado2 {
set {
if (value < 0)
{
lado2 = 0;
}
else {
lado2 = value;
}
}
get {
return lado2;
}
}
public Rectangulo(int lado1, int lado2) {
this.Lado1 = lado1;
this.Lado2 = lado2;
}
public override float area()
{
return Lado1 * Lado2;
}
public override float perimetro()
{
return (2 * Lado1) + (2 * Lado2);
}
}
}
[/highlight]
observen como nuevamente estamos aplicando la herencia Rectangulo:Figura sabemos que ya no es necesario declarar lado1 por que lo heredo de la clase figuras,pero como necesitamos otro lado mas(base y altura) agregamos la declaracion de ese lado en la clase
[highlight]
private int lado2;
public int Lado2 {
set {
if (value < 0)
{
lado2 = 0;
}
else {
lado2 = value;
}
}
get {
return lado2;
}
}
[/highlight]
si ven nuevamente declaramos otro atributo llamado lado2 para ser consistentes con acceso privado y sus respectivos metodos get y set para modificar o consultar el estado de ese atributo,asi cada vez que creemos un objeto derivado de la clase rectangulo tendra dos lados,
por consiguiente tambien modifcamos su construtor de la siguiente forma
[highlight]
public Rectangulo(int lado1, int lado2) {
this.Lado1 = lado1;
this.Lado2 = lado2;
}
[/highlight]
aqui ya estamos asignando los dos valores que pasemos como argumentos en la creacion de la instancia y estos se guardaran respectivamente en lado1 y lado2.
nuevamente haremos una sobreescritura de metodos,para poder calcular el area y perimetro del rectangulo,aqui ya no usara la del circulo sino su propia version de los metodos.
Bien como creo que ya se entendio el concepto de las dos siguientes solo dejare el codigo,la explicacion es la misma que las dos figuras anteriores, hay que sobreescribir los metodos,para que dependiendo que figura sea utilizada use su propia version del metodo de area y perimetro y de ser necesario se agregan mas lados
using System;
using System.Collections.Generic;
using System.Text;
namespace Tarea3Figuras
{
class Cuadrado:Figura
{
public Cuadrado(int lado1) {
this.Lado1 = lado1;
}
public override float area()
{
return Lado1 * Lado1;
}
public override float perimetro()
{
return 4 * Lado1;
}
}
}
Observar que solo se necesito un lado,ya que en el caso del circulo todos los 4 lados son iguales,no tendria sentido declarar 3 lados mas,el constructor por lo tanto solo asignara un lado a las instancias que se creen.
la clase Triangulo
using System;
using System.Collections.Generic;
using System.Text;
namespace Tarea3Figuras
{
class Triangulo:Figura
{
private int lado2;
private int lado3;
public int Lado2 {
set {
if (value < 0) {
lado2 = 0;
}
else{
lado2=value;
}
}
get {
return lado2;
}
}
public int Lado3 {
set {
if (value < 0)
{
lado3 = 0;
}
else {
lado3 = value;
}
}
get {
return lado3;
}
}
public Triangulo(int tbase, int altura) {
Lado1 = tbase;
Lado2 = altura;
}
public Triangulo(int L1, int L2, int L3) {
Lado1 = L1;
Lado2 = L2;
Lado3 = L3;
}
public override float area()
{
return (Lado1 * Lado2) / 2.0F;
}
public override float perimetro()
{
return Lado1 + Lado2 + Lado3;
}
}
}
agregamos dos atributos mas Lado2,Lado3 ya que un triangulo puede ser equilatero,isoceles o escaleno(todos los lados distintos) por lo cual los tres lados podrian ser diferentes, agregamos su constructor con los tres lados y finalmente hacemos la sobreescritura de sus metodos para calcular el area y perimetro.
Agregando codigo al formulario
Lo que sigue es mas bien como integrar todo en la aplicacion y agregar la funcionalidad a los botones,dependiendo que figura sea seleccionada asi deberan aparecer o no algunos campos,por ejemplo si seleccionamos un circulo,sabemos que solo se necesita que se muestre un lado,por otra parte para un triangulo necesitamos ingresar tres lados,ademas cada figura se le puede calcular su area o perimetro, por lo que tambien se debera ajustar el codigo.
Hacemos doble clic sobre el boton btnCalcular y dentro de su evento click, escribiremos lo siguiente
try
{
switch (tipo_figura)
{
case 1:
if (rdbArea.Checked == true)
{
Triangulo tri = new Triangulo(int.Parse(txtLado1.Text), int.Parse(txtLado2.Text));
txtResultao.Text = Convert.ToString(tri.area());
}
else
{
Triangulo tri = new Triangulo(int.Parse(txtLado1.Text), int.Parse(txtLado2.Text), int.Parse(txtLado3.Text));
txtResultao.Text = Convert.ToString(tri.perimetro());
}
break;
case 2:
if (rdbArea.Checked == true)
{
Cuadrado cuadr = new Cuadrado(int.Parse(txtLado1.Text));
txtResultao.Text = Convert.ToString(cuadr.area());
}
else
{
Cuadrado cuadr = new Cuadrado(int.Parse(txtLado1.Text));
txtResultao.Text = Convert.ToString(cuadr.perimetro());
}
break;
case 3:
if (rdbArea.Checked == true)
{
Circulo circ = new Circulo(int.Parse(txtLado1.Text));
txtResultao.Text = Convert.ToString(circ.area());
}
else
{
Circulo circ = new Circulo(int.Parse(txtLado1.Text));
txtResultao.Text = Convert.ToString(circ.perimetro());
}
break;
case 4:
if (rdbArea.Checked == true)
{
Rectangulo rect = new Rectangulo(int.Parse(txtLado1.Text), int.Parse(txtLado2.Text));
txtResultao.Text = Convert.ToString(rect.area());
}
else
{
Rectangulo rect = new Rectangulo(int.Parse(txtLado1.Text), int.Parse(txtLado2.Text));
txtResultao.Text = Convert.ToString(rect.perimetro());
}
break;
}
}
//catch
catch (Exception) {
MessageBox.Show(“Error la ingresar datos”);
}
el codigo es extenso,pero repetitivo asi que no lo explicare todo estamos usando un case para que dependiendo que se seleccione en en radio button,asi aparezcan o desaparezcan algunos campos de texto en el caso de que se haya seleccionado el triangulo se podra elegir entre calcular el area o perimetro
case 1:
if (rdbArea.Checked == true)
{
Triangulo tri = new Triangulo(int.Parse(txtLado1.Text), int.Parse(txtLado2.Text));
txtResultao.Text = Convert.ToString(tri.area());
}
else
{
Triangulo tri = new Triangulo(int.Parse(txtLado1.Text), int.Parse(txtLado2.Text), int.Parse(txtLado3.Text));
txtResultao.Text = Convert.ToString(tri.perimetro());
}
break;
se creara un nuevo objeto del tipo Triangulo llamado tri y se le pasaran como argumentos los lados que se digiten en los tres texbox,luego se invocara al metodo dependiendo de la seccion de area o perimetro y el resultado sera mostrado como cadena en el textbox txtResultado., para las demas figuras es igual,solo cambia el tipo de objetos que se creara dependiendo de la seleccion.
creamos otro metodo para reiniciar los controles
private void reinicia_controles() {
foreach (Control ctr in this.groupBox2.Controls) {
ctr.Visible = false;
ctr.Text = “”;
}
txtResultao.Text = “”;
btnCalcular.Text = “Calcular”;
btnCalcular.Visible = true;
btnCalcular.Enabled = true;
}
otro mas para que muestre los campos correspondientes para el area y perimetro
muy bien eso es todo, no me detuve en lo ultimo debido a que la intencion era explicar a herencia,lo demas es pura programación para dejarlo mas presentable, si quieren ver como queda todo unido pueden bajarse el codigo adjunto,deben tener vs 2012 para poder abrilo, igual si tienen dudas pueden hacerlas aqui. Bajar adjunto
Navegando por la web tratando de conseguir informacion sobre como realizar aplicaciones para android usando c# (csharp), me encontre con una web donde crearon la forma de hacerlo.
La web es Xamarin, la misma te permite descargar lo necesario para poder realizar las aplicaciones para android u otro sistema desde tu C# incluyendo el 2010.
Si eres de las personas asi como yo, acostumbradas a usar C# 2005 o 2010, y no queremos aprender java, esta es tu mejor opcion, lastimosamente xamarin es de pago y esta bastante caro, un poco elevado el precio, pero si te animas ya nos contaras despues .
Te permite descargar una version trial, pero luego tiene precios acorde a tus necesidades. A continuacion te expondremos los links para cada lugar.
En el transcurso de nuestra vida, nos encontramos con interrogantes muy peculiares, principalmente cuando nos dedicamos al mundo del desarrollo de aplicaciones de escritorio.
En un desarrollo que hice, necesitaba hacer resaltar cada fila de una grilla de acuerdo a su estado, el proyecto estaba desarrollado en C# de Visual Studio 2005, con DevExpress v 8.2.
Aqui les traigo los pasos a realizar para hacer que tu grilla usando DevExpress, logre tener diferenciado cada linea de acuerdo a un determinado valor de uno de sus columnas.
Una ves que tenemos creado nuestro GridControl (DevExpress), debemos entrar a su panel de control como mostramos en la siguiente imagen
Una ves dentro nos apareceran las opciones que podemos modificar de nuestro GridView, por lo que debemos buscar en la opcion “OptionsSelection” los valores “EnableAppareanceFocusedCell” y “EnableAppareanceFocusedRow” y a ambos asignarle valor “False”, de esta forma evitariamos que cuando mostremos la grilla la fila y/o campo/s esten seleccionados y no nos deje ver los colores que asignamos para cada accion.
Luego en el mismo lugar (panel de control de la grilla), nos dirigimos a el simbolo con forma de rayo que esta en la parte de arriba, accediendo de esa forma a los distintos metodos que podemos crear o usar de la Grilla, en especial usariamos el metodo “RowStyle” como podemos ver en la imagen siguiente.
Al darle doble click encima, nos creara el metodo y es donde trabajaremos, quedandonos de la siguiente forma.
Llegado hasta aqui ya tenemos todo listo para colocar el codigo que nos permitira tener cada fila de acuerdo al valor de una de nuestras columnas pintadas de diferente color.
El siguiente codigo es el encargado de realizar lo que queremos:
[highlight]
string estado = "";
GridView vista = sender as GridView;
try
{
estado = vista.GetRowCellValue(e.RowHandle, vista.Columns["estado"]).ToString().Trim();
}
//controlamos cualquier excepcion
catch { };
//revisamos de acuerdo al estado
switch (estado)
{
case "PENDIENTE":
e.Appearance.BackColor = Color.Yellow;
e.Appearance.BackColor2 = Color.White;
break;
case "RECHAZADO":
e.Appearance.BackColor = Color.Red;
e.Appearance.BackColor2 = Color.White;
break;
case "PROCESADO":
e.Appearance.BackColor = Color.Green;
e.Appearance.BackColor2 = Color.White;
break;
}
[/highlight]
Explicando un poco el codigo:
La variable string estado = “”; nos permitiria guardar el valor que tiene nuestra columna de comparacion y pintar la fila entera de acuerdo a su determinado valor.
La variable GridView vista = sender as GridView;, nos permite inicializar de tal forma que el objeto “sender” contenga los mismo valores que posee un GridView y por consiguiente la variable creada “vista”, tendra tambien esos mismos valores.
Esta porcion de codigo nos permite obtener el valor que posee la columna que querramos comparar luego, se pone dentro de un try/catch para evitar alguna excepcion que ocurra en el camino.
Una ves obtenido el valor de dicho campo, el que hace la magia para pintar toda la fila lo podemos ver en el siguiente codigo
[highlight]
//revisamos de acuerdo al estado
switch (estado)
{
case "PENDIENTE":
e.Appearance.BackColor = Color.Yellow;
e.Appearance.BackColor2 = Color.White;
break;
case "RECHAZADO":
e.Appearance.BackColor = Color.Red;
e.Appearance.BackColor2 = Color.White;
break;
case "PROCESADO":
e.Appearance.BackColor = Color.Green;
e.Appearance.BackColor2 = Color.White;
break;
}
[/highlight]
Siendo por fin el resultado final el siguiente:
Espero que les haya gustado, pareciese muy basico lo expuesto, pero puedo asegurarles que a mas de uno en algun momento de su vida, lo necesitara…