0% encontró este documento útil (0 votos)
118 vistas226 páginas

Examen

El documento habla sobre analizadores sintácticos y su función de convertir el código fuente en estructuras de datos como árboles. También describe diferentes tipos de analizadores como descendentes y ascendentes.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
118 vistas226 páginas

Examen

El documento habla sobre analizadores sintácticos y su función de convertir el código fuente en estructuras de datos como árboles. También describe diferentes tipos de analizadores como descendentes y ascendentes.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 226

Analizador Sintáctico

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:

int: Para números enteros.


float: Para números de punto flotante (decimales).
char: Para caracteres individuales.
double: Para números de punto flotante de doble precisión.

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 sumar(int a, int b) {


return a + b;
}

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

Para compilar los programas de C utilizaremos un compilador en línea, para no configurar


nada en los equipos y así poder probar los programas, el link compiladores gratuitos son:

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

El manejo de archivos en C se realiza mediante un conjunto de funciones proporcionadas por la


biblioteca estándar stdio.h. Algunas de las funciones más comunes son fopen(), fclose(), fprintf(),
fscanf(), fwrite(), fread(), entre otras.

Aquí te presento algunos ejemplos básicos de manejo de archivos en C:

Escribir en un archivo:

#include <stdio.h>

int main() {

FILE *file;

file = fopen("archivo.txt", "w");

if (file == NULL) {

printf("No se pudo abrir el archivo.\n");

return 1;

fprintf(file, "¡Hola, mundo!");

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;

file = fopen("archivo.txt", "r");

if (file == NULL) {

printf("No se pudo abrir el archivo.\n");

return 1;

while ((ch = fgetc(file)) != EOF) {

putchar(ch);

fclose(file);

return 0;

Escribir y leer estructuras

#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

Persona p = {"John Doe", 30};

// Escribir estructura en archivo

file = fopen("persona.dat", "wb");

if (file == NULL) {

printf("No se pudo abrir el archivo para escritura.\n");

return 1;

fwrite(&p, sizeof(Persona), 1, file);

fclose(file);

// Leer estructura desde archivo

Persona p_leida;

file = fopen("persona.dat", "rb");

if (file == NULL) {

printf("No se pudo abrir el archivo para lectura.\n");

return 1;

fread(&p_leida, sizeof(Persona), 1, file);

printf("Nombre: %s\n", p_leida.nombre);

printf("Edad: %d\n", p_leida.edad);

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.

El lenguaje de programación C ofrece un conjunto robusto de funciones y características para el


manejo de archivos a través de la biblioteca estándar stdio.h. A continuación, se detallan algunas de
las funciones y características más comunes:

1. FILE: Es un tipo de dato definido en C que representa un archivo. La mayoría de las


funciones de manejo de archivos en C trabajan con punteros de este tipo.

2. fopen: Esta función se usa para abrir un archivo.

FILE *fopen(const char *ruta, const char *modo);

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.

3. fclose: Cierra el archivo que ha sido abierto.

int fclose(FILE *archivo);

4. fgetc y fputc: Para leer y escribir un solo carácter respectivamente.

int fgetc(FILE *archivo);

int fputc(int carácter, FILE *archivo);

5. fgets y fputs: Para leer y escribir cadenas de caracteres.

char *fgets(char *cadena, int num, FILE *archivo);

int fputs(const char *cadena, FILE *archivo);

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

int fscanf(FILE *archivo, const char *formato, ...);

int fprintf(FILE *archivo, const char *formato, ...);

7. fread y fwrite: Para leer y escribir bloques de datos (útil para archivos binarios).

size_t fread(void *ptr, size_t tamaño, size_t cont, FILE *archivo);

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.

long ftell(FILE *archivo);

int fseek(FILE *archivo, long desplazamiento, int origen);

origen puede ser: SEEK_SET (inicio del archivo), SEEK_CUR (posición actual), o SEEK_END (final del
archivo).

9. feof: Verifica si el puntero del archivo ha llegado al final del archivo.

int feof(FILE *archivo);

10. rewind: Mueve el puntero del archivo al principio del archivo.

void rewind(FILE *archivo);

11. remove y rename: Para eliminar y renombrar archivos respectivamente.

int remove(const char *ruta);

int rename(const char *viejo_nombre, const char *nuevo_nombre);

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.

Ejemplo de uso de archivos en C

[Fecha] 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA

Vamos a crear un programa simple en C para administrar registros de estudiantes. El programa


permitirá:

a) Añadir un nuevo estudiante.


b) Listar todos los estudiantes.
c) Borrar todos los registros.

Cada estudiante tendrá un nombre y una matrícula.

#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("\n--- Administración de Estudiantes ---\n");

printf("1. Añadir estudiante\n");

printf("2. Listar estudiantes\n");

printf("3. Borrar todos los registros\n");

printf("4. Salir\n");

[Fecha] 9
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA

printf("Elige una opción: ");

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");

} while (opcion != 4);

return 0;

void agregarEstudiante() {

Estudiante e;

[Fecha] 10
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA

FILE *file = fopen("estudiantes.dat", "ab");

if (file == NULL) {

printf("Error al abrir el archivo.\n");

return;

printf("\nIngrese la matrícula: ");

scanf("%d", &e.matricula);

printf("Ingrese el nombre: ");

scanf(" %[^\n]", e.nombre); // Leer hasta el salto de línea

fwrite(&e, sizeof(Estudiante), 1, file);

fclose(file);

printf("Estudiante añadido con éxito.\n");

void listarEstudiantes() {

Estudiante e;

FILE *file = fopen("estudiantes.dat", "rb");

if (file == NULL) {

printf("Error al abrir el archivo.\n");

return;

printf("\n--- Lista de Estudiantes ---\n");

while (fread(&e, sizeof(Estudiante), 1, file)) {

[Fecha] 11
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA

printf("Matrícula: %d, Nombre: %s\n", e.matricula, e.nombre);

fclose(file);

void borrarRegistros() {

if (remove("estudiantes.dat") == 0) {

printf("\nRegistros borrados con éxito.\n");

} else {

printf("\nError al borrar los registros.\n");

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

Ejemplos de pequeños programas en C:


1. Ejemplo 1 Promedios
#include <stdio.h>

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

// Solicitar al usuario que ingrese tres números


printf("Ingresa el primer número: ");
scanf("%f", &num1);

printf("Ingresa el segundo número: ");


scanf("%f", &num2);

printf("Ingresa el tercer número: ");


scanf("%f", &num3);

// 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;
}

2. Ejemplo 2 Suma números en arreglo


#include <stdio.h>

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

for (int i = 0; i < n; i++) {


suma += numeros[i];
}

printf("La suma de los números en el arreglo es: %d\n", suma);

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

De uso general De sintaxis compacta Portable


Antecedentes
• Profesor de matemáticas e inventor en la universidad de Cambridge,
Inglaterra, a mediados del siglo XIX, Charles Babbage fue el primero en
concebir la idea de un lenguaje de programación, al predecir varias de las
teorías en las que se basan las computadoras actuales.
• Babbage desarrolló la idea de una máquina analítica programable que,
por limitaciones tecnológicas de su época, no pudo ser construida. Junto
con él, su colaboradora Ada Lovelace es considerada como la primera
programadora de la historia, ya que escribió los primeros programas para
la máquina concebida por Babbage en tarjetas perforadas, siguiendo una
lógica de programación muy similar a la empleada en nuestros días. Estos
programas nunca pudieron verse ejecutados debido a que la máquina no
fue construida.
Antecedentes
• Charles Babbage es considerado el padre de la informática. A pesar de
que su máquina nunca pudo ser desarrollada, sus ideas y diseños
sirvieron para la construcción y el progreso de las primeras
computadoras modernas.
• Cuando surgió la primera computadora, la ENIAC (Electronic Numerical
Integrator And Calculator), su programación se basaba en componentes
físicos, o sea, se programaba invirtiendo directamente el hardware de la
máquina: se cambiaban de sitio los cables para conseguir así la
programación. La entrada y salida de datos se realizaba mediante
tarjetas perforadas
Fechas importantes
• 1946
– Ingeniero Alemán Konrad Zuse, desarrolla lenguaje Plankalkul,
aplicado para jugar ajedrez.
• 1949
– Surgió el short code, primer lenguaje aplicado en un dispositivo de
cómputo electrónico.
• 1951
– Grace Hopper, realizo el primer compilador conocido ampliamente, el
A-0, y aparece el MATH-MATIC
Fechas importantes
• 1952
– Alick E. Glennie concibió un sistema de programación llamado
Autocode.
• 1957
– Aparece Forttran (Formula Translating) sistema traductor de formulas
matemáticas
• 1960’s
– Comienza a aparecer nuevos lenguajes de programación cada vez
más completos concebidos a partir de diversos enfoques,
características y propósitos.
Clasificación
• Los circuitos microprogramables son sistemas digitales, lo que
significa que trabajan con dos únicos niveles de tensión
simbolizados con el cero (0) y el uno (1). Por eso, el lenguaje de
máquina utiliza sólo dichos signos.
• Un lenguaje de bajo nivel es trasladado fácilmente a lenguaje
de máquina (la palabra bajo se refiere a la abstracción reducida
entre el lenguaje y el hardware).
• Y los lenguajes de programación de alto nivel se caracterizan
por expresar los programas de una manera sencilla.
Clasificación
• Bajo Nivel
– Assembler
• Alto Nivel
– C++
– Fortran
– Java
– Perl
– PHP
– Python
Clasificación de Lenguajes
• Imperativos
– Emplean instrucciones como unidad de trabajo de los programas
(Cobol, Pascal, C, Ada).
• Declarativos
– Los programas se construyen mediante descripciones de funciones o
expresiones lógicas (Lisp, Prolog)
• Orientados a Objetos
– El diseño de los programas se basa más en los datos y su estructura. La
unidad de proceso es el objeto y en él se incluyen los datos (variables)
y operaciones que actual sobre ellos (Smalltalk, C++).
Clasificación de Lenguajes
• Orientados al problema
– Están diseñados para problemas específicos, principalmente de
gestión, suelen ser generadores de aplicaciones.
• Naturales
– Están desarrollándose nuevos lenguajes con el objetivo de aproximar
el diseño y construcción de programas al lenguaje de las personas.
Clasificación por generaciones
• Generaciones
– Primera
• Lenguajes de maquina y ensambladores
– Segunda
• Primeros lenguajes de alto nivel imperativo (Fortran, Cobol)
– Tercera
• Lenguajes de alto nivel imperativo, son los más utilizados
actualmente( Algol 8, PL/I, Pascal, Modula)
Clasificación por generaciones
– Cuarta
• Orientados a las aplicaciones de gestión y manejo de bases de
datos (Natural, SQL).
– Quinta
• Orientados a la inteligencia artificial (IA) y al procesamiento de los
lenguajes naturales (LISP, Prolog).
Componentes
• Los lenguajes de programación no han dejado de ser un conjunto de
símbolos con una estructura gramatical, reglas semánticas y de sintaxis.
• En este orden, los lenguajes de alto nivel han facilitado su uso al
implementar un lenguaje parecido al inglés, más reducido y formal, para
establecer condiciones como if-then-else, indicar el tipo de dato que se
va a manejar, como integer, real, double, o señalar eventos como print.
• De igual manera, hay signos y operadores que ayudan a estructurar
operaciones matemáticas o lógicas, como suma, resta, multiplicación (+,
-, *, /), etcétera
Tipos y estructuras de datos
• Las estructuras de datos son elementos de los lenguajes de
programación que permiten manipular de forma más eficiente
variables diversas: numéricas o tipo texto (cadenas de
caracteres), y otras más complejas, como vectores, matrices y
apuntadores, etcétera.
Instrucciones
• Son estructuras gramaticales predefinidas, muy parecidas al
lenguaje humano, para generar secuencias de acciones que
conformen un programa.
• Van desde los operadores aritméticos y lógicos básicos (sumas,
restas, and, or) hasta instrucciones más especializadas para
realizar diversas acciones dentro del programa, como guardado
de archivos, volcado de pantalla de un texto, etcétera.
Control de flujo
• Se refiere a la secuencia de acciones de un programa. En
ocasiones, dentro de la secuencia de instrucciones, hay puntos
donde el programa debe tomar decisiones con base en el valor
de una variable o el cumplimiento de una cierta condición.
• El tipo de instrucciones que posibilitan dichas acciones son,
precisamente, las de control de flujo: condicionales (if-then-
else), de bucle (for o while) o selección (case).
Tipo de datos y mecanismos de abstracción
• ¿Qué es abstracción?
– Es la capacidad mediante la cual se puede simplificar el proceso de
interpretación (Martín F., 2007). Por ejemplo, ¿cuántos diferentes tipos de sillas
crees que existan en el mundo? Muchísimas. Sin embargo, cuando escuchamos o
leemos la palabra “silla” nuestra mente no se confunde, sino que
inmediatamente visualiza un objeto destinado para sentarse.

• ¿Qué son datos?


– Es el conjunto de propiedades, representada de manera abstracta, que
caracteriza a una entidad. En el ejemplo de la silla, los datos serían: tiene
respaldo, tiene pata(s), etc.
Tipo de datos y mecanismos de abstracción
• ¿Qué es información?
– Es el conjunto de valore que toman los datos para un determinado fenómeno junto
con las relaciones y dependencias de los mismos. Ejemplo: la silla tiene una pata
rota.
• ¿Qué es conocimiento?
– Corresponde con el contenido de la información utilizada por el ser humano para la
toma de decisiones. Ejemplo: la silla tiene una pata rota, no debo sentarme en ella.
Cuando diseñamos una base de datos, necesitamos crear un Modelo de datos, que
viene siendo una abstracción mediante la cual describimos un sistema real (o
incluso abstracto), lo que nos permite ocultar detalles, simplificando un problema
mediante la agrupación de elementos con propiedades comunes.
Mecanismos de abstracción
• Generalización.
– Obtener una nueva clase de objetos a partir de sus subclases.
Utilizamos la expresión “es un”. Por ejemplo, “la silla es un mueble”.
Obtuvimos un nuevo objeto (mueble) a partir de una subclase de
objetos (silla).
• Especialización.
– Dividir una clase general en un conjunto de subclases. La clase
“mueble” se puede dividir en “sillas”, “sillones”, etc.
Mecanismos de abstracción
• Clasificación.
– Crear o buscar clases para englobar las instancias en la clase
correspondiente. Por ejemplo, cuando a un pupitre lo clasificamos
como un mueble escolar.
• Instanciación.
– Obtener las instancias de una clase. Por ejemplo, tu “sillón favorito”
es una instancia de la clase “sillón”.
Mecanismos de abstracción
• Agregación.
– Considerar un objeto basándose en los elementos o propiedades que
lo constituyen. Como cuando nos dicen que un objeto tiene 4 patas
(elemento), un respaldo (elemento), y es cómodo (propiedad),
concluimos que es un mueble.
• Refinamiento.
– Representar los elementos o propiedades de una clase. Un sofá es
alto, ancho y tiene tapicería.
Mecanismos de abstracción
• Para modelar un objeto abstracto a partir de uno del mundo
real podemos seguir dos estrategias:
– Ascendente.
• Utilizando agregación, generalización y clasificación.
– Descendente.
• Utilizando especialización, instanciación y refinamiento.
Tipo de dato abstracto
• En el mundo de la programación existen diversos lenguajes de
programación que se han ido creando con el paso del tiempo y
que se han perfeccionado debido a las necesidades de los
programadores de la época a la que pertenecen. Los primeros
lenguajes de programación eran de tipo lineal, ya que un
programa se recorría desde un punto marcado como Inicio
hasta llegar a un punto Fin. Con el tiempo se fueron creando
nuevos lenguajes y en nuestros días los más utilizados son los
llamados “orientados a objetos”
Tipo de dato abstracto (TDA)
• El concepto de tipo de dato abstracto (TDA, Abstract Data Type), fue
propuesto por primera vez hacia 1974 por John Guttag y otros, pero no
fue hasta 1975 que por primera vez Barbara Liskov lo propuso para el
lenguaje CLU.
• El lenguaje Turbo Pascal fue determinante para la común aceptación de
los TDA con la introducción de las Units, si bien estas no cumplen con
las características básicas de un tipo de dato abstracto como por
ejemplo la encapsulación de los datos. El lenguaje de programación Ada
pudo implementar exitosamente los TDA con sus packages. Vale
recordar que estos dos últimos lenguajes soportan formalmente la
programación modular.
Definición
• Supongamos que en algún lenguaje de POO un pequeño programa saca
el área de un rectángulo de las dimensiones que un usuario decida.
Pensemos también que el usuario probablemente quiera saber el área
de varios rectángulos. Sería muy tedioso para el programador definir la
multiplicación de ‘base’ por ‘altura’ varias veces en el programa, además
que limitaría al usuario a sacar un número determinado de áreas. Por
ello, el programador puede crear una función denominada ‘Area’, la cual
va a ser llamada, con los parámetros correspondientes, el número de
veces que sean necesitadas por el usuario y así el programador se evita
mucho trabajo, el programa resulta más rápido, más eficiente y de
menor longitud.
Separación de la interfaz e implementación
• Cuando se usa en un programa de computación, un TDA es
representado por su interfaz, que sirve como cubierta a la
correspondiente implementación. La idea es que los usuarios de un TDA
tengan que preocuparse solo por la interfaz, pero no por la
implementación, ya que esta puede ir cambiando con el tiempo y, si no
existiera encapsulación, afectarían a los programas que usan el dato.
Esto se basa en el concepto de Ocultación de información, una
protección para el programa de decisiones de diseño que son objeto de
cambio.
Separación de la interfaz e implementación
• La solidez de un TDA reposa en la idea de que la implementación está
escondida al usuario. Solo la interfaz es pública. Esto significa que el TDA
puede ser implementado de diferentes formas, pero mientras se
mantenga consistente con la interfaz, los programas que lo usan no se ven
afectados.
• Por ejemplo, un TDA de una lista puede ser implementado mediante un
Arreglo o una lista enlazada o hasta un árbol binario de búsqueda. Una
lista es un TDA con operaciones bien definidas (agregar elemento, agregar
al final, agregar al principio, recuperar, eliminar, etc.) mientras una lista
enlazada es una estructura de datos basada en punteros o referencias
(dependiendo del lenguaje) que puede ser usada para crear una
representación de una lista.
Caracterización

• Un TDA está caracterizado por un conjunto de operaciones


(funciones) al cual se denomina usualmente como interfaz
pública y representa el comportamiento del TDA; mientras que
la implementación como la parte privada del TDA está oculta al
programa cliente que lo usa. Todos los lenguajes de alto nivel
tienen predefinidos TDA; que son los tipos denominados
simples y las estructuras predefinidas, y estos tienen sus
interfaces públicas que incluyen las operaciones como la +, -, *,
etc.
Tipos de abstracción
• 1. Abstracción funcional:
– crear procedimientos y funciones e invocarlos mediante un nombre
donde se destaca qué hace la función y se ignora cómo lo hace. El
usuario solo necesita conocer la especificación de la abstracción (el
qué) y puede ignorar el resto de los detalles (el cómo).
• 2. Abstracción de datos:
– Tipo de datos:
• Proporcionado por los lenguajes de alto nivel. La representación
usada es invisible al programador, al cual solo se le permite ver las
operaciones predefinidas para cada tipo.
Tipos de abstracción
– Tipos definidos:
• por el programador que posibilitan la definición de valores de
datos más cercanos al problema que se pretende resolver.
– TDA:
• para la definición y representación de tipos de datos (valores +
operaciones), junto con sus propiedades.
– Objetos:
• Son TDA a los que se añade propiedades de reutilización y de
compartición de código.
Tipos de abstracción
• La abstracción de datos es la característica de un sistema de bases de
datos, que permite al usuario o programador operar con los datos sin
necesidad de conocer detalles que para él no son de “importancia”,
ofreciendo así una visión abstracta de estos. Para cumplir con tal fin se
han definido diferentes niveles de abstracción:
– Nivel Físico. Determina como están almacenados físicamente los datos (pistas,
sectores, cilindros), representa el nivel más bajo.
– Nivel Lógico o Conceptual. Determina la organización de los archivos. Índices,
llaves, orden de campos, relaciones, tipos de datos.
– Nivel de Vistas. Oculta parte de la información a los usuarios, es decir hace
visible solo una parte de la base de datos.
Ejemplos de TDA
• Listas:
– una colección secuencial de elementos con operaciones como agregar, borrar,
recorrer.
• Pilas:
– una colección de elementos que sigue la propiedad LIFO. Operaciones comunes
incluyen push, pop, top.
• Colas:
– una colección de elementos que sigue la propiedad FIFO . Operaciones comunes
incluyen enQueue o agregarFinal, deQueue o retornarPrimero.
Ejemplos de TDA
• Conjuntos:
– implementación de conjuntos con sus operaciones básicas (unión, intersección y
diferencia), operaciones de inserción, borrado, búsqueda...
• Diccionarios:
– son un conjunto de asociaciones de clave y valor. Sus operaciones
comunes son put (colocar), get (obtener), recorrer, eliminar.
• Grafos:
– Implementación de grafos; una serie de vértices unidos mediante una serie de
arcos o aristas.
Encapsulamiento
• En la Programación orientada a objetos (POO), la
encapsulación se refiere a la agrupación de datos con los
métodos que operan en esos datos, o la restricción del acceso
directo a algunos de los componentes de un objeto.
• La encapsulación se utiliza para ocultar los valores o el estado
de un objeto de datos estructurados dentro de una clase,
evitando el acceso directo a ellos por parte de los clientes de
una manera que podría exponer detalles de Implementación
ocultos o violar la invariancia de estado mantenida por los
métodos
Encapsulamiento
• Podríamos decir por tanto que con la encapsulación logramos
agrupar datos o restringir el acceso directo a algunos
componentes de un objeto, mediante métodos a modo de
intermediarios que harán uso de ellos mediante unas reglas
definidas. Ayudándonos así por ejemplo a alcanzar otro nivel
de la programación orientada a objetos como sería el
polimorfismo (no confundir con el polimorfismo en el
malware).
Encapsulación y herencia
• Los autores de "Design Patterns" discuten la tensión entre la
herencia y la encapsulación y afirman que, en su experiencia,
los diseñadores abusan de la herencia.
• Afirman que la herencia a menudo rompe la encapsulación,
dado que la herencia expone una subclase a los detalles de la
implementación de su clase padre. Como se describe en el
problema del yo-yo, el uso excesivo de la herencia y, por lo
tanto, la encapsulación, puede volverse demasiado complicado
y difícil de depurar.
Modificadores de acceso
• Los modificadores de acceso son palabras clave que se usan para
especificar la accesibilidad declarada de un miembro o un tipo.
Depende del lenguaje de programación que se use, pero los más
comunes son:
▪ Default: En el caso del lenguaje Java, los miembros de datos, clase o métodos
que no se declaran utilizando ningún modificador de acceso, es decir, que tengan
un modificador de acceso predeterminado, solo son accesibles dentro del mismo
paquete.3
▪ Public: El acceso público es el nivel de acceso más permisivo. No hay ninguna
restricción para el acceso a miembros públicos.
▪ Protected: Un miembro protegido es accesible dentro de su clase y por parte de
instancias de clases derivadas.
Modificadores de acceso
▪ Private: El acceso privado es el nivel de acceso menos permisivo. Los
miembros privados solo son accesibles dentro del cuerpo de la clase o el
struct 6 en el que se declaran.
▪ Internal: Solo se puede tener acceso a los tipos internos o los miembros
desde los archivos del mismo ensamblado.
▪ Protected internal: Se puede obtener acceso a un miembro protected
internal desde el ensamblado actual o desde tipos que se deriven de la
clase contenedora.
▪ Private protected: Los miembros private protected están accesibles
para los tipos que se deriven de la clase contenedora, pero solo desde
dentro del ensamblado correspondiente que lo contenga.
Lenguajes Autómatas de Estado Finito
Universidad Nacional
Facultad de Ciencias Exactas y Naturales
Paradigmas de Programación
MAP. Rodolfo Sanchez
Introducción
• La teoría de Autómatas se aplica en el campo de la informática en
traductores, procesadores, compiladores e intérpretes se aplica los
lenguajes, gramáticas y autómatas para la construcción de analizadores
léxicos, y para la construcción de analizadores sintácticos.
• Son lenguajes cuyas cadenas esta formadas por la concatenación de
símbolos, en las cuales no hay relación entre una parte de la cadena y
otra.
• Los lenguajes y autómatas desempeñan un papel fundamental en la
teoría de la computación y tienen diversas aplicaciones en la vida real.
Importancia en la teoría de la computación
• Jerarquía de Chomsky:
– Los lenguajes y autómatas están conectados a la jerarquía de
Chomsky, que clasifica los diferentes tipos de gramáticas y lenguajes
según su complejidad y poder expresivo. Esto proporciona una base
para entender las capacidades y limitaciones de los sistemas de
procesamiento de información.
Importancia en la teoría de la computación
• Complejidad Computacional:
– Los autómatas y lenguajes están relacionados con la noción de
complejidad computacional. Al estudiar cómo los algoritmos
resuelven problemas, podemos analizar cuántos recursos (como
tiempo y memoria) se requieren. Esto es esencial para optimizar
algoritmos y comprender los límites fundamentales de la
computación.
Aplicaciones en la vida real
• Compiladores y Lenguajes de Programación:
– Los lenguajes regulares y los autómatas son esenciales en la
construcción de compiladores. Ayudan a analizar y traducir código
fuente en lenguaje máquina o código ejecutable. Los autómatas de
estado finito se utilizan para implementar la etapa de análisis léxico,
que descompone el código en tokens reconocibles.
Aplicaciones en la vida real
• Procesamiento de Lenguaje Natural (PLN):
– En PLN, los autómatas de estado finito se utilizan para modelar la
estructura de los lenguajes naturales, como la segmentación de
palabras y la identificación de patrones gramaticales. Esto es crucial
para la traducción automática, la búsqueda de información y la
generación de lenguaje.
Aplicaciones en la vida real
• Validación de Datos y Entradas:
– Los autómatas de estado finito se aplican para validar datos y
entradas en sistemas como formularios en línea, sistemas de bases
de datos y sistemas de validación de tarjetas de crédito. Ayudan a
garantizar que los datos ingresados cumplan con ciertas reglas y
restricciones.
Aplicaciones en la vida real
• Diseño de Circuitos Digitales:
• En el diseño de hardware, los autómatas se usan para modelar y
verificar circuitos digitales. Ayudan a diseñar sistemas electrónicos
confiables y eficientes, como procesadores y dispositivos integrados.
• Redes de Comunicación:
• Los autómatas se utilizan en la administración de protocolos de
comunicación en redes. Ayudan a garantizar la transmisión y
recepción adecuada de datos en sistemas de comunicación
complejos.
Autómata finito
• AF, es modelo computacional que realiza cómputos en forma
automática sobre una entrada para producir una salida. Este
modelo está conformado por un alfabeto, un conjunto de
estados finito, una función de transición, un estado inicial y un
conjunto de estados finales.
Símbolos
• a , b ,c , # , 0 , 1 , then , begin, end, else
• Conjunto finito no vacío
– V1 = { a, b, c, d, … x, y, z}
– V2 = {if, then, begin, end, else}
– Se puede definir las tablas ASCII y EBCDIC
• Cadena es una secuencia finita de símbolos
– Abcd es una cadena del alfabeto V1
Lenguajes regulares
• Un lenguaje regular es un conjunto de cadenas de caracteres
sobre un alfabeto que puede ser reconocido por un autómata
finito.
• Los lenguajes regulares son el nivel más bajo en la jerarquía de
Chomsky, lo que significa que son relativamente simples y
pueden ser descritos y manipulados mediante reglas y
patrones básicos.
Autómatas finitos
• Un autómata finito es un modelo abstracto de cómputo que
consta de un conjunto finito de estados, una entrada, una
función de transición y estados finales.
• Se utiliza para reconocer lenguajes regulares. Un autómata
finito puede estar en un estado en un momento dado y, en
función de la entrada y la función de transición, puede cambiar
de estado o permanecer en el mismo estado.
• Si el estado en el que termina es uno de los estados finales,
entonces la cadena de entrada es reconocida por el autómata.
Autómatas finitos
• Los autómatas finitos se dividen en dos tipos principales:
1.Autómatas Finitos Deterministas (AFD): En un AFD, para cada
combinación de estado y símbolo de entrada, existe una única
transición posible. Esto significa que el autómata siempre sabe
exactamente qué hacer en cada paso.
2.Autómatas Finitos No Deterministas (AFND): En un AFND, puede
haber múltiples transiciones posibles desde un estado dado
utilizando el mismo símbolo de entrada. Esto permite cierto grado de
no determinismo en la elección de la transición a seguir.
Autómatas finitos
• Los autómatas finitos deterministas y no deterministas tienen la misma
capacidad en términos de lenguajes regulares que pueden reconocer,
pero pueden requerir diferentes enfoques para su implementación.
• En resumen, los lenguajes regulares son conjuntos de cadenas de
caracteres que pueden ser reconocidos por autómatas finitos.
• Estos conceptos son fundamentales en la teoría de la computación y son
utilizados en la construcción de compiladores, procesadores de lenguaje
natural y muchas otras aplicaciones en ciencias de la computación y
lingüística.
Diagrama de AFD
AFND
• Una extensión a los autómatas finitos deterministas que
permite que cada nodo del diagrama de estados salga un
número mayor o menor de flechas con símbolos del alfabeto.
– Se permite que falte la flecha de alguno de los símbolos del alfabeto,
o que haya varias flechas que salgan de un solo nodo con la misma
etiqueta.
– Podemos considerar que los AFD son casos especiales de AFND.
Ejemplo AFND
Ejemplos en la vida real
• En la industria:
– Cadenas de montaje, soldadura, pintura de autos
– Planta químicas y petrolíferas
• Alimentación:
– Envasado, embotellado, almacenaje, llenado de botellas, etc.
• Electrónica:
– Termostato, lavadoras.
• comunicaciones:
– Modelo de llamadas en espera.
Importancia de los autómatas
• Realizan el computo, el cálculo y la comparación de los valores
de procesos análogos de encoder.
• Ofrecen flexibilidad para modificar la lógica de control, cuando
sea necesario, en el menor tiempo posible.
• Responden a los cambios de los parámetros del proceso en
fracciones de segundos.
• Solucionan problemas de manera simple y rápida.
• Interactúan con el usuario.
Lenguajes de programación autómatas
• Pascal

• 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.

• Algunos ejemplos de modelos computacionales comunes son


modelos del pronóstico del tiempo, modelos del Earth
Simulator, modelos de simulador de vuelo, modelos de
plegamiento molecular de proteínas, y modelos de red neural.
Programación Imperativa
• La programación imperativa (del latín imperare = ordenar) es el
paradigma de programación más antiguo. De acuerdo con este
paradigma, un programa consiste en una secuencia claramente definida
de instrucciones para un ordenador.
• El código fuente de los lenguajes imperativos encadena instrucciones
una detrás de otra que determinan lo que debe hacer el ordenador en
cada momento para alcanzar un resultado deseado. Los valores
utilizados en las variables se modifican durante la ejecución del
programa. Para gestionar las instrucciones, se integran estructuras de
control como bucles o estructuras anidadas en el código.
Programación Imperativa
• Los lenguajes de programación imperativa son muy concretos y trabajan
cerca del sistema. De esta forma, el código es, por un lado, fácilmente
comprensible, pero, por el otro, requiere muchas líneas de texto fuente
para describir lo que en los lenguajes de la programación declarativa se
consigue con solo una parte de las instrucciones.
• Los lenguajes de programación imperativa más conocidos son:
– Fortran, Java, Pascal, ALGOL, C, C#, C++, Ensambladores, BASIC, COBOL, Python,
Ruby
Programación Imperativa
• Estilos de programación.
– El estilo estructurado de programación amplía el principio imperativo
central con las estructuras concretas de control: secuencias, selección
e iteración. Esto se hace para mitigar o evitar por completo las
instrucciones de salto que añaden una complejidad innecesaria al
código imperativo.
– El enfoque procedimental divide las tareas de las que se debe ocupar
un programa en tareas parciales más pequeñas que se describen en
el código por separado. De esta forma, se crean principios básicos de
programación que también se pueden reutilizar en otros programas.
Programación Imperativa
– Estilo del modelo de programación modular, cada uno de los
componentes de programa se diseñan, desarrollan y prueban con
total independencia los unos de los otros. No es hasta el final del
proceso cuando los módulos se combinan para conformar el software
real.
Programación Declarativa
• ​La programación declarativa es un paradigma de programación
en el que el programador define lo que debe lograr el
programa sin definir cómo debe implementarse. En otras
palabras, el enfoque se centra en lo que debe lograrse en lugar
de instruir cómo lograrlo. Es diferente de un programa
imperativo que tiene el comando establecido para resolver un
cierto conjunto de problemas al describir los pasos necesarios
para encontrar la solución.
Programación Declarativa
• La programación declarativa describe una clase particular de
problemas con la implementación del lenguaje y se encarga de
encontrar la solución. El enfoque de programación declarativa
ayuda a simplificar la programación detrás de algunas
aplicaciones de procesamiento en paralelo.
Programación Declarativa
• El orden de expresión o declaraciones o la replicación de una
declaración no tendrían ningún impacto en la programación declarativa.
• La programación declarativa puede clasificarse además en
programación de restricción, programación lógica y programación de
lógica de restricción. Prolog, SQL y SQL incorporado son algunos de los
ejemplos bien conocidos de lenguajes de programación declarativos. Se
proporcionan herramientas a los programadores en la programación
declarativa para permitir la abstracción de la implementación y ayudar
en la concentración del problema.
Programación Declarativa
• Hay muchas ventajas asociadas con la programación declarativa. En
primer lugar, minimiza la mutabilidad. Las estructuras de datos
inmutables ayudan a eliminar errores difíciles de detectar y son más
fáciles de manejar. Los programadores encontrarían más fácil trabajar
con tales enfoques de programación en lugar de aquellos con
procedimientos poco claros, dependencias implícitas o con muchos
estados mutables. Otro beneficio con la programación declarativa es
que reduce los efectos secundarios del estado al favorecer el uso de
construcciones complejas como funciones y tuberías de orden superior
y al desalentar las variables. El enfoque de programación también ayuda
a hacer que el código sea más comprensible y más escalable
Programación funcional (FP)
• La programación funcional nos es más que un paradigma de
programación, es decir, es una forma en la cual podemos resolver
diferentes problemáticas.
• Functional Programming (Programación Funcional), comúnmente
abreviado FP.
• Cuando nos encontramos desarrollamos software utilizando este
paradigma, estaremos trabajando principalmente con funciones,
evitaremos los datos mutables, así como el hecho de compartir estados
entre funciones.
Programación funcional (FP)
• Con este paradigma las funciones serán tratadas como ciudadanos de
primera clase. Las funciones podrán ser asignadas a variables además
podrán ser utilizadas como entrada y salida de otras funciones.
• A las funciones que puedan tomar funciones como parámetros y
devolver funciones como resultado serán conocidas como función de
orden superior.
• La programación funcional es un paradigma declarativo. Nos
enfocaremos en "qué" estamos haciendo y no en "cómo" se está
haciendo que sería el enfoque imperativo. Esto quiere decir que nosotros
expresaremos nuestra lógica sin describir controles de flujo; no usaremos
ciclos o condicionales.
Programación funcional (FP)
• Funciones Puras
– Las funciones puras, no son más que funciones, las cuales, dando el
mismo input, siempre retornan el mismo output, además de no tener
efectos secundarios.
• Composición de funciones
– La composición de funciones es el proceso de combinar dos o más
funciones, teniendo como finalidad ejecutar cada una de estas
funciones en secuencia para obtener un resultado en concreto.
Programación funcional (FP)
• Estado compartido
– El estado compartido es cualquier variable, objeto o espacio de
memoria que exista en un ámbito compartido. Un ámbito compartido
puede incluir el alcance global o ámbitos de cierre. A menudo, en la
programación orientada a objetos, los objetos se comparten entre
ámbitos al agregar propiedades a otros objetos.
• Mutabilidad
– Un objeto inmutable es aquel que no puede ser modificado una vez
haya sido creado. Por ejemplo, una variable en Java, no es un objeto
inmutable. Podemos ver a los objeto inmutables como constantes, una
vez nosotros asignamos un valor este no podrá ser modificado.
Programación funcional (FP)
• Efectos secundarios
– Un efecto secundario es cualquier cambio de estado en la
aplicación que sea observable fuera de la función llamada
• Algunos lenguajes de programación:
– Java , PHP, Ruby, Python, Elixir, Kotling, Haskell, Erlang
• Muchos de estos lenguajes no están cien por ciento enfocados
en la programación funcional, lo cual no es malo, de hecho,
estos nos permiten hacer una transición de un paradigma a
otro, comúnmente de la programación orientada a objetos ha
programación funcional.
Programación Lógica
• La programación lógica es un tipo de paradigma de programación
dentro del paradigma de programación declarativa. La programación
lógica gira en torno al concepto de predicado, o relación entre
elementos.
• La mayoría de los lenguajes de programación lógica se basan en la teoría
lógica de primer orden, aunque también incorporan algunos
comportamientos de orden superior como la lógica difusa. En este
sentido, destacan los lenguajes funcionales, ya que se basan en el
cálculo lambda, que es la única teoría lógica de orden superior que es
demostradamente computable.
Programación Lógica
• Un concepto importante de programación lógica es la descomposición
de programas en sus componentes lógicos y sus componentes de
control. Con lenguajes de programación lógica de bajo nivel, estos
componentes determinan la solución del problema, por eso los
componentes de control pueden variar para proporcionar alternancia de
ejecución de un programa lógico. Estos conceptos son capturados con el
eslogan
– Algoritmo= lógica + control
– donde "lógica" representa un programa lógico y "control" diferentes
estrategias de demostración del teorema.
Programación Lógica
• La programación lógica permite formalizar hechos del mundo real, por
ejemplo:
• las aves vuelan
• los pingüinos no vuelan
• "pichurri" es un ave
• "sandokan" es un perro
• "alegría" es un ave
• y también reglas o restricciones:
• Una mascota vuela si es un ave y no es un pingüino
• Ante dicho "programa" es posible establecer hipótesis que no son más que preguntas o
incógnitas, por ejemplo:
– ¿ "pichurri" vuela ?
– ¿ qué mascotas vuelan ?....
Programación Lógica
• Gracias a que la lógica de primer orden es computable, el
ordenador será capaz de verificar la hipótesis, es decir,
responder a las incógnitas:
• Es cierto que "pichurri" vuela.
• "pichurri" y "alegría" vuelan.
• El lenguaje de programación lógica por excelencia es Prolog,
que cuenta con diversas variantes. La más importante es la
programación lógica con restricciones, que posibilita la
resolución de ecuaciones lineales además de la demostración
de hipótesis.
Programación Orientada a Objetos (POO)
• La programación orientada a objetos (POO); es un paradigma de
programación que parte del concepto de "objetos" como base, los
cuales contienen información en forma de campos (a veces también
referidos como atributos o propiedades) y código en forma de métodos.
• Los objetos son capaces de interactuar y modificar los valores
contenidos en sus campos o atributos (estado) a través de sus métodos
(comportamiento).
• Muchos de los objetos prediseñados de los lenguajes de programación
actuales permiten la agrupación en bibliotecas o librerías, sin embargo,
muchos de estos lenguajes permiten al usuario la creación de sus
propias bibliotecas.
Programación Orientada a Objetos (POO)
• Algunas características clave de la programación orientada a
objetos son herencia, cohesión, abstracción, polimorfismo,
acoplamiento y encapsulamiento.
• Su uso se popularizó a principios de la década de 1990. En la
actualidad, existe una gran variedad de lenguajes de
programación que soportan la orientación a objetos, estando
la mayoría de éstos basados en el concepto de clases e
instancias.
Programación Orientada a Objetos (POO)
• Los objetos son entidades que tienen un determinado estado,
comportamiento e identidad:
– La identidad es una propiedad de un objeto que lo diferencia del
resto; dicho con otras palabras, es su identificador (concepto análogo
al de identificador de una variable o una constante).
– Los métodos y campos están estrechamente relacionados por la
propiedad de conjunto. Esta propiedad destaca que una clase
requiere de métodos para poder tratar los campos con los que
cuenta.
Programación Orientada a Objetos (POO)
• La programación orientada a objetos difiere de la programación
estructurada tradicional, en la que los datos y los procedimientos están
separados y sin relación, ya que lo único que se busca es el
procesamiento de unos datos de entrada para obtener otros de salida.
• La programación estructurada prima el concepto de procedimientos o
funciones sobre el de estructuras (se emplean principalmente funciones
que procesan datos). La programación orientada a objetos, en cambio,
primero se definen los objetos o estructuras para posteriormente
solicitar la ejecución de sus métodos.
Programación Orientada a Objetos (POO)
• Entre los lenguajes orientados a objetos se destacan los
siguientes:
– ABAP12​, ABL13​, ActionScript, ActionScript 3, C#, Clarion, Clipper
summer 87​, D, Object Pascal (Embarcadero Delphi), Gambas,
GObject, Genie, Harbour, Eiffel, Fortran 90/95, Java, JavaScript15,​
Léxico16​, Objective-C, Ocaml, Oz, R, Perl1718​, Perl 6, PHP19​,
PowerScript, Processing.20​, Python, Ruby, Self, Smalltalk21​, Swift,
Magik, Vala, VB.NET, Visual FoxPro22​,Visual Basic 6.0,Visual
DataFlex, Visual Objects, XBase++, DRP, Scala2324.
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA

Introducción al Lenguaje de Programación Pascal

Pascal es un lenguaje de programación históricamente importante, diseñado en la década de 1970


con fines educativos por Niklaus Wirth. Es conocido por su sintaxis estructurada y fácil de leer, lo
que lo convierte en una opción excelente para aprender conceptos básicos de programación.

1. Conceptos básicos de Pascal


Programas: Un programa en Pascal comienza con la palabra clave program, seguida del nombre del
programa y una lista de archivos usados, si los hay.

program PrimerPrograma;
begin
writeln('¡Hola, mundo!');
end.

Variables: Deben ser declaradas antes de ser usadas.

var
numero: integer;
nombre: string;

Tipos de datos: Pascal admite una variedad de tipos de datos, como integer, real, char, string, entre
otros.

Operaciones: Las operaciones aritméticas básicas son +, -, *, y /.

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.

function Sumar(a, b: integer): integer;


begin
Sumar := a + b;
end;

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.

Ejercicios de pequeños programas en PASCAL:

HOLA Mundo
program HolaMundo;
begin
writeln('¡Hola, mundo!');
end.

Suma de dos números


Este programa solicita al usuario que ingrese dos números y luego muestra la suma
program SumaDeDosNumeros;
var
a, b, suma: integer;
begin
writeln('Ingrese el primer número: ');
readln(a);
writeln('Ingrese el segundo número: ');
readln(b);
suma := a + b;
writeln('La suma de ', a, ' y ', b, ' es: ', suma);
end.

Cálculo del área de un criculo

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.

Numero Par o Impar


Este programa determina si un número dado es par o impar.
program ParOImpar;
var
numero: integer;
begin
writeln('Ingrese un número:');
readln(numero);
if numero mod 2 = 0 then
writeln('El número ', numero, ' es par.')
else
writeln('El número ', numero, ' es impar.');
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);

writeln('Tabla de multiplicar del ', numero);


for i := 1 to 10 do
writeln(numero, ' x ', i, ' = ', numero * i);
end.

Calculadora simple
program CalculadoraSimple;
var

Página 4 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA

num1, num2, resultado: real;


operador: char;
begin
writeln('Calculadora Simple');
write('Ingrese el primer número: ');
readln(num1);
write('Ingrese el operador (+, -, *, /): ');
readln(operador);
write('Ingrese el segundo número: ');
readln(num2);

case operador of
'+': resultado := num1 + num2;
'-': resultado := num1 - num2;
'*': resultado := num1 * num2;
'/': resultado := num1 / num2;
end;

writeln('Resultado: ', resultado:0:2);


end.

Conversor de temperatura
program ConversorTemperatura;
var
celsius, fahrenheit: real;
begin
write('Ingrese la temperatura en grados Celsius: ');
readln(celsius);

fahrenheit := celsius * 9/5 + 32;

writeln('La temperatura en grados Fahrenheit es: ', fahrenheit:0:2);


end.

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;

writeln('¡Adivina el número secreto entre 1 y 100!');

Página 5 de 8
UNIVERSIDAD NACIONAL
FACULTAD DE CIENCIAS EXACTAS Y NATURALES
ESCUELA DE INFORMÁTICA

while intentosRestantes > 0 do


begin
write('Intento ', 6 - intentosRestantes, ': ');
readln(intento);

if intento = numeroSecreto then


begin
writeln('¡Correcto! ¡Has adivinado el número secreto!');
break;
end
else if intento < numeroSecreto then
writeln('El número es mayor.')
else
writeln('El número es menor.');

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

writeln('1. Escribir en el archivo');


writeln('2. Leer del archivo');
writeln('3. Salir');
readln(opcion);

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

▪ for (int i = 0; i < max; i++) { proc (i); }

• es equivalente a

▪ for (int j = 0; j < max; j++) { proc (j); }


β-reducción
• Una expresión de la forma ((λ V. E) E′) es llamada un beta
redex. Una lambda expresión que no admite ninguna beta
reducción se dice que está en su forma normal. No toda
expresión lambda tiene forma normal, pero si existe, es única.
η-conversión
• Es la tercer regla, esta conversión, que podría ser añadida a las
dos anteriores para formar una nueva relación de equivalencia.
La eta conversión expresa la idea de extensionalidad, que en
este contexto implica que dos funciones son la misma si y solo
si dan el mismo resultado para cualquier argumento. La eta
conversión convierte entre λ x. f x y f siempre que x no
aparezca sola en f. Esto puede ser entendido como equivalente
a la extensionalidad así.
η-conversión
• Si f y g son extensionalmente equivalentes, es decir, si f a== g a
para cualquier expresión lambda a entonces, en particular
tomando a como una variable x que no aparece sola en f ni en g,
tenemos que f x == g x y por tanto λ x. f x == λ x. g x, y así por
eta conversión f == g. Entonces, si aceptamos la eta conversión
como válida, resulta que la extensionalidad es válida.
• Inversamente, si aceptamos la extensionalidad como válida
entonces, dado que por beta reducción de todo y tenemos que (λ
x. f x) y == f y, resulta que λ x. f x == f; es decir, descubrimos que
la eta conversión es válida.
Cálculo lambda y los lenguajes de programación

• La mayoría de los lenguajes de programación tienen sus raíces


en el cálculo lambda, lo que provee los mecanismos básicos
para las abstracciones de procedimiento y abstracciones de
aplicaciones (subprogramas).
• A implementación del cálculo lambda en una computadora
involucra tratar a las "funciones" como objetos de primera
clase, lo que aumenta la complejidad de su implementación.
Cálculo lambda y los lenguajes de programación
• Las contrapartes más prominentes del cálculo lambda en
programación son los lenguajes de programación funcional, que
esencialmente implementa el cálculo aumentado con
algunas constantes y tipos de dato.
• Los lenguajes funcionales no son los únicos que soportan las
funciones como objetos de primera clase. Muchos lenguajes
de programación imperativa, como Pascal, hace tiempo que
permiten pasar subprogramas como argumentos a otros
subprogramas. En C y su derivado C++ el resultado equivalente se
obtiene pasando punteros al código de las funciones
Cálculo lambda y los lenguajes de programación
• Estos mecanismos están limitados a subprogramas escritos
explícitamente en el código, y no soportan directamente
funciones de alto nivel. Algunos lenguajes imperativos
orientados a objetos, tiene notaciones que representan
funciones de cualquier orden; tales mecanismos están
disponibles en C++.
• Agente en línea
• agent (x: REAL): REAL do Result := x * x end
Cálculo lambda y los lenguajes de programación
• Un ejemplo en Python usa la forma lambda de funciones:
• func = lambda x: x * x
• Lo anterior crea una función anónima llamada func que puede
ser pasada como parámetros a otras funciones, ser
almacenada en variables, etc. Python también puede tratar
cualquier otra función creada con la sentencia
estándar def como un first-class object.
Cálculo lambda y los lenguajes de programación
• Un ejemplo similar en C++ (usando la biblioteca
Boost.Lambda):
• for_each(v.begin(), v.end(), cout << _1 * _1 << endl;);
• Aquí, la función de librería estándar for_each itera sobre todos
los miembros del vector (o lista) v, e imprime el cuadrado de
cada elemento. La notación _1 es la convención Boost de
Lambda para representar el elemento contenedor,
representado como x en cualquier otro lado.
Cálculo lambda y los lenguajes de programación
• Un delegado simple de c# que toma una variable y retorna el
cuadrado. Esta variable función puede ser pasada a otros
métodos (o delegados de funciones).
// Declare a delegate signature
delegate double MathDelegate (double i);
// Create an delegate instance
MathDelegate f = delegate (double i) { return Math.Pow (i, 2); };
// Passing 'f' function variable to another method, executing,
// and returning the result of the function
double Execute (MathDelegate func)
{
return func(100);
}
Recursividad
• Las funciones recursivas o también conocidas como funciones
recursivas-μ son una clase de funciones de los números
naturales en los números naturales que son «computables» en
un sentido intuitivo.
• Las funciones recursivas están relacionadas con las funciones
primitivas recursivas y su definición inductiva se construye
basándose en la de las funciones primitivas recursivas
Recursivas primitivas
• Las funciones recursivas se definen agregándole a la recursión
primitiva el operador de búsqueda o minimización no acotada
que permite definir funciones parciales.
• Muchas de las funciones normalmente estudiadas en teoría de
los números, y las aproximaciones a las funciones de valor real
utilizan la recursión primitiva. Como ejemplo de ellas se tiene
la suma, la división, el factorial, el enésimo primo, etc.
Definición
• La variable o argumento de una función recursiva primitiva es
un número natural o una n-tupla de números naturales
(i1, i2,..., in), mientras que el resultado o valor de la función es
un número natural.
• Una función es primitiva recursiva si es la función constante
cero, la función sucesor, una proyección o si se define a partir
de funciones primitivas recursivas utilizando únicamente
composición y recursión primitiva.
Ejemplo
• Suma de enteros
– Intuitivamente, se esperaría que la suma se comportase de la forma
siguiente:
suma(0,x)=x
suma(n+1,x)=suma(n, x)+1
– llevada esta función al esquema de las funciones primitivas queda
así:
suma(0,x)=P1¹(x)
suma(S(n), x)=S(P1³(suma(n, x), n, x))
– (donde P1³ es la función que recibe tres argumentos y devuelve el
primero de ellos).
Limitaciones
• Si bien la recursión primitiva parece poder expresar cualquier
operación, en realidad sólo cubre un subconjunto estricto de
las funciones computables.
• Esto se verifica con una variante del argumento
de diagonalización de Cantor.,
Funciones recursiva en C
• Una función puede ser recursiva tanto de forma directa (si es
llamada a sí misma) o de forma indirecta (si llama a una
función que luego la llama).
• Una función recursiva puede dar origen a un típico problema
en programación, la recursión infinita, que es cuando una
función se llama a sí misma infinitas veces. Esto detiene el
normal funcionamiento de un programa.
Funciones recursivas en C
• Para que esto no suceda una función recursiva debe ser muy
bien pensada. Principalmente una función recursiva debe
saber resolver el caso más simple, llamado caso base. Si la
función es llamada con el caso base, inmediatamente retorna
el resultado (no necesita volver a llamarse a sí misma
para poder resolverlo).
• Si la función es llamada con un caso más complejo, las
sucesivas llamadas a sí mismas irán virtualmente
descomponiendo ese caso hasta llegar a un caso base, para
luego determinar el resultado final de la función.
Funciones recursivas en C
• Caso sencillo: cálculo del factorial de un número
n! = n * (n – 1)!

• O sea, el factorial (simbolizado con un signo de exclamación)


de un número n resulta de multiplicar el mismo número por el
factorial de ese número menos uno. De esta manera se va
restando hasta llegar al caso base que es el factorial de 1 y su
resultado es 1. Por ejemplo, el factorial de 5 es:
El factorial de 5 es: 5! = 5 * 4!
el factorial de 4 es: 4! = 4 * 3!
el factorial de 3 es: 3! = 3 * 2!
el factorial de 2 es: 2! = 2 * 1!
el factorial de 1 es: 1! = 1
Funciones recursivas en C
• El cálculo de factorial es posible hacerlo tanto con una
estructura de control como usando una función recursiva. El
código de la función recursiva puede ser:

int factorial(int numero)


{
if (numero == 0)
return 1;
else
return (numero * factorial(numero – 1));
}
Funciones recursivas en C
• Factorial de un numero.
• #include<stdio.h>
long factorial(int);
int main()
{
int n;
long f;
printf("Ingrese el entero del que desea calcular el factorial\n");
scanf("%d", &n);
if (n < 0)
printf("Los enteros negativos no estan permitidos.\n");
else
{
f = factorial(n);
printf("%d! = %ld\n", n, f);
}
return 0;
}
long factorial(int n)
{
if (n == 0)
return 1;
else
return(n * factorial(n-1));
}
Funciones recursivas en C
a) En la recursividad tenemos estos factores importantes:

a) Una función se llama a sí misma

b) En cada llamada, tiene que haber algo que permita una evolución
(si no estaríamos en una autollamada tipo bucle infinitio)

c) Tiene que existir una situación en la que ya no hay una nueva


autollamada, sino un resultado o acción. Esta situación se
denomina caso base y permite que se salga de la recursión.
Funciones recursivas en C
• Factorial con un while
int factorial(int n){
while (n!=1){
return n * factorial(n-1);
}
return 1;
}
Funciones de recursion de cola
• Funciones de recursión de cola son funciones que finalizan con
una llamada recursiva que no crea ninguna operación deferida.

Recusión de cola: Recursión en aumento:

//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);
}
}

// Para mantener la sintaxis original de como se llama a la función factorial


int fact_tail(int n) {
return fact_tail_sum(n, 1);
}

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

• Dado un universo de estudio, el objetivo de un sistema de


reconocimiento de patrones consiste en particionar dicho
universo en clases "patrón" ajenas, de tal manera que el
sistema asignará a un elemento x a una y sólo una clase. Es
decir, el problema es de clasificación, el sistema reconoce que
un elemento pertenece a una clase
Reconicimiento de patrones

• Partes del problema:


– Aislar los objetos (segmentación)
– Extraer las características que discriminan los objetos
– Construir el sistema de clasificación definiendo una distancia que
permita medir que tan próximo es el elemento a cada una de las
clases y en este sentido clasificar x en la clase cuya distancia se
acerque más.
Fases de un Sistema reconocimiento
Ejemplo
• Ejemplo:
– Supongamos, que deseamos construir un sistema reconocedor de
patrones que sea capaz clasificar 4 frutas diferentes: cerezas,
limones, manzanas, uvas.
– Definiendo como variables discriminatorias x1 = diámetro de cada
fruta, y x2 = grado de rojo que contiene cada fruta intentaremos
construir nuestro sistema. Gráficamente podríamos representar el
problema de la siguiente manera:
Ejemplo
Ejemplo
Diseño Sistema de reconocimiento de patrones
1. Diseño algoritmo localizador del objeto:
• Decidir qué propiedades de los objetos discriminan mejor y cómo medirlas
2. Selección características:
– Seleccionar un algoritmo de segmentación que aislará los objetos
individuales de la imagen.
3. Diseño clasificador:
– Establecer las bases matemáticas del algoritmo de clasificación y
escoger la estructura del clasificador que se usará.
Diseño Sistema de reconocimiento de patrones

4. Aprendizaje del clasificador:


– Fijar parámetros ajustables, por ejemplo, fronteras de decisión, etc.
en la clasificación.
5. Evaluación del funcionamiento:
– Estimar las tasas de los posibles errores al clasificar.
Ejemplos de sistemas reconocedores de patrones
Expresiones regulares y evaluación de expresiones
• Las expresiones regulares son modelos que describen las
combinaciones de caracteres en el texto.
• Se podrían definir como una serie de caracteres que forman un
patrón, que representan a otro grupo de caracteres mayor, de
tal forma que podemos comparar el patrón con otros
conjuntos de caracteres para ver las coincidencias.
• Las expresiones regulares pueden utilizarse en múltiples
lenguajes de programación.
Expresiones regulares
• Las expresiones regulares son un lenguaje que permite
simbolizar conjuntos de cadenas de texto formadas por la
concatenación de otras cadenas. Es decir, permite buscar
subcadenas de texto dentro de una cadena de texto.
• Algunos ejemplos de expresiones regulares serian las
siguientes:
Expresiones regulares
C ar ác ter Tex to bu s c ado
^ Principio de entrada o línea.
$ Fin de entrada o línea.
* El carácter anterior 0 o más veces.
+ El carácter anterior 1 o más veces.
? El carácter anterior una vez como máximo (es decir, indica que el carácter anterior es opcional).
. C ualquier carácter individual, salvo el de salto de línea.
x|y x o y.
{n} Exactamente n apariciones del carácter anterior.
{n,m} C omo mínimo n y como máximo m apariciones del carácter anterior.
[abc] C ualquiera de los caracteres entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [a-f] es equivalente a [abcdef]).
[^abc] C ualquier carácter que no esté entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [^a-f] es equivalente a [^abcdef]).
\b Límite de palabra (como un espacio o un retorno de carro).
\B C ualquiera que no sea un límite de palabra.
\d C ualquier carácter de dígito. Equivalente a [0-9].
\D C ualquier carácter que no sea de dígito. Equivalente a [^0-9].
\f Salto de página.
\n Salto de línea.
\r Retorno de carro.
\s C ualquier carácter individual de espacio en blanco (espacios, tabulaciones, saltos de página o saltos de línea).
\S C ualquier carácter individual que no sea un espacio en blanco.
\t Tabulación.
\w C ualquier carácter alfanumérico, incluido el de subrayado. Equivalente a [A-Za-z0-9_].
\W C ualquier carácter que no sea alfanumérico. Equivalente a [^A-Za-z0-9_].
Expresiones regulares
Significado Caracter
Cualquier letra en minuscula [a-z]
Entero ^(?:\+|-)?\d+$
Correo electrónico /[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}/
URL ^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$
(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$
Contraseña segura
(Entre 8 y 10 caracteres, por lo menos un digito y un alfanumérico, y no puede contener caracteres espaciales)
^\d{1,2}\/\d{1,2}\/\d{2,4}$
Fecha
(Por ejemplo 01/01/2007)
^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$
Hora
(Por ejemplo 10:45:23)
Número tarjeta de crédito ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$
Número teléfono ^[0-9]{2,3}-? ?[0-9]{6,7}$
Código postal ^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$
Ejercicios en C
1. Crear un programa en C que valide un numero ingresado de 8 digitos, si
empieza con 8,7 o 6 indentifiquelo como un numero de telefono celular,
si empieza con 2 que lo categorize como un numero de telefono fijo.
2. Aceptar una hilera de caracteres y debe de validar lo que se ingreso es
un email, validando la estructura [email protected].
3. Incluir el siguiente format ’99/99/9999’ e indentificar si el valor incluido
corresponde a una fecha valida.
4. Identificar el codigo de barras incluido si pertenece a Costa Rica(744).

También podría gustarte