viernes, 17 de febrero de 2017

Unidad 1 Lógica Proposicional



1.1 Estilos de programación.

El código de un programa lo leen muchas personas, bien para repararlo, bien para ampliarlo o, simplemente, para evaluarlo. Para estos lectores es fundamental que el programa esté bien redactado, con estilo, para que su significado sea claro y diáfano.
Al igual que cuando aprendemos redacción literaria, una forma excelente de adquirir un buen estilo es leer textos ajenos. Es por ello que recomendamos al alumno la lectura, y aún estudio, de programas existentes. Un programa puede escribirse con mejor o peor estilo. En estas notas intentaremos concretar qué se entiende por un programa bien escrito.
Que un programa funcione o no es en buena medida independiente de que esté bien o mal escrito. No obstante:
   1.    un programa mal escrito tiene una probabilidad mayor de no funcionar correctamente

        un buen estilo facilita la corrección.
2.    es imposible depurar un programa mal escrito.

3.    es imposible mantener un programa mal escrito.


Ordenación y estilo.

Se seguirá una convención coherente sobre:
  1. Capitalización de palabras clave
  2. Capitalización de variables locales, variables globales y constantes.
  3. Nivel de sangrado (número de espacios usados por cada nivel).
  4.   Ordenación de las declaraciones de tipos compuestos (registros, objetos, etc.
  5. Ordenación de las sentencias case.

Bajo ningún concepto se seguirá un estilo de codificación que induzca a interpretaciones.



ALINEACIÓN Y SANGRADO.
  1. · Los sangrados se realizarán siempre con tabuladores y nunca con espacios
  2. .Se sangrará un único tabulador por nivel. 
  3.  Los diferentes editores permiten configurar posteriormente el tamaño en caracteres de ese tabulador.

·        Se deberá usar uno de los dos estilos siguientes de sangrado:
d

Se recomienda el sangrado por bloques puros. En Java, este sangrado es obligatorio dado que coincide con la recomendación oficial de Sun (Sun Microsystems 1999).

Se tolera el uso de cláusulas Then continuadas en la misma línea cuando no excedan la anchura de la página:


En las declaraciones de tipos compuestos, se recomienda sangrar respecto al inicio de la línea y no respecto a la palabra clave o el nombre de tipo. Es decir, usar:


En lugar de:


O de :


En las sentencias switch, se recomienda sangrar respecto a la palabra que selecciona la acción en lugar de respecto al inicio de la acción. Es decir, usar:


En lugar de:


Sentencias continuadas a más de una linea

Cuando una sentencia tenga que partirse en más de una linea, el punto de partición se elegirá de forma que quede claro que la primera linea tiene continuidad en la siguiente. Por ejemplo:


En lugar de:


Agrupamiento

Los trozos de código dentro de una rutina o bloque deberán separarse con líneas en blanco cuando el objetivo o intención de cada uno de ellos sea diferente.

En las sentencias If, While, Until, cuando las expresiones condicionales sean muy largas, se agruparán de forma que cada sub-condición esté en una línea aparte, sangrada al nivel del inicio de la primera condición:


En las declaraciones de variables, no se harán agrupaciones por tipos. Es decir, cada variable deberá estar con su tipo. Por ejemplo, el siguiente código no es admisible:


Debiendo sustituirse por:

Comentarios

Los comentarios deberán tener el mismo nivel de sangrado que el código que comentan.

La métrica CP (Comment Percentage) se define como el número de líneas de comentario
dividida por el número de líneas no blancas de código. Un nivel apropiado para esta métrica está en torno al 20% (Rosenberg y Hyatt 1995).

 Los comentarios deben escribirse de forma que sean fáciles de modificar. Por ejemplo, los siguientes comentarios son difíciles de cambiar:


El motivo es que el más mínimo cambio requerirá un tedioso trabajo de volver a recuadrar con asteriscos el resultado.

Otro ejemplo de comentario difícil de mantener es: Los comentarios deben escribirse de forma que sean fáciles de modificar. Por ejemplo, los siguientes comentarios son difíciles de cambiar:


1.2 Evaluación de expresiones

Una expresión es una combinación de operadores y operandos de cuya evaluación se obtiene un valor. Los operandos pueden ser nombres que denoten objetos variables o constantes, funciones, literales de cualquier tipo adecuado de acuerdo con los operadores u otras expresiones más simples. La evaluación de una expresión da lugar a un valor de algún tipo, una expresión se dice que es del tipo de su resultado. Para evaluar una expresión es necesario conocer la prioridad de los operadores, con lo cual se puede determinar cuál operación se va a realizar antes que las demás.


Las expresiones se evalúan de acuerdo con la precedencia de los operadores. Ante una secuencia de operadores de igual precedencia, la evaluación se realiza según el orden de escritura, de izquierda a derecha. El orden de evaluación puede modificarse usando paréntesis.

Tipos de expresiones:

Dentro de las expresiones distinguimos dos clases según el tipo de datos que devuelven al evaluarlas
  1. ·         Aritméticas: las que devuelven un valor numérico
  2. ·         Lógicas: las que devuelven true o false

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.

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.

Como contenido auxiliar les dejamos este vídeo sobre el mismo tema.


1.3 Definición de funciones

La mejor manera de desarrollar y mantener un programa grande es construirlo a partir de piezas pequeñas o módulos, los cuales son más manejables que el programa original.

El programador puede escribir funciones para definir tareas específicas que se podrían utilizar en muchos puntos del programa. A éstas se les llama funciones definidas por el programador. Las instrucciones reales que definen a las funciones se escriben solamente una vez, y están ocultas a las demás funciones.

Ejemplos de funciones en C.


A continuación los enteros se pasan a máximo (línea 19), la cual determina el entero más grande.


1.4 Disciplina de tipos

“Los tipos se infieren, es decir se comprueban, de forma estática, en tiempo de compilación.”
En los lenguajes de programación con disciplina de tipos, cada tipo representa una colección de valores o datos similares. El conocer los tipos de las funciones ayuda a documentar los programas y evitar errores en tiempo de ejecución.
Un lenguaje tiene disciplina de tipos si los errores de tipos se detectan siempre es necesario determinar los tipos de todos los operandos, ya sea en tiempo de compilación o de ejecución

Pascal
  • ·         Cercano a tener disciplina de tipos pero no realiza comprobación de tipos en los registros variantes (incluso puede omitirse la etiqueta discriminatoria en dichos registros)

Ada
  • ·        Resuelve el problema de los registros variantes realizando comprobación dinámica de tipos (sólo en este caso).
  • ·   Tiene una función de biblioteca que permite extraer un valor de una variable de cualquier tipo (como una cadena de bits) y usarlo como un tipo diferente (no es una conversión de tipos) se trata de una suspensión temporal de la comprobación de tipos

C
  • No tiene disciplina de tipos por:
  • No se realiza comprobación de tipos sobre las uniones.
  • Permite funciones con parámetros sobre los que no se realiza comprobación de tipos


Java
  • ·         Tiene disciplina de tipos (no hay uniones)


ML y Haskell

·        Poseen disciplina de tipos, Los tipos de los parámetros de las funciones (y de estas mismas) se conocen en tiempo de compilación (ya sea por declaración del usuario o por inferencia de tipos).

Haskell y otros lenguajes funcionales utilizan el sistema de tipos de Milner, que tiene dos características fundamentales:

Disciplina estática de tipos: Los programas bien tipados se pueden conocer en tiempo de compilación. Un programa bien tipado se puede utilizar sin efectuar comprobaciones de tipo en tiempo de ejecución, estando garantizado que no se producirán errores de tipo durante el computo.

Polimorfismo: Permite que una misma función se pueda aplicar a parámetros de diferentes tipos, dependiendo del contexto en el que la función se utilice.

1.5 Tipos de datos

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.

Los Tipos de Datos 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ícitamente 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.

Tipos De Datos
Todos los datos tienen un tipo asociado con ellos. Un dato puede ser un simple carácter, tal como `b’, un valor entero tal como 35. El tipo de dato determina la naturaleza del conjunto de valores que puede tomar una variable.
  • ·         Numéricos
  • ·         Simples Lógicos
  • ·         Alfanuméricos (string)
Tipos de Datos Simples:
  • ·    Datos Numéricos: Permiten representar valores escalares de forma numérica, esto incluye a los números enteros y los reales. Este tipo de datos permiten realizar operaciones aritméticas comunes.
  • ·        Datos Lógicos: Son aquellos que solo pueden tener dos valores (cierto o falso) ya que representan el resultado de una comparación entre otros datos (numéricos o alfanuméricos).
  • ·   Datos Alfanuméricos (String): Es una secuencia de caracteres alfanuméricos que permiten representar valores identificables de forma descriptiva, esto incluye nombres de personas, direcciones, etc. Es posible representar números como alfanuméricos, pero estos pierden su propiedad matemática, es decir no es posible hacer operaciones con ellos. Este tipo de datos se representan encerrados entre comillas.

A continuación una pequeña lista con diferentes tipos de valores y unas características:


REFERENCIAS


José A. Mañas. (8 de mayo, 2003). Estilo de Programación. 2003, de Universidad Politécnica de Madrid Sitio web: http://www.lab.dit.upm.es/~lprg/material/apuntes/doc/estilo.htm


Tania Marlene Coronado LopezMenú Saltar al contenido. (12 de febrero del 2014). ESTILOS DE PROGRAMACIÓN. 2014, de WordPress.com. Sitio web: https://programacionlogicayfuncional.wordpress.com/2014/02/12/estilos-de-programacion/

Sonia Joaquín Trejo Paola Marquez Alfredo. (Friday, March 4, 2016). PROGRAMACIÓN LÓGICA Y FUNCIONAL. 2014, de http://programacionlogyfun.blogspot.mx Sitio web: http://programacionlogyfun.blogspot.mx/2016/03/programacion-logica-y-funcional-la.html

Tania Marlene Coronado LopezMenú Saltar al contenido.. (12 de febrero del 2014). EVALUACION DE EXPRESIONES EN DIFERENTES LENGUAJES. 2014, de https://programacionlogicayfuncional.wordpress.com Sitio web: https://programacionlogicayfuncional.wordpress.com/2014/02/12/evaluacion-de-expresiones/

Paul Deitel, Harvey Deitel. (2004). Como Programar en C, C++ y Java . United States: Prentice Hall.

Diana Avila. (2017). 176565687-Disciplina-de-Tipos. 2017, de Instituto tecnologico de Huehuetan Sitio web: https://www.academia.edu/8497501/176565687-Disciplina-de-Tipos

Karla Ortega . (12 de febrero de 2014). UNIDAD 1: CONCEPTOS FUNDAMENTALES. 2014, de .blogspot.mx Sitio web: http://karlaprogramacionfuncional.blogspot.mx/2014/02/unidad-1-conceptos-fundamentales.html

Alejandra IR, Horeb RL.. (2 de marzo de 2016). 1.5 Tipos de Datos. 2016, de blogspot.mx Sitio web: http://prolog-fun.blogspot.mx/2016/03/15-tipos-de-datos.html