Python: saber si estoy en el hemisferio norte o sur


Solicitar al usuario ingresar su latitud y longitud y determinar si este se encuentra en el hemisferio norte o hemisferio sur.

Teniendo las siguientes variables como punto 0 el Ecuador:
lat = -2.0000000
lon = -77.5000000


Veamos como hacerlo:
lat = -2.0000000
lon = -77.5000000
lat_domicilio = float(input("Ingresa la latitud de tu domicilio: "))
lon_domicilio = float(input("Ingresa la longitud de tu domicilio: "))
estoy_al_sur = lat_domicilio - lat < 0
if estoy_al_sur:
    print("Estas en el hemisferio sur")
else:
    print("Estas en el hemisferio norte")

Explicación:

Existen distintas formas de resolver este problema, pero básicamente lo que hacemos es solicitar la latitud y longitud donde se encuentra el usuario (y las almacenamos en las variables lat_domicilio y lon_domiciliopara posteriormente hacer una resta entre la latitud del usuario y la latitud del Ecuador y ver si es menor que 0 para que de True o False. (True estamos al sur y False estamos al norte)

Ejemplo 1:
supongamos que estamos en Toronto, Canadá
Ejemplo 2:
supongamos que estamos en Punta Arenas, Chile.

Así, tan sencillo se puede realizar este calculo

Enlaces de interés:

  • Obtener tus coordenadas: https://www.coordenadas-gps.com/
  • Los hemisferios de la tierra: https://www.astromia.com/glosario/hemisferio.htm
¿qué mas se te ocurre hacer con esta información?


Python: calcular perimetro


En este simple ejercicio calcularemos el perímetro de un cuadrado utilizando el lenguaje Python.


def perimetro(lado):
  perimetro = 0
  perimetro = lado*4
  return perimetro

Todo el mundo debería aprender a programar

Decía Steve Jobs que “todo el mundo debería aprender a programar un ordenador porque esto te ayuda a pensar”.


Infografía interfaz lenguaje Scratch

Una nueva infografía para complementar la interfaz de scracth que publique hace un tiempo atrás.
También puedes descargar el archivo PDF para imprimir.


WPF vs Windows Forms


En un post anterior hablé que WPF (windows presentation foundation) es hoy en día la evolución de Windows Forms dada sus características. Sin embargo, a pesar que, ambos tienen el mismo objetivo que es la creación de interfaz gráfica para el usuario (GUI), estos poseen bastantes diferencias la una de la otra, las cuales veremos en este artículo.

Windows Forms:

Quizá es el más utilizado a la hora de crear aplicaciones de escritorio para Windows (yo mismo llevo utilizando por varios años). Podemos definir a Windows Forms como un conjunto de bibliotecas para el desarrollo de interfaces gráficas basada en los controles estándar de windows (por ejemplo el textbox) dependiente de Win32.

Ventajas:
  • Amplia documentación en Internet.
  • Permite el uso de WPF
  • Montón de ejemplos basados en Windows Forms
  • El diseñador de Visual Studio funciona más eficientemente con Windows Forms

WPF:

Permite crear aplicaciones visualmente impactantes, puesto que sus controles están basados en formato vectorial y no se pierde calidad de imagen, como asi tambien la posiblidad de incorporar diversos elementos que se mencionaran más abajo.

El lenguaje utilizado en la parte gráfica es XAML (Extensible Application Markup Language) basado en XML (Extensible Markup Language). Esto permite construir la parte gráfica en jerarquías de modelos lo cual resulta muy amigable.
Del otro lado tenemos la lógica del programa o código de programación basada en C# o Visual Basic, que llamaremos code-behind. La cual esta totalmente separada del aspecto gráfico.

Ventajas:
  • Utiliza la aceleración de hardware para la construcción GUI.
  • Diseño gráfico y lógica de programación independientes.
  • Posibilidad de trabajo en conjunto para diseñadores y programadores.
  • Soporta Windows Forms.
  • Posibilidad de enlace de datos altamente avanzados, limpia y separada del diseño.
  • Incorporar documentos fijos, componentes multitudinaria, gráficos bidemensionales y tridemencionales entre otros.
Conclusión.
La interfaz gráfica es la que el usuario final utilizará y esta más decir que no se debe descuidar por nuestra parte, puesto que el usuario da mucho valora a ella. Al usuario/cliente no le interesa si esta programado en C#, Visual Basic, etc. siempre y cuando la interfaz sea linda, amigable y funcional.


Artículos y fuentes de interés:

  • http://www.wpf-tutorial.com/about-wpf/wpf-vs-winforms/
  • https://www.infragistics.com/community/blogs/b/devtoolsguy/posts/windows-presentation-foundation-vs-winforms
  • https://msdn.microsoft.com/library/aa663364.aspx
  • https://v3nant30.wordpress.com/2012/01/29/windows-forms-o-wpf/

Crear Calculadora con WPF y C# (Segunda Parte)


Seguimos desarrollando nuestra calculadora básica que comenzamos en el post anterior (Crear Calculadora con WPF y C# (Primera Parte))

1.- A cada elemento le asignaremos un nombre para poder identificarlo correctamente. Utilizaremos x:Name="nombre" para esta asignación. Lo realizamos en el XAML:

Botones:
<!-- Botones: Números -->
        <button grid.column="0" grid.row="2" x:name="btn7">7</button>
        <button grid.column="1" grid.row="2" x:name="btn8">8</button>
        <button grid.column="2" grid.row="2" x:name="btn9">9</button>
        <button grid.column="0" grid.row="3" x:name="btn4">4</button>
        <button grid.column="1" grid.row="3" x:name="btn5">5</button>
        <button grid.column="2" grid.row="3" x:name="btn6">6</button>
        <button grid.column="0" grid.row="4" x:name="btn1">1</button>
        <button grid.column="1" grid.row="4" x:name="btn2">2</button>
        <button grid.column="2" grid.row="4" x:name="btn3">3</button>
        <button grid.column="1" grid.row="5" x:name="btn0">0</button>

        <!-- Botones: Operadores -->
        <button grid.column="3" grid.row="1" x:name="btnSumar">+</button>
        <button grid.column="3" grid.row="2" x:name="btnRestar">-</button>
        <button grid.column="3" grid.row="3" x:name="btnMultiplicar">*</button>
        <button grid.column="3" grid.row="4" x:name="btnDividir">/</button>
        <button grid.column="3" grid.row="5" x:name="btnResultado">=</button>

        <!-- Botones: Limpiadores -->
        <button grid.column="0" grid.row="1" x:name="btnCE">CE</button>
        <button grid.column="1" grid.row="1" x:name="btnC">C</button>
        <button content="&lt;=" grid.column="2" grid.row="1" x:name="btnRetroceder"></button>
        
        <!-- Boton: Positivo y Negativo -->
        <button content="+-" grid.column="0" grid.row="5" x:name="btnPositivoNegativo"></button>

TextBox:
  <!-- TextBox -->
        <TextBox x:Name="txtResultado" IsReadOnly="True" TextAlignment="Right" VerticalContentAlignment="Bottom" FontSize="40" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4">0</TextBox>

Ahora comenzaremos con la programación en C#


2.- Comenzamos a programar. Vamos a dar clic en el botón 1, En el panel de Propiedades seleccionamos el control de eventos y damos doble clic en "Clic".


3.- Creamos tres variables (para almacenar los números y la operación)

4.- En la opción Clic del botón 1 insertamos:
 private void btn1_Click(object sender, RoutedEventArgs e)
        {       
            if (operacion == "")
             {
                numero1 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
             }
            else
             {
                numero2 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
             }
       }

5.- Repetimos este proceso por cada botón numérico, hasta el momento tendríamos:
namespace Calculadora
{
    /// 
    /// Lógica de interacción para MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {

        long numero1 = 0;
        long numero2 = 0;
        string operacion = "";

        public MainWindow()
        {
            InitializeComponent();
        }


        private void btn1_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
            }

        }

        private void btn2_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 2;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 2;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn3_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 3;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 3;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn4_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 4;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 4;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn5_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 5;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 5;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn6_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 6;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 6;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn7_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 7;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 7;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn8_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 8;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 8;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn9_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 9;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 9;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn0_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 0;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 0;
                txtResultado.Text = numero1.ToString();
            }
        }
    }
}

6.- Botones de operación:
private void btnSumar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "+";
            txtResultado.Text = "0";
        }

        private void btnRestar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "-";
            txtResultado.Text = "0";
        }

        private void btnMultiplicar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "*";
            txtResultado.Text = "0";
        }

        private void btnDividir_Click(object sender, RoutedEventArgs e)
        {
            operacion = "/";
            txtResultado.Text = "0";
        }

7.- Botón de resultado:
  private void btnResultado_Click(object sender, RoutedEventArgs e)
        {
            switch(operacion)
            {
                case "+":
                    txtResultado.Text = (numero1 + numero2).ToString();
                    break;
                case "-":
                    txtResultado.Text = (numero1- numero2).ToString();
                    break;
                case "*":
                    txtResultado.Text = (numero1 * numero2).ToString();
                    break;
                case "/":
                    txtResultado.Text = (numero1  / numero2).ToString();
                    break;

            }
            numero1 = 0;
            numero2 = 0;
            operacion = "";
        }

8.- Botón +-:
        private void btnPositivoNegativo_Click(object sender, RoutedEventArgs e)
        {
            txtResultado.Text = (-1 * int.Parse(txtResultado.Text)).ToString();
        }

9.- Botones de limpiar entrada
            //CE: CLEAR ENTRY
            if(operacion=="")
            {
                numero1 = 0;
            }
            else
            {
                numero2 = 0;
            }
            txtResultado.Text = "0";

        }

10.- Código de limpiar:
       
private void btnC_Click(object sender, RoutedEventArgs e)
        {
            //C: CLEAR
            numero1 = 0;
            numero2 = 0;
            operacion = "";
            txtResultado.Text = "0";

        }

11.- Botón de retroceder:
        private void btnRetroceder_Click(object sender, RoutedEventArgs e)
        {
            if(operacion=="")
            {
                numero1 = (numero1 / 10);
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 / 10);
                txtResultado.Text = numero2.ToString();
            }
        }

12.- Código completo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Calculadora
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        long numero1 = 0;
        long numero2 = 0;
        string operacion = "";

        public MainWindow()
        {
            InitializeComponent();
        }


        private void btn1_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 1;
                txtResultado.Text = numero2.ToString();
            }

        }

        private void btn2_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 2;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 2;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn3_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 3;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 3;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn4_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 4;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 4;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn5_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 5;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 5;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn6_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 6;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 6;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn7_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 7;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 7;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn8_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 8;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 8;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn9_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 9;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 9;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn0_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10);
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10);
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btnSumar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "+";
            txtResultado.Text = "0";
        }

        private void btnRestar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "-";
            txtResultado.Text = "0";
        }

        private void btnMultiplicar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "*";
            txtResultado.Text = "0";
        }

        private void btnDividir_Click(object sender, RoutedEventArgs e)
        {
            operacion = "/";
            txtResultado.Text = "0";
        }

        private void btnResultado_Click(object sender, RoutedEventArgs e)
        {
            switch(operacion)
            {
                case "+":
                    txtResultado.Text = (numero1 + numero2).ToString();
                    break;
                case "-":
                    txtResultado.Text = (numero1- numero2).ToString();
                    break;
                case "*":
                    txtResultado.Text = (numero1 * numero2).ToString();
                    break;
                case "/":
                    txtResultado.Text = (numero1  / numero2).ToString();
                    break;

            }
            numero1 = 0;
            numero2 = 0;
            operacion = "";
        }

        private void btnCE_Click(object sender, RoutedEventArgs e)
        {
            //CE: CLEAR ENTRY
            if(operacion=="")
            {
                numero1 = 0;
            }
            else
            {
                numero2 = 0;
            }
            txtResultado.Text = "0";

        }

        private void btnC_Click(object sender, RoutedEventArgs e)
        {
            //C: CLEAR
            numero1 = 0;
            numero2 = 0;
            operacion = "";
            txtResultado.Text = "0";

        }

        private void btnRetroceder_Click(object sender, RoutedEventArgs e)
        {
            if(operacion=="")
            {
                numero1 = (numero1 / 10);
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 / 10);
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btnPositivoNegativo_Click(object sender, RoutedEventArgs e)
        {
            txtResultado.Text = (-1 * int.Parse(txtResultado.Text)).ToString();
            // txtResultado.Text = Math.Abs(int.Parse(txtResultado.Text)).ToString();
        }
    }
}

Ahora solo queda mejorar el código y algunas funciones.

Saludos