apuntes de lenguajes de programación

77
T EMA 1: Introducción a los lenguajes de programación 1.1. Concepto de un lenguaje de programación El termino alfabeto denota cualquier conjunto finito de símbolos. Una cadena sobre algún alfabeto es un secuencia finita de símbolos tomados de ese alfabeto. Por lo tanto, el término lenguaje se refiere a cualquier conjunto de cadenas de un alfabeto finito que cumple con ciertas reglas gramaticales. Cualquier notación para describir algoritmos y estructuras de datos se puede calificar como lenguaje de programación. Los componentes de software se construyen mediante lenguajes de programación que tiene un vocabulario limitado, una gramática definida explícitamente y reglas bien formadas de sintáxis y semántica. Estos atributos son esenciales para la traducción hecha por la máquina. Las clases de lenguajes que se utilizan actualmente son los lenguajes máquina o de bajo nivel, los lenguajes de alto nivel y los lenguajes no procedimentales. Los lenguajes máquina son una representación simbólica del conjunto de instrucciones de la CPU. Si un programador produce programas mantenibles y bien documentados, puede utilizar el lenguaje máquina para hacer un uso extremadamente eficiente de la memoria y para optimizar la velocidad de ejecución del programa. Pero si el programa esta mal diseñado y tiene poca o nada documentación, el lenguaje máquina puede convertirse en una pesadilla. El lenguaje ensamblador es un ejemplo de lenguaje máquina. Los lenguajes de alto nivel permiten al programador y al programa independizarse de la máquina, ya

Upload: miguel-angel-olvera-garcia

Post on 12-Nov-2015

9 views

Category:

Documents


0 download

DESCRIPTION

Apuntes de lenguajes de Programación

TRANSCRIPT

T EMA 1:

T EMA 1: Introduccin a los lenguajes de programacin

1.1. Concepto de un lenguaje de programacinEl termino alfabeto denota cualquier conjunto finito de smbolos. Una cadena sobre algn alfabeto es un secuencia finita de smbolos tomados de ese alfabeto. Por lo tanto, el trmino lenguaje se refiere a cualquier conjunto de cadenas de un alfabeto finito que cumple con ciertas reglas gramaticales.Cualquier notacin para describir algoritmos y estructuras de datos se puede calificar como lenguaje de programacin. Los componentes de software se construyen mediante lenguajes de programacin que tiene un vocabulario limitado, una gramtica definida explcitamente y reglas bien formadas de sintxis y semntica. Estos atributos son esenciales para la traduccin hecha por la mquina. Las clases de lenguajes que se utilizan actualmente son los lenguajes mquina o de bajo nivel, los lenguajes de alto nivel y los lenguajes no procedimentales.Los lenguajes mquina son una representacin simblica del conjunto de instrucciones de la CPU. Si un programador produce programas mantenibles y bien documentados, puede utilizar el lenguaje mquina para hacer un uso extremadamente eficiente de la memoria y para optimizar la velocidad de ejecucin del programa. Pero si el programa esta mal diseado y tiene poca o nada documentacin, el lenguaje mquina puede convertirse en una pesadilla. El lenguaje ensamblador es un ejemplo de lenguaje mquina.Los lenguajes de alto nivel permiten al programador y al programa independizarse de la mquina, ya que utilizan instrucciones similares a las de los lenguajes utilizados entre los humanos para comunicarse, como el ingls, y se pueden ejecutar en diversos tipos de computadoras. FORTRAN, Pascal, C, etc. son lenguajes de alto nivel.

1.2. Paradigmas de programacin

Los llamados paradigmas de programacin son conceptualizaciones genricas, que renen en un nombre a distintos lenguajes y tcnicas empleados para escribir programas. En otras palabras, definiremos como Paradigma de software a un conjunto de reglas que establecen la forma para analizar, disear y escribir programas. La diferencia entre los lenguajes que pertenecen a uno u otro paradigma de programacin radica en la manera en que se orientan a la resolucin del problema y a la forma en que hacen referencia a los datos.En este subtema identificaremos los diferentes paradigmas de programacin y veremos algunos ejemplos de cdigos de los lenguajes ms representativos de cada uno de ellos.

1.2.1 ProceduralesEs tambin conocido como paradigma imperativo, el cual define a la programacin como el desarrollo de procedimientos. Aqu se puede hacer la siguiente divisin: Lenguajes simples de procedimientos y Lenguajes de procedimientos estructurado en bloques. Lenguajes simples de procedimientos.- Estos lenguajes se componen de procedimientos, llamados subprogramas, funciones o subrutinas) que se ejecutan cuando son llamados. Ejemplos de lenguajes que caen dentro de este paradigma son Fortran y lenguaje C. Observemos el siguiente programa en lenguaje C:

// En este lenguaje las variables se definen antes de que se usen#include void saludo( ){printf ("%s", "Hola mundo");}main( ){int i; i=2;if (i==2) saludo ( );

}

Observaste que en la funcin main() se invoca a la funcin saludo()?. En este paradigma la manera de escribir programas es crear estructuras de datos y funciones como entidades separadas . Constatmoslo con el siguiente ejemplo en lenguaje Fortran, que es tambien un lenguaje simples de procedimientos, en el que el programa principal invoca a una funcin definida fuera de l .PROGRAM TRIVIALINTEGER ii=2IF (i.EQ.2) CALL SALUDO( )STOPEND

SUBROUTINE SALUDOPRINT * , "HOLA MUNDO"RETURNEND

Observa que el programa principal TRIVIAL invoca a la SUBROUTINE SALUDO.

Lenguajes de procedimientos estructurado en bloques.- Este tipo de lenguajes emplea reglas de alcance y una estructura de bloques anidados para guardar y tener acceso a datos. Un lenguaje ejemplo de este paradigma es el Pascal. Observa en el siguiente cdigo que el procedimiento saludo esta anidado dentro del programa principal trivial.

program trivial (input,output);vari=integer;procedure saludo;beginwriteline ("hola mundo");end;begini:=2;if (i=2) then saludo;end.

Es importante sealar que la programacin de los cdigos anteriores es muy similar debido a que pertenecen al mismo paradigma. Veamos los siguiente paradigma.

1.2.2 LgicosUn ejemplo de lenguaje que entra en este paradigma es Prolog, el cual no est orientado a la programacin para usos generales, sino que se orienta a resolver problemas usando el clculo de predicados. Veamos el siguiente cdigo ejemplo en Prolog:/*Base de datos en prolog*/: le_gusta (juan, libros) /*A Juan le gusta libros*/le_gusta (juan, mara)/*A Juan le gusta Mara */le_gusta (juan, pescado)/*A Juan le gusta pescado */--------------------------------------------------------------- Consulta en Prolog:?_le_gusta (juan, libros)Yes?_le_gusta (juan, X)X= libros;X= mara;X= pescado;

Prolog trata de emular una pltica usuario-mquina. Esta forma de programacin es muy diferente a la vista anteriormente.

1.2.3 FuncionalesComo lenguajes representativos de este paradigma podemos mencionar a Lisp, ML, Scheme , entre otros. Este tipo de lenguajes est destinado a programarse en forma aplicativa.

Lisp fue creado por John McCarthy y un grupo del Massachussets Institute of Technology en 1960 (MIT), el lenguaje se ha utilizado en la investigacin en ciencias de la computacin, sobre todo en la Inteligencia Artificial (robtica, procesamiento de lenguaje natural, prueba de teoremas, etc.). En seguida se muestra un cdigo ejemplo Lisp:

> (define (hola i) ((cond (eq i 2) (print "Hola mundo")) (T (print "Adios mundo")))> (define (hazlo)(hola 2))> hazlo

"Hola mundo"

Veamos el siguiente paradigma.

1.2.4 Orientados a ObjetosEn este caso las unidades de datos se consideran objetos activos. La caracterstica principal de los lenguajes orientados a objetos es la capacidad de representar definiciones de objetos a modo de esqueletos que pueden usarse una y otra vez para construir mltiples objetos con las mismas propiedades o modificarse para construir nuevos objetos con propiedades similares. Algunos ejemplos de lenguajes de programacin orientada a objetos son C++, Java, SmallTalk, Caf. Veamos el siguiente programa ejemplo en C++class trivial#include class trivial{ public://definicin de la funcin//miembro saludovoid saludo( ){cout , por ejemplo a > b y da como resultado un verdadero si el valor de a es mayor estrictamente que el valor de b, es falso en caso contrario.El "menor que" se representa con el smbolo = , por ejemplo a >= b y da como resultado un verdadero si el valor de a es mayor o igual que el valor de b, es falso en caso contrario.En cuanto al "menor o igual" se representa con el smbolo >= 100La expresin ser verdadera si a=5 y b=5, ya que primero se verifica que a==b , luego se verifica que b!=0 es verdadera lo que deduce que la expresin a==b && b!= 0 es verdadera y ya no se analiza la siguiente parte de la expresin, porque como se pudo ver en la tabla de verdad slo debe de existir un verdadero en el OR para que toda la expresin sea verdadera.Pero si a=105 y b=5, primero se verifica que a==b es falso, sin verificar mas se deduce que a==b && b!= 0 es falso, en esta ocasin es imperioso verificar que a> 100 es verdadera, por lo tanto (a==b && b!= 0 || a> 100) es verdadera.En el caso de que a=8 y b=5, primero se verifica que a==b es falso, sin verificar mas se deduce que a==b && b!= 0 es falso, en seguida se verifica que a> 100 es falso, por lo tanto (a==b && b!= 0 || a> 100) es falsaObservar que en los casos anteriores la evaluacin de las expresiones fue en el orden que marca las reglas de precedencia de los operadores.

Uso de parntesisEl orden de precedencia de los operadores puede ser cambiada con el uso de los parntesis, vemoslo en el siguiente ejemploEn la expresina - b + c * dPor la precedencia de operadores, primero se ejecutar el producto c * d, en seguida el resultado se sumar a b y el valor obtenido se restar a la variable a. Es decir, si a=5, b=3, c=2 y d=4 entonces el resultado de la operacin de la primera expresin sera c*d= 2*4 = 8, en seguida se ejecutara b+8=3+8=11 y este resultado ser restado a a -11= 5-11= - 6.Pero si a la misma expresin le agregamos los parntesis(a - b + c) * dindependientemente de las reglas de precedencia de operadores, primero se ejecutar lo que est entre parntesis (a - b + c) ,en seguida el resultado se multiplicar con la variable d. Es decir, si a=5, b=3, c=2 y d=4 entonces el resultado de la operacin (a - b + c) = (5-3+2)= 4 , luego se ejecutar 4*d=4*4=16. Como se puede observar el uso de los parntesis no slo altera el orden de precedencia de los operadores sino tambin altera el resultado de las operaciones.

2.3 Palabras reservadas del lenguaje{lzklmlzkmzlk2.4 Tipos de datos definidos por el usuario2.4.1 struct

En C una estructura es una coleccin de variables que se referencian bajo el mismo nombre. Una estructura proporciona un medio conveniente para mantener junta informacin relacionada. Las variables que conforman la estructura son llamados elementos estructurados. Para definir una estructurastruct dire {char nombre [30];char direccion [50];char estado [3];unsigned long int codigo;};

Generalmente todos los elementos en estructura son relacionados lgicamente unos con otros. Por ejemplo, se puede representar normalmente la informacin de nombre y direccin de una lista de correo en una estructura. Este fragmento de cdigo declara la plantilla de la estructura que define los campos nombre y direccin. La palabra clave struct dice al compilador que se est definiendo una plantilla de escritura.Observar que la definicin termina en punto y coma. La razn para el punto y coma es que para una definicin de estructura es una sentencia, adems, la estructura dire identifica esta estructura de datos particular y es especificador de tipo.En este momento del cdigo, realmente no ha sido declarada ninguna variable. El cdigo slo ha definido el formato de los datos. Para declarar una variable real con esa estructura, se escribir:struct dire mivar;Esta lnea declara la variable mivar de tipo estructura dire , la cual se representar en memoria con cinco campos:uno para nombre con 30 caracteres (30 bytes), otro para direccin con 50 caracteres (50 bytes), uno para estado con 3 caracteres (3 bytes) y uno para cdigo (4 bytes)mivar 30 bytes50 bytes3 bytes4 bytes

nombre direccin estado cdigoCuando se define una estructura, esencialmente se define un tipo de variable compleja que compone la estructura de los elementos. Slo cuando se declare una variable de ese tipo existir realmente.

Se puede declarar una o ms variables cuando se define una estructura. Por ejemplo:struct dire {char nombre [30];char direccion [50];char estado [3];unsigned long int codigo;} info_dire, binfo, cinfo;

Este cdigo define un tipo de estructura llamado dire y declara las variables info_dire, binfo y cinfo del mismo tipo.El formato general de una definicin de estructura es:struct nombre_de_estructura {tipo nombre_variable1;tipo nombre_variable2;tipo nombre_variable3;...} variables_estructuras ;

Donde se puede omitir el nombre de la estructura tipo nombre_de_estructura y las variables_estructura, pero no ambasSe referencian elementos individuales de la estructura usando el operador punto (.). Por ejemplo, el siguiente cdigo asignara el cdigo postal 12345 al campo correspondiente de la variable estructura info_dire que se declar antesinfo_dire. codigo = 12345 ;El nombre de la variable estructura, que se sigue por un punto y el nombre del elemento referenciar ese elemento individual de estructura. Se accede a los elementos de estructura usando este formato. El formato general es:nombre_estructura.nombre_elementopor lo tanto, para imprimir el cdigo postal en la pantalla, se escribir:printf (" %d ",info_dire.codigo);que imprimir el cdigo postal dentro del cdigo postal de la variable estructurada info_dire.En el mismo sentido, se puede usar el carcter matriz info_dire.nombre para llamar a gets (), como se muestra a continuacin:gets (info_dire.nombre);Esta llamada gets () pasar a un puntero de un caractr al comienzo del elemento nombre.Para acceder a los elementos individuales de info_dire.nombre. se podr indexar nombre. Por ejemplo, se puede imprimir los elementos de info_dire.nombre de caractr en caractr usando este cdigo:int t;for (t=0; info_dire.nombre[t] ; ++t) putchar (info_dire.nombre[t]) ;

2.4.2 typedefTurbo C permite definir nuevos nombres de datos explcitamente usando la palabra clave typedef. Realmente no se est creando una nueva clase de datos, sino un nuevo nombre para un tipo existente. Este nuevo proceso puede ayudar a hacer programas independientes de la mquina, i.e. ms portables; slo se necesita cambiar las sentencias typedef, el formato general es:typedef nombre_de_tipo;donde nombre_de_tipo es cualquier tipo de dato y nombre es el nuevo nombre para ese tipo. El nombre que se define es adems, y no reemplazable, por el nombre de tipo existente.Por ejemplo, se podra crear un nuevo nombre para float usandotypedef float balance;Esta sentencia le dice al compilador reconocer balance como otro nombre para float . Despus podra crear una variable float usando balance:balance over_due;Aqu over_due es una variable en punto flotante de tipo balance, que es otra palabra para float. Se puede usar typedef para crear nombres para tipos mas complejos, todava como se muestra aqu:typedef struct client {float due;int over_due;char name [40];};clien clist [NUM_CLIENTS]; /*define el array clist de estructuras de tipo struct client*/Usando typedef puede ayudar a que el cdigo sea ms legible y fcil de portar a una mquina nueva. Sin embargo, recordar que no se est creando ningn tipo de datos nuevo.Ahora que se ha visto el poder de personalizar los tipos de datos de Turbo C, se esta preparando para pasar a los operadores avanzados de este mismo 2.4.3 uninEn C, una unin es una posicin de memoria que se usa para varias variables similares, que pueden ser de tipos diferentes. La definicin de unin es similar a la de una estructura, como se demuestra a continuacin:

union u_tipo {int i;char ch;};Como con una declaracin de estructura, esta definicin no declara ninguna variable. Se puede declarar una variable poniendo su nombre al final de la definicin o usando una sentencia separada de declaracin. Para declarar una variable unin cnvt de tipo u _ tipo usando la definicin, que se escribira: unin u_tipo cnvtEn cnvt, tanto el entero i y carcter ch comparten la misma posicin de memoria. (sin embargo , ocupa dos bytes y ch solo uno). La figura siguiente muestra la forma en que i y ch comparten la misma direccin.

cnvt

2 bytes para el entero i

1 byte para el char ch

Cuando se declara una unin, C crear automticamente una variable lo suficientemente grande para que quepa el tipo de variable mas largo en la unin. Para acceder a un elemento de unin () se usa la misma sintaxis que se usara para guardar el tipo mas grande de variable.

Para acceder al elemento unin se usa la misma sintaxis que se usa para las estructuras: el operador de punto y el operador de flecha (si se usa puntero a union)

Elemento de unin directamente, usar el operador de punto. Si se accede a unin a travs de un puntero, usar el operador de flecha. Por ejemplo, para asignar el entero 10 al elemento i de cnvt, se escribir:cnvt.i=10;En el ejemplo siguiente, el cdigo pasa a un puntero para cnvt a la funcin:funcl (unin u_tipo *un){un-> i=10; /*asigna 1- a cnvt usando un puntero */}Usando una unin puede ayudar en la produccin y la de la independencia de la mquina o portable. Como el compilador mantiene la pista del tamao de las variables que constituyen la unin, el uso de dicha unin no produce dependencias de la maquina. No necesita preocuparse del tamao de un entero, un carcter, una variable en punto flotante o similares.

En C se usan frecuentemente las uniones cuando las conversiones de tipo son necesarias.

2.5 Estructuras de control2.5.1 ifLa sentencia if funciona de la misma manera en casi todos los lenguajes. Su forma ms sencilla esif (condicin) sentenciadonde condicin es una expresin que se evala de falsa o verdadera (en el lenguaje C, verdadero es no cero y falso cero). Ejemploif (10 < 11) printf ("10 es menor que 11")En la lnea anterior, la condicin es verdadera por lo tanto se imprimir en pantalla el mensaje dado en la instruccin printf de C.Otra forma de manejar a la sentencia if es recurriendo al else que se lee "si no", y en su caso ejecutar las instrucciones en caso de que la condicin sea falsa, su estructura general es if (condicin) ejecuta sentencia(s) si la condicin es verdaderaelseejecuta sentencia(s) si la condicin es falsa

Ejemploif (n < 11) printf ("%d es menor que 11", n);elseprintf ("%d es mayor o igual que 11", n);En el ejemplo depender del valor que tome n para ejecutar la instruccin indicada.

Por ltimo, veremos la sentencia if en su forma anidada, su estructura general es if (condicin 1) ejecuta sentencia(s) si la condicin 1 es verdaderaelse if (condicin 2) ejecuta sentencia(s) si la condicin 2 es verdadera . . .else if (condicin n) ejecuta sentencia(s) si la condicin-n es verdadera else ejecuta sentencia(s) si las condiciones de la 1 a la n fueron falsas

Ejemploif ((n>=0)&&(n < 11)) printf ("%d es mayor o igual que 0 pero menor que 11", n);else if ((n>=11)&&(n < 20)) printf ("%d es mayor o igual que 11 pero menor que 20", n);else if ((n>=21)&&(n < 30)) printf ("%d es mayor o igual que 21 pero menor que 30", n);else printf ("%d es mayor o igual 30", n);En el ejemplo depender del valor que tome n para ejecutar la instruccin indicada.

En seguida veremos las sentencias de ciclo, tambin denominadas bucles, permiten ejecutar en forma repetitiva (o iterativa) el conjunto de instrucciones definidas dentro de ellas. Son ejemplo de estas sentencias el while, do-while y for, que enseguida se describirn. 2.5.2 forEl bucle for presenta la siguiente estructura en su forma ms sencilla esfor (inicializacin, condicin, incremento) sentencia;donde inicializacin establece la variable de control del bucle a un valor. La condicin es una expresin que se evala de falsa o verdadera cada vez que se repite el bucle. Se mantiene el bucle en funcin mientras la condicin es verdadera. La porcin incremento incrementa la variable de control. Ejemploint contador;for(contador =1; contador