Mostrando entradas con la etiqueta C_Sharp. Mostrar todas las entradas
Mostrando entradas con la etiqueta C_Sharp. Mostrar todas las entradas

martes, 3 de marzo de 2026

C# 018 ► Calcular el Factorial de un número

Ejercicio 018: Calcular el factorial de u número.

Entrada: Un número entero.

Salida: El factorial del número ingresado.

using System;
class Factorial {
    static void Main() {
        int num, fac = 1;

        Console.WriteLine("Ingresa un número");
        num = int.Parse(Console.ReadLine());

        while (num > 0) {
            fac = fac * num;
            num--;
        }

        Console.WriteLine("El factorial es " + fac);

    }
}

Mismo ejercicio:
En Java
En Pascal

sábado, 28 de septiembre de 2024

■ Métodos de Math en C#

Funciones Matemáticas predefinidas en C#

Las funciones matemáticas predefinidas de un lenguaje nos facilitan la obtención de resultados matemáticos sin tener que realizarlos nosotros mismos, estas son algunas de las principales en C#.


■ Métodos de Math

• Abs(int/double): Devuelve el valor absoluto de un número entero o decimal.

Console.WriteLine(Math.Abs(-5)); // Devolverá 5
Console.WriteLine(Math.Abs(5)); // Devolverá 5

• BigMul(int, int): Devuelve la multiplicación de los valores que recibe.

Console.WriteLine(Math.BigMul(1, 2)); // Devolverá 2
Console.WriteLine(Math.BigMul(2, 8)); // Devolverá 16

• Cbrt(double): Devuelve la raíz cúbica de un número.

Console.WriteLine(Math.Cbrt(27));   // Devolverá 3
Console.WriteLine(Math.Cbrt(3.14)); // Devolverá 1.46434

• Ceiling(double): Devuelve el número redondeado a su siguiente entero superior.

Console.WriteLine(Math.Ceiling(3.14));  // Devolverá 4
Console.WriteLine(Math.Ceiling(3.64));  // Devolverá 4
Console.WriteLine(Math.Ceiling(-3.14)); // Devolverá -3

• Clamp(int/double, int/double, int/double):
Si el primer número está entre el rango del segundo y tercero devuelve el propio número.
Si el primer número está por debajo del segundo número, devuelve el segundo número.
Si el primer número está por encima del segundo número, devuelve el segundo número.

Console.WriteLine(Math.Clamp(5, 1, 10)); // Devolverá 5
Console.WriteLine(Math.Clamp(1, 5, 10)); // Devolverá 5
Console.WriteLine(Math.Clamp(10, 1, 5)); // Devolverá 5

• Exp(double): Devuelve la constante de Euler elevada al parámetro indicado.

Console.WriteLine(Math.Exp(2)); // Devolverá 7.389

• Floor(double): Devuelve el número redondeado a su siguiente entero inferior.

double n = 4.3, m = 4.8, o = -4.7;
Console.WriteLine(Math.Floor(n)); // Devolverá 4.0
Console.WriteLine(Math.Floor(m)); // Devolverá 4.0
Console.WriteLine(Math.Floor(o)); // Devolverá -5.0

• Log(int/double): Devuelve el logaritmo natural de un número.

Console.WriteLine(Math.Log(2)); // Devolverá 0.69314

• Log10(int/double): Devuelve el logaritmo base 10 de un número.

Console.WriteLine(Math.Log10(2)); // Devolverá 0.30102

• Max(int/double, int/double): Devuelve el mayor de los dos números recibidos.

int a = 5, b = 3;
double c = 4.25, d = 6.3;
Console.WriteLine(Math.Max(a, b)); // Devolverá 5
Console.WriteLine(Math.Max(c, d)); // Devolverá 6.3

• Min(int/double, int/double): Devuelve el menor de los dos números recibidos.

int a = 5, b = 3;
double c = 4.25, d = 6.3;
Console.WriteLine(Math.Min(a, b)); // Devolverá 3
Console.WriteLine(Math.Min(c, d)); // Devolverá 4.25

• Pow(int/double, int/double): Devuelve el primer número a la potencia que indique el segundo número.

int a = 5, b = 2.5;
Console.WriteLine(Math.Pow(a, 3)); // Devolverá 125.0
Console.WriteLine(Math.Pow(a, b)); // Devolverá 55.9016

• Round(double): Devuelve el número redondea a su valor entero más cercano positivo o negativo.

double a = 3.49, b = 3.5;
Console.WriteLine(Math.Round(a)); // Devolverá 3
Console.WriteLine(Math.Round(b)); // Devolverá 4

• Sqrt(int/double): Devuelve la raíz cuadrada de un número.

int x = 25;
double y = 3.14;
Console.WriteLine(Math.Sqrt(x)); // Devolverá -0.13352
Console.WriteLine(Math.Sqrt(y)); // Devolverá -0.00159


► Trigonométricas

• Acos(int/double): Devuelve el arco coseno de un número.

Console.WriteLine(Math.Acos(1));   // Devolverá 0
Console.WriteLine(Math.Acos(0.5)); // Devolverá 1.04719

• Asin(int/double): Devuelve el arco seno de un número.

Console.WriteLine(Math.Asin(1));   // Devolverá 1.57079
Console.WriteLine(Math.Asin(0.5)); // Devolverá 0.52359

• Atan(int/double): Devuelve el arco tangente de un número.

Console.WriteLine(Math.Atan(1));   // Devolverá 0.78539
Console.WriteLine(Math.Atan(0.5)); // Devolverá 0.46364

• Cos(int/double): Devuelve el coseno de un número.

Console.WriteLine(Math.Cos(1));   // Devolverá 0.540302
Console.WriteLine(Math.Cos(0.5)); // Devolverá 0.877582

• Sin(int/double): Devuelve el seno de un número.

int x = 25;
double y = 3.14;
Console.WriteLine(Math.Sin(x)); // Devolverá -0.13235
Console.WriteLine(Math.Sin(y)); // Devolverá 0.001592

• Tan(int/double): Devuelve la tangente de un número.

int x = 25;
double y = 3.14;
Console.WriteLine(Math.Tan(x)); // Devolverá -0.13352
Console.WriteLine(Math.Tan(y)); // Devolverá -0.00159


■ Llamar función dentro de otra función.

Dado que estas funciones reciben números como parámetro de entrada y a su vez devuelven números como resultado de salida, es posible meter una función en lugar del parámetro de otra, por ejemplo:

La función BigMul(int, int) devuelve el producto de los dos números recibidos, si le pasáramos los números -2 y 5, el resultado sería -10, si nosotros quisiéramos ese número positivo, bastaría con meter la función BigMult() dentro de la función Abs() que recibe un número, en este caso el que devuelve BigMul() y devuelve el absoluto del número recibido, esto sería de la siguiente forma:

Math.Abs(Math.BigMul(-2, 5));

Esto nos daría como resultado 10 positivo y de la misma forma se puede aplicar combinando otras funciones.

■ C Sharp Arreglos Bidimensionales (matrices)

¿Qué es un arreglo bidimensional? clic aquí.


■ Estructura

<tipo>[,] <identificador> = new <tipo>[<filas>, <columnas>];

Donde:
  • tipo es el tipo de dato que guardará la matriz.
  • identificador es el nombre de la matriz.
  • filas es el número de filas que contendrá
  • columnas es el número de columnas que contendrá


■ Declarando matrices 3x3 de diferentes tipos

• Matriz de enteros

int[,] matriz = new int[3,3];

• Matriz de caracteres

char[,] matriz = new char[3,3];

• Matriz de cadenas

string[,] matriz = new string[3,3];


■ Declaración e inicialización con valores

• Matriz de enteros

int[,] matriz = new int[3,3] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

• Matriz de caracteres

char[,] matriz = new char[3,3] {{'a', 'b', 'c'},{'d', 'e', 'f'},{'g', 'h', 'i'}};

• Matriz de cadenas

string[,] matriz = new string[3,3] {{"uno", "dos", "tres"},{"cuatro", "cinco", "seis"},{"siete", "ocho", "nueve"}};


■ Llenado de la matriz en tiempo de ejecución

Estándo la matriz previamente declarada, se llenaría mediante un doble for para recorrer sus filas y columnas:

for (int i=0; i < 3; i++) {
    for (int j=0; j < 3; j++) {
        Console.WriteLine("Ingresa el valor");
        matriz[i,j] = int.Parse(Console.ReadLine());
    }
}

■ C Sharp Arreglos Unidimensionales

Declaración de arreglos en C#

¿Qué es un arreglo? clic aquí.


■ Sintaxis

<tipo>[] <identificador> = new <tipo>[<tamaño>] ;

Donde:
  • tipo es el tipo de dato que guardará el arreglo.
  • identificador es el nombre que se le dará al arreglo.
  • tamaño es el número de datos que almacenará el arreglo.

■ Declarando arreglos tamaño 10 de diferentes tipos:

• Arreglo de enteros

int[] arreglo = new int[10];

• Arreglo de caracteres

char[] arreglo = new char[10];

• Arreglo de cadenas de texto

string[] arreglo = new string[10];


■ Declaración e inicialización a la vez

int[] arreglo = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

La línea anterior declara un arreglo nuevo de tipo int cuyo tamaño es el mismo número que representen los elementos con que es inicializado, en este caso los números del 0 al 9 por lo tanto es tamaño 10.


■ Estructuras anidadas en C#

■ Estructuras anidadas... formas prácticas

Considerando los siguientes datos de entrada:

// arreglo de edades
int[] edades = new int[] {19, 12, 7, 22, 40, 25, 35, 16, 14, 5};

// variable int
int num = 5;


Veamos cómo funciona cada estructura anidada:

• If / if

if (num > -1) {
    if (num != 0) {
        Console.WriteLine ("Es positivo");
    }
}


• If / if - else

if (num > -1) {
    if (num != 0) {
        Console.WriteLine ("Es positivo");
    } else {
        Console.WriteLine ("Es cero");
    }
} else {
    Console.WriteLine("Es negativo");
}


• For / if

for (int i=0; i < edades.Length; i++) {
    if (edades[i] > 17) {
        Console.WriteLine("Es mayor de edad");
    }
}


• For / if - else

int mayores = 0;
int menores = 0;

for (int i=0; i < edades.Length; i++) {
    if (edades[i] > 17) {
        menores++;
    } else {
        mayores++;
    }
}


• While / if - else

int mayores = 0;
int menores = 0;

int i = 0;
while (i < edades.Length) {
    if (edades[i] > 17) {
        menores++;
    } else {
        mayores++;
    }
    i++;
}


• For / For

for (int i=0; i < edades.Length; i++) {
    for (int j=0; j < edades[i]; j++) {
        Console.Write("*");
    }
    Console.WriteLine();
}


• For / While

for (int i=0; i < edades.Length; i++) {
    int j = 0;
    while (j < edades[i]) {
        Console.Write("*");
        j++;
    }
    Console.WriteLine();
}


• While / While

int i=0;
while (i < edades.Length) {
    int j = 0;
    while (j < edades[i]) {
        Console.Write("*");
        j++;
    }
    Console.WriteLine();
    i++;
}


• do-while / while

int i=0;
do {
    int j = 0;
    while (j < edades[i]) {
        Console.Write("*");
        j++;
    }
    Console.WriteLine();
    i++;
} while (i < edades.Length);



La elección de la estructura dependerá del problema a resolver y del criterio de cada quien.

viernes, 27 de septiembre de 2024

■ C# switch con expresiones boleanas

Estamos acostumbrados a usar la estructura swich evaluando valores exactos, switch toma la variable y ejecuta el bloque con las instrucciones del caso con el cual coincida, ejemplo:

int variable = 2;
switch(variable) {
    case 1:
        // Se ejecuta si la variable es 1
        break;
    case 2:
        // Se ejecuta si la variable es 2
        break;
    case n:
        // Se ejecuta si la variable es n
        break;
}


Aunque dependiendo de la problemática resulta ser muy útil, pero a veces sería más conveniente poder evaluar una expresión boleana en cada caso, por ejemplo:

int n;
switch(n) {
    En caso de que n < 0:
        break;
    En caso de que n == 0:
        break;
    En caso de que n > 0:
        break;
}


En C# hay una forma de hacer lo anterior, bastan unos pequeños ajustes al switch para poder evaluar expresiones boleanas en cada uno de sus casos, la estructura es la siguiente:

switch (variable) {
    case <variable_caso> when (<expresión_boleana>):
    break;
}

Donde:
variable es el valor que recibe y evaluará el switch.
variable_caso toma el valor de la variable recibida por el switch.
when indica que el caso se ejecutará solo si se cumple la siguiente condición.
expresión_boleana es la condición que debe cumplirse para cada caso.


■ Ejemplo

Un switch que reciba números enteros y cuente cuántos son negativos, cuántos positivos y cuántos son 0.

switch (num) {
    case int n when (n < 0):
        negativos++;
        break;
    case int n when (n == 0):
        ceros++;
        break;
    case int n when (n > 0):
        positivos++;
        break;
}


Parece algo que podríamos manejar mejor con un if, pero este es solo un ejemplo muy básico para mostrar esta característica del switch ya que tiene otras ventajas por ejemplo con objetos.

■ C# Switch

 ■ Estructura del switch

switch(<variable>) {
    case valor_1:
        // instrucciones 
        break;
    case valor_2:
        // instrucciones
        break;
    case valor_3:
        // instrucciones
        break;
    case valor_n:
        // instrucciones
        break;
    case default:
        // instrucciones si no fue ninguno de los anteriores
}


■ Ejemplo

Si la variable que se le pasa al switch es un int.

int valor = 1;

switch (valor) {
    case 1:
        // instrucciones si es 1
        break;
    case 2:
        // instrucciones si es 2
        break;
    case 3:
        // instrucciones si es 3
        break;
    case default:
        // instrucciones si no es ninguna de las anteriores
        break;
}


Si la variable que se le pasa al switch es un string.

string valor = "a";

switch (valor) {
    case "a":
        // instrucciones si es "a"
        break;
    case "b":
        // instrucciones si es "b"
        break;
    case "c":
        // instrucciones si es "c"
        break;
    case default:
        // instrucciones si no es ninguna de las anteriores
        break;
}


■ Comparado con if

El switch es como un if múltiple, pero a diferencia del if que además de evaluar variables y expresiones boleanas como "x > y"; el switch solo evalúa valores exactos, es decir, recibe una variable y si el valor de dicha varíable es igual a alguna de sus opciones (casos) realiza las instrucciones.

Tiene una opción que es "default" que no es obligatorio ponerla, pero cuando se usa ésta se ejecuta si el valor de la variable evaluada no coincide con ninguno de los casos anteriores.

Pero en C# a diferencia de otros lenguajes hay un tipo de switch que si puede evaluar expresiones boleanas, el funcionamiento de este se puede ver aquí.

■ C#_016 ► Multiplicar dos matrices m*m

Ejercicio 016: Multiplicar dos matrices m*m.

Entrada: Tamaño de las matrices A y B y llenado de las mismas.

Salida: Matriz multiplicada.


using System;

public class C_016 {
    public static void Main(string[] args) {
        int m, filas, columnas, res;
        Console.WriteLine("¿De qué tamaño serán las matrices?");
        m = int.Parse(Console.ReadLine());
        Console.WriteLine("Las matrices serán " + m + "*" + m);
        
        int[,] matrizA = new int[m,m];
        int[,] matrizB = new int[m,m];
        int[,] matrizAB = new int[m,m];
        
        filas = columnas = m;
        
        // Se llenan las matrices
        Console.WriteLine("Ingresa los números de las matrices");
        Console.WriteLine("Matriz A");
        for (int i=0; i < m; i++) {
            for (int j=0; j < m; j++) {
                Console.WriteLine("Ingresa el valor " + i + "-" + j);
                matrizA[i,j] = int.Parse(Console.ReadLine());
            }
        }
        Console.WriteLine("Matriz B");
        for (int i=0; i < m; i++) {
            for (int j=0; j < m; j++) {
                Console.WriteLine("Ingresa el valor " + i + "-" + j);
                matrizB[i,j] = int.Parse(Console.ReadLine());
            }
        }
        
        // Se multiplican las matrices
        for (int i=0; i < filas; i++) {
            for (int j=0; j < columnas; j++) {
                res = 0;
                for (int k=0; k < filas; k++) {
                    res += matrizA[i,k] * matrizB[k,j];
                }
                matrizAB[i,j] = res;
            }
            Console.WriteLine("\n");
        }
        // Se muestra la matriz multiplicada
        Console.WriteLine("MatrizAB");
        for (int i=0; i < filas; i++) {
            for (int j=0; j < columnas; j++) {
                Console.Write(matrizAB[i,j] + " \t");
            }
            Console.WriteLine();
        }
    }
}


■ En otros lenguajes:
     • Pseudocódigo
     • Java_016 ✓
     • Pascal_016 ✓

sábado, 14 de septiembre de 2024

■ C# 031 ► Convertir la primera letra de cada palabra en mayúscula

Ejercicio 031: Tomar un String con una frase y convertir la primer letra de cada palabra en mayúscula.

Hay muchas formas de hacerlo, en este caso trataremos al String como un arreglo de caracteres, es decir, se recorrerá y se irá detectando el inicio de cada palabra para convertirla a mayúscula.

Entrada:
String frase = "al mal tiempo buena cara"

Salida:
Imprimir "Al Mal Tiempo Buena Cara"

using System;
namespace CSharp_031 {
    class Program {
        static void Main(string[] args) {
            string frase = "al mal tiempo buena cara";

            for (int i=0; i < frase.Length; i++) {
                if (i == 0 || frase[i-1] == ' ') {
                    Console.Write(Char.ToUpper(frase[i]));
                } else {
                    Console.Write(frase[i]);
                }
            }

            Console.ReadKey();
        }
    }
}


Explicación:

Se recorre el string (frase) con un for como si de un arreglo se tratara, en la condición se evalúa si es la primer posición del string o si la posición anterior es un espacio en blanco, si se cumple una u otra convertimos el caracter actual a mayúscula, si no se cumple ninguna solo se muestra el caracter tal cual.

Para convertir el caracter en mayúscula se usa el método "ToUpper" de la clase "Char".

martes, 13 de febrero de 2024

C# 015 ► Ordenar arreglo de menor a mayor

Ejercicio 015: Pedir el tamaño de un arreglo, llenarlo y ordenarlo de forma ascendente.

Entrada: El tamaño del arreglo y llenado del mismo.

Salida: Arreglo ordenado.


using System;

public class Program {
    public void Ordenar(int[] _numeros) {
        int aux;

        for (int x = 0; x < _numeros.Length; x++) {
            for (int y = x + 1; y < _numeros.Length; y++) {
                if (_numeros[y] < _numeros[x]) {
                    aux = _numeros[y];
                    _numeros[y] = _numeros[x];
                    _numeros[x] = aux;
                }
            }
        }

        Console.WriteLine("Arreglo ordenado:");
        for (int i = 0; i < _numeros.Length; i++) {
            Console.Write(_numeros[i] + ", ");
        }
    }

    public static void Main(string[] args) {
        Program metodos = new Program();

        Console.WriteLine("¿Cuántos números serán?");
        int tam = int.Parse(Console.ReadLine());
        Numeros = new int[tam];

        for (int i = 0; < Numeros.Length; i++) {
            Console.WriteLine("Ingresa número " + i + "/" + tam);
            Numeros[i] = int.Parse(Console.ReadLine());
        }

        Console.WriteLine("Arreglo sin ordenar:");
        for (int i = 0; i < Numeros.Length; i++) {
            Console.Write(Numeros[i] + ", ");
        }
        Console.WriteLine();

        metodos.Ordenar(Numeros);
    }
}



En este ejemplo, la ordenación ascendente del arreglo se hace en el método "Ordenar", que se manda a llamar mediante el objeto "metodos" pasándole como parámetro el arreglo "Numeros" previamente llenado.

El método de ordenación empleado en este ejercicio es el de la "burbuja", el cual consiste en comparar cada uno de los elementos con los restantes verificando si alguno es menor, si es así se intercambian, y así hasta que se revise todo el arreglo, al final los números quedan ordenados.

Este método es para efectos explicativos, otra forma de hacerlo es usar el método propio de C# "Array.Sort()", el cual recibe como parámetro el arreglo que se desea ordenar, considerando este ejemplo sería:

    Array.Sort(Numeros);    //Si se usa en main
    Array.Sort(_numeros);   //Dentro del método Ordenar



■ En otros lenguajes:
     • Pseudocódigo 
     • Java_015 ✓
     • Pascal_015 ✓
     • Python_015 

jueves, 23 de julio de 2015

■ Estructura de una función C#

Una función es un método que contiene un conjunto de instrucciones que puede o no devolver un valor según se requiera.

Cuando la función no devuelve valor se dice que no tiene tipo, mientras que cuando si regresa un valor se dice que es una función con tipo. El tipo de la función dependerá del valor que esta regresa.

■ Estructura de la función

<ámbito> <tipo> Nombre(argumentos) {
    //Bloque de instrucciones
    //return Variable; //Únicamente cuando devuelve un valor
}

Donde:
Ámbito: Puede ser público o privado dependiendo de si queremos pueda ser accedida desde cualquier parte del programa o solo localmente en la clase a la que pertenezca.
Tipo: Tipo de valor que devolverá la función al ser invocada, puede ser int, bool, string, double, etc., o bien "void" si no regresará nada.
Nombre: Identificador o nombre que se le da a la función.
Argumentos: Datos de entrada con los que trabajará la función, puede no llevar.
Return: Solo cuando la función es con tipo, cuando es sin tipo no lleva return.


■ Ejemplo

• Sin parámetros ni tipo.
Función que solo muestra un mensaje.

public void Mensaje() {
    Console.WriteLine("Mensaje"); //En consola
    MiLabel.Text = "Mensaje"; //En un form
}

• Con tipo
Función que recibe dos números enteros y devuelve la suma

public int Suma(int n1, int n2) {
    return n1 + n2;
}

• De tipo boleano
Función que recibe un número y devuelve verdadero si es positivo o falso si no

public bool Positivo(int num) {
    if (num > 0) {
        return true;
    } else {
        return false;
    }
}


■ Llamada a la función

Consideremos la función "Suma" de tipo entero que regresa la suma de dos números pasados como parámetros.

• Si la función es local, es decir, se llama desde la misma clase:

1) Asignar su resultado a una variable y luego mostrar la variable
int resultado = Suma(num1, num2);
Console.Write(resultado);

2) Mostrar directamente su resultado:
Console.Write(Suma(num1, num2));


• Si la función pertenece a otra clase, pero es pública:

Primero debemos declarar un objeto del tipo de dicha clase:
NombreClase MiObjeto = new NombreClase();

Luego mediante este objeto invocamos la función:

1) Guardando el resultado en una variable
int resultado = MiObjeto.Suma(num1, num2);
Console.Write(resultado);

2) Mostrando resultado directamente
Console.Write(MiObjeto.Suma(num1, num2));


Nota: Cuando la función se asigna a una variable, ésta debe ser del mismo tipo que el valor que regresa la función.