Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010

5.8. El orden no importa

En algunos lenguajes, una función debe estar declarada antes de usarse. Esto no es necesario en C#. Por ejemplo, podríamos rescribir el fuente anterior, de modo que "Main" aparezca en primer lugar y "duplica" aparezca después, y seguiría compilando y funcionando igual:

/*---------------------------*/
/*  Ejemplo en C# nº 55:     */
/*  ejemplo55.cs             */
/*                           */
/*  Función tras Main        */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo55
{
 
  public static void Main()
  {
    int n = 5;
    Console.WriteLine("n vale {0}", n);
    duplica(ref n);
    Console.WriteLine("Ahora n vale {0}", n);
  }
 
  public static void duplica(ref int x) {
    Console.WriteLine("  El valor recibido vale {0}", x);
    x = x * 2;
    Console.WriteLine("  y ahora vale {0}", x);
  }
 
}
 

5.9. Algunas funciones útiles

5.9.1. Números aleatorios

En un programa de gestión o una utilidad que nos ayuda a administrar un sistema, no es habitual que podamos permitir que las cosas ocurran al azar. Pero los juegos se encuentran muchas veces entre los ejercicios de programación más completos, y para un juego sí suele ser conveniente que haya algo de azar, para que una partida no sea exactamente igual a la anterior.

Generar números al azar ("números aleatorios") usando C# no es difícil: debemos crear un objeto de tipo "Random", y luego llamaremos a "Next" para obtener valores entre dos extremos:

 
// Creamos un objeto random
Random r = new Random();
 
// Generamos un número entre dos valores dados
int aleatorio = r.Next(1, 100);
 

Podemos hacer que sea realmente un poco más aleatorio si en la primera orden le indicamos que tome como semilla el instante actual:

 
Random r = new Random(DateTime.Now.Millisecond);
 

De hecho, una forma muy simple de obtener un número "casi al azar" entre 0 y 999 es tomar las milésimas de segundo de la hora actual:

 
int falsoAleatorio = DateTime.Now.Millisecond;
 

Vamos a ver un ejemplo, que muestre en pantalla un número al azar entre 1 y 10:

/*---------------------------*/
/*  Ejemplo en C# nº 56:     */
/*  ejemplo56.cs             */
/*                           */
/*  Números al azar          */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo56
{
 
  public static void Main()
  {
 
    Random r = new Random(DateTime.Now.Millisecond);
    int aleatorio = r.Next(1, 10);
    Console.WriteLine("Un número entre 1 y 10: {0}", 
      aleatorio);
  }
 
}
 

Ejercicios propuestos:

5.9.2. Funciones matemáticas

En C# tenemos muchas funciones matemáticas predefinidas, como:

(casi todos ellos usan parámetros X e Y de tipo "double")

y una serie de constantes como

Todas ellas se usan precedidas por "Math."

La mayoría de ellas son específicas para ciertos problemas matemáticos, especialmente si interviene la trigonometría o si hay que usar logaritmos o exponenciales. Pero vamos a destacar las que sí pueden resultar útiles en situaciones más variadas:

Ejercicios propuestos:

5.9.3. Pero hay muchas más funciones…

PPero en C# hay muchas más funciones de lo que parece. De hecho, salvo algunas palabras reservadas (int, float, string, if, switch, for, do, while...), gran parte de lo que hasta ahora hemos llamado "órdenes", son realmente "funciones", como Console.ReadLine o Console.WriteLine. Nos iremos encontrando con otras funciones a medida que avancemos.

5.10. Recursividad

Una función recursiva es aquella que se define a partir de ella misma. Dentro de las matemáticas tenemos varios ejemplos. Uno clásico es el "factorial de un número":

  n! = n • (n-1) • (n-2) • ... • 3 • 2 • 1

(por ejemplo, el factorial de 4 es 4 • 3 • 2 • 1 = 24)

Si pensamos que el factorial de n-1 es

  (n-1)! = (n-1) • (n-2) • (n-3) • ... • 3 • 2 • 1

Entonces podemos escribir el factorial de un número a partir del factorial del siguiente número:

  n! = n • (n-1)!

Esta es la definición recursiva del factorial, ni más ni menos. Esto, programando, se haría:

/*---------------------------*/
/*  Ejemplo en C# nº 57:     */
/*  ejemplo57.cs             */
/*                           */
/*  Funciones recursivas:    */
/*  factorial                */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo57
{
 
  public static long fact(int n) {
   if (n==1)               // Aseguramos que termine
     return 1;
   return n * fact (n-1);  // Si no es 1, sigue la recursión
  }
 
 
  public static void Main()
  {
    int num;
    Console.WriteLine("Introduzca un número entero: ");
    num = System.Convert.ToInt32(System.Console.ReadLine()); 
    Console.WriteLine("Su factorial es: {0}", fact(num));
  }
 
}
 

Dos consideraciones importantes:

¿Qué utilidad tiene esto? Pues más de la que parece: muchos problemas complicados se pueden expresar a partir de otro más sencillo. En muchos de esos casos, ese problema se podrá expresar de forma recursiva. Más adelante veremos algún otro ejemplo.

Ejercicios propuestos: