Examen
Examen
Universidad Nacional
Facultad de Ciencias Exactas y Naturales
Paradigmas de Programacion
MAP. Rodolfo Sanchez
Analizador Sintáctico
• Un analizador sintáctico (o parser) es una de las partes de un
compilador que transforma su entrada en un árbol de
derivación.
• El análisis sintáctico convierte el texto de entrada en otras
estructuras (comúnmente árboles), que son más útiles para el
posterior análisis y capturan la jerarquía implícita de la entrada
Analizador Sintáctico
• Un analizador léxico crea tokens de una secuencia de
caracteres de entrada y son estos tokens los que son
procesados por el analizador sintáctico para construir la
estructura de datos, por ejemplo, un árbol de análisis o árboles
de sintaxis abstracta.
• El análisis sintáctico también es un estado inicial del análisis de
frases de lenguaje natural. Es usado para generar diagramas de
lenguajes que usan flexión gramatical, como los idiomas
romances o el latín.
Analizador Sintáctico
• Los lenguajes habitualmente reconocidos por los analizadores
sintácticos son los lenguajes libres de contexto. Cabe notar que
existe una justificación formal que establece que los lenguajes
libres de contexto son aquellos reconocibles por un autómata
de pila, de modo que todo analizador sintáctico que reconozca
un lenguaje libre de contexto es equivalente en capacidad
computacional a un autómata de pila.
Analizador Sintáctico
• Los analizadores sintácticos fueron extensivamente estudiados
durante los años 1970, detectándose numerosos patrones de
funcionamiento en ellos, cosa que permitió la creación de
programas generadores de analizadores sintáticos a partir de
una especificación de la sintaxis del lenguaje en forma Backus-
Naur por ejemplo, tales como yacc,GNU bison y javaCC.
Lenguajes de programación
• El uso más común de los analizadores sintácticos es como
parte de la fase de análisis de los compiladores. De modo que
tienen que analizar el código fuente del lenguaje. Los lenguajes
de programación tienden a basarse en gramáticas libres de
contexto, debido a que se pueden escribir analizadores rápidos
y eficientes para éstas.
Lenguajes de programación
• Las gramáticas libres de contexto tienen una expresividad
limitada y sólo pueden expresar un conjunto limitado de
lenguajes. Informalmente la razón de esto es que la memoria
de un lenguaje de este tipo es limitada, la gramática no puede
recordar la presencia de una construcción en una entrada
arbitrariamente larga y esto es necesario en un lenguaje en el
que por ejemplo una variable debe ser declarada antes de que
pueda ser referenciada.
Clasificación
• Analizador sintáctico descendente (Top-Down-Parser): ..un
analizador puede empezar con el símbolo inicial e intentar
transformarlo en la entrada, intuitivamente esto sería ir
dividiendo la entrada progresivamente en partes cada vez más
pequeñas, de esta forma funcionan los analizadores LL, un
ejemplo es el javaCC.
Clasificación
• Analizador sintáctico ascendente (Bottom-Up-Parser): un analizador
puede empezar con la entrada e intentar llegar hasta el símbolo inicial,
intuitivamente el analizador intenta encontrar los símbolos más
pequeños y progresivamente construir la jerarquía de símbolos hasta el
inicial, los analizadores LR funcionan así y un ejemplo es el Yacc.
• Otros son
• Analizador sintáctico descendente recursivo
• Chart parser
• Left corner parser
• Analizador sintáctico LR
Paradigmas de programación
EIF - 400
Facultad de Ciencias Exactas y Naturales
Escuela de Informática
MAP. Rodolfo Sánchez S.
Introducción a la programación
• Se llama Programación a la implementación de un algoritmo
en un determinado lenguaje de programación, para realizar un
programa.
• Algoritmo es una secuencia no ambigua, finita y ordenada de
instrucciones que han de seguirse para resolver un problema.
• Programa (Software en inglés) es una secuencia de
instrucciones que una computadora puede interpretar y
ejecutar.
Introducción a la programación
• Un programa está formado por algoritmos y estructura de
datos.
• Se han propuesto diversas técnicas de programación, cuyo
objetivo es mejorar tanto el proceso de creación de software
como su mantenimiento.
• Entre ellas se pueden mencionar las programación lineal,
estructurada, modular y orientada a objetos.
Lenguajes de programación
• Lenguaje de programación es el idioma utilizado para
controlar el comportamiento de una máquina, particularmente
una computadora.
• Consiste en un conjunto de símbolos y reglas sintácticas y
semánticas que definen su estructura y el significado de sus
elementos y expresiones.
Lenguajes de programación
• En la actualidad los lenguajes de programación están escritos
para ser comprensibles por el ser humano, a este código se le
llama código fuente, pero no es comprendido por la máquina
ya que esta solo maneja el lenguaje binario.
• La compilación es el proceso de traducir un programa en
código fuente a programa en código objeto (que usa el
lenguaje binario), el programa encargado de compilar se
llama compilador. La mayoría de software de programación
trae su propio compilador.
Tipos de lenguajes de programación
• Los lenguajes de programación se clasifican en varios tipos, los
hay por nivel, y por la forma como se ejecutan.
• Por nivel: Hay lenguajes de programación de alto nivel y
lenguajes de bajo nivel. Los lenguajes de alto nivel permiten
que con pocas palabras se logre hacer lo mismo que se logra
con un lenguaje de bajo nivel.
– Ejemplos de lenguajes de alto nivel: C++, Python, Java
– Ejemplos de lenguaje de bajo nivel: assembler, cobol
Tipos de lenguajes de programación
• Por la forma como se ejecutan Hay lenguajes compilados e
interpretados.
• Los lenguajes compilados necesitan de un programa especial
que lea el código fuente y cree un archivo binario ejecutable
para una plataforma específica. Ejm: C++, Pascal.
• Los lenguajes interpretados necesitan de un programa que
traduzca en directo el código fuente escrito a instrucciones de
la plataforma en la que se ejecutan. Ejm: Python, Visual Basic,
Script.
Lenguajes de bajo nivel
• Lenguaje de máquina. El único que entiende directamente la
computadora: utiliza el alfabeto binario formado por los
símbolos 0 y 1 (apagado / encendido). Son realmente difíciles
de aprender y de manejar, ya que no resultan nada cercanos al
ser humano, pero son muy rápidos, ya que se ahorra mucho
tiempo en la respuesta, puesto que se evitan las traducciones
intermedias.
• Fueron desarrollas en la primera generación de computadoras
Lenguajes de alto nivel
• Son desarrollados para que el usuario de la computadora,
permiten que los procedimientos se expresen con un estilo
comprensible; sin embargo, la computadora no los entiende
directamente. Algunos de estos lenguajes fueron desarrollados
durante la Segunda Generación de computadoras y la mayoría
durante la Tercera Generación, por ejemplo: Pascal, BASIC,
Ada, FORTRAN, etc.
• Usan traductores llamados compiladores.
Lenguajes de programación
Tipos de programas
• Código Fuente: recibe este nombre el conjunto de
instrucciones tal y como fueron escritos por el programador en
el lenguaje de alto nivel (programa fuente).
• Código Objeto: son las instrucciones de un programa cuando
ya han sido traducidas al lenguaje máquina (programa objeto).
• Código Ejecutable: es un código objeto que puede ser
ejecutado por la computadora de inmediato (no todos los
códigos objeto son ejecutables).
Interpretes
• Traduce a lenguaje máquina, cada línea del programa fuente y
la ejecuta de inmediato.
• Traducen en Lenguaje de Alto Nivel a Lenguaje Maquina, se
encargan de traducir cada instrucción, una por una contenida
en un programa escrito en cualquier lenguaje de alto nivel a
instrucciones en código binario, comprensible por las
computadoras.
• No crea código objeto.
• Ejemplos: Cpython, Ruby MRI
Los compiladores
• A diferencia de los intérpretes que traducen instrucción por
instrucción, los compiladores traducen todo el programa
entero y luego lo integran generando un programa ejecutable
por si solo. Con esto se consigue mas eficacia e independencia
, ya que una vez compilado el programa, el compilador no
tiene por qué estar presente, pudiendo ser transportado el
programa ejecutable a cualquier computadora, sin ver el
listado de ordenes, ni manejar el compilador.
• Traduce código fuente a código objeto
Los compiladores
• El código o programa fuente es el conjunto de instrucciones en
lenguaje de alto nivel.
• Un compilador analiza las líneas del programa e identifica
ciertas estructuras para traducirlas adecuadamente a lenguaje
máquina. Una vez que se ha efectuado la compilación puede
prescindirse del programa fuente.
• Ejemplo: IBM Cobol, Java OpenJDK
Compilación del Programa Fuente
• Análisis de léxico: durante esta etapa se verifica que las palabras
utilizadas en el programa fuente pertenezcan al lenguaje.
• Análisis de sintaxis: esta parte de la compilación examina cada
instrucción del programa fuente para que las instrucciones estén
organizadas correctamente.
• Generación de código intermedio: este produce un código
simbólico que permitirá efectuar la equivalencia con el lenguaje
máquina.
• Generación de código maquina: en esta última etapa se elabora
el programa objeto.
Clasificación de los lenguajes de programación
• Los principales lenguajes pueden clasificarse de la siguiente
manera:
• Lenguajes Clásicos o Tradicionales.
• Lenguajes Visuales (orientados a objetos).
• Lenguajes de Internet, ejecutados desde un browser.
Lenguajes clásicos o tradicionales
• Estos lenguajes están basados en un lenguaje cercano al ser
humano en el que se escribe el código necesario para realizar
las operaciones que se requieren (miles y miles de líneas
generalmente), que posteriormente es traducido o compilado
generando un programa ejecutable. Los más conocidos son: el
PASCAL, el BASIC, el C, el COBOL, y el CLIPPER. Dependiendo
del programa que se requiera realizar pueden ser mejores unos
u otros.
Lenguajes visuales
• Son lenguajes más avanzados que los lenguajes clásicos y están
basados en objetos. Cada entidad del programa (eventos,
acciones, datos, etc.), es un objeto sobre el que se definen
operaciones. Esto permite almacenar los objetos (con todo su
código de programa), en una serie de librerías y utilizarlos
cuando sea necesario, ahorrando al programador el trabajo de
tener que volver a programarlos. Son lenguajes muy intuitivos
y fáciles de utilizar, y sustituyen las tediosas líneas de código,
por sencillas y directas representaciones gráficas.
Lenguajes de internet
• Son los lenguajes específicos para la creación de páginas Web
de Internet, y realizar su programación (motores de búsqueda,
seguridad, establecimiento de comunicaciones, etc.).
• Son la última generación de lenguajes. Existen distintos tipos,
dependiendo del grado de especialización, aunque algunos,
como el HTML, son lenguajes basados en sencillas marcas o
TAG.
Lenguajes de programación
Utilidad.
Lenguajes.
BASIC, PASCAL, Aprendizaje de programación.
Ada, C y C++ Programación de sistemas.
Logo Lenguaje didáctico.
COBOL, RPG, Natural, SQL Gestión de empresas.
Algol, FORTRAN, APL Calculo numérico.
CLIPPER, ACCESS, dBASE, Delphi, SQL Bases de datos.
Smalltalk, Actor, C++, Eiffel Programación orientada a objetos (OOP).
Visual Basic, Visual C , C# Programación Windows.
HTML, JAVA, PERL Internet (páginas WEB).
Lingo Programas multimedia.
Prolog, Lisp Inteligencia artificial.
VRLM Realidad virtual.
Mapper, Cogen, Linc Lenguajes de cuarta generación 4GL.
Traducción y compilación
• Un compilador es un programa informático que traduce un
programa escrito en un lenguaje de programación a otro
lenguaje de programación, generando un programa
equivalente que la máquina será capaz de interpretar.
• Usualmente el segundo lenguaje es lenguaje de máquina, pero
también puede ser un código intermedio (bytecode), o
simplemente texto. Este proceso de traducción se conoce
como compilación.
Paradigma Imperativo
• Enfoques subordinados al paradigma de programación
imperativa son:
– Programación estructurada: La programación estructurada es un tipo de
programación imperativa donde el flujo de control se define mediante bucles
anidados, condicionales y subrutinas, en lugar de a través de GOTO.
– Programación procedimental: Este paradigma de programación consiste en
basarse en un número muy bajo de expresiones repetidas, englobarlas todas en
un procedimiento o función y llamarlo cada vez que tenga que ejecutarse.
– Programación modular: consiste en dividir un programa en módulos o
subprogramas con el fin de hacerlo más manejable y legible. Se trata de una
evolución de la programación estructurada para resolver problemas de
programación más complejos.
Paradigma declarativo
• Este paradigma no necesita definir algoritmos puesto que
describe el problema en lugar de encontrar una solución al
mismo. Este paradigma utiliza el principio del razonamiento
lógico para responder a las preguntas o cuestiones
consultadas.
• Este paradigma a su vez se divide en dos:
– Programación Lógica: Prolog
– Programación funcional: Lisp, Scala, Java, Kotlin
Paradigma Programación orientada a objetos
• En este modelo de paradigma se construyen modelos de
objetos que representan elementos (objetos) del problema a
resolver, que tienen características y funciones.
• Permite separar los diferentes componentes de un programa,
simplificando así su creación, depuración y posteriores
mejoras.
• La programación orientada a objetos disminuye los errores y
promociona la reutilización del código. Es una manera especial
de programar, que se acerca de alguna manera a cómo
expresaríamos las cosas en la vida real.
Paradigma Programación orientada a objetos
• Podemos definir un objeto como una estructura abstracta que,
de manera más fiable, describe un posible objeto del mundo
real y su relación con el resto del mundo que lo rodea a través
de interfaces.
• Ejemplos de lenguajes de programación orientados a objetos
serían Java, Python o C#.
Paradigma Programación orientada a objetos
• La programación orientada a objetos se sirve de diferentes
conceptos como:
– Abstracción de datos
– Encapsulación
– Eventos
– Modularidad
– Herencia
– Polimorfismo
Paradigma programación reactiva
• Este paradigma se basa en escuchar lo que emite un evento o
cambios en el flujo de datos, en donde los objetos reaccionan a
los valores que reciben de dicho cambio.
• Las librerías más conocidas son Project Reactor, y RxJava.
React/Angular usan RxJs para hacer uso de la programación
reactiva.
Conclusión
• Se ha expuesto de manera simplificada algunos de los
principales paradigmas de programación mas relevantes, la
forma de hacer programas cambia cada día mas rápido en la
informática y, como hemos visto, también muchos de los
lenguajes de programación se adaptan a nuevas formas de
hacer las cosas.
• Hay varios lenguajes que se consideran multiparadigma, ya que
permiten implementación y combinación de varias de estas
estructuras en el desarrollo de programas.
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Lenguaje de programación C
Manual de introducción al lenguaje C.
MAP. Rodolfo Andrés Sánchez
Introducción a C:
C es un lenguaje de programación ampliamente utilizado y considerado uno de los pilares
fundamentales en el mundo de la programación. Es un lenguaje de programación de
propósito general que se utiliza para desarrollar una variedad de aplicaciones, desde
sistemas operativos hasta aplicaciones de escritorio y más.
Conceptos Básicos:
1. Variables y Tipos de Datos:
En C, las variables se utilizan para almacenar datos. Los tipos de datos básicos incluyen:
Ejemplo:
int edad = 25;
float altura = 1.75;
char inicial = 'J';
2. Instrucciones de Control:
if, else: Estructuras condicionales para tomar decisiones.
while, for: Bucles para repetir acciones.
switch: Estructura para evaluar múltiples casos.
[Fecha] 1
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Ejemplo:
if (edad >= 18) {
printf("Eres mayor de edad.\n");
} else {
printf("Eres menor de edad.\n");
}
3. Funciones:
Las funciones son bloques de código reutilizables. Cada programa en C debe tener una
función main() que es el punto de entrada del programa.
Ejemplo:
#include <stdio.h>
int main() {
int resultado = sumar(5, 3);
printf("La suma es: %d\n", resultado);
return 0;
}
4. Arreglos y Punteros:
Los arreglos son colecciones de elementos del mismo tipo. Los punteros son variables que
almacenan direcciones de memoria.
[Fecha] 2
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Ejemplo:
int numeros[5] = {1, 2, 3, 4, 5};
int *ptr = &numeros[0]; // Puntero al primer elemento del arreglo
5. Entrada y Salida:
La función printf() se utiliza para mostrar información en la pantalla, mientras que scanf() se
utiliza para leer la entrada del usuario.
Ejemplo:
int num;
printf("Ingresa un número: ");
scanf("%d", &num);
Conclusión:
Este es solo un pequeño vistazo al lenguaje C. Hay muchos más conceptos avanzados
para explorar, como estructuras, punteros avanzados, gestión de memoria, etc. A medida
que te familiarices con estos conceptos básicos, podrás crear programas más complejos y
efectivos. ¡La práctica constante es la clave para dominar la programación en C
https://www.onlinegdb.com/online_c_compiler
https://www.programiz.com/c-programming/online-compiler/
https://www.tutorialspoint.com/codingground.htm
[Fecha] 3
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Escribir en un archivo:
#include <stdio.h>
int main() {
FILE *file;
if (file == NULL) {
return 1;
fclose(file);
return 0;
Leer un archivo
#include <stdio.h>
[Fecha] 4
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
int main() {
FILE *file;
char ch;
if (file == NULL) {
return 1;
putchar(ch);
fclose(file);
return 0;
#include <stdio.h>
typedef struct {
char nombre[50];
int edad;
} Persona;
int main() {
FILE *file;
[Fecha] 5
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
if (file == NULL) {
return 1;
fclose(file);
Persona p_leida;
if (file == NULL) {
return 1;
fclose(file);
return 0;
[Fecha] 6
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Estos ejemplos muestran operaciones básicas de lectura y escritura en archivos en C. Hay muchas
otras funciones y características que puedes explorar para manejar archivos de forma más avanzada,
como la manipulación de archivos binarios, la búsqueda en archivos, entre otros.
ruta: Es una cadena que especifica el nombre y la ruta del archivo a abrir.
modo: Es una cadena que especifica el modo en el que se abrirá el archivo, como "r" (lectura), "w"
(escritura), "a" (añadir), "rb" (lectura binaria), "wb" (escritura binaria), entre otros.
6. fscanf y fprintf: Para leer y escribir con formato, similar a scanf() y printf().
[Fecha] 7
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
7. fread y fwrite: Para leer y escribir bloques de datos (útil para archivos binarios).
size_t fwrite(const void *ptr, size_t tamaño, size_t cont, FILE *archivo);
8. ftell y fseek: Para obtener la posición actual del puntero de archivo y mover el puntero de
archivo a una posición específica respectivamente.
origen puede ser: SEEK_SET (inicio del archivo), SEEK_CUR (posición actual), o SEEK_END (final del
archivo).
Estas son solo algunas de las funciones básicas para el manejo de archivos en C. Siempre es
aconsejable revisar la documentación y los manuales de referencia para obtener detalles más
específicos y ejemplos de uso de estas funciones.
[Fecha] 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int matricula;
char nombre[100];
} Estudiante;
void agregarEstudiante();
void listarEstudiantes();
void borrarRegistros();
int main() {
int opcion;
do {
printf("4. Salir\n");
[Fecha] 9
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
scanf("%d", &opcion);
switch (opcion) {
case 1:
agregarEstudiante();
break;
case 2:
listarEstudiantes();
break;
case 3:
borrarRegistros();
break;
case 4:
printf("Saliendo...\n");
break;
default:
printf("Opción inválida.\n");
return 0;
void agregarEstudiante() {
Estudiante e;
[Fecha] 10
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
if (file == NULL) {
return;
scanf("%d", &e.matricula);
fclose(file);
void listarEstudiantes() {
Estudiante e;
if (file == NULL) {
return;
[Fecha] 11
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
fclose(file);
void borrarRegistros() {
if (remove("estudiantes.dat") == 0) {
} else {
Este programa utiliza un archivo binario llamado estudiantes.dat para almacenar y recuperar
registros de estudiantes. Puedes compilar y ejecutar este programa y probar sus funcionalidades. Es
una implementación simple y hay mucho espacio para mejoras y funcionalidades adicionales
int main() {
// Declaración de variables
float num1, num2, num3, promedio;
[Fecha] 12
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
// Calcular el promedio
promedio = (num1 + num2 + num3) / 3;
// Mostrar el resultado
printf("El promedio de %.2f, %.2f y %.2f es: %.2f\n", num1, num2, num3, promedio);
return 0;
}
int main() {
int numeros[] = {5, 10, 15, 20, 25};
int n = sizeof(numeros) / sizeof(numeros[0]); // Calcula la longitud del arreglo
int suma = 0;
[Fecha] 13
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
return 0;
}
3. Ejemplo 3 Factorial
--Factorial, calcula el factorial ingresado por el usuario
#include <stdio.h>
int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int num;
printf("Ingresa un número: ");
scanf("%d", &num);
[Fecha] 14
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
if (num < 0) {
printf("No se puede calcular el factorial de números negativos.\n");
} else {
int result = factorial(num);
printf("El factorial de %d es %d\n", num, result);
}
return 0;
}
[Fecha] 15
Lenguajes de programación
Universidad Nacional
Facultad de Ciencias Exactas y Naturales
Escuela de Informática
Paradigmas de programación, EIF-400
MAP. Rodolfo Sanchez S.
Lenguaje de programación
• Es un lenguaje formal diseñado para
realizar procesos que pueden ser llevados a
cabo por máquinas como las computadoras.
• Pueden usarse para crear programas que
controlen el comportamiento físico y lógico de
una máquina, para expresar algoritmos con
precisión, o como modo de comunicación
humana.
Lenguajes de programación
• Está formado por un conjunto de símbolos y
reglas sintácticas y semánticas que definen su
estructura y el significado de sus elementos y
expresiones. Al proceso por el cual se
escribe, se prueba, se depura, se compila (de
ser necesario) y se mantiene el código
fuente de un programa informático se le
llama programación
Pasos de un lenguaje de programación
• El desarrollo lógico del programa para resolver un
problema en particular.
• Escritura de la lógica del programa empleando un
lenguaje de programación específico (codificación
del programa).
• Ensamblaje o compilación del programa hasta
convertirlo en lenguaje de máquina.
• Prueba y depuración del programa.
• Desarrollo de la documentación
Analizador sintáctico
• es una de las partes de un compilador que
transforma su entrada en un árbol de
derivación.
• El análisis sintáctico convierte el texto de
entrada en otras estructuras (comúnmente
árboles), que son más útiles para el posterior
análisis y capturan la jerarquía implícita de la
entrada
Analizador sintáctico
• El uso más común es en la fase de análisis de
un compilador.
• De modo que lo que hace es analizar código
fuente.
• Lo define una gramática libre de contexto.
Lenguajes de programación y su
arquitectura
Introduccion
• Abstraccion de datos:
– La abstracción es un mecanismo de la mente
humana fundamental para la comprensión de
fenómenos o situaciones que involucren una gran
cantidad de detalles.
• Abstraer es, por tanto, un proceso mental que
tiene dos aspectos complementarios:
Abstraccion de datos
• El aspecto de destacar los detalles relevantes
del objeto en estudio.
• El aspecto de ignorar los detalles irrelevantes
del objeto. Se entiende que son irrelevantes
en ese nivel de abstracción. Si descendemos
de nivel, es probable que algunos de estos
detalles pasen a ser relevantes.
Abstraccion de datos
• La abstracción permite estudiar fenómenos
complejos siguiendo un método jerárquico, es
decir, por sucesivos niveles de detalle. La
mayoría de las veces se sigue una dirección
descendente, desde los niveles de menos
detalle o más generales, a los de más detalle o
más específicos. En ocasiones también se
emplea una dirección ascendente.
Encapsulamiento
• En programación modular, y más
específicamente en programación orientada a
objetos, se denomina Encapsulamiento al
ocultamiento del estado, es decir, de los datos
miembro de un objeto de manera que sólo se
pueda cambiar mediante las operaciones
definidas para ese objeto.
Encapsulamiento
• Cada objeto está aislado del exterior, es un
módulo natural, y la aplicación entera se
reduce a un agregado o rompecabezas de
objetos.
• El aislamiento protege a los datos asociados
de un objeto contra su modificación por quien
no tenga derecho a acceder a ellos,
eliminando efectos secundarios e
interacciones.
Formas de encapsular
• Estándar (Predeterminado)
• Abierto:
– Hace que el miembro de la clase pueda ser accedido desde
el exterior de la Clase y cualquier parte del programa.
• Protegido:
– Solo es accesible desde la Clase y las clases que heredan (a
cualquier nivel).
• Semi cerrado:
– Solo es accesible desde la clase heredada.
• Cerrado:
– Solo es accesible desde la Clase
Paradigmas de programacion
• Un paradigma de programación es una
propuesta tecnológica adoptada por una
comunidadde programadores y desarrolladore
s cuyo núcleo central es incuestionable en
cuanto que únicamente trata de resolver uno
o varios problemas claramente delimitados; la
resolución de estos problemas debe suponer
consecuentemente un avance significativo en
al menos un parámetro que afecte a
la ingeniería de software.
Paradigmas de programacion
• Un paradigma de programación representa un
enfoque particular o filosofía para diseñar
soluciones. Los paradigmas difieren unos de
otros, en los conceptos y la forma de abstraer
los elementos involucrados en un problema,
así como en los pasos que integran su solución
del problema, en otras palabras, el cómputo.
Paradigmas de programación
• “Un paradigma de programación indica un método
de realizar cómputos y la manera en que se deben
estructurar y organizar las tareas que debe llevar a
cabo un programa ”
– Los paradigmas fundamentales están asociados a
determinados modelos de cómputo.
– También se asocian a un determinado estilo de
programación
– Los lenguajes de programación suelen implementar, a
menudo de forma parcial, varios paradigmas.
Tipos de paradigmas
• 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 C,BASIC o Pascal.
Tipos de paradigmas
• Programación orientada a objetos:
• Está basada en el imperativo, pero encapsula
elementos denominados objetos que incluyen
tanto variables como funciones. Está
representado por C++ o el Java, pero el más
representativo sería el Smalltalk que está
completamente orientado a objetos.
Tipos de paradigmas
• Programación dinámica: está definida como el
proceso de romper problemas en partes pequeñas
para analizarlos y resolverlos de forma más óptima,
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.
Tipos de paradigmas
• Programación declarativa: Está basado en
describir el problema declarando propiedades
y reglas que deben cumplirse, en lugar de
instrucciones. Hay lenguajes para la
programación funcional, la programación
lógica, o la combinación lógico-funcional.
Unos de los primeros lenguajes funcionales
fueron Lisp y Prolog.
Tipos de paradigmas
– Programación funcional: basada en la definición
los predicados y es de corte más matemático, está
representado por Scheme (una variante de Lisp)
o Haskell.
– Programación lógica: basado en la definición de
relaciones lógicas, está representado por Prolog.
– Programación con restricciones: Similar a la lógica
usando ecuaciones. Casi todos los lenguajes son
variantes del Prolog.
Lenguajes de programación y arquitectura
Universidad Nacional
Facultad de Ciencias Exactas y Naturales
Escuela de Informática
MAP. Rodolfo Sánchez
Introducción
• En términos generales, un lenguaje de programación es una
herramienta que permite desarrollar software o programas
para computadora. Los lenguajes de programación son
empleados para diseñar e implementar programas encargados
de definir y administrar el comportamiento de los dispositivos
físicos y lógicos de una computadora.
• Lo anterior se logra mediante la creación e implementación de
algoritmos de precisión que se utilizan como una forma de
comunicación humana con la computadora.
Introducción
• A grandes rasgos, un lenguaje de programación se conforma de una serie
de símbolos y reglas de sintaxis y semántica que definen la estructura
principal del lenguaje y le dan un significado a sus elementos y
expresiones.
• Programación es el proceso de análisis, diseño, implementación, prueba y
depuración de un algoritmo, a partir de un lenguaje que compila y genera
un código fuente ejecutado en la computadora.
• La función principal de los lenguajes de programación es escribir
programas que permiten la comunicación usuario-máquina. Unos
programas especiales (compiladores o intérpretes) convierten las
instrucciones escritas en código fuente, en instrucciones escritas en
lenguaje máquina (0 y 1).
Lenguaje C
• En particular, este lenguaje está caracterizado por ser de uso
general, de sintaxis compacta y portable. Así, un lenguaje de
programación es una herramienta informática que permite
desarrollar programas para computadoras.
Lenguaje C
• C
Paradigmas de programación
Universidad Nacional
Facultad de Ciencias Exactas y Naturales
Escuela de Informática
EIF-400
MAP. Rodolfo Sánchez
Modelos computacionales
• Un modelo computacional es un modelo matemático en las ciencias de la
computación que requiere extensos recursos computacionales para
estudiar el comportamiento de un sistema complejo por medio de la
simulación por computadora.
• El sistema bajo estudio es a menudo un sistema complejo no lineal para
el cual las soluciones analíticas simples e intuitivas no están fácilmente
disponibles. En lugar de derivar una solución analítica matemática para el
problema, la experimentación es hecha con el modelo cambiando los
parámetros del sistema en la computadora, y se estudian las diferencias
en el resultado de los experimentos.
Modelos computacionales
• Las teorías de la operación del modelo se pueden
derivar/deducir de estos experimentos de computacionales.
program PrimerPrograma;
begin
writeln('¡Hola, mundo!');
end.
var
numero: integer;
nombre: string;
Tipos de datos: Pascal admite una variedad de tipos de datos, como integer, real, char, string, entre
otros.
2. Estructuras de control
Condicional If-Then-Else:
if condicion then
begin
// Código si la condición es verdadera
end
else
begin
// Código si la condición es falsa
end;
Bucle For:
for i := inicio to fin do
begin
// Código a repetir
end;
Bluce While
Página 1 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
while condicion do
begin
// Código a repetir
end;
Bucle repeat-Until:
repeat
// Código a repetir
until condicion;
3. Procedimientos y funciones
Procedimientos: Son rutinas que realizan una acción pero no devuelven un valor.
procedure Saludar;
begin
writeln('¡Hola!');
end;
Funciones: Son similares a los procedimientos, pero devuelven un valor.
4. Archivos y E/S
Pascal permite la lectura y escritura de archivos a través de diversos procedimientos y funciones.
Ejemplo:
var
f: text;
linea: string;
begin
assign(f, 'archivo.txt');
reset(f);
while not eof(f) do
begin
readln(f, linea);
writeln(linea);
end;
close(f);
end.
5. Unidades y módulos
Página 2 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Las unidades permiten modularizar el código. Puedes tener partes comunes del código en una
unidad y usarla en varios programas.
unit MiUnidad;
interface
procedure Saludar;
implementation
procedure Saludar;
begin
writeln('¡Hola desde MiUnidad!');
end;
end.
Este es solo un vistazo general de Pascal. A medida que te adentres en el lenguaje, descubrirás más
características y técnicas avanzadas. Si bien no es tan popular en la actualidad como otros lenguajes
como Python o JavaScript, Pascal sigue siendo una excelente elección para aprender fundamentos
de programación y estructuras de datos.
HOLA Mundo
program HolaMundo;
begin
writeln('¡Hola, mundo!');
end.
Página 3 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Dado un radio proporcionado por el usuario, este programa calcula y muestra el área de un círculo.
program AreaCirculo;
const
PI = 3.14159;
var
radio, area: real;
begin
writeln('Ingrese el radio del círculo:');
readln(radio);
area := PI * radio * radio;
writeln('El área del círculo con radio ', radio:0:2, ' es: ', area:0:2);
end.
Tabla de Multiplicar
Genera la tabla de multiplicar de un numero
program TablaMultiplicar;
var
numero, i: integer;
begin
write('Ingrese un número para ver su tabla de multiplicar: ');
readln(numero);
Calculadora simple
program CalculadoraSimple;
var
Página 4 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
case operador of
'+': resultado := num1 + num2;
'-': resultado := num1 - num2;
'*': resultado := num1 * num2;
'/': resultado := num1 / num2;
end;
Conversor de temperatura
program ConversorTemperatura;
var
celsius, fahrenheit: real;
begin
write('Ingrese la temperatura en grados Celsius: ');
readln(celsius);
Adivina el numero
program AdivinaElNumero;
var
numeroSecreto, intento, intentosRestantes: integer;
begin
randomize; // Inicializa el generador de números aleatorios
numeroSecreto := random(100) + 1; // Número aleatorio entre 1 y 100
intentosRestantes := 5;
Página 5 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
intentosRestantes := intentosRestantes - 1;
end;
if intentosRestantes = 0 then
writeln('Agotaste tus intentos. El número secreto era: ', numeroSecreto);
end.
El manejo de archivos en Pascal es una característica fundamental que permite a los programas leer
y escribir datos en archivos persistentes. A continuación, te muestro un programa simple que
demuestra cómo trabajar con archivos de texto en Pascal.
Este programa permitirá al usuario crear un archivo de texto, escribir algunas líneas y luego leer el
archivo y mostrar su contenido.
program ManejoDeArchivos;
var
archivo: text;
nombreArchivo: string;
linea: string;
opcion: integer;
begin
writeln('Programa de manejo de archivos en Pascal');
write('Ingrese el nombre del archivo (ejemplo: "misdatos.txt"): ');
readln(nombreArchivo);
repeat
writeln('Seleccione una opción:');
Página 6 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
case opcion of
1:
begin
assign(archivo, nombreArchivo);
rewrite(archivo); // Crea o sobrescribe el archivo
writeln('Escriba algunas líneas de texto. Escriba "FIN" para terminar.');
repeat
readln(linea);
if linea <> 'FIN' then
writeln(archivo, linea);
until linea = 'FIN';
close(archivo);
end;
2:
begin
assign(archivo, nombreArchivo);
reset(archivo); // Abre el archivo para leer
writeln('Contenido del archivo:');
while not eof(archivo) do
begin
readln(archivo, linea);
writeln(linea);
end;
close(archivo);
end;
3: writeln('Hasta luego!');
else
writeln('Opción inválida. Por favor, intente de nuevo.');
end;
until opcion = 3;
end.
Al ejecutar este programa, se te presentará un menú que te permitirá escribir en un archivo o leer
de un archivo. Cuando elijas escribir en el archivo, podrás ingresar múltiples líneas y terminar con la
palabra "FIN". Luego, al seleccionar leer del archivo, se mostrará el contenido del archivo.
Página 7 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA
Es importante recordar siempre cerrar los archivos después de usarlos (con close(archivo)) para
asegurarte de que todos los cambios se guarden y para liberar los recursos del sistema.
Compilador en linea:
https://www.onlinegdb.com/online_pascal_compiler#
Página 8 de 8
Programación Funcional
Universidad Nacional
Facultadad de ciencias exactas y naturales
Escuela de Informática
MAP. Rodolfo Sanchez
Programación Funcional
• Es un paradigma de programación declarativa basado en el uso
de funciones matemáticas.
• tiene sus raíces en el cálculo lambda, un sistema formal
desarrollado en los años 1930 para investigar la definición de
función, la aplicación de las funciones y la recursión. Muchos
lenguajes de programación funcionales pueden ser vistos como
elaboraciones del cálculo lambda.
Calculo Lambda
• Es un sistema formal diseñado para investigar la definición
de función, la noción de aplicación de funciones y la recursión.
• Fue introducido por Alonzo Church y Stephen Kleene en 1930.
• Puede ser usado para definir de manera limpia y precisa qué es
una "función computable".
• Se puede considerar al cálculo lambda como el más pequeño
lenguaje universal de programación. Consiste en una regla de
transformación simple (sustitución de variables) y un esquema
simple para definir funciones.
Calculo Lambda
• El cálculo lambda es universal porque cualquier función
computable puede ser expresada y evaluada a través de él. Por
lo tanto, es equivalente a las máquinas de Turing.
• Sin embargo, el cálculo lambda no hace énfasis en el uso de
reglas de transformación y no considera las máquinas reales
que pueden implementarlo. Se trata de una propuesta más
cercana al software que al hardware.
Calculo Lambda
• Considérese las siguientes dos funciones.
– Por un lado, la función identidad I(x) = x, que toma un único
argumento, x, e inmediatamente devuelve x.
– La función suma S(x,y) = x + y, que toma dos argumentos, x e y, y
devuelve la suma de ambos: x + y.
• La primera observación es que las funciones no necesitan ser
explícitamente nombradas.
Calculo Lambda
• Esto es, la función S(x,y) = x + y puede ser reescrita como una
función anónima: x,y → x + y (que se lee: «el par de x e y se
mapea a x + y»). Del mismo modo, I(x) = x puede ser reescrita
de forma anónima como x → x, que se lee: «el argumento x se
mapea a sí mismo».
• La segunda observación es que el nombre que se asigne a los
argumentos de la función es generalmente irrelevante. Esto
es, x → x e y → y expresan la misma función: la función
identidad. Del mismo modo, x,y → x + y y u,v → u + v expresan
la misma función: la función suma.
Calculo Lambda
• Una tercera observación es que toda función que requiere dos
argumentos, como por ejemplo la función suma, puede ser
reescrita como una función que acepta un único argumento,
pero que devuelve otra función, la cual a su vez acepta un
único argumento. Por ejemplo, x,y → x + y puede ser reescrita
como x → (y → x + y). Esta transformación se conoce como
currificación, y puede generalizarse para funciones que
aceptan cualquier número de argumentos. Esto puede parecer
difícil de entender, pero se entiende mejor mediante un
ejemplo.
Calculo Lambda
• Considérese la función suma no currificada:
➢ x,y → x + y
• Al tomar a los números 2 y 3 como argumentos, se obtiene:
➢ 2+3
• Lo cual es igual a 5. Considérese ahora la versión currificada de la función
➢ x → (y → x + y)
• Si se toma al número 2 como argumento, se obtiene la función:
➢ y→2+y
• Y tomando luego al número 3 como argumento, se obtiene:
➢ 2+3
Calculo Lambda
• Una cuarta observación es que una función puede aceptar
como argumento a otra función, siempre y cuando esta otra
función tenga ella misma un sólo argumento.
• Por ejemplo, la función identidad puede aceptar como
argumento a la función suma (currificada).
• Es decir, se toma a la función x → (y → x + y) y se la pone como
argumento en z → z. El resultado será obviamente x → (z → x +
z), (igual a la x → (y → x + y)) pues la función identidad siempre
devuelve lo mismo que se le da.
Calculo Lambda
• En el cálculo lambda, las funciones están definidas por
expresiones lambda, que dicen qué se hace con su argumento.
• Por ejemplo, la función "sumar 2", f(x) = x + 2 se expresa en
cálculo lambda así: λ x. x + 2 (o, equivalentemente, λ y. y + 2
ya que el nombre de su argumento no es importante).
• Y el número f(3) sería escrito como (λ x. x + 2) 3. La aplicación
de funciones es asociativa a izquierda: f x y = (f x) y.
Considerando la función que aplica una función al número 3: λ
f. f 3. , podemos pasarle "sumar 2", quedando así: (λ f. f 3) (λ x.
x + 2).
Calculo Lambda
• En el cálculo lambda, una expresión o término se define
recursivamente a través de las siguientes reglas de formación:
1. Toda variable es un término: x, y, z, u, v, w, x1, x2, y9,...
2. Si t es un término y x es una variable, entonces (λx.t) es un término
(llamado una abstracción lambda).
3. Si t y s son términos, entonces (ts) es un término (llamado una
aplicación lambda).
4. Nada más es un término.
Calculo Lambda
• Según estas reglas de formación, las siguientes cadenas de
caracteres son términos:
x
(xy)
(((xz)y)x)
(λx.x)
((λx.x)y)
(λz.(λx.y))
((x(λz.z))z)
Calculo Lambda
• Las primeras dos reglas generan funciones, mientras que la última
describe la aplicación de una función a un argumento. Una
abstracción lambda λx.t representa una función anónima que toma
un único argumento, y se dice que el signo λ liga la variable x en el
término t.
• Una aplicación lambda ts representa la aplicación de un argumento
s a una función t. Por ejemplo, λx.x representa la función identidad
x → x, y (λx.x)y representa la función identidad aplicada a y. Luego,
λx.y representa la función constante x → y, que develve y sin
importar qué argumento se le dé
Variables libres y ligadas
• Las apariciones (ocurrencias) de variables en una expresión son
de tres tipos:
1. Ocurrencias de ligadura (binders)
2. Ocurrencias ligadas (bound occurrences)
3. Ocurrencias libres (free occurrences)
• Las variables de ligadura son aquellas que están entre el λ y el
punto. Por ejemplo, siendo E una expresión lambda:
▪ (λ x y z. E) Las ligaduras son x,y y z.
Variables libres y ligadas
• La ligadura de ocurrencias de una variable está definido
recursivamente sobre la estructura de las expresiones lambda,
de esta manera:
1. En expresiones de la forma V, donde V es una variable, V es una
ocurrencia libre.
2. En expresiones de la forma λ V. E, las ocurrencias son libres en E
salvo aquellas de V. En este caso las V en E se dicen ligadas por el λ
antes V.
3. En expresiones de la forma (E E′), las ocurrencias libres son
aquellas ocurrencias de E y E′.
Variables libres y ligadas
• Expresiones lambda tales como λ x. (x y) no definen funciones
porque las ocurrencias de y están libres. Si la expresión no tiene
variables libres, se dice que es cerrada.
• Como se permite la repetición del identificador de variables, cada
binding tiene una zona de alcance asociada (scope de ahora en
adelante) Un ejemplo típico es: (λx.x(λx.x))x, donde el scope del
binding más a la derecha afecta sólo a la x que tiene ahí, la
situación del otro binding es análoga, pero no incluye el scope de la
primera. Por último la x más a la derecha está libre. Por lo tanto,
esa expresión puede reexpresarse así (λy.y(λz.z))x
α-conversión
• Los nombres de las variables ligadas no son importantes. Por
ejemplo λx.x y λy.y son la misma función. Sin embargo, esta
regla no es tan simple como parece a primera vista. Hay
algunas restricciones que hay que cumplir antes de cambiar el
nombre de una variable por otra. Por ejemplo, si
reemplazamos x por y en λx.λy.x, obtenemos λy.λy.y, que
claramente, no es la misma función. Este fenómeno se conoce
como captura de variables.
α-conversión
• En un ejemplo de otro tipo, se ve que
• es equivalente a
b) En cada llamada, tiene que haber algo que permita una evolución
(si no estaríamos en una autollamada tipo bucle infinitio)
//Entrada: Los enteros x e y, de forma que x >= y e y > 0 //Entrada: n es un entero de forma que n >= 1
int gcd(int x, int y) int fact(int n)
{ {
if (y == 0) if (n == 1)
return x; return 1;
else else
return gcd(y, x % y); return n * fact(n - 1);
} }
Funciones de recursion de cola
• Ejemplo // Función factorial con tail recursion
int fact_tail_sum(int n, int sum) {
if (n == 1) {
return sum;
} else {
return fact_tail_sum(n - 1, sum * n);
}
}
int main()
{
int num = 0;
cout << "Ingresa un nro " << endl; cin >> num;
cout << "Su factorial es " << fact_tail(num) << endl;
return 0;
}
Funcion recursiva lineal
• En la recursión lineal cada llamada recursiva genera, como
mucho, otra llamada recursiva. Se pueden distinguir dos tipos
de recursión lineal atendiendo a cómo se genera resultado.
• En la recursión lineal no final el resultado de la llamada
recursiva se combina en una expresión para dar lugar al
resultado de la función que llama.
• En la recursión lineal final el resultado que es devuelto es el
resultado de ejecución de la última llamada recursiva
Funcion recursiva lineal
• Ejemplo no lineal
#include <stdio.h>
int factorial(int numero){
if (numero > 1) return (numero*factorial(numero-1));
else return(1);
}
int main (){
int n;
printf("Introduce el número: ");
scanf("%d",&n);
printf("El factorial es %d", factorial(n));
}
Funcion recursiva lineal
• Ejemplo Lineal maximo comun divisor:
#include <stdio.h>
long mcd(long,long);
main(int argc, char *argv[]){
long a= 4454,b= 143052;
printf("El m.c.d. de %ld y %ld es %ld\n",a,b,mcd(a,b));
}
long mcd(long a, long b){
if (a==b) return a;
else if (a<b) return mcd(a,b-a);
else return mcd(a-b,b);
}
Limitaciones de programacion funcional
• Mayor dificultad inicial. Aunque sean muy fáciles de entender
y mantener, suele ser más difícil escribir un programa
funcionalmente, sobre todo para mentes acostumbradas a lo
imperativo.
• La ausencia de variables de estado.
• Falta de recursos. Al estar tan poco extendidos, faltan la gran
cantidad de recursos (librerías, frameworks, etc.) existentes
para otros lenguajes
Reconocimiento de patrones
Universidad Nacional
Facultad de Ciencias Exactas y Naturales
Escuela de Informatica
MAP. Rodolfo Sanchez
Introduccion