miércoles, 21 de abril de 2010

Factorial en C++

Un problema muy frecuente cuando estamos dando nuestros primeros pasos en la programación, es la realización de un algoritmo para encontrar el factorial de un número dado (simbolizado como n!). Para solucionar este problema, el día de hoy les traigo dos soluciones realizadas por mi. Pero primero, ¿qué es el factorial de un número?


"Para todo número natural n, se llama n factorial o factorial de n al producto de todos los naturales desde 1 hasta n"
Fuente: Wikipedia


El prototipo de la función factorial que use para las dos soluciones es:

//Prototipo de la función factorial
long int factorial(unsigned int numero);

En el primer algoritmo nos valemos de un ciclo, en el cual acumularemos el resultado de todas las multiplicaciones desde uno (1) hasta llegar a n, dando fin al bucle, y entregando el resultado:

//Factorial usando ciclos
long int factorial(unsigned int numero)
{
long int lFact = 1L;
for(int i = 2; i <= numero; i++)
lFact *= i;
return lFact;
}

En el segundo algoritmo, tomamos como base las características que tiene la función factorial, y hacemos un procedimiento recursivo hasta encontrar el factorial requerido:

//Factorial usando recursión
long int factorial(unsigned int numero)
{
if(numero == 0U || numero == 1U)
return 1L;
return numero * factorial(numero - 1U);
}

lunes, 19 de abril de 2010

Pasar matrices por referencia en C++

Cuando declaramos un array de algún tipo, en realidad estamos declarando un puntero a la dirección de memoria del primer elemento del array. Y cuando accedemos a los subíndices del array por medio del operador [], estamos haciendo uso de la aritmética de punteros para movernos por la memoria accediendo a las direcciones que necesitamos. Podemos ver esto de una forma mas fácil en el siguiente ejemplo:


//Primero declaramos un array de enteros
//de dimensión diez (10)

int array[10];

//Luego creamos un puntero a un entero
int * pArray;

//y asignamos la dirección del array al puntero
pArray = array;


Note se que cuando asignamos la dirección lo hacemos directamente, sin necesidad de usar el operador & (dirección de). Esto pasa, porque en realidad 'array' es un puntero como 'pArray'.

Ahora si queremos acceder a los subíndices, podemos hacerlo por medio de 'pArray' y de 'array'. Miremos el siguiente ejemplo:

//En este ejemplo estamos inicializando
//los diez elementos de 'array' en cero

for(int i = 0; i < 10; i++)
{
pArray[i] = 0;
}

Ahora lo importante. ¿Cómo pasar arreglos por referencia en C++? Como ya vimos, en realidad los arreglos son punteros al primer subíndice de un array. Entonces para pasar un array por referencia, resulta ser sencillo. Observemos el siguiente prototipo:

void inicializar(int filas, int columnas,
int matriz[filas][columnas]);

Lo que hacemos aquí es, primero pasar las dimensiones de la matriz, y luego la declaramos. El orden aquí es importante, ya que si declaramos el array sin conocer sus dimensiones, el compilador arrojara un error, pues no sabrá como tiene que dimensionar el arreglo. Ahora, para llamar la función simplemente hacemos lo siguiente:

//llamada a la función 'inicializar'
inicializar(filas, columnas, matriz);

donde 'matriz' es una matriz de dimenciones [filas][columnas].