1.2.1 Evaluación de
expresiones en diferentes lenguajes
¿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
1.2.2 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í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.
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.
“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.2.4 Funciones
EL concepto de función tiene su origen
en el término latino functĭo. La palabra puede ser utilizada en diversos
ámbitos y con distintos significados.
Por otra parte, una función
matemática es la correspondencia o relación f de los elementos de un conjunto A
con los elementos de un conjunto B. Una función cumple con la condición de
existencia (todos los elementos de A están relacionados con los elementos de B)
y con la condición de unicidad (cada elemento de A está relacionado con un
único elemento de B).
En la informática, más precisamente
en los lenguajes de programación, una función es un tipo de subalgoritmo que
describe una secuencia de órdenes. Estas órdenes cumplen con una tarea
específica de una aplicación más grande.
Un problema
complejo se puede dividir en pequeños subproblemas mas sencillos. Estos
subproblemas se conocen como “Módulos” y su complementacion en un lenguaje se
llama subprograma (procedimientos y funciones).
Un subprograma
realiza las mismas acciones que un programa, sin embargo, un subprograma lo
utiliza solamente un programa para un propósito especifico.
Un subprograma
recibe datos de un programa y le devuelve resultados (el programa “llama” o
“invoca” al subprograma, este ejecuta una tarea especifica y devuelve el
“control” al programa que lo llamo).
Función: Una
función en matemáticas, es una operación que toma un o mas valores (argumentos)
y devuelve un resultado (valor de la función para los argumentos dados). Por
ejemplo:
F(X) = X / (1+X2)
Donde:
F ………….. Nombre de
la función
X …………. Es el
argumento (también conocido como parámetro formal)
Definición de
funciones: Una definición de función se presenta de la siguiente manera:
Función
nombre_funcion (p1, p2, …, pn)
Inicio
Bloque de
instrucciones
Fin
Donde:
Función …………… Es
la palabra clave que nos indica una definición de función.
Nombre_funcion …..
Es el identificador con el cual se reconoce a la función en el cuerpo del
algoritmo
principal.
P1,p2,…,pn ……… Es
el grupo de parámetros que define a la función.
Llamado a una
función
Cuando definimos
una función solo le indicamos al algoritmo que esta función existe, pero una
definición de función no implica la realización de las instrucciones que la
constituyen. Para hacer uso de una función, el algoritmo principal la debe
llamar. Por ejemplo:
Función F(X)
Inicio
F = X /(1 + X^2)
Fin
Inicio
Imprimir “Este es
el algoritmo principal”
Leer N
R = F(N) llamado
de la función
Imprimir “El
resultado de la función es:”,R
Fin