13 noviembre 2024

Citando APA en Word

En esta entrada de mi blog voy a describir algo que me hubiera sido muy valioso cuando estaba estudiante, pero ahora Word lo incluye como una función que te puede ahorrar mucho trabajo al citar textos desde un documento.

Citar fuentes es fundamental en cualquier trabajo académico, ya que da crédito a los autores originales y permite a otros verificar y consultar las fuentes que sustentan lo que estás escribiendo. ¿Imagínate que te quemaste las pestañas investigando y generando un trabajo muy bien hecho para que otro llegue y solo le dé Copy-Paste y lo entregue como si él lo hubiera hecho? Eso se llama plagio y en ambientes académicos es un crimen que puede acabar con tu carrera. Al citar correctamente, evitamos el plagio y mostramos respeto por el esfuerzo intelectual de otros. Hay muchos formatos para citar, pero el más usado (o por lo menos el que más he visto) es el APA. Éste u otro sistema de cita da claridad y uniformidad a los trabajos académicos, lo cual es importantísimo.

Hay muchas páginas que te pueden generar citas y bibliografía en formato APA, pero aquí te voy a mostrar cómo hacerlo en Word. Me parece que está más fácil tener todo integrado en un solo lugar en lugar de andar copiando y pegando entre la página y mi documento. Además, Word no solo te da el formato a lo que citas sino que maneja las referencias, lo cual te facilita la vida al añadir, gestionar y dar formato a las citas, evitando errores y ahorrando tiempo. Con esta herramienta, podrás centrarte en el contenido y no en lo latoso que es recordar las reglas de cómo citar correctamente.

Aquí te dejo un paso a paso para usar el manejador de referencias en Word para citar en formato APA.

Configura el estilo de cita:

  • Abre tu documento de Word.
  • Ve a la pestaña Referencias.
  • En el grupo de "Citas y Bibliografía", selecciona Estilo y elige APA en el menú desplegable.


Añadir una Cita:

  • Coloca el cursor en el lugar del documento donde deseas insertar la cita.
  • En la pestaña Referencias, selecciona Insertar Cita > Agregar nueva fuente….
  • Aparecerá una ventana de "Crear fuente", donde deberás ingresar la información de la fuente, como el autor, título, año de publicación, etc. Recuerda de elegir el tipo de publicación del que se trata antes de llenar la información porque el formato cambia si es libro, sección de un libro, artículo, etc. Si no te sabes todos los datos (que deberías), llena los que sepas.
  • Después de completar los campos, haz clic en Aceptar. Word insertará la cita en el lugar indicado.



Gestionar Fuentes:
  • Si necesitas modificar o revisar alguna de las fuentes, selecciona Administrador de fuentes en la pestaña Referencias.
  • Aquí puedes editar, eliminar o agregar nuevas fuentes a tu lista.

Citar de Nuevo la Misma Fuente:

  • Para citar una fuente que ya has usado, coloca el cursor donde deseas insertar la cita.
  • Selecciona Insertar Cita y elige la fuente correspondiente de la lista.

Crear la Bibliografía:

  • Una vez que hayas insertado todas las citas, es hora de agregar la bibliografía.
  • Coloca el cursor al final del documento o en la página donde deseas crear la bibliografía.
  • En la pestaña Referencias, selecciona Bibliografía y elige el estilo "Bibliografía" o "Referencias".
  • Word generará automáticamente una lista de todas las fuentes que has citado, en formato APA.

Espero que este material te pueda ayudar en tus estudios presentes y futuros. ¡Saludos!

* Imagen de APA tomado de la página de firmacjar

11 noviembre 2024

La Guía (más o menos) Completa del SELECT


Hace mucho tiempo escribí sobre cómo usar la instrucción SELECT de SQL. Como son muchos mensajes, aquí pongo un índice para que te sea más sencillo aprender muchas de las variantes que tiene el SELECT. Si estás aprendiendo a usar esta instrucción, te sugiero que los veas en orden (al cabo que cada uno es muy corto). ¡Ojalá te sea de utilidad!

21 febrero 2024

Python: diccionarios

En este post voy a explicar cómo usar diccionarios en Python. El diccionario es un Hash Table (algo que expliqué aquí de cómo usarlo en Java). Como he hecho en las últimas explicaciones que he hecho de Python, aquí les dejo el video que explica todo y después va el código que aparece en el video.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
# Primer ejemplo de uso de diccionarios
# Un diccionario es como una lista, solo que en lugar de tener 
# un índice numérico, puede ser de casi cualquier tipo
# De forma más técnica, se trata de una tabla de Hash (Hash Table)

# Creo un diccionario para traducir números de español a inglés
espanolAIngles = dict()     # Crea un diccionario vacío

# Agrego unos cuantos elementos al diccionario:
# (no se pueden repetir los índices)
espanolAIngles["uno"] = "one"
espanolAIngles["dos"] = "two"
espanolAIngles["tres"] = "three"
espanolAIngles["cuatro"] = "four"
espanolAIngles["cinco"] = "five"

# Muestro lo que tiene el diccionario hasta ahorita
print("Contenido del diccionario\n",espanolAIngles)

# Con el mismo formato de salida, puedo inicializar el diccionario
estados = {"jal":"Jalisco","mich":"Michoacán","cdmx":"Ciudad de México","ver":"Veracruz","coah":"Coahuila"}
estados["son"] = "Sonora"
print("Diccionario de estados:")
print(estados)

# El índice me permite buscar un valor
print("El estado jal es",estados["jal"])

# len me da el número de valores en la lista (clave y valor)
print("La cantidad de estados almacenados es de",len(estados))

# El in nos permite ver si algo está en un diccionario
if "mich" in estados:
    print(estados["mich"],"está en la lista de estados")
else:
    print("Michoacán no está en la lista")
if "chih" not in estados:
    print("Chihuahua no está en la lista")
else:
    print(estados["chih"],"está en la lista")

# Para buscar un valor en la lista, sin conocer la llave (índice), uso values
# Aquí creo una lista con los valores
if "Veracruz" in list(estados.values()):
    print("Veracruz está en la lista")

1 2 3 4 5 6 7 8 9 10 11 12 13
# Ejemplo del uso de diccionario para contar la cantidad
# de cada letra en un texto
# En estadística diríamos que estamos creando un histograma

palabra = input("Escribe un texto:")    # Pido un texto
dicc = dict()                           # Creo un diccionario vacío
for c in palabra:                       # Hago un ciclo yendo letra por letra de la palabra dada
    if c not in dicc:                   # Si la letra no está en el diccionario...
        dicc[c] = 1                     # ...lo agrego con un valor de 1
    else:                               # Si ya está...
        dicc[c] = dicc[c] + 1           # ...le sumo 1

print("Conteo de palabras:",dicc)       # Muestro el diccionario

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# Aquí muestro cómo usar ciclos con un diccionario

# Creo el diccionario con 6 elementos
edades = {"tony":51,"cesar":16,"diego":17,"francisco":18,"erika":15,"mariana":16}

print("Gente menores a 30:")
# uso el for para recorrer la lista y mostrarla al usuario
for llave in edades:
    if edades[llave] < 30:              # Con esto solo muestro los elementos cuya edad es menor a 30
        print(llave,edades[llave])

print("\nMostrando todo en orden:")
# Si quiero mostrar en orden, creo una lista de las llaves en el diccionario
# con el método keys
listaLlaves = list(edades.keys())
# Luego ordeno esta lista
listaLlaves.sort()
# Luego muestro el diccionario en orden
for llave in listaLlaves:
    print(llave,edades[llave])

Espero que te haya sido de utilidad. ¡Saludos!

P.D. La imagen que usé la tomé de aquí.

18 febrero 2024

Python: funciones

Hace tiempo expliqué cómo usar funciones en C y en Visual Basic 6. No voy a ahondar en qué son las funciones ni para que sirven. Más bien, voy a mostrar como usarlas y definirlas en Python.

La explicación la puedes encontrar en el siguiente video y después pongo el código que expliqué en el video.

PRÓXIMAMENTE ESTARÁ AQUÍ EL VIDEO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# Se pueden importar librerías para algunas funciones adicionales
# math tiene funciones matemáticas
import math 

# Prueba con funciones que son predeterminadas en Python
# max devuelve el valor máximo de una lista (incluyendo cadenas)
print("Letra más grande: ",max("Buenos días"))
# min devuelve el valor más pequeño
print("Valor menor: ", min([1,6,8,-1,1000,0]))
# len devuelve la longitud de una lista
print("La cadena tiene ",len("Texto de prueba")," letras")
print("Hay ",len([5,9,1,4,2,3,6]), " elementos en la lista")
# Pido un ángulo en grados, convierto a radianes y devuelvo el seno
grados = input("Escribe los grados de un ángulo: ")
radianes = float(grados) * math.pi / 180       # math.pi devuelve el valor de PI
seno = math.sin(radianes)
print("Seno de ", grados, "°  = ", seno)
num = float(input("Escribe un numero: "))
raiz = math.sqrt(num)
print("La raíz cuadrada de", num, " = ", raiz)

1 2 3 4 5 6 7 8 9 10 11 12
# Genero números al azar
# Este import me deja usar el objeto random
import random

print('10 números al azar entre 5 y 30...')
i = 0
while i < 10:
    # random.randint de devuelve un número al azar entre...
    # ...los números que le diga, en este caso, entre 5 y 30.
    print(random.randint(5,30))
    i = i + 1
input('Fin del programa, presione ENTER para salir')

1 2 3 4 5 6 7 8 9 10 11 12
# Ejemplo donde creo mis propias funciones
# def sirve para definir una función
# dentro de los paréntesis pueden ir (o no) parámetros
# Éste no empeza a ejecutarse porque es una definición
def muestraPoema():
    print("EL FUTURO\n\tJulio Cortázar\n\nY sé muy bien que no estarás.\nNo estarás en la calle")
    print("en el murmullo que brota de la noche\nde los postes de alumbrado,")
    print("ni en el gesto de elegir el menú,\nni en la sonrisa que alivia los completos en los subtes")
    print("ni en los libros prestados,\nni en el hasta mañana.")

# Aquí empieza el flujo de la ejecución del programa
muestraPoema()      # Aquí llamo a la función

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Ejemplo #2 de funciones
# Las funciones pueden llevar parámetros
def suma(a,b):
    return a + b    # return es la instrucción que devuelve un valor

# Puedo definir valores default para uno o más parámetros
def multiplica(a,b=2):
    return a * b

num1 = float(input("Escribe un número: "))
num2 = float(input("Escribe otro número: "))
# Llamo a la función suma con dos parámetros
print("La suma de",num1,"y",num2,"es",suma(num1,num2))
# Uso la multiplicación con los dos números
print("La multiplicación de",num1,"y",num2," es igual a",multiplica(num1,num2))
# Ahora uso el valor default del 2do parámetro de multiplica
print("La multiplicación de",num1,"y 2 es",multiplica(num1))

16 febrero 2024

Python: ciclos o iteraciones

En todo lenguaje de programación es necesario permitir que las cosas se repitan y Python no es la excepción. Básicamente tenemos dos ciclos: el while que es igual al de otros lenguajes de programación y el for que nos permite recorrer listas.

En el siguiente video les explico cómo funciona con unos ejemplos y después del video viene el código fuente que usé.

Y aquí está el código fuente de los ejemplos que aparecen en el video:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# Ejemplo de ciclos: tabla de multiplicar

try:
    # Pido el número del que quiero la tabla
    num = int(input('Escribe el número del que quiere la tabla: '))
    i = 0
    while i < 11:
        res = i * num
        print(i, ' x ',num,' = ',res)
        i = i + 1
except:
    print('Debe escribir un número')

# Espero a que esciba algo para terminar el programa (y cerrar la ventana)
input('Pulse ENTER para terminar')

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
# Ejemplo de ciclos y condiciones
# Programa que calcula la suma y promedio de todos los números escritos, 
# menos los 9. Y tiene que escribir 99 para salir

print('Cálculo de suma y promedio de números. Se ignora el 9')
# Inicializo la suma y la cantidad de números en 0
suma = 0
cantNums = 0
try:
    # Ciclo infinito
    while True:
        # Pido número y lo convierto a float
        num = float(input('Escribe un número, 99 para salir: '))
        print('num = ', num)
        # Si es 9, lo ignoro (termina el ciclo y lo vuelvo a ejecutar)
        if num == 9:
            print('num es 9')
            continue
        # Si es 99, sale del ciclo
        if num == 99:
            print('num es 99')
            break
        # Si es cualquier otro número, lo sumo e incremento la cantidad de nums
        suma = suma + num
        cantNums = cantNums + 1
    # Muestro la suma, calculo el promedio y también lo muestro
    print('Suma = ', suma)
    prom = suma / cantNums
    print('Promedio = ',prom)
except:
    print('Escriba un número')
# Esto es para que no se cierre la ventana
input('Presione ENTER para finalizar')

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# Ejemplo del uso del ciclo for para recorrer listas

# Aquí declaro una lista llamado amigos. Esto lo profundizamos más adelante
amigos = ["Tony","Ruth","Panchito","Alex","Marce","Yadira","Miguel","Chava","Monse","Karina"]
# El ciclo for va a recorrer la lista. x es una variable que va a tomar cada elemento 
# en turno de la lista en la variable amigos, iniciando en el primero y terminando en el ùltimo
for x in amigos:
    print("Bienvenido, ", x)
print("Gracias a todos por venir\n")

# Cálculo del mayor, menor y suma de una lista de números
mayor = None        # None es para decir que la variable está vacía
menor = None
suma = 0
for x in [1,100,10,500,1232,-85,2,4,8,16,32,64,128,256,512,1024]:
    if mayor is None or x > mayor:
        mayor = x
    if menor is None or x < menor:
        menor = x
    suma = suma + x
print("Resultados:")
print("Mayor = ", mayor, "\nMenor = ", menor)
print("Suma = ", suma)

Espero que les sea de utilidad esta explicación ¡Saludos!

P.D. Imagen tomada del éste sitio.

14 febrero 2024

Python: condiciones

En cualquier lenguaje de programación, es necesario que el programa sea capaz de tomar decisiones. Ya he escrito cómo usarlas en C y son casi iguales en C++, Java y C#, entre otros. Pero en éste video te voy a mostrar cómo usarlas en Python.

En éste video te explico, con varios ejemplos, cómo se pueden usar condiciones en este lenguaje. Nota de aclaración: no existe un equivalente a la instrucción switch que tenemos en otros lenguajes. Dicho esto, aquí está el video.

Y aquí pongo el código de los ejemplos que se mostraron en el video:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# Ejemplo de condiciones y excepciones
# Calcula el IMC y da un diagnóstico
# Pido los datos al usuario
temp = input('Escriba su peso en kilogramos: ')    # Pido dato (devuelve texto)
# El try va a tratar de ejecutar las instrucciones en su interior
# Si hay un error, en lugar de tronar el programa, va a ejecutar lo que
# está en la parte except. Si no hay problema, ignora esa parte
try:
    peso = float(temp)      # Convierto el dato a float (número con punto decimal)
    temp = input('Escriba su altura en metros: ')
    altura = float(temp)
    imc = peso / altura**2    # Calculo el índice de masa corporal
    print('El indice de masa corporal es')
    print(imc)

    # Realizo diagnóstico del peso
    if imc < 18.5:
        print('Bajo peso')
    elif imc < 25:
        print('Peso normal')
    elif imc < 30:
        print('Sobrepeso')
    else:
        print('Obesidad')
except:
    print('Escribió mal un valor: solo se admiten números')

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 03Camion.py - Ejemplo de condicionales
try :
    temp = input('Edad: ')      # Pido la edad al usuario
    edad = int(temp)            # Convierto la edad a un número entero
    # No paga si es bebé o anciano
    if edad < 2 or edad >= 60 :
        precio = 0
    else :
        est = input('¿Estudiante (S/N)?')
        vale = input('¿Trae vale (S/N)?')
        if (est == 'S' or est == 's') and (vale == 's' or vale == 'S') :
            precio = 6.5
        else :
            precio = 9
    print('Precio')
    print(precio)
except :
    print('Escribió un valor inválido')

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# Pruebas con condiciones
texto1 = input("Escribe un texto: ")
texto2 = input("Escribe otro texto: ")
if texto1 is texto2:
    print(texto1, " is ", texto2)
if texto1 == texto2:
    print(texto1, " == ", texto2)
if texto1 != texto2:
    print(texto1, " != ", texto2)
if texto1 is not texto2:
    print(texto1, " is not ", texto2)

num1 = 10
num2 = 30
if num1 is num2:
    print(num1," is ",num2)
if num1 == num2:
    print(num1," == ",num2)
if num1 is not num2:
    print(num1," is not ",num2)
if num1 != num2:
    print(num1," != ",num2)

# Operador ternario (condicional en otros lenguajes)
mayor = num1 if num1>=num2 else num2
print("El mayor es ",mayor)

Espero que esto les haya servido. En la siguiente ocasión, hablaremos de funciones. ¡Hasta la próxima!

Imagen tomada del Blog de UTel.

13 febrero 2024

Python: instalación y conceptos básicos

Hace tiempo quise empezar a escribir sobre cómo programar con Python. Hice un post de cómo instalarlo (lo cual me arrepiento porque en ese post usaba el intérprete de Python y un editor de texto llamado Brackets. Pero después empecé a usar Visual Studio Code que es mucho mejor, desde mi punto de vista).

También escribí cómo generar números aleatorios, pero en lugar de brincar de tema en tema, quiero empezar desde cero (aunque rapidito) y con este post empiezo.

Así que hice este video donde les indico cómo instalar Python con Visual Studio Code y muestro un programa de ejemplo que usa variables, operadores, instrucciones de entrada (input) y de salida (print). Abajo del video pongo el código de este  ejemplo.

Para instalar Python, éstas son las ligas que aparecen en el video: sitio para descargar el intérprete de Python y la descarga de Visual Studio Code.

Aquí está el video:


Y éste es el código del ejemplo:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# Primer ejemplo en Python

num1 = input('Escribe el numero de la base: ')                  # Pido un número (base)
num2 = input('Escribe la potencia a la que se vaa elevar: ')    # Pido número (la potencia
pot = int(num1) ** int(num2)                                    # Calculo la potencia
print('El resultado es ')                                       # Imprimo el resultado
print(pot)

# Uso de operadores aritméticos (aparte del exponente que está arriba)
a = 3
b = 5
print('Suma = ', a+b)
print('Resta = ', a-b, "\nMultiplicación = ", a*b, '\nDivisión = ', a/b)
print('Módulo o resíduo = ', a%b)

# Operadores con cadenas
texto1 = 'Hola '
texto2 = texto1 + 'amigo'               # La suma con texto hace una concatenación de los mismos
print('Suma de textos = ', texto2)
texto3 = texto1 * 3                     # La multiplicación con texto hace una cadena con el texto repetido
print('Texto multiplicado = ', texto3)
Í

Espero que les haya sido de utilidad. Espero pronto poner la siguiente parte, donde hablaré de condiciones. ¡Hasta la próxima!

27 noviembre 2023

La encriptadera en C#

Los datos son importantes y, como programadores, es nuestro deber mantenerlos seguros. En este post en mi blog voy a explicar cómo usar algunos métodos de la librería System.Security.Cryptography para encriptar y desencriptar datos de texto.

Hice un programa que lo ejemplifica (pongo todo le código al final), pero como dijo Jack el Destripador, vámonos por partes.

Al principio debo importar la librería System.Security.Cryptography para que todo esto funcione. Por eso al principio del programa lo incluyo con el using:

using System.Security.Cryptography;

Pero esto no basta para que funcione. Para que tu programa pueda hacer uso de las clases y objetos de esta librería, se tiene que incluir al proyecto una referencia al framework que contiene lo de seguridad. En su proyecto, hagan clic derecho en la ventana de su solución donde dice referencias, como se ve en esta imagen:


Del menú contextual que aparece, seleccionen Agregar referencia... y aparece una ventana con todas las referencias, que por default están apareciendo las referencias de NET Framework. Allí pon una tache en la que dice System.Security como se ve en la siguiente imagen:


El método encriptar toma una cadena (textoNormal) y un arreglo de bytes opcional (entropia) para agregar aleatoriedad al proceso de encriptación. Convierte el texto a bytes y utiliza el método ProtectedData.Protect para encriptar los datos. El resultado es un arreglo de bytes que representa el texto encriptado. Éste es el código simplificado:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/// <summary>
/// Función que encripta un texto
/// </summary>
/// <param name="textoNormal">cadena que se desea encriptar</param>
/// <param name="entropia">arreglo de bytes que añaden aleatoriedad a la función</param>
/// <returns></returns>
public static byte[] encriptar(string textoNormal, byte[] entropia = null)
{
    // Creo arreglo de bytes del texto normal
    byte[] bytesNormal = Encoding.UTF8.GetBytes(textoNormal);

    // Devuelvo el texto encriptado
    return ProtectedData.Protect(bytesNormal, entropia, DataProtectionScope.CurrentUser);
}
El método desecriptar toma un arreglo de bytes (bytesEncriptados) y un arreglo de bytes opcional (entropia). Desencripta los datos utilizando el método ProtectedData.Unprotect y convierte los bytes resultantes de nuevo a una cadena utilizando la codificación UTF-8.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
        /// <summary>
        /// Desencripta un arreglo de bytes que han sido encriptados
        /// </summary>
        /// <param name="bytesEncriptados">bytes de datos encriptados</param>
        /// <param name="entropia">arreglo de bytes que añaden aleatoriedad a la función</param>
        /// <returns>cadena con el texto original</returns>
        public static string desencriptar(byte[] bytesEncriptados, byte[] entropia = null)
        {
            // Desencripto el arreglo de bytes y lo almaceno en otro
            byte[] bytesNormales = ProtectedData.Unprotect(bytesEncriptados, entropia, 
                DataProtectionScope.CurrentUser);

            // Devuelvo el arreglo convertido a cadena
            return Encoding.UTF8.GetString(bytesNormales);
        }

Y hacer clic en el botón solo agarra el texto que está en la caja de texto, lo encripte, muestra el arreglo de bytes encriptados en una etiqueta, desencripta el arreglo de bytes y muestra el resultado en otra etiqueta.

Pero antes de mostrar el código, ¿qué hace ProtectedData.Protect? Ésta función permite tomar información y convertirla en una forma que es difícil de entender para cualquier persona que no tenga la clave adecuada para descifrarla.

Al usarlo le proporcionas la información que deseas cifrar (por ejemplo, una contraseña) y, opcionalmente, también puedes proporcionar algo llamado "entropía". La entropía es como agregar un toque adicional de aleatoriedad para hacer que el cifrado sea aún más seguro. Y la función devuelve los datos cifrados, que luego puedes almacenar de forma segura en tu aplicación o base de datos.

Y ProtectedData.Unprotect es una función en C# que hace el proceso inverso de lo que hace ProtectedData.Protect. Es decir, toma datos cifrados (información que ha sido previamente encriptada) y los descifra para devolverlos a su forma original o legible.

Ahora sí, aquí va el código completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.Collections;
using System.Security.Cryptography.Xml;

namespace Encripcion
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        /// <summary>
        /// Función que encripta un texto
        /// </summary>
        /// <param name="textoNormal">cadena que se desea encriptar</param>
        /// <param name="entropia">arreglo de bytes que añaden aleatoriedad a la función</param>
        /// <returns></returns>
        public static byte[] encriptar(string textoNormal, byte[] entropia = null)
        {
            // Creo arreglo de bytes del texto normal
            byte[] bytesNormal = Encoding.UTF8.GetBytes(textoNormal);

            // Devuelvo el texto encriptado
            return ProtectedData.Protect(bytesNormal, entropia, DataProtectionScope.CurrentUser);
        }

        /// <summary>
        /// Desencripta un arreglo de bytes que han sido encriptados
        /// </summary>
        /// <param name="bytesEncriptados">bytes de datos encriptados</param>
        /// <param name="entropia">arreglo de bytes que añaden aleatoriedad a la función</param>
        /// <returns>cadena con el texto original</returns>
        public static string desencriptar(byte[] bytesEncriptados, byte[] entropia = null)
        {
            // Desencripto el arreglo de bytes y lo almaceno en otro
            byte[] bytesNormales = ProtectedData.Unprotect(bytesEncriptados, entropia, 
                DataProtectionScope.CurrentUser);

            // Devuelvo el arreglo convertido a cadena
            return Encoding.UTF8.GetString(bytesNormales);
        }

        private void btnEncriptar_Click(object sender, EventArgs e)
        {
            // Éste es el texto a encriptar
            string textoOriginal = txtTextoOrig.Text;

            // Obtengo el arreglo de bytes encriptados
            byte[] resultadoEncriptado = encriptar(textoOriginal);

            // Muestro los bytes encriptados
            lblEncript.Text = "";
            for (int i=0;i < resultadoEncriptado.Length; i++)
            {
                lblEncript.Text = lblEncript.Text + " " + resultadoEncriptado[i];
            }

            // Desecripto los datos y los pongo en la etiqueta
            lblNormal.Text = desencriptar(resultadoEncriptado);
        }
    }
}

Espero que les haya sido de utilidad. ¡Saludos!

P.D. La imagen de encripción al principio del post fue tomada de este sitio: https://www.pcworld.com/article/540005/what-is-encryption.html

14 noviembre 2023

Archivos CSV en C#

Los archivos de texto siguen siendo de mucha utilidad (como comentaba en mi post anterior sobre archivos txt en C++). Pero son aún más útiles si con CSV (para una explicación completa sobre archivos CSV, haz clic aquí). Y en este post te voy a platicar cómo crearlos en C#.

En resumidas cuentas, un archivo CSV es un archivo de texto que contiene datos los cuales están separados con comas (por eso CSV, comma separated values). Son muy útiles porque se abren de forma nativa en Excel y desde allí puedes hacer mil cosas con los datos).

Para escribir en un archivo de texto, necesitamos objetos de las clases StreamWriter (para escribir al archivo) y StreamReader (para leer datos). 

Para este ejemplo, hice un nuevo proyecto Aplicación de Windows Forms (.NET Framework) e hice la siguiente interfaz:


En esta ventana voy a pedir nombre, edad y semestre en cajas de texto, selecciona un tipo de bachillerato de un combobox. Abajo hay una lista donde voy a poner los alumnos registrados. Los botones tienen las siguientes funciones: agregar el alumno (sus datos están en las cajas de texto y combobox) a la lista. Otro botón va a eliminar todo lo que está en la lista. Otro botón guarda lo que está en la lista al archivo, mientras que otro lee del archivo y pone en la lista los datos tal y como están guardados. Y al final un botón para salir del programa.

Me voy a enfocar en el código que manipula el archivo (escribir datos en él y leer datos de él). Al final pongo el código completo.

Éste es el método que se encarga de guardar todo lo que está en la lista al archivo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/// <summary>
/// Guarda  lo que está en el stringbuilder a un archivo
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGuardar_Click(object sender, EventArgs e)
{
    // Creo el StreamWriter y abro el archivo para escritura
    StreamWriter streamWriter = new StreamWriter("miarchivo.csv");

    // Escribo todo lo del StringBuilder al archivo
    for (int i=0;i<lstAlumnos.Items.Count;i++)
    {
        streamWriter.WriteLine(lstAlumnos.Items[i].ToString());
    }

    // Cierro el archivo
    streamWriter.Close();
}
Aquí estamos abriendo el archivo para escritura en un objeto llamado streamWriter (que es de la clase StreamWriter). El constructor de StreamWriter abre el archivo y se encarga de todo lo necesario. Luego hay un ciclo que va por todos los elementos de la lista, escribiendo línea por línea al archivo. Al final cierras el archivo y todos contentos.

Este es el método para leer línea por línea del archivo y ponerlo en la lista. Éste es el código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/// <summary>
/// Elimina todo de la lista, lee el archivo línea por línea y lo va agregando a la
/// lista.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnLeer_Click(object sender, EventArgs e)
{
    // Elimino todo en la lista
    lstAlumnos.Items.Clear();

    // Abro archivo para lectura
    StreamReader streamReader = new StreamReader("miarchivo.csv");

    // Voy por todos los registros, leyendo una línea y agregándolo a la lista
    // Mientras no llego al final del archivo...
    while (!streamReader.EndOfStream)
    {
        // Leo una línea del archivo
        string linea = streamReader.ReadLine();
        // Agrego esta línea a la lista
        lstAlumnos.Items.Add(linea);
    }

    // Cierro el archivo
    streamReader.Close();
}
Empiezo eliminando todos los elementos de la lista. Luego creo el objeto StreamReader (y al crearlo abre el archivo). Con el archivo abierto, tengo un ciclo que lee línea por línea (EndOfStream me dice si llegué al final del archivo y el ReadLine lee toda una línea y devuelve un string con lo que leí). Y esa cadena lo agrego a la lista. Al terminar el ciclo, cierro el archivo y ya.

Aquí les pongo el código de toda la ventana, esperando que sea de utilidad:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
using System;
using System.IO;
using System.Windows.Forms;

namespace ArchivosCSV
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Pregunta si desea salir y termina la ejecución del programa
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSalir_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Desea salir?","CSV",MessageBoxButtons.YesNo,
                MessageBoxIcon.Question) == DialogResult.Yes)
            {
                Application.Exit();
            }
        }

        /// <summary>
        /// Agrega los datos a un StringBuilder
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            // Creo la cadena con todos los valores separados por comas
            string linea = txtNombre.Text + "," + txtEdad.Text + "," + txtSemestre.Text + ","
                + cboBach.Items[cboBach.SelectedIndex];

            // A la listbox le agrego esa línea
            lstAlumnos.Items.Add(linea);

            // Dejo en blanco todos los campos
            txtEdad.Text = "";
            txtNombre.Text = "";
            txtSemestre.Text = "";
            cboBach.SelectedIndex = 0;
        }

        // Elimina todos los elementos de la lista y del stringbuilder
        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            // Elimino todo lo de la lista
            lstAlumnos.Items.Clear();
        }

        /// <summary>
        /// Selecciona el primer elemento del combobox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            cboBach.SelectedIndex = 0;
        }

        /// <summary>
        /// Guarda  lo que está en el stringbuilder a un archivo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            // Creo el StreamWriter y abro el archivo para escritura
            StreamWriter streamWriter = new StreamWriter("miarchivo.csv");

            // Escribo todo lo del StringBuilder al archivo
            for (int i=0;i<lstAlumnos.Items.Count;i++)
            {
                streamWriter.WriteLine(lstAlumnos.Items[i].ToString());
            }

            // Cierro el archivo
            streamWriter.Close();
        }

        /// <summary>
        /// Elimina todo de la lista, lee el archivo línea por línea y lo va agregando a la
        /// lista.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLeer_Click(object sender, EventArgs e)
        {
            // Elimino todo en la lista
            lstAlumnos.Items.Clear();

            // Abro archivo para lectura
            StreamReader streamReader = new StreamReader("miarchivo.csv");

            // Voy por todos los registros, leyendo una línea y agregándolo a la lista
            // Mientras no llego al final del archivo...
            while (!streamReader.EndOfStream)
            {
                // Leo una línea del archivo
                string linea = streamReader.ReadLine();
                // Agrego esta línea a la lista
                lstAlumnos.Items.Add(linea);
            }

            // Cierro el archivo
            streamReader.Close();
        }
    }
}
Espero que les haya sido de utilidad. ¡Hasta la próxima!

07 noviembre 2023

Archivos de texto en C++

Los archivos de texto son muy usados en estos tiempos, a pesar de que hay sistemas DBMS y mil otras cosas para almacenar datos. Pero, a pesar de todo, siguen siendo muy útiles. Y programar archivos de texto en C++ es muy sencillo y eso te voy a mostrar en este post de mi blog donde quiero mostrarte como abrir, escribir a, leer de y cerrar archivos en este lenguaje.

Abrir un archivo
Antes de poder hacer cualquier otra cosa, hay que abrir el archivo. Para hacerlo, utilizamos la clase fstream. Puedes abrir un archivo para escritura (ofstream), lectura (ifstream), o ambas (fstream). Aquí tienes un ejemplo de cómo abrir un archivo para escritura:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ofstream archivo_salida("mi_archivo.txt");

    if (archivo_salida.is_open()) {
        cout << "El archivo se abrió exitosamente.\n";
        // Realiza operaciones de escritura aquí
        archivo_salida.close(); // Cierra el archivo
    } else {
        cout << "Error al abrir el archivo.\n";
    }
}

Escritura en un archivo de texto
Ya que esté abierto el archivo, se escribe texto en él usando el operador << como se ve en este ejemplo:

1 2 3 4 5 6 7 8
ofstream archivo_salida("mi_archivo.txt");

if (archivo_salida.is_open()) {
    archivo_salida << "Hola, esto es un ejemplo de escritura en un archivo.\n";
    archivo_salida.close(); // No olvides cerrar el archivo
} else {
    cout << "Error al abrir el archivo.\n";
}

Leer del archivo
Para leer desde un archivo, primero abrimos el archivo en modo lectura (ifstream) y luego usamos el operador >> o la función getline para leer los datos. Aquí hay un ejemplo de lectura utilizando getline:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream archivo_entrada("mi_archivo.txt");
    string linea;

    if (archivo_entrada.is_open()) {
        while (getline(archivo_entrada, linea)) {
            cout << linea << endl;
        }

        archivo_entrada.close(); // Cierra el archivo después de leer
    } else {
        cout << "Error al abrir el archivo.\n";
    }

    return 0;
}

Cerrar el archivo
Es importante recordar cerrar el archivo una vez que hayamos terminado de trabajar con él. Esto garantiza que todos los datos se escriban o lean correctamente y que el archivo quede en un estado consistente.

Ejemplo completo
Aquí está un ejemplo que muestra cómo abrir un archivo, escribir en él y luego leer su contenido:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    // Apertura del archivo para escritura
    ofstream archivo_salida("mi_archivo.txt");

    if (archivo_salida.is_open()) {
        archivo_salida << "Hola, esto es un ejemplo de escritura en un archivo." << endl;
        archivo_salida.close();
    } else {
        cout << "Error al abrir el archivo para escritura.\n";
        return 1; // Salir del programa con código de error
    }

    // Apertura del archivo para lectura
    ifstream archivo_entrada("mi_archivo.txt");
    string linea;

    if (archivo_entrada.is_open()) {
        while (getline(archivo_entrada, linea)) {
            cout << linea << endl;
        }

        archivo_entrada.close();
    } else {
        cout << "Error al abrir el archivo para lectura.\n";
        return 1; // Salir del programa con código de error
    }

    return 0; // El programa termina con éxito
}

Espero que todo esto te sea útil. ¡Hasta la próxima!


24 octubre 2023

Generando números al azar en Python

Por lo menos en la programación, dejamos algunas cosas al azar. Es muy importante generar números al azar para diferentes tipos de aplicaciones, desde juegos, simulaciones y análisis de datos hasta ciberseguridad y mil aplicaciones más.

Para facilitarnos la vida, Python tiene un módulo, llamado random, que nos ayuda a generarlos. En este post te voy a mostrar cómo usarlo.

Antes de empezar...

Antes de poder empezar a generar números aleatorios, debes importar el módulo random. Puedes hacerlo con una simple declaración import al principio de tu programa:

import random

Con esto tu programa ya tiene acceso a varias funciones y clases para generar datos aleatorios, algunos de los cuales vamos a hablar más adelante.

Generando números enteros aleatorios

El módulo random proporciona la función randint(a, b) para generar un número entero aleatorio entre a y b, incluyendo ambos valores. Así es cómo puedes utilizarlo:

1 2 3 4
import random

entero_aleatorio = random.randint(1, 10)
print("Entero Aleatorio:", entero_aleatorio)

En este ejemplo, random.randint(1, 10) genera un número entero aleatorio entre 1 y 10, y el resultado se almacena en la variable entero_aleatorio. Puedes ajustar el rango para adaptarlo a tus necesidades específicas.

Generando números con decimales

No es tan común, pero a veces necesitas generar números que tengan decimales de forma aleatoria. Para esto puedes utilizar la función random.uniform(a, b). Genera un número de punto flotante aleatorio entre a y b. Aquí tienes un ejemplo:

1 2 3 4
import random

flotante_aleatorio = random.uniform(0.0, 1.0)
print("Número de Punto Flotante Aleatorio:", flotante_aleatorio)
Para terminar, les muestro el ejemplo de un programa que genera 10 números aleatorios enteros entre 5 y 30:
 
1 2 3 4 5 6 7 8 9 10 11 12
# Genero números al azar
# Este import me deja usar el objeto random
import random

print('10 números al azar entre 5 y 30...')
i = 0
while i < 10:
    # random.randint de devuelve un número al azar entre...
    # ...los números que le diga, en este caso, entre 5 y 30.
    print(random.randint(5,30))
    i = i + 1
input('Fin del programa, presione ENTER para salir');
random tiene muchas otras funciones en los que no me voy a meter pero que estos son los principales o más usuales. Espero que les haya sido de utilidad. ¡Hasta la próxima!

09 octubre 2023

Revolviendo vectores

El otro día estaba tratando de hacer un programa que te permite jugar 21 (Blackjack), aunque no fuera de forma "completa", más bien como un ejercicio del uso de vectores, clases y objetos en C++.

Uno de los problemas era revolver una baraja. Como ya he hablado de cómo generar números aleatorios en C++, pensé una forma de generar números al azar e irlos cambiando con los que están, pero supuse que debía haber una mejor manera, algo más sencillo. Y sabía que en Java había forma de trabajar con ArrayLists, así que me puse a buscar cómo se puede hacer en C++. Y sí, hay una función que me puede "mezclar" al azar (o pseudoazar, como hemos dicho cuando hablé de números aleatorios), e incluso escribí brevemente sobre cómo usarlo, pero aquí te explico cómo usarlo con un ejemplo más completo.

El método en cuestión es el random_shuffle y para poderlo usar, tienes que incluir la librería <algorithm>. Y necesita el uso de números aleatorios (si no sabes cómo funcionan, lee primero este post de mi blog), así que incluimos la librería <cstdlib> para usar el srand y el rand, y la librería <ctime> para obtener la hora del sistema para inicializar el generador de números pseudoaleatorios. Así que la pura parte de la declaración, quedaría así:

1 2 3 4 5
#include <iostream>			// cout, cin
#include <vector>			// vector
#include <algorithm>		// random_shuffle
#include <ctime>			// Para usar time() - inicializar números aleatorios
#include <cstdlib>			// srand, rand
Después de esto, en el main() antes en hacer cualquier otra cosa, inicializo el generador de números aleatorios con el reloj del sistema, como se ve aquí:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
Esto va al principio del main():

    srand(time(NULL));
	baraja.Barajear();

En la clase Baraja viene estos métodos:

// Genera números aleatorios (para uso con random_shuffle)
int myrandom (int i) { return rand()%i;}

// Barajear: barajea toda la baraja
void Baraja::Barajear() {
	random_shuffle(cartas.begin(),cartas.end(),myrandom);
}
Aquí viene una parte que va en el main() y también estoy mostrando el método de la clase Baraja (al rato pongo todo el código) que barajea (revuelve) los elementos del vector. También agrego una función, llamado myrandom, que no pertenece a ninguna clase, que genera los números aleatorios para ser usados en el método random_shuffle.

Aquí pongo el código completo. El archivo tiene una clase Carta que guarda el palo (corazones, trébol, etc.), el valor o rango (As, 2, 3, etc) y si está visible o no. Tiene un constructor que recibe dos cadenas (palo y rango) y métodos para voltear una carta, devolver los datos de una carta, saber si está visible o no y para devolver el valor (rango).

Luego tiene una clase Baraja que tiene un vector de objetos Carta, un constructor que inicializa el vector con todas las cartas de una baraja inglesa (para eso hay un par de arreglos para ayudar a inicializar) y métodos que te devuelve una carta (y lo quita del vector), para barajear la carta (lo que mostré en el código anterior), para imprimir todas las cartas en la baraja, y una que nos indica si la baraja está vacía o no.

También hay una clase Jugador que tiene las manos de cada jugador: guarda un vector de tipo Carta y una cadena con el nombre del jugador. No tiene constructor y tiene métodos para Agregar una carta al vector del jugador, devolver el número de cartas que tiene, mostrar sus cartas, asignar un nombre al jugador y para mostrar el nombre del jugador.

El main() declara una Baraja y un vector de Jugador, inicializa la baraja (con un código que mostré con anterioridad), pide número de jugadores, pide las cartas para cada jugador, revisa si alguien ganó justo después de repartir las cartas (poco probable, pero hay que revisar) e inicia un ciclo donde muestra cartas del jugador y le pregunta si desea otra carta, revisa si perdió o si ganó. Si nadie ha ganado, al final determina el ganador (el que más cera esté de sumar 21).

Con esa explicación, ahora sí les dejo el código completo del programa, esperando que les sea de utilidad. ¡Saludos!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
/* ****
 * Juego de 21
 * ****/

#include <iostream>			// cout, cin
#include <vector>			// vector
#include <string>			// uso strings
#include <algorithm>		// random_shuffle
#include <ctime>			// Para usar time() - inicializar números aleatorios
#include <cstdlib>			// srand, rand

using namespace std;

/* ***
 * CLASE Carta 
 * *** */
class Carta {
	// Campos privados
	string palo,rango;
	bool visible;
	
	// Constructor
	public:
	    Carta(string,string);
	
	// Métodos
		void Voltear() {
			visible = !visible;
		}
		string Imprimir();
	    bool Visible() {
	    	return visible;
		}
		string Rango() {
			return rango;
		}
};

// Constructor
Carta::Carta(string palo,string rango) {
	this->palo = palo;
	this->rango = rango;
	visible = false;
}

// Imprimir
string Carta::Imprimir() {
	string x;
	x.append(rango).append(" de ").append(palo);
	return x;
}

/* ***
 * CLASE Baraja
 * ***/
class Baraja {
	// Campos
	private:
		vector <Carta> cartas;
	
	// Constructor
	public:
		Baraja();
		
	// Métodos
		Carta TomaCarta();
		void Barajear();
		void Imprimir();
		//void Partir(int);
		bool Vacia() {
			return cartas.empty();
		}
};

// Declaro arreglos útiles para inicializar
string rangos[] = {"As","2","3","4","5","6","7","8","9","10","Joto","Reina","Rey"};
string palos[] = {"Corazones","Diamantes","Treboles","Picas"};

// Constructor: llena la baraja con 52 cartas
Baraja::Baraja() {
	int i,j;
	
	for (i=0;i<4;i++) {
		for (j=0;j<13;j++) {
			Carta temp(palos[i],rangos[j]);
			cartas.push_back(temp);
		}
	}
}

// Imprimir: Imprime todas las cartas de la baraja
void Baraja::Imprimir() {
	int i;
	
	for (i=0;i<cartas.size();i++) {
		cout << cartas[i].Imprimir() << endl;
	}
}

// Genera números aleatorios (para uso con random_shuffle)
int myrandom (int i) { return rand()%i;}

// Barajear: barajea toda la baraja
void Baraja::Barajear() {
	random_shuffle(cartas.begin(),cartas.end(),myrandom);
}

// TomaCarta: Devuelve la última carta de la baraja
Carta Baraja::TomaCarta() {
	Carta x = cartas[cartas.size()-1];  		// x = la última carta
	cartas.pop_back();							// Elimino la última carta de la baraja
	return x;									// Devuelvo x
}

/* ***
 * CLASE: Jugador
 * ***/
class Jugador {
	// Campos
	private:
		vector<Carta> cartas;
		string nombre;
	
	// Métodos
	public:
		void AgregarCarta(Carta);
		// Devuelve el número de cartas que tengo en las manos
		int NumCartas() {
			return cartas.size();
		}
		int SumaCartas();
		string MuestraCartas();
		void AsignaNombre(string nombre) {
			this->nombre = nombre;
		}
		string MuestraNombre() {
			return nombre;
		}
};

// Agrega una carta a las que tengo en mis manos
void Jugador::AgregarCarta(Carta c) {
	cartas.push_back(c);
}

// Devuelve la suma de las cartas
int Jugador::SumaCartas() {
	int i,suma=0,temp;
	string r;
	
	for(i=0;i<cartas.size();i++) {
		r = cartas[i].Rango();
		if (r.compare("As")==0) {
			suma += 11;
		} else if (r.compare("Joto")==0 || r.compare("Reina")==0 || r.compare("Rey")==0) {
			suma += 10;
		} else {
			temp = stoi(r);		// Obtiene el entero que hay en la cadena del rango
			suma += temp;
		}
	}
	
	// Si me pasé de 21, veo si hubo As. Si hay, le resto 10
	if (suma > 21) {
		for(i=0;i<cartas.size();i++) {
			if (cartas[i].Rango().compare("As")==0) {
				suma -= 10;
			}
		}
	}
	
	return suma;
}

// Devuelve una cadena con las cartas del jugador
string Jugador::MuestraCartas() {
	string temp;
	int i;
	
	for (i=0;i<cartas.size();i++) {
		temp.append(cartas[i].Imprimir()).append("\n");
	}
	return temp;
}

int main() {
	// Declaro variables y objetos
	Baraja baraja;
	int i,j,noJugadores = 0;
	vector <Jugador> jugadores;
	string siono;
	
	// Preparo la baraja
	srand(time(NULL));
	baraja.Barajear();
	
	// Preguntar número de jugadores
	while (noJugadores < 2 || noJugadores > 4) {
		cout << "Numero de jugadores: ";
		cin >> noJugadores;
	}
	getline(cin,siono);
	
	// Pedir cartas
	Jugador x;
	for (i=0;i<noJugadores;i++) {		// Creo un vector de jugadores del tamaño adecuado
		cout << "Nombre: ";
		getline(cin,siono);
		x.AsignaNombre(siono);
		jugadores.push_back(x);
	}
	for (i=0;i<2;i++) {					// Se reparten 2 cartas a cada jugador
		for (j=0;j<noJugadores;j++) {	// Se reparten a todos los jugadores
			jugadores[j].AgregarCarta(baraja.TomaCarta());
		}
	}
	
	// Si alguien tiene 21 (ya ganó desde el inicio)
	for (i=0;i<noJugadores;i++) {
		if (jugadores[i].SumaCartas() == 21) {
			cout << "¡Ganó el jugador " << jugadores[i].MuestraNombre() 
				<< "! Sus cartas fueron:\n" << jugadores[i].MuestraCartas();
			return 1;
		}
	}
	
	// Ciclo de pedir cartas
	for (i=0;i<noJugadores;i++) {
		do {
			// Muestro las cartas del jugador y le pregunto si quiere otra
			cout << jugadores[i].MuestraNombre() << ", tus cartas son:\n";
			cout << jugadores[i].MuestraCartas() << endl;
			cout << "Jugador " << jugadores[i].MuestraNombre() <<
				", ¿Otra carta (S/N)? ";
			getline(cin,siono);
			if (siono[0] == 'S' || siono[0] == 's') {
				jugadores[i].AgregarCarta(baraja.TomaCarta());
				// Si perdió, elimino al jugador y decremento noJugadores
				if (jugadores[i].SumaCartas() > 21) {
					cout << "Jugador " << jugadores[i].MuestraNombre()
						<< " perdió. Sus cartas suman " << 
						jugadores[i].SumaCartas() << "\nY sus cartas son\n"
						<< jugadores[i].MuestraCartas() << endl;
					jugadores.erase(jugadores.begin()+i);
					noJugadores --;
				} else if (jugadores[i].NumCartas() == 5) {	// Si llega a tener 5 cartas y no se pasa, gana
					cout << jugadores[i].MuestraNombre() 
						<< ", ¡ganaste! Tienes 5 cartas y no te pasaste de 21. "
						<< "Tus cartas fueron:\n" << jugadores[i].MuestraCartas() << endl;
					return 1;
				} else if (jugadores[i].SumaCartas() == 21) {	// Si sus cartas suman 21, gana
					cout << jugadores[i].MuestraNombre() 
						<< ", ¡ganaste! Tus cartas suman 21. "
						<< "Tus cartas fueron:\n" << jugadores[i].MuestraCartas() << endl;
					return 1;
				}
			}
		} while (siono[0] != 'N' && siono[0] != 'n');
	}
	
	// Ver quien ganó (de los que quedan)
	j = 0;				// En j guardo el índice de quien ganó
	if (!jugadores.empty()) {
		for (i=1;i<noJugadores;i++) {
			if (jugadores[i].SumaCartas() > jugadores[j].SumaCartas()) {
				j = i;
			}
		}
		cout << "El ganador es " << jugadores[j].MuestraNombre() << 
			" y sus cartas fueron:\n" << jugadores[j].MuestraCartas() << endl;
	} else {
		cout << "Todos perdieron\n";
	}
}

11 septiembre 2023

Ordenando vectores

Hace unos días les mostré como "revolver" el contenido en un vector en C++ (después de haber explicado, hace mucho, como usar vectores y luego iteradores), pero para otro problema tenía que ordenar un vector.

Encontré esta página que lo explica muy bien, y luego lo apliqué a un ejemplo práctico que ordena un vector que tiene datos de diferente tipo. De esta manera pueden ver cómo funciona el método sort con mis propias funciones de comparación.

Te aconsejo de leer el post que explica el sort y aquí te dejo mi código de ejemplo:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
/* ***
 * Ordena.cpp - Ejemplifica como usar el sort en vectores
 * ***/
 
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Prueba {
	public:
		int datoEntero;
		float datoFlotante;
		string datoString;
		Prueba();		//	 Constructor default
		Prueba(int,float,string);	// Constructor sobrecargado
		string MuestraDatos();
};

// Constructor default
Prueba::Prueba() {
	datoEntero = 0;
	datoFlotante = 0.0f;
	datoString = "";
}

// Constructor sobrecargado
Prueba::Prueba(int entero,float numDecimal,string texto) {
	datoEntero = entero;
	datoFlotante = numDecimal;
	datoString = texto;
}

// Devuelve una cadena con los valores en el objeto
// Salida: una cadena con los valores
string Prueba::MuestraDatos(){
	string x = to_string(datoEntero).append(" - ").append(to_string(datoFlotante)).append(" - ").append(datoString);
	return x;
}

// Función para comparar (usado en el sort)
bool compara1(Prueba a,Prueba b) {
	return a.datoEntero < b.datoEntero;
}

bool compara2(Prueba a,Prueba b) {
	return a.datoFlotante < b.datoFlotante;
}

bool compara3(Prueba a,Prueba b) {
	// compareTo devuelve un número, hagoa la expdresión para que devuelva
	// True o False.
	return (a.datoString.compare(b.datoString) < 0);
}

int main () {
	// Declarar el vector
	vector<Prueba> lista;
	// Lleno el vector con datos
	lista.push_back(Prueba(1,2.0f,"primero"));
	lista.push_back(Prueba(7,2.5f,"segundo"));
	lista.push_back(Prueba(4,4.5f,"tercero"));
	lista.push_back(Prueba(3,6.33f,"cuarto"));
	lista.push_back(Prueba(5,1.8f,"quinto"));
	lista.push_back(Prueba(2,8.45f,"sexto"));
	
	// Muestro el contenido del vector
	cout << "Lista de elementos\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
	
	// Ordeno la lista usando mi función para comparar
	// y muestro la lista ordenada
	sort(lista.begin(),lista.end(),compara1);
	cout << "Lista de elementos ordenados por el dato entero\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
	
	// Ordeno la lista de nuevo usando mis otras funciones
	// para comparar y muestro las listas resultantes
	sort(lista.begin(),lista.end(),compara2);
	cout << "Lista de elementos ordenados por el dato flotante\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
	sort(lista.begin(),lista.end(),compara3);
	cout << "Lista de elementos ordenados por el texto\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
}

Espero que te sea útil. ¡Hasta la próxima!

05 septiembre 2023

Revolviendo un vector en C++

Hace tiempo escribí sobre cómo usar vectores en C++ y como usar iteradores. Sin embargo, el otro día quise "revolver" (hacer un shuffle) a un vector y se me complicó un poquito encontrar la solución.

En Java existe Collections.shuffle y quería algo similar para un vector. Y, después de experimentar un rato y leer varias páginas, encontré que existe una función shuffle que recibe dos iteradores (del inicio y final del vector) y un motor de generador de números aleatorios. Aquí les dejo el ejemplo simple que hice:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
/* ***
 * AzarVector.cpp - Ejemplo de cómo "revolver" un vector en C++
 * ***/
 
#include <vector>		// Para usar el vector
#include <iostream>	
#include <random>		// Para el default_random_engine
#include <algorithm>	// Para el shuffle

using namespace std;

int main() {
	vector<int> lista;
	
	// Lleno la lista
	cout << "Llenando el vector con 100 enteros...\n";
	for (int i=0;i<100;i++) {
		lista.push_back(i);
	}
	
	// Muestro la lista
	cout << "\nLos elementos dados de alta...\n";
	for (int i : lista) {
		cout << i << endl;
	}
	
	// "Revuelvo" la lista
	shuffle(lista.begin(),lista.end(),default_random_engine());
	
	// Muestro la lista
	cout << "\nLos elementos mezclados...\n";
	for (int i : lista) {
		cout << i << endl;
	}
}
Espero que esto les sirva en sus proyectos. ¡Saludos!

04 septiembre 2023

Instalando Python

Empezaré a escribir un poco sobre Python, un lenguaje de alto nivel que se ha vuelto sumamente popular en los últimos años. Pero antes de empezar, es necesario tener las herramientas necesarias para poder crear y ejecutar programas hechas en este lenguaje.

Voy a mostrar una configuración mínima, que solo tenga lo necesario e indispensable para embarcar esta aventura. Así que solo necesitamos dos cosas: un editor de texto y el compilador/intérprete de Python.

Para editor de texto, podrías usar hasta el bloc de notas que viene en Windows, pero hay cosas mejores. Yo generalmente uso Notepad++ pero mejor decidí usar otro editor, llamado Brackets porque funciona igual en Windows, Mac y Linux. Además, está muy padre.

Instalar Python

Primero voy a instalar el intérprete de Python. Para eso, primero hay que visitar la página www.python.org como se ve en la siguiente imagen:

De allí, pon tu mouse sobre el botón Downloads:

Debería reconocer tu sistema operativo y sugerir el que te corresponde. Como yo estoy haciendo todo sobre Windows, doy clic sobre el botón gris que dice Python 3.11.5 (que es la versión actual del intérprete de Python cuando escribí esto. Tal vez aparezca una versión más reciente). Descarga el archivo y ejecútalo. Debería aparecer una ventana como ésta:

Si deseas instalar con las opciones default (que generalmente está muy bien), dale clic sobre Install Now. Si quieres cambiar la carpeta donde se va a instalar o alguna otra opción, haz clic sobre Customize Installation y en las ventanas siguientes seleccionas las opciones personalizadas. Cuando termines, te aparece la siguiente ventana. Presiona el botón Close para terminar.


¡Felicidades! Ya instalaste Python. ahora instalemos Brackets.

Instalar Brackets

Para instalar Brackets, ve a la página brackets.io. Y te lleva a esta página:


Y presiona el botón que dice Download. Guarda el archivo y ejecútalo. Cuando lo corres, aparece esta ventana:


Dile que estás de acuerdo y presiona el botón Siguiente. En la siguiente ventana, selecciona Típico (si quieres instalarlo de forma default) o Personalizada (hay un par de opciones que puedes cambiar).


Espera un momento y cuando termines, aparece la ventana que te permite abrir Brackets o Finalizar. Sé feliz y haz lo que quieras porque ya tienes todo listo para trabajar con Python. ¡Felicidades!


En un futuro cercano seguiré escribiendo sobre Python para que sigas por aquí . ¡Saludos!

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...