domingo, 26 de septiembre de 2010

Lenguajes funcionales

Materia Lenguajes de Programación

Los lenguajes funcionales se basan en la declaración de funciones aritméticas, trata de ser un lenguaje expresivo y matemáticamente elegante.
Los programas escritos en lenguajes funcionales están compuestos únicamente por la definición de funciones, pero no se trata de subrutinas de un programa iterativo, si no más bien como funciones puramente matemáticas.
Los lenguajes funcionales son: Haskell, Miranda, R, Lisp, Scala, Scheme, ML, Erlang entre otros.

Lenguaje R
Es un lenguaje para análisis estadístico y gráfico creado por Ross Ihaka y Robert Gentleaman.
Los análisis gráficos pueden ser visualizados en su propia ventana, permitiendo ser guardada en varios formatos(pdf, png, etc), mientras que los resultados de análisis estadísticos los podemos ver en la misma pantalla.
Una vez instalado R(sudo apt-get install r-base) en nuestra computadora, es fácil empezar los primero que veremos es el cursor < listo para comenzar!

Lo que yo hice en R es una gráfica con valores al azar:

> x <- rnorm(10)
> y <- rnorm(10)
> plot(x, y)


Y esta es la ventana que muestra la gráfica:

Ahora una gráfica más personalizada, muestra nuestras calificaciones hasta ahora en la materia de Lenguajes de programación sin contar los puntos extras.

> Alumnos <- 1:34; Puntos <- c(11, 5, 4, 10, 9, 7, 3, 9, 11, 6, 5, 0, 0, 8, 11, 7, 2, 1, 8, 0, 6, 11, 8, 2, 8, 14, 4, 7, 0, 5, 0, 10, 10, 10); > plot(Alumnos, Puntos, pch=22, col="red", bg="yellow", main="Calificaciones Lenguajes")


Bueno una pequeña explicación, lo que estoy indicando es que Alumnos es una variable que contiene 34 posiciones, y puntos tambien tiene 34 pero con valores que yo le dí, la función plot(Alumnos, Puntos) es la que gráfica los datos.
Personalizar:
pch: Especifica que la gráfica será con determinada figura, en mi ejemplo utilicé la figura numero 22, pero bien pudo haber sido cualquier otra. En la siguiente imagen podemos ver las diferentes figuras a elegir:

col: Es el contorno de la figura elegida.
bg: Color de fondo.
main: Titulo del gráfico.

Y la gráfica resultante:



Lisp

Lisp es un lenguaje tipo funcional, es el segundo lenguaje de alto nivel más viejo, los dialectos de Lisp más ampliamente conocidos son el Scheme y Common Lisp.
El nombre Lisp viene de "LISt Processing" (Proceso de LIStas). Una de las estructuras de datos importante de Lisp son las listas encadenadas, el código fuente de lisp esta compuesto de listas.
Es un lenguaje útil para desarrollar la inteligencia artificial.

Para empezar a programar en Lisp lo primero que hice fué instalar clisp:

cecy@cecy-desktop:~$ sudo apt-get install clisp

Después escribo en el terminal clisp y aparece algo como esto:

Hice algunos ejercicios de recursión en lisp:

Fibonacci

[1]> (defun fibo (n)
(if (<= n 1)
n
(+ (fibo(- n 1)) (fibo(- n 2)))))
FIBO
[2]> (FIBO 5)
5
[3]> (FIBO 7)
13

Potencia
(defun potencia(base exponente)
(if(= exponente 0)
1
(* base (potencia base (- exponente 1))))
)
POTENCIA
Break 101 [103]> (POTENCIA 1 2)
1
Break 101 [103]> (POTENCIA 2 2)
4
Break 101 [103]> (POTENCIA 2 5)
32
Break 101 [103]> (POTENCIA 3 3)
27
Break 101 [103]> (POTENCIA 3 3)

Factorial
Break 114 [117]> (defun factorial(n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
FACTORIAL
Break 114 [117]> (FACTORIAL 5)
120


Y un tipo case en lisp:
Break 120 [123]> (defun funcion(n)
(cond ((= n 0) (print "Presionaste 0"))
((= n 1) (print "Presionaste 1"))) )
FUNCION
Break 120 [123]> (funcion 0)

"Presionaste 0"

martes, 7 de septiembre de 2010

Recursividad-LABORATORIO

Se llama recursividad a una función que se llama a sí misma.

Utilidad

Cuando se puede describir un problema de la misma naturaleza, aunque de menor complejidad.
Pero se tiene que conocer la solución no recursiva para el caso más sencillo, es decir el caso base y hacer que la división de nuestro problema acabe recurriendo al caso base.

¿Cómo es que funciona?
  • El problema se va descomponiendo en subproblemas cada vez de menor complejidad.
  • Se tiene que llegar al caso base.
  • Con las soluciones parciales se llega a la solución final.
Diseño de la función recursiva
  • Solución para el caso general, que es dónde se aplica la recursión y pueden añadirse otros pasos adicionales para juntar las soluciones parciales.
  • Solución para el caso base, debe existir por lo menos un caso base y no debe ser recursivo.
Aspectos a considerarse para decidir entre recursión o iteración
  • El tiempo que puede tardarse en realizar las recursiones y el uso de memoria.
  • La redundancia ya que algunas soluciones recursivas suelen resolver un problema en repetidas ocasiones.
  • Aveces es necesaria la recursión cuando es muy difícil de encontrar la solución iterativa.
  • La elegancia y legibilidad de una solucíon recursiva.

Ahora ejemplos para identificar los casos base y como funciona la recursión:

Factorial

Código:
#!/usr/bin/python
numero = int(input("Factorial de:"))

def factorial(numero):
if numero == 0: #Este es el caso base
return 1
else:
return numero * factorial(numero-1) #Caso general

print factorial(numero)


Su ejecución:

Potencia
Código:
#!/usr/bin/python

base = int(input("La base es:"))
exponente = int(input("El exponente es:"))

def potencia(base, exponente):
if exponente == 0: #Este es el caso base
return 1
else:
return base * potencia(base, exponente-1) #Caso general

print potencia(base, exponente)

Y su ejecución:


Fibonacci

Código:

#!/usr/bin/python
numero = int(input("Fibonacci de:"))
def fibonacci(numero):
if numero == 0: #Caso base
return 0
if numero == 1: #Caso base
return 1
else:
return fibonacci(numero-1) + fibonacci(numero-2) #Caso recursivo

print fibonacci(numero)

Su ejecución:


Torres de Hanoi
Y por último las Torres de Hanoi que fué el tema que me tocó exponer, hay dos casos recursivos el primero es el que se encarga básicamente de pasar los discos de la torre inicial a la torre temporal, y el segundo de la torre temporal a la torre final.
Aquí les dejo el código:
#!/usr/bin/python

ndiscos = int(input("Numero de discos:"))

def Hanoi(ndiscos, inicial, temporal, final):
if ndiscos > 0:
Hanoi(ndiscos-1, inicial, final, temporal)
print 'Se mueve de la torre', inicial, 'a la torre', final
Hanoi(ndiscos-1, temporal, inicial, final)

Hanoi(ndiscos, 1, 2, 3)


Su ejecución:

Descargas

lunes, 6 de septiembre de 2010

Segunda presentación

Torres de Hanoi

Hola compañeros, aquí les dejo mi presentación para mañana del tema de Torres de Hanoi, a mí me tocó dar la primera parte del tema (pseudocodigo) mis compañeros Juan Carlos, Roberto Carlos y Esteban ampliarán la información con ejemplos.





Aquí mi presentación en odp, pdf y .ppt

domingo, 5 de septiembre de 2010

Lenguajes de scripting - LABORATORIO

Hola compañeros, esta entrada es para el laboratorio de lenguajes de programación, subí algunos programas con los que estuve practicando sh y javascript.

SH
Como lo dijé en mi entrada de scripts para la materia, sh es un lenguaje que nos permite ahorrar tiempo en teclear algunos comandos que utilizamos muy seguido, en este caso mi programa lo que hace es ayudarme a organizar mis imagenes y programas, ya que por falta de tiempo algunas veces creo programas e imágenes para subirlas a mi blog pero las pongo en cualquier lugar(el lugar predeterminado) y se hacen muchos documentos en un mismo lugar de diferentes temas. Bueno aquí les dejo el código y mi programa para descargar.

#!/bin/sh
echo Vamos a ordenar!!
for i in $(ls); do
case $i in
*.png)
mv /home/cecy/$i /home/cecy/Pictures/$i;;
*.c)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/C/$i;;
*a.out)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/C/$i;;
*.java)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/Java/$i;;
*.class)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/Java/$i;;
*.py)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/Python/$i;;
*.awk)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/AWK/$i;;
*.pl)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/Perl/$i;;
*.sh)
mv /home/cecy/$i /home/cecy/LenguajesdProgra/Sh/$i;;
esac
done
echo Listo!!

Aquí la imágen de mis documentos antes de ejecutar el script:


Su ejecución:
cecy@cecy-desktop:~$ sh cambiacarpeta.sh
Vamos a ordenar!!
Listo!!
cecy@cecy-desktop:~$

y después de ejecutarlo(dentro de la carpeta C):



JAVASCRIPT
Javascript sirve para extender las capacidades del lenguaje HTML, no se puede desarrollar un programa en javascript fuera de algún navegador, es un lenguaje interpretado que se embebe en una pagina web HTML(Un lenguaje interpretado significa que las instrucciones las analiza y procesa el navegador en el momento en que deben ser ejecutadas).

En javascript hice dos programas en verdad muy sencillos uno consiste en una caja de texto en la que le escribes tu nombre y aparece una ventanita y te da un mensaje de bienvenida a mi blog. Para esto utilice los formularios de HTML text y button, una vez que el usuario teclee su nombre y de click al botón "confirmar", aparecerá la ventana. Descargar aquí.
>




Ingresa tu nombre:






Esta es una imágen de como se ve el script en mi blog:



Y el otro es un script que de acuerdo al día de la semana da un saludo, en este script utilice la clase Date, para obtener la fecha y luego el método getDay() para obtener el día de la semana 0 es domingo, 1 lunes, 2 martes y así hasta el sábado. El día de la semana entra al switch y según el día entra al case y da el mensaje asignado. Descargar aquí.




Y una imágen del script en mi blog:

sábado, 4 de septiembre de 2010

Tercer reporte(Lenguajes de scripting)

AWK
Realicé un programa en awk que ayuda con la sintaxis de los acentos en el lenguaje html. Lo primero que hice fué escribir el código abriendo desde emacs el archivo que llamé cambiahtml.awk . Como muchos sabemos poner los acentos en lenguaje html aveces es un poco tedioso ya que en vez de escribir la palabra simplemente con su acento se tiene que poner el código para ese carácter por ejemplo la palabra "arbol" es necesario escribir &aacute;arbol, para lograr ca,biar los acentos por su traduccion al html utilicé la funcion gsub(r, s), que sirve para intercambiar r por s.

#!/usr/bin/awk -f
{gsub("á","\\&aacute;");gsub("Á","\\&Aacute;");
gsub("é","\\&eacute;");gsub("É","\\&Eacute;");
gsub("í","\\&iacute;");gsub("Í","\\&Iacute;");
gsub("ó","\\&oacute;");gsub("Ó","\\&Oacute;");
gsub("ú","\\&uacute;");gsub("Ú","\\&Uacute;");
gsub("ñ","\\&ntilde;");gsub("N","\\&Ntilde;");
gsub("ü","\\&uuml;");gsub("Ü","\\&Uuml;");
print $0}
Para probar que mi programa funciona creé un documento al que llamé archivo.txt, y simplemente le pegué un texto cualquiera.
Después en el terminal tecleé el siguiente comando:
awk -f cambiahtml.awk archivo.txt > codigo.txt
lo que hacen estas instrucciones es que cambiahtml.awk cambia el texto que se encuentra en archivo.txt y la salida que se produce la mando a codigo.txt para poder ver como quedarón ya los acentos cambiados o para ver directamente en el navegador poniendo en vez de codigo.txt codigo.html:
awk -f cambiahtml.awk archivo.txt > codigo.html
Elegí awk para este programa, porque awk es un lenguaje ideal para el procesamiento de texto.


Sh
Lo que hace mi programa(CompyEjec.sh) en sh es compilar y ejecutar archivos de java, c, c++ o python. Elegí este lenguaje porque es muy útil para cuando se tienen que repetir los comandos en la terminal, así solamente se ejecuta el programa sh y ganas algo de tiempo, por ejemplo en el programa que realicé compilas y ejecutas en un solo paso.

#!/bin/sh
case $1 in
*.py)
echo Ejecutando $1
python $1 ;;
*.java)
echo Compilando y ejecutando $1
javac $1
java ${1%.java};;
*.c)
echo Compilando y ejecutando $1
gcc $1
./a.out;;

*.cpp)
echo Compilando y ejecutando $1
g++ $1 -o ${1%.cpp}
./${1%.cpp};;
*)
echo $1 archivo no válido ;;
esac
Explicación de mi código:
La línea de case $1 in lo que hace es tomar el primer argumento de la línea de ordenes(en este caso sería el nombre del programa que se quiere compilar y ejecutar), para entrar a las opciones del case se busca en el nombre del archivo los que contengan la extensión .py, .c, .cpp o .java y en el caso de que el archivo no contenga ninguna de estas extensiones se da un mensaje "archivo no válido".
Es muy probable que se estén preguntando que hacen las lineas que contienen un código parecido a esto java ${1%.java}, bueno como todos sabemos la forma de compilar un archivo .java es javac archivo.java y para ejecutarlo java archivo, entonces lo que yo necesité hacer para obtener solamente el nombre del archivo sin su extensión es cortar el .java con la expresión java${1%.java}, lo mismo para los arhivos en c y cpp.

Funcionamiento de mi programa
Primero se escribe el nombre de mi archivo .sh(CompyEjec.sh) y después el archivo que se quiere compilar y ejecutar, en este ejemplo el archivo tiene una extensión .txt por lo que es un archivo no válido

Ejemplo archivo .java


Ejemplo archivo.py

Ejemplo archivo.c

Ejemplo archivo.cpp


Perl
Y para Perl hice un programa(nprimos.pl) para identificar si un número es primo o no, decidí hacer este programa de números primos porque recuerdo que fué el primer programa que hice en C y me surgieron demasiadas dudas en cuanto a las declaraciones de variables y bucles, para este programa Perl investigué la forma en que se escribe el for, if y do..while.
Aquí les dejo el código de mi programa:

#!/usr/bin/perl

print "Numero primo o no?\n";

do{
$cont = 0;
print "Ingresa el numero\n";
$numero = <STDIN>;
for($i=1;$i<=$numero;$i++){
$x = $numero % $i;
if($x == 0){
$cont++;}
}
if($cont > 2 || $numero == 1 || $numero == 0){
print "No es numero primo\n";}
else{
print "Si es numero primo\n";}
print "¿Probar un numero mas? (Si=1 No=0)\n";
$op = <STDIN>;
}while($op == 1);
Y algunas ejecuciones:

Lenguajes de programación - Laboratorio

Entrada un poco atrasada, es de la semana en que todos presentamos algunos lenguajes de programación.

Para laboratorio he seleccionado PHP (que explicó mi compañero Juan Antonio en su blog) que es un lenguaje interpretado del lado del servidor, esto quiere decir que los programas escritos en PHP son ejecutados por el servidor web mediante un interprete antes de transferir al cliente que lo solicitó. Los programas escritos en PHP son directamente embebidos en en código HTML.
La forma de embeber el código PHP en HTML es utilizando etiquetas que señalan el inicio y fin del script.
Las dos formas de hacer eso es:
<?php................................
..........................................
..........................................
?>
o
<script languaje="php">
.........................................
.........................................
</script>

y bueno este es el código(tablas.php) que hice para practicar un poco php, en el que el for genera una tabla de multiplicar de manera muy sencilla.


Y su vista:
Y uno más en TCL que es un lenguaje script, lenguaje que explicó Guillermo en su blog, hice un programa que calcula el factorial de 10, pero haciendo uso del for y no de recursión.Primero la manera de ejecutarlo es:
cecy@cecy-desktop:~$ tclsh suma.tcl
El código de mi programa fac.tcl:


Y su ejecución:
cecy@cecy-desktop:~$ tclsh fac.tcl

3628800

Espero poder subir algo de Matlab luego.
Saludos.

viernes, 3 de septiembre de 2010

C++ (complemento)

Hola compañeros, como en mi entrada para el reporte 2 me hicieron algunos comentarios de sobrecarga de funciones en C++, voy a explicar más a detalle lo que es esto con un ejemplo.
C++ permite usar un mismo nombre para identificar funciones u operadores.
Sobrecarga de funciones en C++ se refiere al uso de un mismo nombre para varias funciones o operadores.
La forma de reconocer a cual función se hace llamada es por el número y tipo de argumentos y también hay funciones que devuelven tipos distintos.
Enseguida les muestro un ejemplo con sus comentarios, en el cual hay dos funciones con el mismo nombre (cubo) pero que reciben y retornan distintos tipos de datos, y es así como se hace la llamada a una función o a otra.

 //Sobrecarga de la funcion Cubo.
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int cubo (int); //prototipo de funcion sobrecargada
double cubo(double);//prototipo de funcion sobrecargada
int main()
{
int ix = 5;
double dx = 1.5;
cout << "El cubo de "<< ix << " es "<<cubo(ix) << endl;
//el compilador al ver un valor int elige la funcion
cout << "El cubo de " << dx << " es " <<cubo (dx) << endl;
//la llamada es igual con un valor double.
;return 0;
}
int cubo (int y ) //Funcion sobrecargada para valores int
{
return y*y*y;
}
double cubo (double y) //Funcion sobrecargada para valores double
{
return y*y*y;
}
Esta es la página donde encontré el código