lunes, 25 de febrero de 2019

Funciones.

DEFINICIÓN DE FUNCIONES.

Una función es una aplicación que toma uno o más argumentos y devuelve un valor.
 Es una correspondencia en la que cada elemento del dominio está relacionado con un único elemento de la imagen.
• Ejemplo de definición de función en Haskell:
doble x = x * x
• Notación matemática: f(a, b) + cd
• Notación Haskell: f a b + c * d
• Los paréntesis se utilizan para agrupar expresiones:
• Notación matemática: f(x, g (y))
• Notación Haskell: f x (g y)
 Las definiciones se incluyen en ficheros de texto. Se acostumbra a identificar dichos ficheros mediante el sufijo .hs.
 Los nombres de funciones tienen que empezar por una letra en minúscula.
 En Haskell la disposición del texto del programa (el sangrado) delimita las definiciones mediante la siguiente regla:
·         Una definición acaba con el primer trozo de código con un margen izquierdo menor o igual que el del comienzo de la definición actual.
·         Un comentario simple comienza con -- y se extiende hasta el final de la línea.
·         Un comentario anidado comienza con {- y termina en -}
máximo x y z=max x( max y z)  {- ejemplo de una definición y un comentario }

La manera más fácil de definir funciones es por combinación de otras funciones:
 fac n = product [1..n]
impar x = not (even x)
 cuadrado x = x*x
suma_de_cuadrados lista = sum (map cuadrado lista) 
Las funciones pueden tener más de un parámetro:
 comb n k = fac n / (fac k * fac (n-k))
formulaABC a b c = [ (-b+sqrt(b*b-4.0*a*c)) / (2.0*a)
  , (-b-sqrt(b*b-4.0*a*c)) / (2.0*a)]

 Las funciones sin parámetros se llaman normalmente constantes:
 pi = 3.1415926535
 e = exp 1.0

Toda definición de función tiene por tanto la siguiente forma:
 • El nombre de la función
• Los nombres de los parámetros (si existen)
• El símbolo =
 • una expresión, que puede contener los parámetros, las funciones estándar y otras funciones definidas. 
Una función que tiene un valor booleano como resultado, tiene a la derecha del símbolo = una expresión con un valor booleano:

negativo  x = x < 0
positivo   x = x > 0
esCero     x = x == 0
Note la diferencia en el anterior ejemplo entre  y  ==. El símbolo = separa la parte izquierda de la parte derecha de la definición. El símbolo == es un operador, como < y >.


Disciplina de datos.

La programación de computadoras, he enfrentado toda clase de paradigmas e ideas. Por ejemplo, están los lenguajes imperativos, de cuarta generación que les dicen, en donde el programador debe decirle al sistema, mediante instrucciones muy precisas, qué queremos que haga la máquina. Así, tenemos que ver esta serie de instrucciones como un algoritmo, una especie de receta de cocina que se debe ejecutar rigurosamente para obtener los resultados deseados.

Para ello hay lenguajes como Pascal o C, el segundo quizás el más popular en el mundo, en donde la expresividad del lenguaje permite hacer muchísimas cosas. Los lenguajes modernos deben contar con estructuras de datos dinámicas, que permiten, en muchos casos, una manera mucho más eficiente de hacer programas y de hacer que estos convivan unos con otros dentro del mismo sistema operativo. Por ello mismo, cuando llegan alumnos que me dicen que programan en Visual Basic, o cualquier variedad de Basic les indico que eso no califica como lenguaje, sino como un “dialecto” de “la tierra primitiva”. Y no exagero. Basic en cualquier modalidad adolece de las estructuras dinámicas asociadas a los lenguajes modernos. Sí, es cierto que Visual Basic ha incorporado algunas ideas de esta naturaleza, pero el problema es que no son estándar, sino que dependen de cada implementación. Por ende, es probable que un programa escrito en Visual Basic sea prácticamente imposible de portar a otro Basic en otra máquina, para hablar de alguna de las deficiencias. Igualmente, la incorporación de apuntadores (o punteros, como suelen decirles en los libros españoles), es bastante primitiva y de difícil uso. Aún así, la popularidad del Basic es evidente porque permite generar prototipos rápidamente, aunque no se utilicen las mejores capacidades expresivas de otros lenguajes.

Otros lenguajes han sido desarrollados para hacer aplicaciones para la Internet, para páginas web y ahí hay cientos de lenguajes de todo género. Tenemos Java, creado por Sun Microsystems, que permite programar prácticamente en cualquier plataforma pues Mac, PC, Linux, o incluso sistemas en computadoras de alto desempeño. Para ello Sun escribió –para cada plataforma– un intérprete de java, que es una máquina virtual. El intérprete está escrito para una implementación única en cada sistema operativo y por ende los programas en Java son portables de una máquina a otra. Además, la cantidad de bibliotecas de funciones para todo género de aplicaciones es extraordinaria. Se cuentan por miles y hay para todas las necesidades. Java tiene sintaxis mezclada de C y Pascal, por lo que la curva de aprendizaje es menor. Además, funciona en un “sandbox”, una especie de caja cerrada en donde la aplicación corre, impidiendo que se puedan crear virus malignos. Es quizás una de las mejores herramientas para programar en la web.

Hay otros lenguajes, como PHP, que es un sistema para generar páginas dinámicas, es decir, páginas que cambian de acuerdo a las necesidades y peticiones de los usuarios. Por ejemplo, Amazon, la tienda virtual de libros, tiene un gran sistema de bases de datos y cada usuario ve cosas diferentes de acuerdo a las peticiones y búsquedas que hacen al sistema. PHP se encarga de presentar los resultados personalizados para cada usuario. Y aunque este sistema es muy robusto y además, se lleva muy bien con MySQL, un manejador de bases de datos escrito para la web, tiene el inconveniente de que es muy poco estricto con los tipos de datos. Así, una variable entera puede recibir un dato de punto flotante o incluso como cadena de caracteres. Eso va contra la disciplina en programación pues da pie a muchísimos errores porque las variables intercambian su propiedad inicial de ser reales, enteras, de caracteres o de cadenas de caracteres. Es difícil “debugear”, es decir, depurar los programas en PHP por este simple hecho de que las variables cambian de tipo y van contra la disciplina en programación. Y aunque es un lenguaje con muchas aplicaciones interesantes, PHP no es un buen candidato para enseñar a nadie a programar.

Tipos de datos.

En lenguajes de programación un tipo de dato es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar.

En un sentido amplio, un tipo de datos define un conjunto de valores y las operaciones sobre estos valores. Casi todos los lenguajes de programación explícita mente incluyen la notación del tipo de datos, aunque lenguajes diferentes pueden usar terminología diferente. La mayor parte de los lenguajes de programación permiten al programador definir tipos de datos adicionales, normalmente combinando múltiples elementos de otros tipos y definiendo las operaciones del nuevo tipo de dato. Por ejemplo, un programador puede crear un nuevo tipo de dato llamado "Persona" que especifica que el dato interpretado como Persona incluirá un nombre y una fecha de nacimiento.

Un tipo de dato entero en computación es un tipo de dato que puede representar un subconjunto finito de los números enteros. El número mayor que puede representar depende del tamaño del espacio usado por el dato y la posibilidad (o no) de representar números negativos. Los tipos de dato entero disponibles y su tamaño dependen del lenguaje de programación usado así como la arquitectura en cuestión. Por ejemplo, si para almacenar un número entero disponemos de 4 bytes de memoria tememos que:4 Bytes = 4x8 = 32 bits Con 32 bits se pueden representar 232=4294967296 valores: Sólo positivos: del 0 al 4294967295 Positivos y negativos: del -2147483648 al 2147483647

Tipos de datos en coma flotante Se usan para representar números con partes fraccionarias. Hay dos tipos de coma flotante: float y double. El primero reserva almacenamiento para un número de precisión simple de 4 bytes y el segundo lo hace para un numero de precisión doble de 8 bytes.Tipo:float4 Bytes (32 bits)double8 Bytes (64 bits)

Tipo de dato carácter (Char)Es cualquier signo tipográfico, puede ser una letra, un número, un signo de puntuación o un espacio. Este término se usa mucho en computación.Un valor de tipo carácter es cualquier carácter que se encuentre dentro del conjunto ASCII ampliado, el cual está formado por los 128 caracteres del ASCII más los 128 caracteres especiales que presenta, en este caso, IBM.
Los valores ordinales del código ASCII ampliado se encuentran en el rango de 0 a 255. Dichos valores pueden representarse escribiendo el carácter correspondiente encerrado entre comillas simples (apóstrofos).Así, podemos escribir:'A' < 'a‘Que significa: "El valor ordinal de A es menor que el de a" o "A está antes que a"Un valor de tipo carácter (char en inglés) se guarda en un byte de memoria.La única operación (además de las relacionales) que podemos hacer con caracteres es la concatenación concatenando dos caracteres, por ejemplo 'a' y 'X' obtendríamos la cadena "aX".

Tipo de dato lógico El tipo de dato lógico o booleano es en computación aquel que puede representar valores de lógica binaria, esto es, valores que representen falso o verdadero. Se utiliza normalmente en  programación, estadística, electrónica, matemáticas (Álgebra booleana), etc...Para generar un dato o valor lógico a partir de otros tipos de datos, típicamente, se emplean los operadores relacionales (u operadores de relación), por ejemplo: 0 es igual a falso y 1 es igual a verdadero(3>2)= 1 = verdadero(7>9)= 0 = falso

Palabra reservada una palabra reservada es una palabra que tiene un significado Gramatical especial para ese lenguaje y no puede ser utilizada como un identificador en ese lenguaje.

Por ejemplo, en SQL, un usuario no puede ser llamado "group", porque la palabra group es usada para indicar que un identificador se refiere a un grupo, no a un usuario. Al tratarse de una palabra clave su uso queda restringido.Ocasionalmente la especificación de un lenguaje de programación puede tener palabras reservadas que están previstas para un posible uso en futuras versiones. En Java const y goto son palabras reservadas — no tienen significado en Java, pero tampoco pueden ser usadas como identificadores. Al reservar los términos pueden ser implementados en futuras versiones de Java, si se desea, sin que el código fuente más antiguo escrito en Java deje de funcionar.


Evaluación de Expresiones.

¿QUE SON LAS EXPRESIONES?
  • Son el método fundamental que tiene el programador de expresar computaciones.
  • Las expresiones están compuestas de operadores, operandos, paréntesis y llamadas a funciones. Los operadores pueden ser:
  • Unarios: Cuando tan solo tienen un operando. Son operadores prefijos.
  • Binarios: 2 Operandos. Son operadores infijos.
  • Ternarios: 3 operandos.
ORDEN DE LA EVALUACIÓN DE LOS OPERADORES.
  • El orden en que se evalúan los operandos viene dado por unas reglas:
  • Reglas de procedencia
  • Reglas de asociatividad
  • Uso de paréntesis
EVALUACIÓN DE EXPRESIONES
Toda expresión regresa un valor. Si hay más de un operador, se evalúan primero operadores mayor precedencia, en caso de empate, se aplica regla asociatividad
Para evaluar una expresión no hay que hacer nada del otro mundo, pues es bien sencillo. Sólo hay que saber sumar, restar, si un número es mayor que otro
Hay tres reglas de prioridad a seguir para evaluar una expresión:
  • Primero, los paréntesis (si tiene)
  • Después, seguir el orden de prioridad de operadores
  • Por último, si aparecen dos o más operadores iguales, se evalúan de izquierda a derecha.
Las expresiones son secuencias de constantes y/o variables separadas por operadores válidos.
Se puede construir una expresión válida por medio de :
1. Una sola constante o variable, la cual puede estar precedida por un signo + ó – .
2. Una secuencia de términos (constantes, variables, funciones) separados por operadores.
Además debe considerarse que:
Toda variable utilizada en una expresión debe tener un valor almacenado para que la expresión, al ser evaluada, dé como resultado un valor.
Cualquier constante o variable puede ser reemplazada por una llamada a una función.
Como en las expresiones matemáticas, una expresión en Pascal se evalúa de acuerdo a la precedencia de operadores
JERARQUÍA DE OPERADORES
El orden general de evaluación de los operadores de una expresión va de izquierda a derecha, con la excepción de las asignaciones que lo hacen de derecha a izquierda.
Podemos seguir las siguientes tres reglas de evaluación de expresiones:
(Regla 1) En todas las expresiones se evalúan primero las expresiones de los paréntesis más anidados (interiores unos a otros); y éstos modifican la prioridad según la cantidad de éstos, los cuales tienen que estar balanceados (el mismo número de paréntesis que abren debe ser igual al número de los paréntesis que cierran).
(Regla 2) Todas las expresiones se evalúan tomando en cuenta la jerarquía de los operadores.
(Regla 3) Todas las expresiones se evalúan de izquierda a derecha.
¿QUÉ HACEN LOS LENGUAJES DE PROGRAMACIÓN AL RESPECTO?
C permite evaluación de circuito corto con los operadores booleanos.
PASCAL no permite evaluación de circuito corto. No se pueden usar sentencias del siguiente tipo:
A:array[1..10] of integer;
If (i<=10) and (a[i]>0) then
Porque se accede a una posición no válida de un array.
ADA: “and”, “or” no son operaciones de circuito corto y “or them” y “and them” si son operaciones de circuito corto.
If (i<=10) and them (a[i]>0) them
Tabla de evaluación de C++ :

Tabla de evaluación de Java:

miércoles, 20 de febrero de 2019

Información sobre los tipos de programación.

Programación estructurada (PE) 

La programación estructurada esta compuesta por un conjunto de técnicas que han ido evolucionando aumentando considerablemente la productividad del programa reduciendo el tiempo de depuración y mantenimiento del mismo. 

Esta programación estructurada utiliza un número limitado de estructuras de control, reduciendo así considerablemente los errores. 

Esta técnica incorpora: 

  • Diseño descendente (top-dow): el problema se descompone en etapas o estructuras jerárquicas.
  • Recursos abstractos (simplicidad): consiste en descompones las acciones complejas en otras más simples capaces de ser resueltas con mayor facilidad.
  • Estructuras básicas: existen tres tipos de estructuras básicas:
    • Estructuras secuenciales: cada acción sigue a otra acción secuencial mente. La salida de una acción es la entrada de otra.
    • Estructuras selectivas: en estas estructuras se evalúan las condiciones y en función del resultado de las mismas se realizan unas acciones u otras. Se utilizan expresiones lógicas.
    • Estructuras repetitivas: son secuencias de instrucciones que se repiten un número determinado de veces.

Las principales ventajas de la programación estructurada son: 

  • Los programas son mas fáciles de entender
  • Se reduce la complejidad de las pruebas
  • Aumenta la productividad del programador
  • Los programas queden mejor documentados internamente.

Un programa esta estructurado si posee un único punto de entrada y sólo uno de salida, existen de "1 a n" caminos desde el principio hasta el fin del programa y por último, que todas las instrucciones son ejecutables sin que aparezcan bucles infinitos. 

Programación modular 

En la programación modular consta de varias secciones dividas de forma que interactúan a través de llamadas a procedimientos, que integran el programa en su totalidad. 

En la programación modular, el programa principal coordina las llamadas a los módulos secundarios y pasa los datos necesarios en forma de parámetros. 

A su vez cada modulo puede contener sus propios datos y llamar a otros módulos o funciones. 

Programación orientada a objetos (POO) 

Se trata de una técnica que aumenta considerablemente la velocidad de desarrollo de los programas gracias a la re utilización de los objetos. 

El elemento principal de la programación orientada a objetos es el objeto. 
El objeto es un conjunto complejo de datos y programas que poseen estructura y forman parte de una organización. 
Un objeto contiene varios datos bien estructurados y pueden ser visibles o no dependiendo del programador y las acciones del programa en ese momento. 

El polimorfismo y la herencia son unas de sus principales características y por ello dedicaremos más adelante un artículo exclusivamente a tratar estos dos términos.  

Programación concurrente 

Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la vez. 

Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de forma simultanea. 

Se trata de una programación más lenta y laboriosa, obteniendo unos resultados lentos en las acciones. 

Programación funcional 

Se caracteriza principalmente por permitir declarar y llamar a funciones dentro de otras funciones. 

Programación lógica 

Se suele utilizar en la inteligencia artificial y pequeños programas infantiles. Se trata de una programación basada en el cálculo de predicados (una teoría matemática que permite lograr que un ordenador basándose en hecho y reglas lógicas, pueda dar soluciones inteligentes).

Programación imperativa o por procedimientos: 
Es el más usado en general, se basa en dar instrucciones al ordenador de como hacer las cosas en forma de algoritmos. La programación imperativa es la más usada y la más antigua, el ejemplo principal es el lenguaje de máquina. Ejemplos de lenguajes puros de este paradigma serían el CBASIC o Pascal.

Programación dinámica: está definida como el proceso de romper problemas en partes pequeñas para analizarlos y resolverlos de forma lo más cercana al óptimo, busca resolver problemas en O(n) sin usar por tanto métodos recursivos. Este paradigma está más basado en el modo de realizar los algoritmos, por lo que se puede usar con cualquier lenguaje imperativo.

Programación dirigida por eventos: la programación dirigida por eventos es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema, definidos por el usuario o que ellos mismos provoquen.

Programación declarativa: está basado en describir el problema declarando propiedades y reglas que deben cumplirse, en lugar de instrucciones. 

Mapa mental sobre los tipos de programación.


Resultado de examen.