Ejemplo propiedad estática

  internal class Persona
    {
        public int Edad { get; set; }
        private static bool procesar= true; // Campo estático
        // Propiedad que tiene un campo privado asociado y que en el get o el set
        // Hacemos o comprobaciones o algo
        private string _nombre; // Campo privado para almacenar el valor de la propiedad
        public string Nombre
        {
            get => "Don/doña "+_nombre; // Descriptor de acceso get (lectura)
            set
            {
                // Descriptor de acceso set (escritura)
                if (!string.IsNullOrEmpty(value))
                {
                    this._nombre = value;
                }
            }
        }
        
        public Persona(): this("Anonimo")
        {
            
        }
        public Persona(String nombre):this(nombre,18)
        {
            
        }
        public Persona(String nombre, int edad)
        {
            Nombre = nombre;
            Edad = edad;
        }
        public void procesarOrden()
        {
            if (procesar) {
                procesar=false;
                Console.WriteLine("Procesando la orden");
            }
            else
            {
                Console.WriteLine("No puedo procesar cpu ocupada");
            }
        }
        public void acabarProceso()
        {
            procesar= true;
            Console.WriteLine("Proceso acabado");
        }
        public static String saludo()
        {
            return "Hola ";
        }
    }

En el programa

 Persona pepe = new Persona();
            Persona ana = new Persona();
            Persona juan = new Persona();

            pepe.procesarOrden();
            ana.procesarOrden();
            juan.procesarOrden();
            pepe.acabarProceso();
            ana.procesarOrden();
            juan.procesarOrden();

Ejercicio mediciones

irene.py

from sklearn import metrics
import numpy as np
def errores(reales, observados):
    mse = metrics.mean_squared_error(observados, reales)
    rmse = np.sqrt(mse)
    mae = metrics.mean_absolute_error(observados, reales)
    mape = metrics.mean_absolute_percentage_error(observados, reales) * 100  # Multiplicamos por 100 para porcentaje
    r2 = metrics.r2_score(observados, reales)
    max_error = metrics.max_error(observados, reales)
    return {
        "mse":mse,
        "rmse":rmse,
        "mae":mae,
        "mape":mape,
        "r2":r2,
        "max_error":max_error
    }

def mostrar_resultados(resultados):
    print(f"Error Medio Cuadrático (MSE): {resultados["mse"]:.2f}")
    print(f"Raíz del error Medio Cuadrático (RMSE): {resultados["rmse"]:.2f}")
    print(f"Error Absoluto Medio (MAE): {resultados["mae"]:.2f}")
    print(f"Porcentaje de Error Absoluto Medio (MAPE): {resultados["mape"]:.2f}%")
    print(f"Coeficiente de Determinación (R²): {resultados["r2"]:.2f}")
    print(f"Error Máximo: {resultados["max_error"]:.2f}")

Caso de uso:


import irene as ir
# Datos
medicion = [43, 61, 37, 35, 79, 37, 60, 38, 30, 69, 88, 82, 95, 72, 71, 30, 74, 39, 91, 36, 65, 46, 74, 31, 94, 36, 71,
            98, 89, 54]
reales = [44, 66, 38, 39, 81, 40, 62, 39, 33, 71, 88, 85, 99, 73, 71, 34, 77, 44, 94, 40, 69, 51, 76, 33, 96, 36, 75,
          99, 91, 57]
# Calculo el error
err=ir.errores(medicion,reales)
# Imprimimos los resultados
ir.mostrar_resultados(err)

Ejercicio clase

Vamos a crear una clase producto con las siguientes propiedades:
String Referencia
String Nombre
int Stock
Double Precio

Vamos a crear una propiedad virtual PVP que es el precio más el iva (21%) solo de lectura
En el stock vamos a comprobar en el setter que no ponemos valores negativos

Vamos a crear un constructor con todos los datos, uno con todos los datos menos el nombre (y le pondremos como nombre la referencia) y uno solo con la referencia y el precio (en nombre pondremos la referencia y en stock 0).
Probad a crear algún producto.

Sobrecarga de constructores

En program

  Persona pepe=new Persona();
            Persona pepe1 = new Persona("Pepe");
            Persona pepe2 = new Persona("pepe",30);
 

En la clase:

 public Persona(): this("Anonimo")
        {
            
        }
        public Persona(String nombre):this(nombre,18)
        {
            
        }
        public Persona(String nombre, int edad)
        {
            Nombre = nombre;
            Edad = edad;
        }

Ejemplo clases

class Persona
    {
        // A la manera de java, creo getter y setter
        private int sueldo;
        public int getSueldo()
        {
            return sueldo;
        }
        public void setSueldo(int sueldo)
        {
            this.sueldo = sueldo;
        }

        // Propiedad sin ninguna modificación. El get y el set se hacen tal cual
        public int Edad { get; set; }

        // Propiedad que tiene un campo privado asociado y que en el get o el set
        // Hacemos o comprobaciones o algo
        private string _nombre; // Campo privado para almacenar el valor de la propiedad
        public string Nombre
        {
            get => "Don/doña "+_nombre; // Descriptor de acceso get (lectura)
            set
            {
                // Descriptor de acceso set (escritura)
                if (!string.IsNullOrEmpty(value))
                {
                    _nombre = value;
                }
            }
        }
        protected int id;
    }

Ejemplos tuplas y ejercicio

  var tuple = (1, "hello");
            Console.WriteLine(tuple);
            Console.WriteLine(tuple.Item1);
            Console.WriteLine(tuple.Item2);
            var namedTuple = (Number: 1, Message: "hello");
            Console.WriteLine(namedTuple.Number);
            Console.WriteLine(namedTuple.Message);
            int[] valores = { 1, 2, 3, 4, 5, 6, 77 };
            var res=GetMinMax(valores);
            Console.WriteLine(res.Item1 );
            Console.WriteLine(res.Item2);
            var (a, b) = res;
            Console.WriteLine(a);
            Console.WriteLine(b);
            var(min,max) = GetMinMax(valores);
            Console.WriteLine(min);
            Console.WriteLine(max);

            (max, min) = (min, max);
            Console.WriteLine(min);

            // Modificar la función pivote a la que le pasabamos una lista de números
            // y nos devuelve en formato de tupla dos listas. Una con los números
            // más pequeños que el pivote y otra con las mayores
            // pivote([1,2,3,4,5,6,7],3)=>([1,2],[4,5,6,7]
            // pivote([1,2,3,4,5,6,7],1)=>([],[2,3,4,5,6,7]
            // pivote([1,2,3,4,5,6,7],7)=>([1,2,3,4,5,6],[])
            // pivote([1,2,3,4,5,6,7],8)=>([1,2,3,4,5,6,7,8],[])

 public static (List<int>,List<int>) pivote(List<int> lista, int elemento)
{
List<int> izq=new List<int>();
List<int> der = new List<int>();
foreach(int numero in lista)
{
if (numero < elemento)
{
izq.Add(numero);
}
if (numero > elemento)
{
der.Add(numero);
}
}
return (izq, der);
}

Ejemplos hashset

 HashSet<int> numeros = new HashSet<int>();

            // Agregar elementos al HashSet
            numeros.Add(1);
            numeros.Add(2);
            numeros.Add(3);
            numeros.Add(1);
            // Iterar a través del HashSet con foreach
            foreach (int numero in numeros)
            {
                Console.WriteLine(numero);
            }
            HashSet<int> masnumeros = new HashSet<int>() { 3, 4, 5, 6 };
            numeros.SymmetricExceptWith(masnumeros);
            foreach (int numero in numeros)
            {
                Console.WriteLine(numero);
            }

            // Cread dos hashset con nombres de dos clases (clase1 y clase2)
            // Y mostrad:
            // Los nombres que estén en las dos clases
            // Los nombres de la primera clase que no están en la segunda

Ejemplos Diccionario


Dictionary&lt;string, int&gt; edades = new Dictionary&lt;string, int&gt;();

// Agregar elementos al diccionario
edades.Add("Juan", 25);
edades.Add("Ana", 30);
edades.Add("Pedro", 22);

// Acceder a elementos por clave
int edadDeJuan = edades["Juan"];
Console.WriteLine($"Edad de Juan: {edadDeJuan}");
edades["Juan"] = 90;
edadDeJuan = edades["Juan"];
Console.WriteLine($"Edad de Juan: {edadDeJuan}");
// Iterar a través del diccionario con foreach
foreach (var kvp in edades)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value} años");
}
foreach(var claves in edades.Keys)
{
Console.WriteLine(claves+"-"+ edades[claves]);
}
foreach (var valores in edades.Values)
{
Console.WriteLine(valores);
}
edades.Remove("Juan");
edades.Remove("Pepe");
foreach (var kvp in edades)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value} años");
}
if (!edades.ContainsKey("Ana"))
{
edades.Add("Ana", 40);
}
if (edades.ContainsValue(30))
{
Console.WriteLine("Hay un alumno con 30 años");
}
if (edades.TryAdd("Pep", 30))
{
Console.WriteLine("Añadida Ana");
}
else
{
Console.WriteLine("No he podido añadir a Ana");
}
int edad;
if (edades.TryGetValue("Ana",out edad))
{
Console.WriteLine("Hemos obtenido el valor");
}
else
{
Console.WriteLine("No existe el valor");
}
if (edades.TryGetValue("Pablo", out edad))
{
Console.WriteLine("Hemos obtenido el valor");
}
else
{
Console.WriteLine("No existe el valor");
}

Probad a crear un diccionaro ‘traduccion’ de cadenas como clave y cadenas como valor e introducid algunas traducciones del español al inglés (ej ‘agua’, ‘water’).
Después probad a buscar esos valores.

Ejercicios listas

Estos ejercicios pueden hacerse utilizando listas o arrays:

1.- Crear una función a la que le pasamos una cadena y un tamaño y nos devuelve una lista de ese tamaño con la cadena como elemento

CreateList(“hola”,3)==>{“hola”,”hola”,”hola”}

2.- Crear una función suma a la que le pasamos una lista de enteros y nos devuelva la suma

Suma({1,2,3})===>6

3.- Crear una función extremos a la que le pasamos una lista de enteros y nos devuelva el mayor y el menor

Extremos({2,8,1})=>(1,8)

4.- Crear una función a la que le pasamos un tamaño y nos devuelve una lista de ese tamaño de enteros rellenando con los números naturales

CreateNumbers(5)===>{1,2,3,4,5}

5.- Crear una función hasOrder que devuelve un booleano si la lista de enteros que le pasamos está ordenada de menor a mayor

hasOrder(´{1,5,8,34})===>true

hasOrder(´{1,15,8,34})===>false

6.- Modificar la función anterior para que incluya un parámetro opcional que valga 0 o 1 indicando si queremos que el orden sea ascendente o descendente

(Si sabes hacerlo, utiliza un enum para el tipo)

7.- Crear una función ReverseNumbers que devuelva la lista invertido

ReverseNumbers({1,2,3,4})====>{4,3,2,1}

8.- Wscribir una función recortarPalabras a la que le pasamos una lista de palabras y una longitud y nos devuelve una lista con las palabras de esa lonitud o superior
recortarPalabras([“aa”,”bbb”,”cccc”,”dddddd”],4)->[“cccc”,”dddddd”]

9.- Escribir una función a la que le pasamos una lista de números y nos devuelve los números en la posición par, los de posición impar los ignora
mitadPares([1,2,5,8,10])->[1,5,10]

10.- Escribir una función a la que le pasamos dos listas de enteros y nos devuelve true si tienen algún elemento en común y false en caso contrario
elementoComun([1,2,3],[4,5,6])->false
elementoComun([1,2,3],[4,5,6,3])->true

11.- Una funcion pivote de una lista de números nos divide la lista en 2 partes primero los menores del número que pasemos y por otra los mayores
pivote([4,1,9,5,3,7],6)->([4,1,5,3],[9,7])

12.- Funcion ordenarLista a la que le pasamos una lista de palabras y nos la ordena por la longitud de las cadenas
ordenarLista([“bbb”,”a”,”ddddd”,”cccc”])->[“a”,”bbb”,”cccc”,”ddddd”]

13.- Crear una función mediaAritmetica a la que le pasamos una lista de números y nos devuelve la media
mediaAritmetica([2,4,6])->4

14.- Crear una función a la que le pasamos una letra y un número y nos genera una lista con esa letra repetida una, dos y hasta n veces
generarCadenas(“a”,5)->[“a”,”aa”,”aaa”,”aaaa”,”aaaaa”]

15.- Una función palabras con caracter a la que le pasamos una cadena y nos devuelve la lista de palabras que tienen ese caracter
# palabrasConCaracter(‘hola que tal’,’a’)->[‘hola’,’tal’]

Mini ejercicio Queue

Random generadorAleatorio = new Random();
int numeroAleatorio = generadorAleatorio.Next(1, 101);
// Crear una fila, vamos a añadir 20 números aleatorios
// entre 1 y 100
// Y vamos a ‘procesar’ esos datos desencolando los elementos
// y haciendo lo siguiente:
// Si es par lo sumamos a una variable suma
// Si es impar lo ignoramos