lunes, 20 de septiembre de 2010

LENGUAJES FUNCIONALES - Generalidades R

Lenguajes de Programación - Semana 7 - ESPERANZA DE PUNTOS EXTRA

Se trata de un lenguaje especializado en el área de matemáticas, para el análisis de datos estadísticos y gráficos.

Debido a que se distribuye mediante licencia GPL su disponibilidad se extiende a la mayoría de los sistemas operativos, y por ello ha cautivado a hombres y mujeres en sectores financieros, estadísticos, médicos, informáticos, etc. Grandes empresas como Merck, Google, Bank of America, Shell, entre muchas otras, lo utilizan para el procesamiento de datos.

COMO ES COSTUMBRE, EN LA BARRA DERECHA EN "RECURSOS" LES DEJÉ 2 TUTORIALES, UNO EN INGLÉS (THE R GUIDE) Y OTRO EN ESPAÑOL (R PARA PRINCIPIANTES), Y PARA COMPLETAR EL SET COMPARTO TAMBIÉN LA TARJETA DE REFERENCIA

SCRIPTS SENCILLOS

Vamos a practicar un poco con este lenguaje.
Primero necesitamos instalar la base de datos de R, ya que UBUNTU no la incluye por default; entonces procederemos a abrir nuestro terminal y teclearemos la secuencia

sudo apt-get install r-base

si nos pide password lo tecleamos y aceptamos todos los mensajes mientras no nos pida nuestro número de tarjeta de crédito.
Al terminar ya podremos teclear en la terminal una R mayúscula, y se abrira el "entorno de trabajo" de R; debe verse algo parecido a esto:



Trabajemos los aspectos básicos, primero como declarar variables, que no es una declaración propiamente como la conocemos de otros lenguajes, mas bien haremos la asignación de un valor; por ejemplo, si queremos que X tenga el valor de 10 entonces se debe teclear en la línea de comandos la secuencia x <- 10, donde el signo <- es el símbolo para asignar el valor. Tecleemos los siguientes valores:

Y <- 20 Y vale 20
30 -> Z Z vale 30

Para ver las variables que tenemos en memoria escribiremos la secuencia ls(), o también ls.str() que además de mostrarnos las variables nos muestra las propiedades de las mismas

Asi se vería en la terminal lo que acabamos de hacer:


Me equivoque, la varible x es minúscula, quiero que sea mayúscula, la corrección no es mas complicada que escribir X <- 10; pero... ahora tengo 2 variables "X" (que en realidad para R no son iguales ya que R si hace distinción entre mayúsculas y minúsculas), haremos uso de la secuencia rm(x) dentro del paréntesis escribimos la variable a eliminar, en éste caso solo la x.


Ahora vamos a realizar algunas operaciones con las variables que tenemos, lo más básico; tecleemos en la terminal:

A <- Z+X Para crear una variable A, que guarde la suma de Z+X, osea 30+10=40
B <- Z-Y Para crear una variable B, que guarde la resta de Z-Y, osea 30-20=10
C <- X*Y Para crear una variable C, que guarde la multiplicación de X*Y, osea 10*20=200
Z/Y -> D Para crear una variable D, que guarde la división de Z/Y, osea 30/10=1.5
E <- C/2 Para crear una variable E, que guarde la división de C/2, osea 200/2=100
F <- sqrt(E) Para crear una variable F, que guarde la raíz cuadrada de E, osea 10

R trabaja por default con variables punto flotante. Ahora tenemos 9 variables en memoria:


Tambien agregamos otras funciones conocidas por nosotros estan por ejemplo:
Trigonometría Hiperbólicas Logarítmicas/Exponenciales
sin(u)cosh(u)log(a, base=exp(1))
cos(u)sinh(u)log10(a)
tan(u)tanh(u)log2(a)
asin(u)acosh(u)exp(a)
acos(u)asinh(u)
atan(u)atanh(u)


Donde en las funciones trigonométricas "U" es el ángulo, solo basta con escribir la secuencia sin(pi/2) para obtener el seno de 90 grados. Observe que el ángulo se debe expresar en radianes.


En las hojas de referencia vienen muchísimas funciones que nos servirán para profundizar en este lenguaje.

SALUDOS

martes, 7 de septiembre de 2010

RECURSION: Torres de Hanoi.c

Lenguajes de Programacion - Semana 6 - Tarea 5: Presentacion

Que tal compañeros, para la clase de la Dr. Elisa me toco analizar el codigo de Torres de Hanoi junto con Ramon, Cecilia y Roberto.

CODIGO:
#include 

void hanoi(int n, int inicial, int temporal, int final) {
 if (n > 0) {
     printf("%d, %d, %d, %d\n", n, inicial, temporal, final);
     hanoi(n - 1, inicial, final, temporal);
     printf("%d, %d, %d, %d\n", n, inicial, temporal, final);
     printf("Del poste %d al %d\n", inicial, final);
     hanoi(n - 1, temporal, inicial, final); 
 }
}

int main (void) {
 int x = 0;
 scanf("%d", &x);
 hanoi(x, 1, 2, 3);
 return 0;
}


¿COMO FUNCIONA EL CODIGO?

Para saberlo les dejo una presentacion que prepare en OpenOffice , la diapositiva 2 es animada para que le entiendan mejor, viene una flechita que los guia a travez del proceso de recursion.
PD: Dado que la presentacion fue creada y editada en OpenOffice, la visualizacion perfecta seria en este programa, no en PowerPoint, por lo que recomiendo abrir la presentacion en OPENOFFICE

LINK DE DESCARGA DE LA PRESENTACION: Recursion.odp

DESCARGA (Código fuente): hanoi.c

Espero les guste

SALUDOS

domingo, 5 de septiembre de 2010

RECURSION: Fibonacci.c

Laboratorio de Lenguajes de Programación - Semana 4

CODIGO:
#include 

int fibonacci (int n) {
   if(n <= 1) 
      return n;
   else
      return (fibonacci(n - 1) + fibonacci(n - 2));
}

int main (void) {     
   int x;
   printf("Fibonacci -> ");
   scanf("%d", &x);
   printf("Fibonacci (%d) = %d", x, fibonacci(x));
   return 0;
}


¿Cómo funciona el código?

Una vez mas centremonos en el bloque recursivo
int fibonacci (int n) {
   if(n <= 1)
      return n;
   else
      return (fibonacci(n - 1) + fibonacci(n - 2));
}


Supongamos que int n = 5, entonces:

Aquí comienza la regresión

Asi la función main imprime el valor final de la sucesión fibonacci de 5, es decir Fibonacci (5) = 5

DESCARGA: fibonacci.c

RECURSION: Factorial.c

Laboratorio de Lenguajes de Programación - Semana 4

CODIGO:
#include 

int factorial (int n) {
    int factor;
    if (n <= 1)
       factor = 1;
    else
        factor = n * factorial(n-1);
    return factor;
}

int main (void) {
    int x;
    printf("Calcular el factorial para -> ");
    scanf("%d", &x);
    printf("%d! = %d", x, factorial(x));
    return 0;
}


¿Cómo funciona el código?

Centremonos en el bloque
int factorial (int n) {
    int factor;
    if (n <= 1)
       factor = 1;
    else
        factor = n * factorial(n-1);
    return factor;
}

Supongamos que calcularemos el factorial para 5, (5!), entonces tenemos que

Primera llamada recursiva, ahora tenemos n = 4

Segunda llamada recursiva, ahora tenemos n = 3

Tercera llamada recursiva, ahora tenemos n = 2

Cuarta y última llamada recursiva, ahora tenemos n = 1
Al llegar a esta parte sucede algo diferente :
int factorial (1) { 
    int factor; 
    1 <= 1 (SE CUMPLE, ENTONCES)
        return 1;

A partir de aquí vamos para atrás, factorial (1) regresa el valor de 1

termina la función factorial (2)

termina la función factorial (3)

termina la función factorial (4)

Para asi dar conclusión a la función factorial (5), que regresa el valor de 120 , este valor se envía a la función main que imprime en pantalla el valor final 5! = 120

DESCARGA: factorial.c

SALUDOS!!!

RECURSION: Potencia.c

Laboratorio de Lenguajes de Programación - Semana  4

CÓDIGO:
#include 

double potencia (int x, int y) {
double resultado;
if(y == 0)
  resultado = 1;
else
  resultado = x * potencia(x,y-1);
return resultado;
}

int main(void) {
int base=0, exponente=0;
printf("\t\tPROGRAMA PARA CALCULAR UNA POTENCIA\n\n");
printf("Dame el valor de la base -> ");
scanf("%d", &base);
printf("Dame el valor del exponente -> ");
scanf("%d", &exponente);
printf("%d elevado a %d es = %f", base, exponente, potencia(base, exponente));
return 0;
}


¿Cómo funciona el código?

Éste es el bloque recursivo:
double potencia (int x, int y) {
    double resultado;
        if(y == 0)
            resultado = 1;
        else
            resultado = x * potencia(x,y-1);
return resultado;
}


Variables tipo double para evitar algún desbordamiento. La función recibe 2 parametros:
int x = Base de la potencia
int y = Exponente de la potencia
Necesitamos otra variable double que será la que almacenara el resultado.
Es caso base es if (y==0)

Supongamos = 5^5 , entonces:



En este punto el caso base se cumple puesto que el exponente ( y ) es cero
double potencia (5, 0) {
  double resultado;
  0 == 0 (SE CUMPLE EL CASO BASE)
    REGRESA 1;

Ahora cada subrutina comenzara a resolverse con el valor la anterior le regresa y asi llegaremos al resultado



DESCARGA: Potencia.c

SALUDOS!! ^_^