Objetivo: Implementar funciones propias del programador mediante la aplicación de la técnica de la programación modular para la resolución de problemas en el desarrollo de software con calidad.
Este documento describe los operadores y estructuras de datos en Prolog, incluyendo listas. Explica que las listas son una estructura de datos común en Prolog que permite representar secuencias ordenadas de elementos. Las listas se dividen en cabeza y cola, donde la cabeza es el primer elemento y la cola es el resto. También cubre operaciones comunes con listas como pertenencia.
La herencia permite derivar una nueva clase de una clase existente, conocida como clase base o superclase. La clase derivada, también llamada subclase o clase hija, hereda los métodos y datos de la clase base. La herencia es una forma de reutilización de código que permite crear jerarquías de clases con características similares.
Diapositia exposicion proyecto de programacionCRISSTHOFER
El documento describe el desarrollo de una aplicación en Java por parte de dos estudiantes para ayudar a los usuarios a aprender las tablas de multiplicar. El proyecto busca aplicar los conocimientos adquiridos en la clase a través de la creación de un juego didáctico que combine la lógica y la creatividad de la programación. El documento detalla los objetivos, metodología, diagnóstico, alcance de la solución y resultados del proyecto.
Objetivo: Describir el proceso de desarrollo de software mediante las características de las fases de análisis, diseño y pruebas para identificarlas dentro de un proyecto de software.
Las interfaces simulan la herencia múltiple permitiendo que una clase implemente múltiples interfaces. Una interfaz declara métodos abstractos que deben ser implementados por las clases que la implementan, y puede heredar de otras interfaces. Las interfaces se usan para establecer características comunes entre clases diferentes y asegurar que solo las clases que las implementen puedan acceder a sus métodos y atributos.
Objetivo: Aplicar tecnologías y mecanismos para el desarrollo de aplicaciones distribuidas básicas, a través de la utilización de técnicas y librerías para sistemas distribuidos.
La programación modular divide un problema complejo en subproblemas más simples mediante la creación de módulos o subprogramas, cada uno de los cuales resuelve un subproblema. Los módulos se comunican entre sí a través de interfaces bien definidas y, aunque a menudo se implementan como funciones o procedimientos, no son sinónimos de estos términos.
Este documento presenta el software Raptor, el cual permite crear diagramas de flujo y aprender sobre diseño de algoritmos. Raptor realiza verificaciones simples de sintaxis y semántica durante la creación de diagramas, y permite ejecutar los diagramas de forma secuencial o paso a paso. El documento explica cómo crear asignaciones, entradas, salidas, estructuras condicionales e iterativas usando Raptor.
Este documento describe los operadores y estructuras de datos en Prolog, incluyendo listas. Explica que las listas son una estructura de datos común en Prolog que permite representar secuencias ordenadas de elementos. Las listas se dividen en cabeza y cola, donde la cabeza es el primer elemento y la cola es el resto. También cubre operaciones comunes con listas como pertenencia.
La herencia permite derivar una nueva clase de una clase existente, conocida como clase base o superclase. La clase derivada, también llamada subclase o clase hija, hereda los métodos y datos de la clase base. La herencia es una forma de reutilización de código que permite crear jerarquías de clases con características similares.
Diapositia exposicion proyecto de programacionCRISSTHOFER
El documento describe el desarrollo de una aplicación en Java por parte de dos estudiantes para ayudar a los usuarios a aprender las tablas de multiplicar. El proyecto busca aplicar los conocimientos adquiridos en la clase a través de la creación de un juego didáctico que combine la lógica y la creatividad de la programación. El documento detalla los objetivos, metodología, diagnóstico, alcance de la solución y resultados del proyecto.
Objetivo: Describir el proceso de desarrollo de software mediante las características de las fases de análisis, diseño y pruebas para identificarlas dentro de un proyecto de software.
Las interfaces simulan la herencia múltiple permitiendo que una clase implemente múltiples interfaces. Una interfaz declara métodos abstractos que deben ser implementados por las clases que la implementan, y puede heredar de otras interfaces. Las interfaces se usan para establecer características comunes entre clases diferentes y asegurar que solo las clases que las implementen puedan acceder a sus métodos y atributos.
Objetivo: Aplicar tecnologías y mecanismos para el desarrollo de aplicaciones distribuidas básicas, a través de la utilización de técnicas y librerías para sistemas distribuidos.
La programación modular divide un problema complejo en subproblemas más simples mediante la creación de módulos o subprogramas, cada uno de los cuales resuelve un subproblema. Los módulos se comunican entre sí a través de interfaces bien definidas y, aunque a menudo se implementan como funciones o procedimientos, no son sinónimos de estos términos.
Este documento presenta el software Raptor, el cual permite crear diagramas de flujo y aprender sobre diseño de algoritmos. Raptor realiza verificaciones simples de sintaxis y semántica durante la creación de diagramas, y permite ejecutar los diagramas de forma secuencial o paso a paso. El documento explica cómo crear asignaciones, entradas, salidas, estructuras condicionales e iterativas usando Raptor.
Objetivo: Utilizar componentes gráficos, eventos, manejadores de eventos y animaciones sencillas, a través de librerías gráficas e hilos con el fin de permitir la interacción del usuario con la aplicación y comprender el procesamiento en paralelo.
Un traductor divide su proceso en dos etapas: análisis y síntesis. La etapa de análisis analiza el lenguaje fuente, verifica su corrección sintáctica y semántica, y genera estructuras intermedias. La etapa de síntesis usa estas estructuras para generar código intermedio, código máquina, y optimizar el código final. Un traductor traduce código de un lenguaje fuente a un lenguaje objetivo, como de un lenguaje de programación a código de máquina.
El documento explica los conceptos básicos de análisis de complejidad de algoritmos, incluyendo notación Big O y Θ. Define las funciones de tiempo de ejecución asintótico para diferentes tipos de bucles anidados y explica que la complejidad de un algoritmo depende del caso más común o lento.
El documento introduce los conceptos básicos de la programación modular, incluyendo la descomposición de un problema complejo en módulos más pequeños y la comunicación entre un programa principal y los módulos a través de llamadas. Explica que la programación modular mejora la legibilidad, el mantenimiento y la reutilización del código.
Este documento describe el crecimiento asintótico de funciones y su relación con el rendimiento de la programación. Explica las notaciones "Big O", "Big Omega" y "little o" para analizar el peor, mejor y comportamiento asintótico de algoritmos a medida que aumenta el tamaño de entrada n. Proporciona ejemplos de análisis de código fuente para ilustrar cómo estas notaciones pueden usarse para cuantificar los límites superiores e inferiores del tiempo de ejecución de algoritmos.
En esta presentación cubrimos el modelo de memoria del JDK 5/6/7, a partir de JDK 8 hay un cambio en el modelo de memoria, así que no toda la presentación seria valida, aunque algunos conceptos se mantienen.
Los ejemplos se pueden encontrar en https://github.com/ldebello/javacuriosities/tree/master/MemoryManagement
Caracterizar la fundamentación teórica del software, mediante el análisis de su evolución y del proceso de ingeniería, que permitan identificar el ámbito de la ingeniería de software.
UML. Un análisis comparativo para la diagramación de softwareYaskelly Yedra
Este documento realiza un análisis comparativo entre el Lenguaje de Modelado Unificado (UML) con el desarrollo estructurado y los métodos orientados a objetos. Describe los elementos, relaciones y diagramas de UML, el desarrollo estructurado y los métodos orientados a objetos. Luego, realiza un análisis comparativo entre estos para descubrir similitudes y diferencias. Concluye que UML no garantiza el éxito de un proyecto pero permite a los ingenieros centrarse en la entrega de un producto
Este documento introduce los conceptos fundamentales de los lenguajes formales, incluyendo alfabetos, cadenas, lenguajes, operaciones sobre lenguajes como concatenación y cerradura, y cómo describir lenguajes mediante propiedades. Explica cómo los alfabetos se pueden usar para generar cadenas y cómo las cadenas a su vez se pueden usar para definir lenguajes formales.
El diagrama de despliegue es un diagrama UML que modela el hardware y las relaciones entre los componentes de hardware y software de un sistema. Describe la arquitectura física del sistema durante la ejecución en términos de procesadores, dispositivos y componentes de software. Muestra la topología del sistema y cómo los nodos de hardware ejecutan componentes de software.
Este documento describe cómo convertir un diagrama de clases UML a código Java. Presenta las clases Vehículo y Persona, explicando cómo los atributos y relaciones del diagrama se convierten en atributos de clase en Java. También incluye información sobre la creación de proyectos y clases en Eclipse, y ofrece ejemplos adicionales de conversión de diagramas de clases a código.
Este documento presenta información sobre componentes y librerías en programación. Explica que una librería es un conjunto de código que implementa funciones y comportamientos con una interfaz definida para ser usada por otros programas. Describe dos tipos de librerías: estáticas y dinámicas. También presenta pasos para crear una librería dinámica (DLL) en C# y Visual Studio.
Clasificación de los lenguajes de programaciónd3m3nt3
Este documento clasifica los lenguajes de programación según tres criterios: nivel de abstracción, forma de ejecución y paradigma de programación. Describe los lenguajes de bajo nivel como lenguajes de máquina y ensamblador que se ejecutan directamente en la máquina, mientras que los lenguajes de alto nivel son más abstractos. Explica que los lenguajes pueden ser compilados o interpretados, y menciona paradigmas como el imperativo y orientado a objetos.
Este documento trata sobre el análisis de algoritmos. Explica que el análisis de algoritmos estima el tiempo y espacio necesarios para ejecutar un algoritmo y permite evaluar la calidad de los algoritmos sin necesidad de implementarlos. También define las complejidades en tiempo y espacio de un algoritmo y explica cómo se puede estimar el crecimiento de las funciones de tiempo usando notaciones como O-grande, Ω y Θ.
Este documento presenta una introducción al proceso de desarrollo de software. Explica conceptos clave como los componentes de un proceso de software, incluyendo personas, roles, actividades y artefactos. También describe elementos como marco de trabajo común, conjunto de tareas, hitos y puntos SQA. El objetivo es caracterizar los fundamentos del proceso de desarrollo de software de manera metodológica.
Equivalencia de autómatas finitos y expresiones regulares.Yamilee Valerio
Este documento discute la equivalencia entre expresiones regulares y autómatas finitos. Explica cómo construir un autómata finito equivalente a una expresión regular dada y viceversa. También introduce autómatas de pila no deterministas, describiendo sus componentes y representación gráfica. Finalmente, incluye tres ejercicios de aplicación del tema.
La computación distribuída es un nuevo modelo de computación que surgió con el objetivo de resolver problemas de computación masiva donde diferentes máquinas trabajan en paralelo formando un clúster de computación.
En los últimos años han surgido diferentes frameworks como Apache Hadoop, Apache Spark y Apache Flink que permiten resolver este tipo de problemas donde tenemos datos masivos desde diferentes fuentes de datos.
Dentro del ecosistema de Python podemos destacar las librerías de Pyspark y Dask de código abierto que permiten la ejecución de tareas de forma paralela y distribuida en Python.
Entre los puntos a tratar podemos destacar:
Introducción a la computación distribuida
Comparando tecnologías de computación distribuida
Frameworks y módulos en Python para computación distribuida
Casos de uso en proyectos Big Data
Este documento presenta los resultados de la evaluación de varios lenguajes de programación según criterios como expresividad, tipos de datos, modularidad, facilidades de entrada y salida, eficiencia, entre otros. Se evalúa el lenguaje Fortran mediante un fragmento de código y se califica cada criterio. Luego, se presenta brevemente la evaluación de los lenguajes ALGOL y Pascal.
Objetivo: Utilizar componentes gráficos, eventos, manejadores de eventos y animaciones sencillas, a través de librerías gráficas e hilos con el fin de permitir la interacción del usuario con la aplicación y comprender el procesamiento en paralelo.
Un traductor divide su proceso en dos etapas: análisis y síntesis. La etapa de análisis analiza el lenguaje fuente, verifica su corrección sintáctica y semántica, y genera estructuras intermedias. La etapa de síntesis usa estas estructuras para generar código intermedio, código máquina, y optimizar el código final. Un traductor traduce código de un lenguaje fuente a un lenguaje objetivo, como de un lenguaje de programación a código de máquina.
El documento explica los conceptos básicos de análisis de complejidad de algoritmos, incluyendo notación Big O y Θ. Define las funciones de tiempo de ejecución asintótico para diferentes tipos de bucles anidados y explica que la complejidad de un algoritmo depende del caso más común o lento.
El documento introduce los conceptos básicos de la programación modular, incluyendo la descomposición de un problema complejo en módulos más pequeños y la comunicación entre un programa principal y los módulos a través de llamadas. Explica que la programación modular mejora la legibilidad, el mantenimiento y la reutilización del código.
Este documento describe el crecimiento asintótico de funciones y su relación con el rendimiento de la programación. Explica las notaciones "Big O", "Big Omega" y "little o" para analizar el peor, mejor y comportamiento asintótico de algoritmos a medida que aumenta el tamaño de entrada n. Proporciona ejemplos de análisis de código fuente para ilustrar cómo estas notaciones pueden usarse para cuantificar los límites superiores e inferiores del tiempo de ejecución de algoritmos.
En esta presentación cubrimos el modelo de memoria del JDK 5/6/7, a partir de JDK 8 hay un cambio en el modelo de memoria, así que no toda la presentación seria valida, aunque algunos conceptos se mantienen.
Los ejemplos se pueden encontrar en https://github.com/ldebello/javacuriosities/tree/master/MemoryManagement
Caracterizar la fundamentación teórica del software, mediante el análisis de su evolución y del proceso de ingeniería, que permitan identificar el ámbito de la ingeniería de software.
UML. Un análisis comparativo para la diagramación de softwareYaskelly Yedra
Este documento realiza un análisis comparativo entre el Lenguaje de Modelado Unificado (UML) con el desarrollo estructurado y los métodos orientados a objetos. Describe los elementos, relaciones y diagramas de UML, el desarrollo estructurado y los métodos orientados a objetos. Luego, realiza un análisis comparativo entre estos para descubrir similitudes y diferencias. Concluye que UML no garantiza el éxito de un proyecto pero permite a los ingenieros centrarse en la entrega de un producto
Este documento introduce los conceptos fundamentales de los lenguajes formales, incluyendo alfabetos, cadenas, lenguajes, operaciones sobre lenguajes como concatenación y cerradura, y cómo describir lenguajes mediante propiedades. Explica cómo los alfabetos se pueden usar para generar cadenas y cómo las cadenas a su vez se pueden usar para definir lenguajes formales.
El diagrama de despliegue es un diagrama UML que modela el hardware y las relaciones entre los componentes de hardware y software de un sistema. Describe la arquitectura física del sistema durante la ejecución en términos de procesadores, dispositivos y componentes de software. Muestra la topología del sistema y cómo los nodos de hardware ejecutan componentes de software.
Este documento describe cómo convertir un diagrama de clases UML a código Java. Presenta las clases Vehículo y Persona, explicando cómo los atributos y relaciones del diagrama se convierten en atributos de clase en Java. También incluye información sobre la creación de proyectos y clases en Eclipse, y ofrece ejemplos adicionales de conversión de diagramas de clases a código.
Este documento presenta información sobre componentes y librerías en programación. Explica que una librería es un conjunto de código que implementa funciones y comportamientos con una interfaz definida para ser usada por otros programas. Describe dos tipos de librerías: estáticas y dinámicas. También presenta pasos para crear una librería dinámica (DLL) en C# y Visual Studio.
Clasificación de los lenguajes de programaciónd3m3nt3
Este documento clasifica los lenguajes de programación según tres criterios: nivel de abstracción, forma de ejecución y paradigma de programación. Describe los lenguajes de bajo nivel como lenguajes de máquina y ensamblador que se ejecutan directamente en la máquina, mientras que los lenguajes de alto nivel son más abstractos. Explica que los lenguajes pueden ser compilados o interpretados, y menciona paradigmas como el imperativo y orientado a objetos.
Este documento trata sobre el análisis de algoritmos. Explica que el análisis de algoritmos estima el tiempo y espacio necesarios para ejecutar un algoritmo y permite evaluar la calidad de los algoritmos sin necesidad de implementarlos. También define las complejidades en tiempo y espacio de un algoritmo y explica cómo se puede estimar el crecimiento de las funciones de tiempo usando notaciones como O-grande, Ω y Θ.
Este documento presenta una introducción al proceso de desarrollo de software. Explica conceptos clave como los componentes de un proceso de software, incluyendo personas, roles, actividades y artefactos. También describe elementos como marco de trabajo común, conjunto de tareas, hitos y puntos SQA. El objetivo es caracterizar los fundamentos del proceso de desarrollo de software de manera metodológica.
Equivalencia de autómatas finitos y expresiones regulares.Yamilee Valerio
Este documento discute la equivalencia entre expresiones regulares y autómatas finitos. Explica cómo construir un autómata finito equivalente a una expresión regular dada y viceversa. También introduce autómatas de pila no deterministas, describiendo sus componentes y representación gráfica. Finalmente, incluye tres ejercicios de aplicación del tema.
La computación distribuída es un nuevo modelo de computación que surgió con el objetivo de resolver problemas de computación masiva donde diferentes máquinas trabajan en paralelo formando un clúster de computación.
En los últimos años han surgido diferentes frameworks como Apache Hadoop, Apache Spark y Apache Flink que permiten resolver este tipo de problemas donde tenemos datos masivos desde diferentes fuentes de datos.
Dentro del ecosistema de Python podemos destacar las librerías de Pyspark y Dask de código abierto que permiten la ejecución de tareas de forma paralela y distribuida en Python.
Entre los puntos a tratar podemos destacar:
Introducción a la computación distribuida
Comparando tecnologías de computación distribuida
Frameworks y módulos en Python para computación distribuida
Casos de uso en proyectos Big Data
Este documento presenta los resultados de la evaluación de varios lenguajes de programación según criterios como expresividad, tipos de datos, modularidad, facilidades de entrada y salida, eficiencia, entre otros. Se evalúa el lenguaje Fortran mediante un fragmento de código y se califica cada criterio. Luego, se presenta brevemente la evaluación de los lenguajes ALGOL y Pascal.
Este documento presenta los resultados de la evaluación de varios lenguajes de programación según criterios como expresividad, tipos de datos, modularidad, facilidades de entrada y salida, eficiencia, entre otros. Se evalúa el lenguaje Fortran mediante un fragmento de código y se califica cada criterio. Luego, se presenta brevemente la evaluación de los lenguajes ALGOL y Pascal.
El documento presenta los resultados de la evaluación de 7 lenguajes de programación según varios criterios. Se evalúan los lenguajes Fortran, ALGOL, Pascal, C, Ada, Java y C# en términos de expresividad, tipos de datos soportados, modularidad, facilidades de entrada/salida, eficiencia, transportabilidad y otros criterios. Los autores concluyen que cada lenguaje tiene fortalezas y debilidades dependiendo del tipo de aplicación.
El documento presenta los fundamentos de la programación orientada a objetos, incluyendo los principios de generalización o abstracción, encapsulamiento, modularidad y jerarquía. Explica cada principio y las reglas para aplicarlos de manera que el software sea correcto, robusto, extensible y reutilizable.
El documento presenta los fundamentos de la programación orientada a objetos, incluyendo conceptos como la generalización, encapsulamiento, modularidad y jerarquía. Explica que la generalización implica abstracción, coherencia de clases y métodos, tipos de datos genéricos y gestión de excepciones. El encapsulamiento oculta la información interna de un objeto. La modularidad minimiza el acoplamiento entre componentes. La jerarquía organiza las clases por niveles de herencia y composición.
Este documento describe los conceptos fundamentales de la programación orientada a objetos como la abstracción, encapsulación e herencia. Explica que la POO surgió en los años 60 y se popularizó en los 80. También detalla algunas ventajas de la POO como la reusabilidad, mantenibilidad y modificabilidad del código, así como algunos desafíos como la necesidad de cambiar la forma de pensar y el posible impacto en el rendimiento.
Este documento describe varios conceptos clave del diseño estructurado de algoritmos y programas, como la descomposición de problemas en módulos mediante refinamientos sucesivos, la jerarquía modular, el acoplamiento e independencia de módulos, la cohesión, las técnicas top-down y bottom-up, y los diagramas de Warnier Orr. El objetivo del diseño estructurado es dividir un problema grande en subproblemas más pequeños resueltos por módulos independientes y de fácil mantenimiento.
Este documento presenta la asignatura de Programación de Algoritmos de la Escuela de Ciencias de la Computación. Los objetivos de la asignatura son que los estudiantes aprendan a utilizar los recursos de Java y presentar técnicas para guardar información en archivos y conceptos de programación orientada a objetos. Se incluyen ejemplos de cómo transferir y guardar datos en archivos usando flujos y registros en Java.
El documento resume las características, estructuras básicas, orígenes y ventajas y desventajas de la programación orientada a objetos. Abstracción, encapsulación y herencia son características clave. Las clases incluyen atributos y métodos. La POO ofrece reusabilidad, mantenibilidad y modificabilidad pero puede requerir un cambio en la forma de pensar y ser más lenta.
Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)Nerys Ramírez Mordán
Este código genera secuencias y repeticiones de vectores en R:
1. La línea 1:10 genera un vector numérico desde 1 hasta 10.
2. La línea rep(1:4,2) repite el vector de 1 a 4 dos veces, resultando en el vector [1,2,3,4,1,2,3,4]. La función rep() repite el vector especificado (1:4) la cantidad de veces indicada en el segundo argumento (2).
Así, rep() permite generar repeticiones de vectores de manera fácil en R.
CREACION DE DLL Y USO (Ejemplo desarrollado)Darwin Durand
El documento describe las capas principales de .NET Framework, incluyendo el runtime de lenguaje común (CLR), la biblioteca de clases base (.NET Framework Base Classes), y las capas de formularios y servicios web. También describe cómo crear una biblioteca de clases de C# para realizar operaciones CRUD en una tabla RAM de una base de datos, incluyendo funciones para listar, eliminar, seleccionar y insertar/actualizar registros.
Este documento presenta una introducción a la programación orientada a objetos en C++. Explica conceptos clave como clases, objetos, encapsulamiento, herencia y polimorfismo. Luego proporciona un ejemplo de clase para calcular las notas de los alumnos en una asignatura según diferentes porcentajes para prácticas, exámenes parciales y finales.
Estimacion de Proyectos, Ingeniería de SoftwareMarvin Romero
Este documento describe diferentes técnicas para estimar los recursos, costos y tiempo necesarios para completar un proyecto de software. Explica cómo determinar los requisitos funcionales y no funcionales del software, y estimar los recursos humanos y materiales requeridos. Luego, detalla tres opciones para realizar estimaciones: basadas en proyectos similares, mediante descomposición del problema o usando modelos empíricos como COCOMO. El documento ilustra estas técnicas con ejemplos de estimaciones basadas en líneas de código y puntos
El documento explica por qué se eligió Python como primer lenguaje de programación para enseñar. Python tiene una sintaxis sencilla y es poderoso, lo que hace que sea más fácil de aprender que lenguajes como Java o C++. Aprender los conceptos básicos de Python facilita el aprendizaje de otros lenguajes. El documento también proporciona una introducción a los conceptos básicos de Python como variables, funciones, condicionales, bucles y clases.
Este documento presenta conceptos fundamentales de programación imperativa como lenguaje C. Define programación estructurada y sus tres estructuras básicas de control. Explica características clave de C como su flexibilidad, transportabilidad y capacidad para dar órdenes a la máquina. También describe elementos como palabras reservadas, librerías y cadenas de formato comúnmente usadas en C.
Este documento presenta y describe los principales frameworks de templates y XML. Introduce los conceptos de frameworks de templates, stream de marcado y funciones como escaping y saneamiento HTML. Luego analiza tres frameworks específicos: Mako, Kid y Genshi, describiendo sus características, sintaxis, instalación y código de ejemplo. El objetivo es comparar las principales características de estos frameworks de templates y XML.
El documento explica qué es un framework. Un framework es una estructura genérica que provee funcionalidad común y puede ser especializada por desarrolladores. Los frameworks dividen el código en zonas estáticas (estructura básica) y zonas dinámicas (puntos de extensión) que permiten añadir funcionalidad específica. Existen frameworks de caja blanca, que se extienden a través de herencia, y de caja negra, que usan composición.
Un marco es una estructura lógica que proporciona una base para el diseño e implementación de software mediante bibliotecas de código y herramientas de desarrollo. Un marco representa una arquitectura de software que modela las relaciones generales entre entidades y provee una estructura metodológica para extender o usar aplicaciones. Los marcos están diseñados para facilitar el desarrollo permitiendo a los desarrolladores enfocarse en requerimientos en lugar de detalles técnicos.
The document proposes a methodology for feature subset selection to detect malware in a network. It combines filter and wrapper techniques to remove redundant and irrelevant features from a dataset containing malware and non-malware network activity. Several machine learning models are trained on the selected features and evaluated on a test set, with random forests achieving the best accuracy improvement of 0.1% compared to using all features. The methodology provides an alternative for feature selection that performs comparably to existing methods and could be applied to other machine learning domains like medical diagnosis or fraud detection.
Este documento presenta una introducción a la ingeniería web. Explica que el rápido crecimiento de Internet y las aplicaciones web ha dado lugar a la necesidad de una nueva disciplina llamada ingeniería web. También describe algunos de los desafíos del desarrollo de aplicaciones web, como el desarrollo ad-hoc y falta de procesos, y cómo esto puede conducir a fallas de proyectos. Finalmente, introduce conceptos clave de la ingeniería web como las características de los sistemas web y categorías de aplicaciones web.
Objetivo: Enfatizar la necesidad de que las páginas web sean utilizables por el máximo número de personas, independientemente de sus conocimientos o capacidades personales e independientemente de las características técnicas del equipo utilizado para acceder a la Web
Este documento presenta una unidad sobre metodologías y técnicas de la ingeniería web. Explica que la unidad estudiará diversas metodologías desde el punto de vista del trabajo con el usuario, analizando cómo y por qué se involucra al usuario y las ventajas y desventajas de cada metodología. Luego procede a enumerar varias metodologías específicas y técnicas que se analizarán.
Este documento presenta la Unidad 4 de un curso sobre Aplicaciones Distribuidas. La unidad cubre conceptos de programación paralela y distribuida utilizando OpenMP y MPI. Incluye información sobre programación de memoria compartida y distribuida, modelos de programación paralela, y ejemplos de código para desarrollar aplicaciones paralelas y distribuidas.
Objetivo: Conocer los fundamentos, técnicas y aplicaciones del procesamiento paralelo y distribuido que permitan el diseño de aplicaciones que requieran cómputo de altas prestaciones.
Objetivo: Identificar los fundamentos de sistemas distribuidos y tecnologías de programación paralela a través de la revisión sistemática de contenidos actualizados, con la finalidad de construir una base sólida de conocimientos que permita su posterior aplicación.
Objetivo: Establecer los lineamientos fundamentales de la gerencia de proyectos en ingeniería de software, impulsando el desarrollo de las mejores prácticas, para generar destrezas en la elaboración de los documentos iniciales de un proyecto, previo a su implementación.
Este documento presenta la unidad 2 de un curso de elaboración de proyectos. Explica conceptos clave como gestión del alcance, línea base del alcance, estructura de desglose del trabajo y su jerarquía de entregables, paquetes de trabajo y cuentas de control. El objetivo es describir las técnicas para definir actividades, alcance y control de cronograma en proyectos de ingeniería de software.
Objetivo: Caracterizar los elementos que involucran la gestión de la configuración del software mediante la identificación de cada uno de sus elementos y características para la correcta aplicación de los mismos.
GCSW Unidad2: Actividades de la gestión de configuración del software Franklin Parrales Bravo
Objetivo: Aplicar estrategias de versionado de software mediante el uso de herramientas tecnológicas específicas para lograr un control de versiones óptimo.
Objetivo: Desarrollar proyectos que resuelvan problemas sencillos de la realidad utilizando el modelamiento orientado a objetos y manejando adecuadamente las posibles excepciones a generarse.
Este documento presenta información sobre direccionamiento IPv6, protocolos de enrutamiento y routers. Explica la estructura y representación de direcciones IPv6, incluyendo reglas para compactarlas. También describe diferentes tipos de direcciones IPv6 como unicast, multicast y anycast, así como conceptos como ámbitos, zonas de ámbito e identificadores de zonas. Finalmente, detalla varios tipos de direcciones IPv6 unicast como globales agregables, de enlace local, de sitio local y ULA.
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4Franklin Parrales Bravo
Objetivo: Describir los diferentes protocolos TCP/IP y direccionamiento IPv4, para identificar los servicios que se habilitan en la transmisión de datos a través de la red.
Objetivo: Estudiar los fundamentos de las comunicaciones y redes, mediante el análisis de los medios de transmisión y modelos de capas que intervienen en una red, para integrar los recursos tecnológicos de comunicaciones y redes.
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...micarnavaltupatrimon
Mi Carnaval es la plataforma que permite conectar al usuario con la cultura y la emoción del Carnaval de Blancos y Negros en la ciudad de Pasto, esta plataforma brinda una amplia oferta de productos, servicios, tiquetería e información relevante para generarle valor al usuario, además, la plataforma realiza un levantamiento de datos de los espectadores que se registran, capturando su actividad e información relevante para generar la analítica demográfica del evento en tiempo real, con estos datos se generan modelos predictivos, que permiten una mejor preparación y organización del evento, de esta manera ayudando a reducir la congestión, las largas filas y, así como a identificar áreas de alto riesgo de delincuencia y otros problemas de seguridad.
Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...Javier Martinez Seco
El 15 de junio de 2024 Javier Martínez Seco, director de Ecode, presentó en SEonthebeach 2024 una ponencia titulada "Casos de éxito en Negocios online - Estrategias WPO que funcionan". Javier compartió su experiencia de más de 15 años en el ámbito de las tecnologías web, destacando su especialización en desarrollo web a medida, SEO técnico y optimización del rendimiento web (WPO).
- Presentación inicial: Javier Martínez es ingeniero informático especializado en tecnologías web, con un historial que incluye la creación y mejora de más de 1000 sitios web y negocios online. Realiza auditorías, consultorías, formación a equipos de desarrollo y desarrollo a medida.
- Sitios web que funcionan bien desde el principio: destacó la diferencia entre un sitio web que simplemente "funciona" y uno que "funciona bien". Ejemplos reales desarrollados por Ecode.
- Calidad en el rendimiento web: explicó qué aspectos deben considerarse para conseguir calidad en el rendimiento de una web. Detalló los procesos que el navegador debe seguir para renderizar una página web, incluyendo la descarga del documento HTML, CSS y demás recursos (imágenes, tipografías, ficheros JavaScript).
- Estrategias de carga óptima: Javier presentó estrategias de carga óptima teniendo en cuenta diferentes objetivos y condiciones de trabajo. Habló sobre la importancia de simular condiciones reales de usuario y ajustar la velocidad y CPU para estas simulaciones. También mencionó la extensión de Chrome Web Vitals.
- Pruebas de rendimiento: indicó cómo probar el rendimiento de carga de una página web en su primera visita.
- Realidad del sector y mercado actual: Javier describió la situación actual del sector, donde se priorizan tecnologías populares que facilitan el trabajo de creación web. Sin embargo, advirtió sobre la dependencia de tecnologías conocidas y la necesidad de adaptar el negocio online a estas tecnologías.
- Ejemplos de cargas no óptimas: presentó ejemplos de malas cargas de diferentes webs populares desarrolladas con CMS y tecnologías como Shopify, Webflow, Prestashop, Magento, Salesforce, Elementor, WordPress y Drupal. La tecnología lenta es tecnología mala.
- ¿Merece la pena hacerlo mejor?: Javier subrayó la importancia de medir la situación actual y evaluar la oportunidad de mejora.
- Javier finalizó la ponencia hablando sobre cómo trabaja actualmente con su empresa Ecode, enfocada en construir sitios web muy optimizados desde el inicio. Presentó un caso de éxito: La Casa del Electrodoméstico, una tienda online a medida con una facturación anual de millones de euros y más de 10 millones de carritos de compra, donde más del 90% de las sesiones cumplen con los parámetros LCP, INP y CLS durante toda la sesión.
La ponencia de Javier Martínez Seco en SEonthebeach 2024 ofreció una visión completa y práctica sobre la optimización del rendimiento web, demostrando cómo las estrategias WPO bien implementadas pueden marcar la diferencia en el éxito de los negocios online.
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...micarnavaltupatrimon
Mi Carnaval es la plataforma que permite conectar al usuario con la cultura y la emoción del Carnaval de Blancos y Negros en la ciudad de Pasto, esta plataforma brinda una amplia oferta de productos, servicios, tiquetería e información relevante para generarle valor al usuario, además, la plataforma realiza un levantamiento de datos de los espectadores que se registran, capturando su actividad e información relevante para generar la analítica demográfica del evento en tiempo real, con estos datos se generan modelos predictivos, que permiten una mejor preparación y organización del evento, de esta manera ayudando a reducir la congestión, las largas filas y, así como a identificar áreas de alto riesgo de delincuencia y otros problemas de seguridad.
DuckDuckGo, es el motor de búsqueda centrado en la privacidad que lleva años creciendo como una sólida alternativa a buscadores como Google, Bing y Yahoo. Sobre todo, una alternativa para todos aquellos que no quieran ser rastreados y que quieran maximizar la privacidad cuando buscan cosas en Internet.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
ALP Unidad 4: Programación modular
1. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 1
12/03/2022
Programación modular
Unidad 4
Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo
para uso de los cursos de Algoritmos y Lógica de Programación
2. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 2
12/03/2022
Objetivo general de la Unidad 4
Implementar funciones propias del programador mediante
la aplicación de la técnica de la programación modular
para la resolución de problemas en el desarrollo de
software con calidad.
3. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 3
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
4. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 4
12/03/2022
Diseño descendente (top-down)
• Permite abordar problemas complejos
• Consiste en descomponer el problema grande
en varios pequeños
– Módulos independientes
– Procedimientos, funciones y bloques de código
Modularidad
Función
F1
Función
F2
Procedimiento
P1
Programa
Principal
5. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 5
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
6. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 6
12/03/2022
Dividir y Conquistar (1)
• Debido a la complejidad de los grandes
problemas y las limitaciones de la mente
humana estos no se pueden atacar como
una unidad monolítica
– Aplicar dividir y conquistar
– Dividir en piezas que pueden ser “conquistadas”
por separado. Sino se hizo una división poco
inteligente
• Dividir en piezas con esta propiedad es una
tarea compleja para el diseño de software
7. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 7
12/03/2022
Dividir y Conquistar (2)
• Las piezas
– Están relacionadas. Juntas forman el sistema
– Entonces, existe comunicación y cooperación
entre las mismas
– Esto agrega complejidad, que surge de la
propia partición
– Cuando el costo de particionar sumado la
complejidad agregada supera los ahorros
logrados por particionar se debe detener el
proceso
8. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 8
12/03/2022
Modularización
• Módulo: un componente bien definido de un
sistema de software que provee recursos y
servicios
– Están bien definidos:
• Recursos y Servicios
• La forma de suministrarlos (Interfaces)
– Un módulo puede ser un programa o varios, una
subrutina o varias
• Principio de Separación de Intereses
– cada módulo se ocupa de aspectos específicos
(cohesión)
9. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 9
12/03/2022
Modularizar
• Dividir sucesivamente, obteniendo niveles
– Se formará una jerarquía de módulos
– Los de mas bajo nivel
• Resuelven problemas más pequeños y
• Contienen mas detalle
• Hasta que los módulos de nivel inferior
– Sean sumamente simples
– Y solo contengan funciones y procedimientos
– Que resuelven problemas independientes y
pequeños
10. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 10
12/03/2022
Cuando modularizar
• Si un conjunto de sentencias realiza una tarea
– Recurrente, repetitiva, identificable
• Debe ser un módulo
• Sin embargo,
– Una tarea no necesita ser recurrente para hacerla un
módulo
Modularidad
Función
F1
Función
F2
Procedimiento
P1
Programa
Principal
11. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 11
12/03/2022
Cohesión
• Se focaliza en conocer el por qué los
elementos de un módulo están juntos en
ese módulo
• El objetivo es tener en un mismo módulo
elementos que están fuertemente
vinculados
– Entonces, módulos más fáciles de entender
– y más fáciles de modificar
12. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 12
12/03/2022
Descomposición
Deben hacerse módulos, pero con cuidado para permanecer en
la cercanía de M. Debe evitarse hacer pocos o muchos
módulos.
Región de
costo mínimo
M
Costo
del
esfuerzo
Costo de integración
Costo total del software
Costo por módulo
Número de módulos
13. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 13
12/03/2022
Funciones propias del lenguaje de programación
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
1 abs(i) int stdlib.h int abs(int i);
Devuelve el valor
absoluto de i
x = abs(-7) // x es 7
2 acos(d) double math.h double acos(double d);
Devuelve el arco
coseno de d
angulo = acos(0.5); // angulo
devuelto es phi/3
3 asin(d) double math.h double asin(double d);
Devuelve el arco
seno de d
angulo = asin(0.707); //
aproximadamente phi/4
4 atan(d) double math.h
double atan(double d);
long double tanl(long double
d);
Devuelve la arco
tangente de d.
Calcula el arco
tangente del
argumento x.
Requiere el
llamado de la
biblioteca
complex.h
angulo atan(1.0); // angulo es
phi/4
5 atan(d1, d2) double math.h
double atan(double d1, double
d2);
Devuelve el arco
tangente de d1/d2
angulo = atan(y, x)
6 atof(s) Double stdlib.h
double atof(const char
*cadena)
Convierte la
cadena s a una
cantidad de doble
precisión. Requiere
el llamdo de la
biblioteca math.h
double x;
char *cad_dbl = "200.85"; ...
x=atof(cad_dbl); // convierte
la cadena "200.85" a valor
real
14. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 14
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
7 atoi(s) int stdlib.h
int atoi(const char
*cadena)
Convierte la cadena s
a un entero.
La cadena debe tener
el siguiente formato:
[espacio en
blanco][signo][ddd]
(siendo obligatorio los
digitos decimales).
int i;
char *cad_ent="123";
...
i=atoi(cad_ent); //convierte
la cadena "123" al entero
123
8 atol(s) long stdlib.h
long atol(const char
*cadena);
Convierte la cadena s
a un entero largo.
La cadena debe tener
el siguiente formato:
[espacio en
blanco][signo][ddd]
(siendo obligatorio los
digitos decimales).
long int i;
char cad_ent="9876543";
...
i=atol(cad_ent); //convierte
la cadena "9876543" al
entero largo
9 calloc(n, s)
void(punt
ero)
malloc.h
y stdlib.h
o bien
alloc.h y
stdlib.h
void *calloc(size_t n,
size_t s);
Reserva memoria
para una formación de
n elementos , cada
uno de s bytes.
Devuelve un puntero
al principio del espacio
reservado.
Si no existente
bastante espacio para
el nuevo bloque o bien
n o s es 0, calloc
devuelve nulo.
long *buffer
buffer=(long *) calloc(40,
sizeof(long));
15. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 15
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
10 ceil(d) double math.h double ceil(double d);
Devuelve un
valor redondeado
por exceso al
siguiente entero
mayor
redondeo=ceil(5.1);
//redondeo es 6
11 cos(d) double math.h
double cos(double d);
complex cos(complex d);
Devuelve el
coseno de d
coseno_x=cos(1.6543)
12 cosh(d) double math.h
double cos(double d);
complex cos(complex d);
Devuelve el
coseno
hiperbólico de d
d=1.00;
printf("d=%f.nn,d);
13
difftime(11,
12)
double time.h
double difftime(time_t hora2,
time_t hora1)
Devuelve la
diferencia de
tiempo 11(hora2)
- 12(hora1) ,
donde 11 y 12
representan el
tiempo
transcurrido
despues de un
tiempo base (ver
función time)
time_t inicio, fin;
clrscrl();
inicio=time(NULL);
delay(5000)
fin=time(NULL)
print("Diferencia en
segundos: %fn",
difftime(inicio,fin));
16. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 16
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
14 exit(u) void stdlib.h void exit(int estado)
Cierra todos los
archivos y buffers y
termina el programa.
El valor de u es
asignado por la
funcion para indicar el
estado de
terminación.
exit(0);
15 exp(d) double math.h
double exp(double d);
complex exp(complex
d)
Eleve e a la potencia
d (e=2,7182818... es
la base del sistema
de logaritmos
naturales
(neperianos))
d=100.00;
y=exp(d);
printf("El exponencial de
x=%f.nn",y);
16 fabs(d) double math.h double fabs(double d);
Devuelve el valor
absoluto de d
y=fabs(-7.25); // y vale 7.25
17 fclose(f) int stdio.h int fclose(FILE *f);
Cierra el archivo f.
Devuelve el valor 0 si
el archivo se ha
cerrado con exito.
int fclose(FILE "archivo");
18 feof(f) int stdio.h int feof(FILE *f);
Determina si se ha
encontrado un fin de
archivo. si es asi,
devuelve un valor
distinto de cero, en
otro caso devuelve 0
feof(fichen);
17. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 17
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
19 fgetc(f) int stdio.h int fgetc(FILE f);
Lee un caracter
del archivo f
c+fgetc(fp)
20 fegts(s, i, f)
char(pun
tero)
stdio.h
char *fgets(char s, int s,
FILE *f);
Lee una cadena
s, con i
caracteres, del
archivo f
fgets(caddemo, 80, fp);
22 fmod(d1, d2) double math.h
double fmod(double d1,
double d2);
Devuelve el resto
de d1/d2 (con el
mismo signo que
d1)
resto=fmod(5.0,2.0); // resto
igual a 1.0
23 fprintf(f, ...) int stdio.h
int fprintf(FILE *f, const char
*formato [,arg,...]);
Escribe datos en
el archivo f (el
resto de los
argumentos
fprintf(f1, "El resultado es
%fn",result);
24 fputc(c, f) int stdio.h int fputc(int c, FILE *f);
Escribe un
caracter en el
archivo f
fputc(*(p++), stdout);
25 fputs(s, f) int stdio.h
int fputs(const char *cad,
FILE *f)
Escribe una
cadena de
caracteres en el
archivo f
fputs("esto es una prueba",
f1);
26
fread(s, i1,
i2, f)
int stdio.h
size_t fread(void *b, size_t
t, size_t n, FILE *f);
Lee i2 elementos,
cada uno de
tamano i1 bytes,
desde el archivo f
hasta la cadena s
fread(buf, strlen(msg)+1, 1,
flujo);
18. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 18
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
27 fopen(s1, s2)
file(p
unter
o)
stdio.h
FILE
*fopen(const
char *s1,
const char
*s2)
Abre un archivo llamado s1, del tipo s2. Devuelve
un puntero al archivo. *
if
((corriente2=f
open("datos","
W+"))==NULL
printf("El
archivo...no
se ha abierto
n");
Modo Acción
"r" Abre para lectura
"w"
Abre un archivo vacío para
escritura
"a"
Abre para escritura al final
del archivo
"r+" Abre para lectura/escritura
"w+"
Abre un archivo vacio para
lectura/escritura
"a+" Abre para lectura y anadir
"rb"
Abre un archivo binario
para lectura.
"wb"
Abre un archivo binario
para escritura
"ab"
Abre un archivo binario
para anadir
"rb+"
Abre un archivo binario
para lectura/escritura.
"wb+"
Abre un archivo binario
para lectura/escritura
"ab+"
Abre o crea un archivo
binario para
lectura/escritura
19. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 19
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
28 free(p) void
malloc.h
o stdlib.h
void free(void
*dir_memoria);
Libera un bloque de memoria
reservada cuyo principio esta
indicado por p.
char *cad;
// asignar memoria a la
cadena
cad=(char *)malloc(50);
...
free(cad); // liberar
memoria
29 fscanf(f, ...) int math.h
int fscanf(FILE *f,
const char *formato,
[, direccion,... ]);
Lee datos del archivo f ( el resto
de los argumentos
fscanf(flujo, %s%f, cad,
&f);
30 fseek(f, l, i) int stdio.h
int fseek(FILE *f, long
desplaza, int origen);
Mueve el puntero al archivo f una
distancia de 1 bytes desde la
posición i (i puede representar el
principio del archivo, la posición
actual del puntero o el fin del
archivo.
Notas
fseek(f1,OL,SEEK_SET);
// ir al principio
Origen Significado
SEEK_SET
Principio de
archivo
SEEK_CUR
Posicion
actual
puntero
SEEK_END
Final del
archivo
20. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 20
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
31 ftell(f) long int stdio.h
long int ftell(FILE
*f);
Devuelve la posicion
actual del puntero
dentro del archivo f
ftell(fichen)
32
fwrite(s, i1,
i2, f)
int stdio.h
size_t fwrite(const
void *p, size_t i1,
size_t i2, FILE *f);
Escribe i2 elementos,
cada uno de tamano 1
bytes, desde la cadena
s hasta el archivo f
num=fwrite(lista,sizeof(char),25,
flujo);
33 getc(f) int stdio.h int getc(FILE *f);
Lee un caracter del
archivo f
while(c=getc(fx) !=EOF {
print ("%c",c);
}
34 getchar( ) int stdio.h int getchar(void);
Lee un caracter desde
el dispostivo de entrada
estandar
int c;
while((*c=getchar()) != 'n')
print ("%c",c);
35 gets(s)
char(pun
tero)
stdio.h
char *gets(char
*cad);
Lee una cadena de
caracteres desde el
dispositivo de entrada
estandar
gets(nombre);
36 isalnum(c) int ctype.h int isalnum(int c);
Determina si el
argumento es
alfanumerico. Devuelve
un valor disitinto de
cero si es cierto; en
otro caso devuelve 0
carac=getch();
if (isalnum(carac))
print("%c letra|digito n",carac);
else
printf("%c no letra|digito n",
carac);
21. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 21
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
37 isalpha(c) int ctype.h
int isalpha(int
c);
Determina si el argumento
es alfabetico. Devuelve un
valor distinto de cero si es
cierto; en otro caso
devuelve 0.
int c;
if (isalpha(c)) printf("%c es
letran",c);
38 isascii(c) int ctype.h
int isascii(int
c);
Determina si el argumento
es un caracter ASCII.
Devuelve un valor disitinto
de cero si es cierto; en otro
caso devuelve 0
int c;
if (isascii(c)) printf('%c es un
asciin",c)
39 iscntrl(c) int ctype.h
int isacntrl(int
c);
Determina si el argumento
es un caracter ASCII de
control. Devuelve un valor
distinto de cero si es cierto;
en otro caso devuelve 0
if(iscntrl(c)) printf"%c es un
caracter de controln",c);
40 isdigit(c) int ctype.h
int isdigit(int
c);
Determina si el numero es
un digito decimal. Devuelve
un valor disitinto de cero si
es cierto; en otro caso
devuelve 0
if(isdigit(c)) printf"%c es un
digiton",c);
41 isgraph(c) int ctype.h
int isgraph(int
c);
Determina si el argumento
es un caracter ASCII grafico
(hex 0x21 -0x7e; octal 041 -
176). Devuelve un valor
distinto de cero si es cierto;
en otro caso devuelve 0
if(isgraph(c)) printf"%c es un
caracter imprimible(no
espacio)n",c);
22. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 22
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
42 islower(c) int ctype.h
int islower(int
c);
Determina si el argumento
es ua minuscula. Devuelve
un valor distinto de cero si
es cierto; en otro caso
devuelve 0
if(islower(c)) printf"%c es una
letra minusculan",c);
43 isodigit(c) int ctype.h
int isodigit(int
c);
Determina si el argumento
es un digito octal. Devuelve
un valor distinto de cero si
es cierto; en otro caso
devuelve 0
if(isodigit(c)) printf"%c es un
digito octaln",c);
44 isprint(c) int ctype.h
int isprintint
c);
Determina si el el
argumento es un caracter
ASCII imprimible (hex 0x20
-0x7e; octal 040 -176).
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
if(isprint(c)) printf("n"c
imprimiblen",c);
45 ispunct(c) int ctype.h
int ispunct(int
c);
Determina si el argumento
es un caracter de
puntuacion. Devuelve un
valor distinto de cero si es
cierto; en otro caso
devuelve 0
if(ispunct(c)) printf"%c es un
caracter de puntuacionn",c);
46 isspace(c) int ctype.h
int isspace(int
c);
Determina si el argumento
es un espacio en blanco.
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
if(isspace(c)) printf"%c es un
espacion",c);
23. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 23
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
47 isupper(c) int ctype.h
int isupper(int
c);
Determina si el argumento
es una mayuscula.
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
if(isupper(c)) printf"%c es una
mayusculan",c);
48 isxdigit(c) int ctype.h
int isxdigit(int
c);
Determina si el argumento
es un digito hexadecimal.
Devuelve un valor distinto
de cero si es cierto; en otro
caso devuelve 0
ifisxdigit(c)) print"%c es un digito
hexadecimaln",c)
49 labs(l) long int math.h
long int
labs(long int
l);
Devuelve el calor absoluto
de 1
long lx=-51654,ly;
ly=labs(lx);
50 log(d) double math.h
double
log(double d);
Devuelve el logaritmo
natural de d
hdouble x,y;
x=10;
y=log(x);
51 log10(d) double math.h
double
log10(double
d);
Devuelve el logaritmno (en
base 10) de d
hdouble x,y;
x=10;
y=log10(x);
52 malloc(u)
void(pun
tero)
stdlib.h
void
*malloc(size_t
u);
Reserva u bytes de
memoria. devuelve un
puntero al principio del
espacio reservado
cadena=malloc(MAX_CHR);
53 pow(d1, d2) double math.h
double
pow(double
d1, double
d2);
Devuelve d1 elevado a la
potencia d2
double x=2.0, y=4.0, z;
z=pow(x,y); //z sera 1.60
24. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 24
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
54 printf(...) int stdio.h
int printf(const
char
*formato[,argu
mento,...]);
Escribe datos en dispositivo de
salida estándar.
print("producto %d y %d es
%dn",x,y,x*y);
55 putc(c, f) int stdio.h
int putc(int c,
FILE *f);
Escribe un caracter en el
archivo f
putc('*',demo);
56 putchar(c) int stdio.h
int putchar(int
c);
Escribe un caracter en el
dispositivo de salida estandar
putchar('B');
57 puts(s) int stdio.h
int puts(const
char *cad)
Escribe una cadena de
caracteres en el dispositivo de
salida estandar
puts("Desea continuar (s/n);
58 rand( ) int stdlib.h int rand(void);
Devuelve un entero positivo
aleatorio
// visualizar 10 numeros
aleatoriosfor (i=0;i<10;i++)
printf("%6d",rand());
Código Formato
%c Caracter
%d Entero Decimal
%e
Real (double o
float), notacion
cientifica.
%f Coma flotante
%s
Cadena de
caracteres
%x
Hexadecimal sin
signo
25. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 25
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
59 rewind(f) void stdio.h
void
rewind(FILE *f);
Mueve el puntero al principio del
archivo f
rewind(fx);
60 scanf(...) int stdio.h
int scanf(const
char *formato
{,direccion,...]);
Lee datos en dispositivo de
entrada estándar
scanf('%d %f %c %s, &i,
&fp, &c, s);
61 sin(d) double math.h
double
sin(double d);
Devuelve el seno de d
double x, y;
x=0.52;
printf('x =%f radianesn",x);
y=cos(x);
printf("el coseno de x
=%fn",y);
62 sinh(d) double math.h
double
sinh(double d);
Devuelve el seno hiperbolico de
d
y=sinh(x);
63 sqrt(d) double math.h
double
sqrt(double d);
Devuelve la raiz cuadrada de d
printf("%lf",sqrt(25.0); //se
visualiza 5
Codigo Formato
%c Caracter
%d Enetero Decimal
%x Hexadecimal
%i Entero Decimal
%f Numero Real
%o Octal
%p Puntero
%s Cadena
26. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 26
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
64 srand(u) void stdlib.h
void
srand(unsigne
d u);
Inicializa el generador de
numeros aleatorios
srand(semilla);
65
strcmp(s1,
s2)
int string.h
int
strcmp(const
char*s1, const
char *s2);
Compara dos cadenas de
caracteres
lexicograficamente.
Devuelve un valor negativo
si s1 < s2; 0 si s1 y s2 son
identicas; y un valor positivo
si s1 > s2
i=strcmp("MNP", "mnp"); //
resultado < 0
i=strcmp("abc", "abc"); //
resultado = 0
i=strcmp("xy", "abc"); //
resultado > 0char
s1[80]="Mayo";
char s2[80]="Octubre";
int j;
j=strcmp(s1,s2);
66
strcmpi(s1,
s2)
int string.h
int
strcmpi(const
char*s1, const
char *s2);
Compara dos cadenas de
caracteres
lexicograficamente, sin
diferenciar mayusculas de
minusculas. Devuelve un
valor negativo si s1 < s2; 0
si s1 y s2 son identicas; y
un valor positivo si s1 > s2
v=strcmpi(s1,s2);
67
strcpy(s1,
s2)
char string.h
char
*strcpy(char
s1, const char
s2);
Copia la cadena de
caracteres s2 en la cadena
s1
char *s1="Pepe Luis";
char b[12];
strcpy(s2,s1);
cout <<s2<< 'n';
27. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 27
12/03/2022
# Función Tipo Biblioteca Sintaxis Descripción Ejemplo
68 strlen(s) int string.h
size_t
strlen(const
char *s);
Devuelve el numero de
caracteres de una cadena
longitud=strlen(nombre);
char s[81]="Cadena demo';
printf("La longitud de s es:
%dn" strlen(s));
69 strset(c, s)
char(pun
tero)
string.h
char
*strset(char
*cad, int c);
Pone todos los caracteres
de s a c (excluyendo el
caracter nulo del final 0)
char *cad="----";
strset (cad,'x'); // cad es ahora
xxxx
70 system(s) int string.h
system(comd)
;
Pasa la orden al sistema
operativo. Devuelve cero si
la orden se ejecuta
correctamente; en otro caso
devuelve un valor distinto
de cero, tipicamente -1.
system(dir);
71 tan(d) double math.h
double
tan(double d);
Devuelve la tangente de d y=tan(x);
72 tanh(d) double math.h
double
tanh(double
d);
Devuelve la tangente
hiperbolica de d
a=tanh(x);
73 time(p) long int time.h
time_t
time(time_t
*h);
Devuelve el numero de
segundos transcurridos
despues de un tiempo base
designado
time(&hora);
74 toascii int ctype.h
int toascii(int
c);
Convierte el valor del
argumento a ASCII
c=toascii(entero);
75 tolower int
ctype.h o
stdlib.h
int tolower(int
c);
Convierte una letra a
minuscula
c=tolower('s'); //c se convierte
en 's'
76 toupper int
ctype.h o
stdlib.h
int toupper(int
c);
Convierte una letra a
mayuscula
c=toupper('s'); //c se convierte
en 'S'
28. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 28
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
29. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 29
12/03/2022
Estructura de los programas que hemos
visto hasta el momento
• Se tiene un solo archivo
fuente.
• Todo lo que hace el
programa se implementa
dentro de la función main.
#include <archivo_cabecera>
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
instruccion_1;
instruccion_2;
. . .
instruccion_N;
return 0;
}
30. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 30
12/03/2022
Problemas de esta metodologia
#include <stdio.h>
int a[3],b[3],c[3];
int main() {
int i;
printf(" Ingrese el primer vector: ");
for(i=0;i<3;i++) {
scanf("%d",&a[i]);
}
printf(" vec1 = [%d %d %d]nn",a[0],a[1],a[2]);
printf(" Ingrese el segundo vector: ");
for(i=0;i<3;i++) {
scanf("%d",&b[i]);
}
printf(" vec2 = [%d %d %d]nn",b[0],b[1],b[2]);
for(i=0;i<3;i++) {
c[i]=a[i]+b[i];
}
printf(" vec3 = vec1 + vec2 = [%d %d %d]nn",c[0],c[1],c[2]);
return 0;
}
Repetición de código
Código
chorizudo
31. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 31
12/03/2022
Problemas de esta metodologia
• Programación repetida.
• A medida que el problema se hace mas
complejo el main tiende a crecer mucho y
hacerse mas difícil de entender.
• Dificultad para programar.
• Poca reutilización de código
32. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 32
12/03/2022
Ejemplo
...
!
7
!
5
!
3
)
(
7
5
3
+
−
+
−
=
x
x
x
x
x
sen
Realizar un programa que calcule el valor de la función
seno usando la serie equivalente para ello. Los valores
de entrada son x y el numero de términos.
A continuación se muestra la serie equivalente:
33. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 33
12/03/2022
Solución sin hacer uso de funciones
...
!
7
!
5
!
3
)
(
7
5
3
+
−
+
−
=
x
x
x
x
x
sen
resul
term
Ciclo para generar el numero de
términos que tendrá la serie
Ciclo anidado para calcular el
factorial(que se usara en el
denominador) y la potencia (que
se usara en el numerador).
Parte que sumara o restara el
termino (term) al acumulador
(resul) usado para almacenar la
solución.
34. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 34
12/03/2022
Solución al problema: funciones
#include <archivo_cabecera>
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
instruccion_1;
instruccion_2;
. . .
instruccion_N;
return 0;
}
#include <archivo_cabecera>
protipo_funciones;
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
funcion_1();
funcion_2();
. . .
funcion_N();
return 0;
}
funcion_1() {
codigo_funcion_1;
}
. . .
funcion_N() {
codigo_funcion_N;
}
35. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 35
12/03/2022
Solución haciendo uso de funciones
Ciclo para generar el numero de
términos que tendrá la serie
Calculo del factorial y la potencia
usando funciones.
Parte que sumara o restara el
termino (term) al acumulador
(resul) usado para almacenar la
solución.
36. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 36
12/03/2022
Solución haciendo uso de funciones
37. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 37
12/03/2022
Solución haciendo uso de funciones
38. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 38
12/03/2022
Solución haciendo uso de funciones
#include <stdio.h>
int a[3],b[3],c[3];
void ingresar_vector(int []);
void imprimir_vector(int []);
void sumar_vectores(int [],int [],int );
int main() {
int i;
printf(" Ingrese el primer vector: ");
ingresar_vector(a);
printf(“vec1 = ”);
imprimir_vector(a);
printf(“nn”);
. . .
return 0;
}
void ingresar_vector(int v[]) {
for(i=0;i<3;i++) {
scanf("%d",&v[i]);
}
}
void imprimir_vector(int v[]) {
printf(“[%d %d %d]”,v[0],v[1],v[2]);
}
void sumar_vectores(int v1[],int v2[],int res) {
for(i=0;i<3;i++) {
res[i]=v1[i]+v2[i];
}
}
Prototipos de las funciones
Función principal
Definición de las funciones
39. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 39
12/03/2022
Implementación de Programas
Utilizando Funciones
• Usualmente los problemas que se resuelven
con un computador son mas grandes y
complejos que los revisados aquí.
• En estos casos, se busca siempre dividir el
problema grande en subproblemas.
• Las funciones son grupos de sentencias bajo
un mismo nombre que nos ayudan en esta
técnica de divide y conquista.
• Son los subproblemas, cada función se
encarga de resolver un problema mas
pequeño.
40. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 40
12/03/2022
Implementación de Programas
Utilizando Funciones
• Hemos utilizado funciones que ya han
sido escritas, e incluidas en librerías.
• Una de las funciones que más hemos
utilizado ha sido printf, de la librería stdio,
para mostrar información en pantalla.
• printf nos ayuda a resolver un problema,
tal como lo hace un programa
• De hecho, todos los programas principales
se escriben como una función: main()
41. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 41
12/03/2022
Implementación de Programas
Utilizando Funciones
• Las funciones y los programas se parecen
mucho, pero difieren:
– Los programas son usados por un usuario
externo
– Las funciones son utilizadas por un programador
– El usuario del programa “Hola Mundo” no conoce
que es la función printf
– El programador que usa printf no siempre
conocerá explícitamente como ésta hace para
mostrar información en pantalla.
– El programador que escribió printf conoce
exactamente su funcionamiento interno
42. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 42
12/03/2022
tipo_retorno nombre_funcion(tipo_1 param_1,. . ., tipo_N param_N)
{
intruccion_1;
. . .
instrucción_N;
return expresion;
}
Estructura de una función en C
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
Cuerpo de la función
Cabecera de la función
Cuerpo de la
función
Tipo de dato retornado
por la función
Nombre de la función
Argumentos de la
función.
Variable retornada por la función
43. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 43
12/03/2022
Estructura de una función en C
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
Tipo de dato retornado
por la función
Nombre de la función
Argumentos de la
función.
Variable retornada por la función
Puede ser cualquier tipo de dato ordinario (int, char, float,
double, etc), un puntero a cualquier tipo de dato, o un dato
tipo struct. Una funcion puede o no retornar un valor.
Puede empezar por una letra o el carácter _.
Después de este puede contener tantas letras
como números o _ se deseen. Si embargo el
compilador ignora a partir de cierta cantidad
Cada parámetro es separado por coma, los
tipos de datos manejados para cada
argumento pueden ser de cualquier tipo de
datos simples o compuestos.
44. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 44
12/03/2022
Conceptos Importantes
• Función
– Grupo de sentencias bajo el mismo nombre
• Llamar a una función
– Ejecutar el grupo de sentencias de una
función. Para lograrlo solo se escribe el
nombre de la función, seguida por una lista
de expresiones, separadas por coma y
encerradas entre paréntesis. Ejemplo
• printf(“%d”, a);
• e = abs(x-y)/ abs(x);
45. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 45
12/03/2022
Conceptos Importantes
• Argumentos
– Se refiere a la lista de expresiones encerradas entre
paréntesis. Permiten pasar la información a la función.
Ejemplo
• printf sabe que imprimir porque se lo indicamos en los
argumentos
– Existen funciones que no necesitan argumentos
• n = GetInteger();
• Retornar
– Una vez “llamada” la función, esta hace su trabajo, y
regresa al mismo punto donde fue llamada. La función ha
“retornado” al punto de llamada, y en la mayoría de los
casos, las funciones envían un valor de retorno.
46. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 46
12/03/2022
Analogía
• Si una función resuelve un determinado problema, se
puede decir que necesita los datos de entrada
(argumentos) y genera una salida (valor que retorna).
• Es similar a cuando un jefe llama a un trabajador para
que efectúe una tarea. Le da las especificaciones
(argumentos) y espera.
• El trabajador a su vez, recibe esta información,
efectúa su trabajo, en la que puede ser que necesite
de la ayuda de otros trabajadores y los “llame”.
• Cuando termina el trabajo, regresa hacia donde su
jefe, y le muestra (retorna) un reporte.
• El jefe nunca supo como el trabajador efectuó su
trabajo o si uso ayuda.
47. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 47
12/03/2022
Argumentos y Retorno: Aclaraciones
• Los datos otorgados a una función, como argumentos,
pudieron ser ingresados, por un usuario externo, mucho
antes de la llamada a la función.
• El resultado que retorna una función, la retorna al programa,
para que se pueda usar en este, cuando se desee. No es
impresa en pantalla, a menos que el programa así lo indique.
void main()
{
double x, y;
printf(“Ingrese un real:”);
x = GetReal();
y = sin(x);
printf(“El seno de x es: %.2f”, y);
}
E/S de datos permiten
a un programa
comunicarse con su
usuario externo
Argumentos y retorno
permiten a una función
comunicarse con el
programa que la llama
48. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 48
12/03/2022
#include <stdio.h>
int main ( )
{
printf (“Hello World!n”) ;
return 0 ;
}
Llamada a funciones
printf es el nombre de una función
predefinida en la librería stdio
esta cadena de caracteres la estamos
pasando como un argumento (parametro)
a la función printf.
Esto sería la llamada a la función
(function call).
49. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 49
12/03/2022
Librería MATH
• La librería math.h permite al programador efectuar cálculos matemáticos
comunes
Numero Descripcion Ejemplo
ceil(x) redondea x al entero mas pequeño no menor
que x
ceil(9.2) es 10.0
ceil(-9.8) es –9.0
floor(x) redondea x al entero mas grande no mayor que
x
floor(9.2) es 9.0
floor(-9.8) es –10.0
fabs(x) valor absoluto de x fabs(-9.5) es 9.5
fmod(x,y) residuo de x/y como numero de punto flotante fmod(13.657, 2.333) es
1.992
sqrt(x) raiz cuadrada de x sqrt(9.0) es 3.0
pow(x,y) x elevado a la potencia y pow(2,7) es 128
log(x) logaritmo natural de x(base e) log10(x)
log10(x) logaritmo de x(base 10) log(2.718282) es 1
exp(x) funcion exponencial exp(0.1) es 2.71828
sin(x) seno trigonometrico de x(en radianes) sin(0.0) es 0.0
cos(x) coseno trigonometrico de x(en radianes) cos(0.0) es 1
tan(x) tangente trigonometrico de x(en radianes) tan(0.0) es 0
50. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 50
12/03/2022
Ejercicio en Clase
• Expresar lo siguiente como una expresión en C
2
2
y
x
distancia +
=
Muestre el valor de x tras la ejecución de las
siguientes sentencias. Asuma x un real
x = fabs(7.5);
x = floor(7.5);
x = ceil(0.0);
x = ceil(-6.4);
x = ceil(-fabs(-8 + floor(-5.5)));
cos
sin
tan =
51. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 51
12/03/2022
Ejercicio
• Una aplicación de la función floor es redondear un valor a
su entero más próximo. La instrucción:
– y = floor(x+0.5);
redondeará el número x al entero más próximo, y asignará
el resultado a y. Escriba un programa que a 5 números los
redondee al número más próximo. Por cada número,
imprima tanto el original como la cifra redondeada.
52. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 52
12/03/2022
Declaración de una función en C
float suma(float num1, float num2);
int max(int x,int y);
void imprimir_saludo(void);
void imprimir_vector(int v[],int long);
int comparar_vectores(int v1[],int v2[]);
• La declaración de una función se denomina prototipo. Básicamente, la
declaración describe la interfaz de la función. Al declarar una función,
básicamente lo que se esta haciendo es especificar la cabecera.
• La forma general de la declaración de una función es:
• Los nombres de los parámetros se suelen omitir.
float suma(float,float);
int max(int,int);
void imprimir_saludo(void);
void imprimir_vector(int [],int);
int comparar_vectores(int [],int []);
tipo_retorno nombre_funcion(tipo_1,. . ., tipo_N);
53. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 53
12/03/2022
Declaración de Funciones
• En C declaramos las variables que vamos a usar
• Así mismo, cuando se escribe una nueva función, esta debe
ser “declarada”.
• Las declaraciones de las funciones de librerías que usamos,
están en su respectivo archivo de cabecera(.h)
• La declaración de una librería es un poco más elaborada que
la de una variable. En una variable solo se indica el tipo y el
identificador. En una función, se debe indicar:
– El nombre de la función
– El tipo de dato de cada argumento, y en muchos casos, un
identificador para cada uno. Aquí los argumentos van separados
con comas.
– El tipo de dato del valor que va a retornar.
54. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 54
12/03/2022
Declaraciones en math.h
55. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 55
12/03/2022
Prototipos de Funciones
• La declaración de una función se conoce como el
prototipo de esa función. Ejemplo:
– double sqrt(double x);
• En un prototipo, es opcional especificar un
identificador para cada argumento.
• Son muy útiles, pues aquel que lo ve, ya puede
intentar usar la función, pues conoce sus argumentos
y el retorno.
• También pueden existir funciones que no tomen
argumentos, en estos casos, en el prototipo se incluye
la palabra void, y por supuesto, sin identificador:
– int GetInteger(void);
56. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 56
12/03/2022
Definición de una función en C
• La definición de la función consiste de la cabecera de la función (declarador)
y un bloque de función. La cabecera de la función especifica el nombre de la
función, el tipo el valor de retorno, y los tipos y nombres de sus parámetros. Las
sentencias del bloque de la función específica lo que hace la función.
• Declarar una función dentro de otra es algo prohibido
• La forma general de la declaración de una función es:
tipo_retorno nombre_funcion(tipo_1 param_1,. . .,
tipo_N param_N) {
intruccion_1;
. . .
instrucción_N;
return expresion;
}
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
57. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 57
12/03/2022
Creando Funciones
• Ya sabemos usar funciones de librerías, pero llega un
punto en la vida de un programador que deseará
escribir sus propias funciones.
• Vamos a escribir una función:
– Se nos ha asignado escribir un programa que convierta
una temperatura en Celsius a Fahrenheit. Esto se logra
con la fórmula.
• Seria ideal escribir una función que se encargue de
eso, y luego poder usarla cuando deseemos.
32
5
9
+
= C
F
58. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 58
12/03/2022
Creando Funciones
• Para crear una nueva función se debe seguir los pasos:
– Especificar el prototipo de la función: Declararla. Esto
se hace normalmente luego de las líneas de #include,
antes del programa principal.
– Especificar los pasos de la función, como esta llevara a
cabo su tarea: Implementarla
• En nuestro caso, para declarar el prototipo debemos
pensar
– Que necesitamos que la función genere:
• La temperatura en Fahrenheit(real)
– Que necesita la función para generar esa información:
• La temperatura en Celsius(real)
double CelsiusAFahrenheit (double c);
59. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 59
12/03/2022
Implementación
• Se puede decir que la implementación se
compone de dos partes:
– La cabecera, que luce igual que el prototipo, siempre
con identificadores para cada argumento, y sin el ; al
final
– El cuerpo, que es un bloque de sentencias, por lo
tanto encerrado entre llaves. Si se van a necesitar
variables, se declaran en el bloque.
double CelciusAFahrenheit(double c)
{
/*Cuerpo*/
}
60. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 60
12/03/2022
• Si la función debe generar un valor, esta lo retornará
usando la sentencia return dentro del cuerpo de la
función.
• La forma de usarla es:
return (expresión que se debe retornar);
• Esto especifica que la función debe terminar, retornando
el valor calculado.
• Hay funciones que no retornan datos, en este caso, se
puede usar return, pero sin mencionar una expresión.
return;
¿Cómo Retornar?
61. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 61
12/03/2022
Implementación y Uso
• La función ya esta implementada, lista para
ser usada (llamada) desde cualquier parte.
• Usemos esta función para escribir una tabla
de conversión de temperatura desde los 0°C
a los 100°C, de 5 en 5.
double CelsiusToFahrenheit(double c)
{
return (9.0 / 5.0 * c + 32);
}
62. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 62
12/03/2022
Uso de funciones en C
• Una función debe ser declarada antes de ser usada, por ello suele ser
común colocar las declaraciones antes de la función main.
#include <archivo_cabecera>
protipo_funciones;
declaracion_variables_globales;
int main() {
declaracion_variables_locales;
funcion_1();
funcion_2();
. . .
funcion_N();
return 0;
}
funcion_1() {
codigo_funcion_1;
}
. . .
funcion_N() {
codigo_funcion_N;
}
#include <archivo_cabecera>
float suma(float,float);
int main() {
. . .
return 0;
}
float suma(float num1, float num2)
{
float res;
res = num1 + num2;
return res;
}
63. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 63
12/03/2022
Invocación (llamada) de funciones en C
• Una vez que se han implementado las funciones el siguiente paso consiste en
usarlas (es decir invocarlas).
• Cuando se ejecuta un programa la primera función que se ejecuta es la función
main, por ello su importancia.
• Una función puede invocar otra función.
#include <stdio.h>
float suma(float,float);
int main() {
f1();
f2();
return 0;
}
f1(){
. . .
}
f2() {
f3()
. . .
}
main()
f1()
f2()
f3()
1
0
2
3
4
5
6
7
64. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 64
12/03/2022
Invocación (llamada) de funciones en C
#include <stdio.h>
float suma(float,float);
int main() {
int a = 3, b = 2, c = 0, d = 3;
int e, f, g, h, i, k;
d = suma(2,-4);
c = suma(a,b);
f = suma(2,c++);
g = suma(++c,d++);
h = suma(suma(1,a),d);
suma(2,3);
return 0;
}
float suma(float num1, float num2) {
float res;
res = num1 + num2;
return res;
}
Una función se puede invocar
las veces que se desee.
Cuando se invoca un función
que retorna un valor se es
libre de llevar el valor
retornado a una variable.
65. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 65
12/03/2022
#include <stdio.h>
#define LIMITEINF 0
#define LIMITESUP 100
#define PASO 5
// Prototipos de Funciones
double CelsiusAFahrenheit(double c);
/* Programa Principal */
void main()
{
int c;
printf(“Tabla de conversion de Celsius a Fahrenheit.n”);
printf(“C Fn”);
for(c = LIMITEINF; c <= LIMITESUP; c = c + PASO)
printf(“%3d %3gn”,c, CelsiusAFahrenheit(c));
}
/*
* Funcion CelsiusAFahrenheit
* Uso: f=CelsiusAFahrenheit(c);
* Esta función retorna el equivalente en Fahrenheit del valor c
en Celsius
*/
double CelsiusAFahrenheit(double c)
{
return (9.0 / 5.0 * c + 32);
}
Uso de una Función
66. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 66
12/03/2022
Funciones más Complejas
• Nuestra nueva función resuelve un problema
sencillo.
• Las funciones usualmente son mas
complejas, y en su código incluyen las
sentencias de control.
• Además, las funciones no sólo retornan
valores enteros, también pueden retornar
cadenas o valores lógicos.
• EJERCICIO
– Escribir una función MinR en C que indique el
menor valor entre dos valores reales.
67. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 67
12/03/2022
Ejercicio en Clase
• Escribir la función Factorial en C que permita calcular el
factorial de un numero dado.
– El factorial de 0 es 1
– El factorial de 1 es 1(1x1)
– El factorial de 2 es 2(1x2)
– El factorial de 3 es 6(1x2x3)
– El factorial de 4 es 24(1x2x3x4)
– El factorial de un número dado es la multiplicación de todos los
números desde el 1 hasta el mismo.
68. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 68
12/03/2022
Solución
int Factorial(int n)
{
int fact, i;
fact = 1;
if (n==0)
return 1;
for(i = 1; i <=n; i++)
fact = fact * i;
return (fact);
}
Inicio
Fin
Recibir n
i >=n
fact = fact * i;
Retornar fact
i = i +1;
Fact = 1;
i = 1;
69. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 69
12/03/2022
Retornando Cadenas
• Escribir una función en
C que dado un mes (6,
7, 12 ..) retorne su
respectivo nombre
(Junio, Julio,
Diciembre..)
– Debe generar la cadena
del nombre del mes
– Debe recibir el número
del mes, un entero.
• El prototipo sería:
string NombreDeMes(int mes);
string NombreDeMes(int mes)
{
switch(mes)
{
case 1:
return(“Enero”);
break;
case 2:
return(“Febrero”);
break;
case 3:
return(“Marzo”);
break;
case 4:
return(“Abril”);
break;
case 5:
return(“Mayo”);
break;
case 6:
return(“Junio”);
break;
case 7:
return(“Julio”);
break;
case 8:
return(“Agosto”);
break;
case 9:
return(“Septiembre”);
break;
case 10:
return(“Octubre”);
break;
case 11:
return(“Noviembre”);
break;
case 12:
return(“Diciembre”);
break;
default:
return(“Mes no v%clido”,160);
}
}
70. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 70
12/03/2022
Utilizando la nueva función
#include <stdio.h>
#include <simpio.h>
// Declaración de Funciones
string NombreMes(int mes);
void main()
{
int mes,dia,anio;
printf(“Ingrese el dia actual:”);
dia = GetInteger();
printf(“Ingrese el mes actual:”);
mes = GetInteger();
printf(“Ingrese el anio actual:”);
anio = GetInteger();
printf(“La fecha ingresada es: %s %d de %d”, NombreMes(mes), dia, anio);
}
71. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 71
12/03/2022
Retornando Bool
• Si las funciones pueden retornar enteros, y
cadenas, porque no van a poder retornar
valores lógicos (bool).
• Las funciones que retornan valores lógicos
se conocen como funciones de predicado.
• Llamar a una función de predicado es
equivalente a hacer una pregunta donde la
respuesta puede ser Verdadera (TRUE) o
Falsa (FALSE).
72. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 72
12/03/2022
Ejercicios en Clase
• Escribir una función en C que permita
determinar si un número es par.
• Escribir una función en C que permita
determinar si un año es bisiesto.
• Escribir un programa imprima los números
pares hasta el 10.
• Escribir un programa que imprima los
años bisiestos desde 1960 hasta el año
actual.
73. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 73
12/03/2022
Solución
bool EsPar(int n)
{
return (n%2==0);
}
bool EsBisiesto(int anio)
{
return (((anio%4==0)&&(anio % 100!=0) ) || ((anio%400)==0));
}
main()
{
int i;
for(i = 1; i <=10; i++)
{
if(EsPar(i)) printf(“%dn”,i);
}
}
main()
{
int i;
for(i = 1960; i <=2004; i++)
{
if(EsBisiesto(i)) printf(“%dn”, i);
}
}
74. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 74
12/03/2022
Comparando Cadenas
• Ahora que ya sabemos más de las funciones,
estamos listos para conocer algo más de las cadenas.
• Los operadores relacionales, sólo pueden aplicarse
sobre tipos de datos atómicos, y eso dejaba de lado a
las cadenas.
• La única forma, por ejemplo, de determinar la
equivalencia de dos cadenas, seria a través de una
función.
• StringEqual es la función de la librería genlib, que
permite este tipo de comparaciones.
– Compara dos cadenas, que debe recibir como argumentos
– Decide si son o no iguales (VERDADERO O FALSO)
– Es una función predicado
bool StringEqual(string s1, string s2);
75. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 75
12/03/2022
Ejercicio en Clase
• Escriba un programa que sume un grupo
de números enteros ingresados por
teclado. El programa deber permitir el
ingreso del número, y luego preguntarle al
usuario si desea seguir ingresando. Si la
respuesta es no, el programa debe
terminar.
76. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 76
12/03/2022
Solución
void main()
{
int suma, n;
string respuesta;
suma = 0;
while(TRUE)
{
printf(“?”);
n = GetInteger();
suma = suma + n;
printf(“Desea seguir ingresando:”);
respuesta = GetLine();
if(StringEqual(respuesta,”no”))
break;
}
printf(“La suma es:%d”,suma);
}
inicio
Escribi
r(“?”)
Suma = 0
Leer(n)
;
suma =
suma + n
Escribir(“De-
sea seguir?”)
Respuesta
== “no”
Escribi
r(sum
a)
fin
Leer(res
-puesta)
77. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 77
12/03/2022
• Hay una mayor complejidad de la mostrada, en el uso de funciones
• Tomemos como ejemplo el siguiente programa:
#include <stdio.h>
#include <simpio.h>
//Declaración de funciones
int Factorial(int n);
void main()
{
int i;
for (i = 0; i < 10; i ++)
printf(“%dn”, Factorial(i));
}
int Factorial (int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
fact = fact * i;
return (fact);
}
Si vemos sólo la
función, tiene sentido,
pues se encarga de
calcular el factorial de
la variable n
Si vemos sólo el programa
principal, tiene sentido, pues
se imprime el factorial de
todos los números hasta el 10
Si vemos el
programa principal y
la función como un
todo, puede resultar
un tanto confuso:
• Hay dos
variables con
nombre i
• En el programa se
usa la variable i
como el número al
que se le calcula el
factorial.
• En la función la
variable a la que
se le calcula el
factorial se llama n
La Verdad detrás de las Funciones
78. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 78
12/03/2022
Paso de Argumentos a Funciones
#include <stdio.h>
#include <simpio.h>
//Declaración de funciones
int Factorial (int n);
void main()
{
int i;
for (i = 0; i < 10; i ++)
printf(“%dn”, Factorial(i));
}
int Factorial (int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
fact = fact * i;
return (fact);
}
En el programa principal, se calcula el
factorial de i.
En la función se calcula el factorial de n
¿Cómo es que hay diferentes
identificadores para el mismo valor?
La respuesta esta muy relacionada con el
concepto de argumento:
- En el programa principal, i representa el
argumento enviado a la función Factorial.
- En la función Factorial, alguna variable
debe recibir el enviado, para representar
dicho valor. Esta variable puede tener
cualquier nombre, en este caso se le dio
el nombre n.
- Una variable definida en la cabecera de
una función, que sirve para recibir el valor
de un argumento, se conoce como
parámetro.
79. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 79
12/03/2022
#include <stdio.h>
#include <genlib.h>
int Factorial(int n);
main()
{
int i;
for (i = 0; i < 10; i ++)
{
printf(“%dn”, Factorial(i));
}
}
int Factorial(int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
{
fact = fact * i;
}
return (fact);
}
Factorial(0)
n
0
n
1
n
2
Factorial(1)
Factorial(2)
expr
1
expr
1
expr
2
Factorial(3)
n
3
expr
6
1
1
2
6
Pasos para llamar a una Función
• Se evalúan las
expresiones enviadas
como argumentos.
• El valor de cada
argumento es copiado en
orden en cada parámetro
correspondiente de la
función llamada.
• Se ejecutan una a una las
sentencias del cuerpo de
la función hasta que
aparece la sentencia
return.
• Se evalúa la expresión de
la sentencia return.
• El programa que llamó a
la función continúa,
reemplazando en el lugar
de la llamada, el valor
retornado
80. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 80
12/03/2022
Manejo de Variables Dentro de las
Funciones (Variables Locales)
• En la función Factorial se usa una variable i, y en el programa
principal se usa otra variable i, pero no parece que se usaran para
lo mismo, ¿son diferentes?.
• De hecho, si son diferentes.
– Cada función puede usar sus propias variables, y estas sólo serán
válidas dentro de la función, se conocen como variables locales.
main
i
0
Al llamar a la función Factorial, se crean 3
variables locales a Factorial, pueden tener
cualquier nombre, en este caso: n, fact e i.
Las variables locales del main aun existen,
pero, no se pueden ver mientras Factorial
este activa.
Cuando todo Factorial termina, retorna el
valor, y las variables locales al main
permanecen iguales como antes de la
llamada.
La variable i es local
a la funcion main
Factorial
n fact i
0 1 1
main
i
0
La variable i es local
a la funcion main
81. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 81
12/03/2022
Ejercicio en Clase
• Suponga que tienen un grupo de 5 monedas americanas:
penny(1 centavo), nickel(5 centavos), dime(10 centavos),
quarter(25 centavos). Se desea conocer de cuantas formas
diferentes, estas se pueden combinar, para formar un par. Se
pueden tomar penny y nickel, o penny y dime, etc
• En este ejemplo n es 5 y k es 2. La solución de cuántas
combinaciones se puede expresar usando:
• Escriba una función en C que permita calcular cuántas
combinaciones de k miembros se pueden generar teniendo n
objetos.
)!
(
!
!
)
,
(
k
n
k
n
k
n
C
−
=
82. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 82
12/03/2022
Llamando Funciones desde otras
Funciones
• Hasta ahora solo hemos hecho llamadas a funciones desde el
programa principal
• Pero las funciones se pueden llamar desde cualquier parte del
programa, incluso desde otras funciones.
• En este ejemplo, la función necesita recibir el número de objetos (n)
y el número de miembros (k) de cada combinación, para poder
retornar el número de combinaciones posibles. El prototipo:
int Combinaciones (int n, int k)
{
return(Factorial(n)/(Factorial(k)*Factorial(n-k));
}
int Combinaciones (int n, int k);
La implementación se podría lograr, usando la función Factorial que
ya fue implementada:
83. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 83
12/03/2022
Un Programa Completo
• A continuación la implementación
completa de un programa que hace uso
de la función Combinaciones:
• Nota:
– A este programa le faltan las validaciones de
las respectivas entradas.
84. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 84
12/03/2022
#include <stdio.h>
#include <genlib.h>
#include <simpio.h>
/* Prototipos de Funciones */
int Combinaciones(int n, int k);
int Factorial(int n);
/* Programa Principal */
void main()
{
int n, k;
printf(“Ingrese el numero de objetos(n) ?”);
n = GetInteger();
printf(“Ingrese el numero de miembros de la combinacion(k) ?”);
k = GetInteger();
printf(“C(%d,%d) = %dn”,n,k,Combinaciones(n,k));
}
/*
* Funcion Combinaciones
* Uso: c = Combianciones(n,k);
* Calcula el numero de combinaciones distintas, para elegir k objetos de un grupo de n
*/
int Combinaciones(int n, int k)
{
return(Factorial(n)/(Factorial(k)*Factorial(n-k));
}
/*
* Funcion Factorial
* Uso: f = Factorial(n);
* Retorna el factorial del argumento n
*/
int Factorial(int n)
{
int fact, i;
fact = 1;
for(i = 1; i <=n; i++)
{
fact = fact * i;
}
return (fact);
}
85. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 85
12/03/2022
Procedimientos
• Hemos visto que existen funciones que no retornan ningún
valor, como printf:
– printf (“Hola Mundon”);
• A este tipo de funciones que no retornan nada, y que se
llaman únicamente para que ejecuten su código, se les llama
procedimientos.
• Muchos lenguajes de programación separan totalmente el
concepto de funciones, con el de procedimientos, pero C las
trata de igual forma.
• Un procedimiento en C, es una función sin valor de retorno.
– void DarInstrucciones(void);
• Los procedimientos pueden recibir tantos argumentos
necesite.
86. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 86
12/03/2022
void ImprimirMenu (void)
{
printf (“1. Tabla de Sumarn”);
printf (“2. Tabla de Restarn”);
printf (“3. Tabla de Multiplicarn”);
printf (“4. Tabla de Dividirn”);
printf (“5. Salirn”);
}
Implementación de Procedimientos
87. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 87
12/03/2022
Refinamiento
• Cuando un problema es muy grande, se busca separarlo,
para resolver todo por partes. Esto es ventajoso
– Las partes más pequeñas son mas fáciles de entender
– Si algo falla, el error es mas fácil de encontrar
• Esto se conoce como descomposición de un problema
• Al escribir un programa, usualmente se piensa en el
programa principal (main),y se piensa en las tareas más
importantes
• Se piensa en dividir el programa en componentes
individuales, los cuales pueden ser a su vez, divididos en
piezas más pequeñas.
• Esto se conoce como diseño top-down, o refinamiento
paso a paso.
88. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 88
12/03/2022
• Se requiere escribir un programa que muestre el calendario completo
de un año dado, que no puede ser menor a 1900.
Dar Instrucciones
Ingreso y
Validacion de Año
Imprimir Mes
Mostrar Nombre del
Mes
Determinar que dia
de la semana fue el
primer dia del mes
Dar el respectivo
marqen para el
primer dia del mes
Un Problema más Grande
89. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 89
12/03/2022
Calendario
Dar Instrucciones Pedir Año Imprimir Calendario
Imprimir Nombre
del Mes
Determinar
cuantos días trae
el mes
Determinar el dia
de la semana
donde cayo el
primer dia
Imprimir el Margen
para el primer dia
del mes
Imprimir Calendario de c/ Mes
Imprimir el
resto de
días
Dependiendo del
mes y de si es
bisiesto, elegir total
de días
Calcular el dia de la
semana del primer dia
del año, contando el
total de días desde
1900 hasta el año
actual, considerando los
años bisiestos
Calcular el dia de la
semana del primer dia del
mes, sumándole al primer
dia del año, el total de días
hasta el mes actual,
considerando el total de
días de cada mes
90. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 90
12/03/2022
Conclusiones del Refinamiento
• Del refinamiento podemos sacar las funciones que necesitaremos:
– Dar instrucciones:
• void DarInstrucciones(void)
– Pedir año(y validarlo):
• int PedirAnio(void);
– Imprimir todo el Calendario de un año
– void ImprimirCalendario(int anio);
• Imprimir el Calendario de un mes, de un año dado
– void ImprimirCalendario(int mes, int anio);
• Conseguir el nombre de un numero de mes dado
– string NombreDeMes(int mes);
• Determinar el numero de la semana donde cayo el primer día
– int PrimerDiaDelMes(int mes, int anio);
• Imprimir margen para primer día
– void ImprimirMargen(int dia_semana);
– FUNCIONES QUE AYUDAN
• Determinar si un año es bisiesto
– bool EsBisiesto(int anio);
• Determinar el numero de días de un mes, de un año dado
– int DiasDeMes(int mes, int anio);
91. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 91
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
92. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 92
12/03/2022
Recursión
• La estrategia a seguir es la delegación de
tareas.
• Es decir que un problema grande se
subdivide en pequeñas tareas, y éstas se
delegan.
• Implica llamar al mismo procedimiento
varias veces.
93. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 93
12/03/2022
La Función Factorial
• Esta función fue implementada
anteriormente con un lazo for.
• La propiedad primordial del factorial es
que está relacionada a su anterior valor
n!=n*(n-1)!
• La función factorial se define como:
n! = 1 si n=0
n*(n-1)! En otro caso
94. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 94
12/03/2022
La Función Factorial
• Dicha definición es recursiva, porque n! está
en términos de (n-1)!, lo cual tiene la misma
forma del original.
• La implementación de la función en C
usando recursión sería:
int Factorial(int n)
{
if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
}
95. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 95
12/03/2022
Manejo Interno de la Recursión
• En el proceso de encontrar la respuesta,
el computador va hacia los procesos
internos, que son las llamadas al mismo
procedimiento una y otra vez.
• Supongamos que se quiere evaluar
fact= Factorial(4);
• En el programa principal se hace la
primera llamada a la función.
96. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 96
12/03/2022
Primera llamada
main
Factorial
4
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
?
La función llama a Factorial(n-1), y tan pronto
ésta regrese, se ejecuta la operación indicada
97. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 97
12/03/2022
Segunda llamada
main
Factorial
3
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
?
Factorial
Igualmente al anterior caso, aquí se hace otro
llamado interno a la función, y la operación no se
realiza hasta que se retorne dicho valor
98. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 98
12/03/2022
Tercera llamada
main
Factorial
2
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
?
Factorial
Siguiendo la lógica, se llama a Factorial(1), y éste a su vez
llama a Factorial(0), realizándose dos llamadas más a la
función
Factorial
99. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 99
12/03/2022
Última llamada
Factorial
0
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
Factorial
Factorial
main
Factorial
Factorial
En este punto, la situación
varía, como n es 0, la función
retorna su resultado
inmediatamente
return(1);
100. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 100
12/03/2022
Retorno
Factorial
1
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
Factorial
Factorial
Factorial
main
1
Desde este punto, se devuelve el retorno a cada
llamada recursiva
return(1*1);
101. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 101
12/03/2022
Retorno
main
Factorial
2
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
1
Factorial
Factorial
return(2*1);
102. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 102
12/03/2022
Retorno
Factorial
3
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
2
Factorial
main
return(3*2);
103. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 103
12/03/2022
Retorno
main
Factorial
4
n if(n==0){
return(1);
} else{
return(n*Factorial(n-1));
}
6
return(4*6);
104. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 104
12/03/2022
El Paradigma Recursivo
• Toda función recursiva tiene la siguiente
estructura:
if(Prueba para el caso simple){
return(solución simple sin usar recursión);
} else{
return(solución recursiva llamando a la misma función);
}
105. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 105
12/03/2022
Otro Ejemplo de Recursión
• Otro ejemplo recursivo es el de elevar un
número entero a una potencia k.
• Su definición es:
nk= 1 si K=0
nxnk-1 en otro caso
La solución recursiva de este problema es
como sigue...
106. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 106
12/03/2022
Otro Ejemplo de Recursión
static int ElevarEnteroPotencia(int n, int k)
{
if(k==0){
return(1);
} else{
return(n* ElevarEnteroPotencia(n, k-1))
}
}
107. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 107
12/03/2022
Consideraciones
• Los problemas vistos, de factorial y número
elevado a una potencia, tienen soluciones
recursivas naturales, porque:
• Se puede identificar el caso más simple.
• Se puede aplicar recursividad para
descomponer el problema en más simples del
mismo tipo.
• Existen otros problemas en los que la recursión
es un poco más difícil de ver, para tales caso
permutaciones son usadas.
108. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 108
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas, Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
109. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 109
12/03/2022
Paso de Parámetros
• Hasta ahora vimos y hemos usado una forma sencilla de pasar parámetros a las
funciones
• Cada parámetro de una función espera y recibe una copia del valor de cada
argumento enviado.
• Ejemplo: Cree una función que reciba dos
valores y los intercambie.
• Podríamos decir que el prototipo seria:
– void Intercambiar(int a, int b);
• Al retornar la función no efectuaría el
cambio, como lo deseamos. Recordemos
que, al pasar parámetros, se efectúa una
copia de los valores. Este tipo de paso de
parámetros se conoce como PASO DE
PARAMETROS POR VALOR
x
main
y
3 4
Intercambiar
a b tmp
3 4
3 3
4
x
main
y
3 4
main()
{
int x, y;
printf(“Ingrese x:”);
x = GetInteger();
printf(“Ingrese y:”);
y = GetInteger();
printf(“x = %d, y= %d”, x, y);
Intercambiar(x,y);
printf(“x = %d, y= %d”, x, y);
}
void Intercambiar(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
110. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 110
12/03/2022
Otra Forma de pasar Parámetros
• El intercambio en la función anterior no se realiza porque jamás se
trabajó con los argumentos.
• En el paso de parámetros por valor, la función trabaja con una copia
de los argumentos.
• Si deseamos que una función manipule sus parámetros, y esto se
refleje en los argumentos, se usa PASO DE PARÁMETROS POR
REFERENCIA. En este caso:
– La función no trabaja con copias
– Trabaja directamente con los argumentos
– La función no recibe valores, sino que recibe direcciones de memoria…
es decir: punteros
111. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 111
12/03/2022
El Intercambio
x
main
y
• Para este tipo de problemas, en los cuales necesitamos modificar directamente
los datos que se reciben como parámetros, se usa la PASO DE
PARÁMETROS POR REFERENCIA
• Si la función no va a recibir valores, si no direcciones, el prototipo seria:
void Intercambiar(int *a, int *b);
3 4
• Los parámetros a y b son ahora
punteros, que representan a los
argumentos directamente
• Cualquier cambio que se haga sobre
a y b se esta haciendo realmente a
las variables a las que estos apuntan
Intercambiar
*a *b tmp
4 3
3 4
3 3
4
x
3 4
3
main
y
4 3
main()
{
int x, y;
printf(“Ingrese x:”);
scanf(“%d”,x);
printf(“Ingrese y:”);
scanf(“%d”,y);
printf(“x = %d, y= %d”, x, y);
Intercambiar(&x,&y);
printf(“x = %d, y= %d”, x, y);
}
void Intercambiar(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
En este caso:
a apunta a x,
b apunta a y
a = &x, b = &y
No se envían
valores, se
envían
direcciones
112. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 112
12/03/2022
Un Uso Mas Interesante
• El paso de parámetros por referencia es útil:
– Cuando deseamos intercambiar valores
– Cuando deseamos que una función retorne mas de un valor
• Como todos sabemos las funciones solo pueden retornar un valor
• Si necesitamos que una función retorne mas de un valor, aquellos
valores que necesitamos retornar, deben ser parámetros por
referencia.
• EJERCICIO EN CLASE
– Crear una función que calcule el menor, el mayor y el promedio de un
arreglo
• Esta función debe retornar 3 valores, usemos parámetros por
referencia
• Si la función retorna mas de 1 valor, podemos declararla como
void…convirtiéndose en un procedimiento.
• void CalcularValores(int arreglo[], int n, int *mayor, int *menor,
int *promedio);
Los datos que
vamos a
retornar, se
declaran como
parámetros
por referencia
113. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 113
12/03/2022
Solución
• Los cálculos hechos se almacenaran en los parámetros
por referencia:
void CalcValores(int arr[], int n, int *menor, int *mayor, float *promedio){
int i, total;
*menor = arr[0];
*mayor = arr[0];
total = 0;
for(i = 0; i < n; i++){
if(arr[i] < *menor) *menor = arr[i];
if(arr[i] > *mayor) *mayor = arr[i];
total = total + arr[i];
}
*promedio = total/ n;
}
La función no tiene
explícitamente una
sentencia return.
Se trabaja
directamente con los
parámetros recibidos.
Estos son direcciones,
para trabajar con ellas,
usamos el operador *
114. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 114
12/03/2022
Advertencia
• El paso de parámetros por referencia no debe
reemplazar al paso de parámetros por valor.
• Solo se usan parámetros por referencia cuando
sea imperiosamente necesario.
• Las funciones, aquellas que retornan valores son:
– Fáciles de entender y seguir por cualquier
programador.
– El valor que retornan se puede asignar a una
variable.
– No así con los procedimientos.
115. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 115
12/03/2022
Contenido
• Diseño descendente
• Módulos, cohesión – Modularidad: Funciones propias
del lenguaje de programación.
• Sub-programas Funciones y Procedimientos.
Declaración y definición.
• Recursividad
• Paso de parámetros por valor y referencia.
• Construcción de Librerías (Bibliotecas)
116. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 116
12/03/2022
Diseño De Una Interfase
• Las funciones y los procedimientos nos
ayudan a reducir la complejidad de los
programas.
• Una interfase le da a un programador
cliente, acceso a un grupo de funciones.
• Para añadir una función a una interfase,
debemos hacerlo con un cierto criterio.
117. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 117
12/03/2022
Criterios Para Diseñar una Interfase
• Una interfase bien diseñada, debe cumplir
los siguientes requisitos:
– Unificación
– Simplicidad
– Suficiencia
– Generalidad
– Estabilidad
118. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 118
12/03/2022
Unificación
• Las funciones (herramientas) dentro de una
librería, deben ser escogidas, de acuerdo a un
cierto tema.
• La unificación también se refiere al enfoque que
se le da a un problema dentro de la misma
librería.
• Por ejemplo:
– Todas las funciones de la librería grafica consideran
que las coordenadas están especificadas en píxeles,
y que la coord. 0,0 esta ubicada en la esquina
superior izq. de un objeto.
– Una función que trabaje con coordenadas en
pulgadas, no conservaría la unificación.
119. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 119
12/03/2022
Simplicidad
• Al diseñar una interfase, el objetivo principal es reducir la
complejidad, a través del uso de ciertas funciones.
• Se trata de proteger al cliente de los detalles complicados.
• La complejidad de la implementación se queda en el lado del
creador de la librería.
• Se “esconde” información del cliente, no se mencionan
detalles en la interfase, ni siquiera a través de comentarios.
• Las funciones también deben ser diseñadas lo más simples
posibles:
– Reduciendo el número de parámetros al mínimo.
– Limitando el total de funciones de la interfase, para no abrumar
al cliente y confundirlo.
120. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 120
12/03/2022
Suficiencia
• Que exista simplicidad, no implica que se debe sacrificar la
suficiencia.
• Al cliente se lo debe proveer de la mayor cantidad de
posibilidades de trabajo.
• Negarle a un cliente una posibilidad de trabajo es fracasar en
el diseño de una interfase.
• Además de que las posibilidades estén disponibles, estas
deben funcionar eficientemente.
• El cliente debe poder confiar en que los resultados dados por
una librería, siempre serán correctos, y que llegaran a el a
tiempo.
• Estos detalles tienen más que ver con la implantación que
con la interfase, pero son estrategias que no debemos pasar
por alto.
121. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 121
12/03/2022
Generalidad
• Una interfase que solo se adapta a las
necesidades de un cliente en particular, puede
que no sirva para otros.
• Una interfase debe ser lo suficientemente general,
para resolver un buen grupo de posibilidades.
• Al crear una interfase debemos olvidarnos de
nuestro punto de vista y ponernos en el lugar de
todos los posibles clientes.
122. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 122
12/03/2022
Estabilidad
• Si la interfase no cambia, los clientes no tienen
porque cambiar sus programas.
• Un creador puede perfectamente hacer cambios a
su librería, y si diseño correctamente su interfase,
estos cambios no afectarán a los clientes.
• Los cambios que haga el creador se harán en la
implementación de la librería.
• Cuando se haga un cambio en la interfase, todos
los clientes deberán cambiar sus programas.
• Usualmente estos cambios son profundos y no se
hacen frecuentemente.
123. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 123
12/03/2022
Al Azar
• Todos hemos usado juegos de computadoras.
• El buscaminas, por ejemplo:
– Nunca se repiten las localidades de las minas.
– Estas fueron ubicadas al azar.
• Lograr que la computadora simule un
comportamiento “al azar” o “aleatorio” es muy útil
para ciertas aplicaciones.
• Sin embargo, esto encierra un cierto nivel de
complejidad.
• Deseamos esconder esa complejidad, usando una
interfase.
124. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 124
12/03/2022
Números Pseudo-Aleatorios
• Un comportamiento determinístico es aquel,
en que las acciones son completamente
predecibles.
• Las computadoras tienen un comportamiento
determinístico, no pueden generar resultados
impredeciblemente.
• Pero pueden simularlo, partiendo de un
procedimiento determinístico. Los números
generados, parecerán ser aleatorios.
125. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 125
12/03/2022
Generación de Números Aleatorios
• La librería en stdlib, incluye en su interfase la función:
– int rand(void);
• El entero que retorna es un número pseudo aleatorio no negativo, ni mayor
a una constante RAND_MAX
#include <stdio.h>
#include <stdlib.h>
#include <genlib.h>
void main()
{
int i, r;
printf("En esta computadora RAND_MAX: %d",
RAND_MAX);
for(i = 0; i < 10; i++)
{
r = rand();
printf("%dn",r);
}
}
126. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 126
12/03/2022
Ejercicio En Clase
• Escribir un programa que simule el lanzamiento de una moneda. El
programa deber “lanzar” 10 veces una moneda e indicar si cayo “Cara”
o “Cruz”.
• Para resolver este problema debemos recordar que rand() nos da un
numero entre 0 y RAND_MAX, es decir, RAND_MAX + 1 posibilidades.
• Nosotros, no deseamos RAND_MAX + 1, deseamos, 2 posibilidades:
RAND_MAX
0 RAND_MAX/2
CARA CRUZ
Podríamos decir, que todos los números menores o iguales que
RAND_MAX/2 representarían la opción 1(Cara) y
Todos los números mayores que RAND_MAX/ 2 representarían la opción
2(Cruz).
127. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 127
12/03/2022
Solución
#include <genlib.h>
#include <stdio.h>
#include <simpio.h>
#include <stdlib.h>
void main()
{
int i, r;
printf("Simulacion del lanzamiento de Monedasn");
for(i=1; i <= 10; i++){
printf("Lanzamiento No. %dn",i);
r = rand();
if(r<=RAND_MAX/2){
printf("CARAn");
} else {
printf("CRUZn");
}
}
}
128. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 128
12/03/2022
Ejercicio En Clase
• Estuvo bien, y acertada nuestra decisión de dividir para 2,
pues las posibilidades casi se repartieron por la mitad.
• Escribir un programa que simule el lanzamiento de un dado, e
indique el número de lado en que cayo.
• Recordemos, ahora si tenemos 6 posibilidades, deberíamos
dividir nuestro rango, para 6
El tamaño de cada division td =
RAND_MAX/6
td 2*td 3*td 4*td 5*td
0 RAND_MAX
1 2 3 4 5 6
129. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 129
12/03/2022
Solución
#include <stdio.h>
#include <stdlib.h>
void main()
{
int r,td;
td = RAND_MAX/6;
printf("Simulacion del lanzamiento de un Dadon");
r = rand();
if(r<=td){
printf("Lado 1n");
}else if(r<=td*2){
printf("Lado 2n");
}else if(r<=td*3) {
printf("Lado 3n");
}else if(r<=td*4) {
printf("Lado 4n");
}else if(r<=td*5) {
printf("Lado 5n");
}else {
printf("Lado 6n");
}
}
130. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 130
12/03/2022
El Problema y su Generalización
• Ahora pensemos en otro tipo de aplicación. Se nos pide escribir un
programa que “escoja” una carta de un mazo:
– En ese caso, la computadora debería generar un número entre 1 y 52.
– Seguir el mismo proceso anterior, con 52 posibilidades significaría
escribir muchas líneas de código.
• Se necesita ahora, escribir un programa que simule el modelo de la
ruleta Europea, donde el rango es de 0 a 36:
– Aunque el procedimiento es parecido, el programa anterior es
completamente inútil.
• Debe existir una forma de generalizar el proceso de limitar el rango
de un número generado aleatoriamente:
– La forma más correcta de generalizar algo para su uso continuo, es a
través de una función.
– Cualquier aplicación que necesite generar un número aleatorio en un
rango dado, podrá usar nuestra nueva función.
131. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 131
12/03/2022
d
Una Nueva Herramienta
• Nuestra función generará un número entero, en un rango dado por un limite
inferior y uno superior:
– int RandomInteger(int v_inf, int v_sup);
• El proceso a seguir es el siguiente:
– Generar un entero entre 0 y RAND_MAX(r)
– Normalizar r, para convertirlo en un número real d entre 0 y 1( 0 <= d < 1)
– Escalar el valor d, multiplicándolo por el tamaño del rango deseado, esto ubicará a
d en el rango de 0 a v_sup-v_inf
– Truncar el valor generado, pues deseamos generar un entero(k)
– Trasladar el entero(k) al rango correcto, de v_inf a v_sup
0 RAND_MAX
r
1
v_sup-v_inf
d
v_sup
v_inf k
132. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 132
12/03/2022
Implementación
int RandomInteger(int v_inf, int v_sup)
{
int r,k;
double d;
r = rand();
d = (double) r / (double) (RAND_MAX +1);
d = d * (v_sup-v_inf+1);
k = (int) d + v_inf;
return k;
}
133. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 133
12/03/2022
Usando La función
• Simulación del lanzamiento de 10 monedas
int RandomInteger(int v_inf, int v_sup);
main(){
int i, r;
printf("Simulacion del lanzamiento de Dadosn");
for(i = 1; i <=10; i++){
printf("Lanzamiento No. %d:", i);
r = RandomInteger(1,6);
printf("Lado %dn",r);
}
}
134. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 134
12/03/2022
Otro Problema sobre el mismo Tema
• Que esperamos que suceda cuando
volvamos a correr el programa cliente?.
• Lo normal, es esperar que el computador
genere otra tanda de números en un orden
completamente diferente.
• Recordemos, que el computador solo puede
simular que genera números al azar.
• Con cada “corrida” del programa, el
computador generará el mismo grupo de
números.
135. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 135
12/03/2022
La Semilla de la Generación
• El proceso básico con el cual el computador “genera” números “al
azar”, es partiendo de un número inicial.
• Usando ese número, la computadora efectúa sus cálculos, y nos
muestra un número que no esperábamos.
• Su nuevo número “inicial” es ahora el último valor calculado.
• Este número “inicial” que la computadora usa para sus cálculos, se
conoce como “semilla”.
• A menos que se indique la computadora siempre usará la misma
semilla en cada “corrida” de un programa.
Proceso de
Calculo
SEMILLA VALOR “AL
AZAR” No. 1
Proceso de
Calculo
VALOR “AL
AZAR” No. 1
VALOR “AL
AZAR” No. 2
136. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 136
12/03/2022
Como Cambiar La Semilla
• La librería stdlib provee una función con la que podemos cambiar la
semilla:
– void srand(int);
• La semilla debe ser un entero.
• La idea es que con cada corrida de un programa, la semilla cambie.
• Lo único que sabemos que siempre esta cambiando, es el tiempo,
podemos usarlo en este caso.
• La librería time contiene funciones para conocer y modificar la fecha,
y la hora local:
– La función time devuelve el numero de segundos transcurridos desde las
00:00:00 del primero de Enero de 1970.
• La expresión que permitirá cambiar la semilla de acuerdo al tiempo:
– srand((int) time(NULL));
137. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 137
12/03/2022
Otra Herramienta
• Todo programa que use números aleatorios,
debería modificar la semilla.
• Para usar la expresión srand, se debe conocer:
– El proceso de generación de números aleatorios.
– La existencia de la función time, de la librería time.
• En conclusión, existe una cierta complejidad en
este proceso, que se puede esconder usando un
procedimiento:
– void Randomize(void);
void Randomize(void){
srand((int) time(NULL));
}
138. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 138
12/03/2022
Construcción de una Librería Propia
• Ahora poseemos dos herramientas para trabajar con
números aleatorios.
• Lo ideal aquí es crear nuestra propia librería.
• Las librerías que crearemos, son archivos de extensión .lib
• Para lograrlo se deben seguir ciertos pasos:
– Crear un proyecto, de tipo Librería estática
– Añadir al proyecto un archivo de cabecera (para la interfase).
Aquí se añadirán:
• Prototipos
• Declaraciones de constantes
• Nuevos tipos de datos
– Añadir al proyecto un archivo .c que contendrá la
implementación de las herramientas declaradas en la interfase.
– Al terminar, se creará un archivo de extensión .lib, que será
nuestra nueva librería.
139. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 139
12/03/2022
Crear El Proyecto
Vamos a crear una
librería estática
140. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 140
12/03/2022
Añadir Los Archivos
Añadimos el archivo de
cabecera(la interfase)
de ext. *.h
Falta añadir el
archivo *.c, para
la
implementacion
El archivo *.c
Ahora ya estan
incluidos todos los
archivos de nuestro
paquete y podemos
continuar
Continuar, el resto de
pasos, son los
mismos para crear un
proyecto normal
Aquí ya aparecerá
elegida la opción de
librería estática, no se
debe cambiar
Nuestra librería se
llamará random.lib y
aquí se indica el
directorio donde se
creará
141. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 141
12/03/2022
¿Cómo Crear La Interfase?
• La interfase, es, como ya sabemos, la cara que una librería, da a un
cliente.
• En una interfase se pueden incluir:
– Prototipos de funciones
– Declaraciones de constantes (usando #define)
– Declaraciones de nuevos tipos de datos (veremos como más adelante)
• Esto quiere decir que jamás se incluirá implementación en una
interfase.
• El formato general de una interfase es:
#ifndef _nombre_h
#define _nombre_h
/*Líneas de #include para librerías que se vaya a usar*/
/*prototipos de funciones*/
/*definición de constantes*/
/*declaraciones de nuevos tipos de datos*/
#endif
El nombre de la
librería
En programas complejos, una
interfase puede ser incluida en
varios archivos .c, para evitar
“confusiones” se pregunta si la
intefase no ha sido usada aun
(ifndef: if not defined)
Si no ha sido usada, se define,
caso contrario, se ignoran todas las
declaraciones de la misma
142. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 142
12/03/2022
Nuestra Nueva Interfase
143. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 143
12/03/2022
La Implementación
Se debe incluir la
interfase, random.h
Al incluirla, asegúrese
de encerrarla entre “”,
y no entre <>
Si al
compilar(Compile-
Make), todo tuvo
éxito, estamos listos
para usar nuestra
librería
144. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 144
12/03/2022
Un Programa Cliente
• Ahora podemos ponernos del lado del cliente,
como hace para usar esta nueva librería?
• Nuestro nuevo programa usara la librería para
simular el lanzamiento de 10 dados.
Al crear el nuevo
proyecto, como cliente,
se añade la nueva
librería, con su ruta
completa. Para evitar
esto, la solucion es
copiar random.lib en el
directorio lib del
compilador
Al incluir la interfase,
también debe indicarse
la ruta completa. Esto
siempre y cuando el
archivo .h se encuentre
en un directorio
diferente del directorio
de trabajo o del
directorio include del
compilador
145. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 145
12/03/2022
Evaluación de una Interfase
• Ahora podemos evaluar nuestra interfase, usando los criterios
mencionados al comienzo:
– Unificada: las herramientas de la interfase comparten un tema en
común: los números aleatorios, por lo tanto, si es unificada.
– Simple: no le hemos usado mucho, pero con el programa cliente
podemos darnos una idea de que en realidad esconde la complejidad
correctamente y las herramientas son muy fáciles de usar.
– Suficiente: realmente las herramientas no cubren todo lo que un cliente
pueda desear hacer con los números aleatorios. Aun le falta por
desarrollar.
– General: las herramientas disponibles son bastante generales, en el
sentido de que no están limitadas a un solo tipo de cliente.
• Este seria el caso, si la interfase solo incluyera funciones para simular que un
dado es lanzado, o para simular que una carta es escogida.
• En cambio la interfase provee las herramientas para desarrollar cualquiera de
esas funciones
– Estable: si la interfase satisface los requerimientos anteriores,
probablemente podrá permanecer estable por un buen tiempo
146. Algoritmos y Lógica de Programación Carrera de Software
Ph.D. Franklin Parrales 146
12/03/2022
Programación modular
Unidad 4
Final de la unidad
Y del curso…. !Muchas gracias
a todos!