antologia de algoritmos y lenguajes de programación 24feb

77
ANTOLOGIA LIC. SUSANA HERNANDEZ RODRIGUEZ DOCENTE DEL ITSP ING. INDUSTRAL 2009 ALGORITMOS Y LENGUAJES DE PROGRAMACIÓN

Upload: itsp

Post on 23-Dec-2015

52 views

Category:

Documents


18 download

DESCRIPTION

contenido de la materia de algoritmos y lenguajes de programación

TRANSCRIPT

Page 1: Antologia de Algoritmos y Lenguajes de Programación 24feb

ANTOLOGIA

LIC. SUSANA HERNANDEZ

RODRIGUEZ

DOCENTE DEL ITSP

ING. INDUSTRAL

2009

ALGORITMOS Y LENGUAJES DE PROGRAMACIÓN

Page 2: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 2

PRESENTACIÓN

En este material contiene los objetivos que se deben lograr al finalizar la unidad, el

método de evaluación del aprendizaje y el contenido. En un mundo cambiante de tecnología como se

tiene el día de hoy se hace necesario evaluar y estudiar parte de esa tecnología. Las computadoras,

el hardware, el software, las grandes máquinas que invaden nuestro mundo requieren de un estudio.

Igualmente contiene los temas relacionados con los lenguajes de programación.

Básicamente se presenta la estructura para conocer de donde surge la tecnología que se está

usando. La información en este tema a cambiando a pasos agigantados aun cuando los lenguajes de

programación son menos cambiantes.

Page 3: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 3

DATOS DE LA MATERIA

Carrera: Ingeniería Industrial

Clave de la asignatura: INM-0407

Horas teoría-horas práctica-créditos: 3-2-8

OBJETIVOS GENERALES

El alumno:

• Conocerá las tendencias actuales de tecnología

• Identificará cada uno de los elementos de un sistema computacional

• Enlistará las características de cada familia de sistemas operativos

• Identificará los diferentes productos de software que existen.

• Utilizara como herramienta de trabajo alguno de esos recursos

Page 4: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 4

INDICE DE CONTENIDO

I. INTRODUCCIÓN A LA COMPUTACIÓN

1.1 Nuevas tecnologías de la información

1.1.1 Evolución de las tecnologías

1.2 Elementos de un sistema computacional

1.2.1 Hardware

1.2.2 Software

1.2.3 Firmware

1.3 Clasificación de los Sistemas Operativos

1.3.1 Familia Windows

1.3.2 Arquitectura Macintosh

1.3.3 Unix

1.3.4 Linux

1.4 Paquetería de software

1.4.1 Paquetería de Office

1.4.2 Modelos de Base de Datos

Page 5: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 5

1.1 Nuevas Tecnologías de la Información

1.1.1 EVOLUCIÓN DE LAS TECNOLOGÍAS

Las TI son principalmente la informática y afines, debido a su facilidad para adoptar soluciones, cuando se implanta el SI, almacén acceso de datos, proceso rápido y con pocos errores, comunicaciones automáticas entre procesos, pero muchas veces la implantación de un SI se realiza de forma deficiente por no entender los usuarios, las posibilidades de las TI, o por haber montado el SI alrededor de una TI previamente incorporada.

Las TI hacen que se cambie la manera de realizar las operaciones, respecto a la que se venía haciendo en la empresa, ya que las TI llevan consigo una propia forma de actuar, por ello deberemos adaptar a los usuarios y la organización a las nuevas formas de ejecutar las operaciones, incluyendo estos métodos cuando diseñemos el SI.

Además es importante realizar un seguimiento de las TI y mantener una actitud crítica acerca de los cambios que se producen, para encontrar las que mejor se ajusten al SI de la empresa, por ello las TI deben llevarnos a reconsiderar la forma de actuar para que el SI funcione adecuadamente a lo largo del tiempo, intentando que las TI aporten mejores métodos para realizar las tareas y obtener una mayor productividad de ellas, pues el desconocimiento de las TI nos puede llevar a una situación improductiva, o forzarnos a realizar las tareas de forma peor, por no ajustarse a nuestro SI.

Para evitar estos resultados, es necesario conocer las TI en términos de lo que nos pueden aportar a nuestro SI, pero siempre dentro de la perspectiva del funcionamiento de la empresa.

Si utilizamos las TI para rediseñar el SI, nos obligamos a replantearnos la forma de realizar ciertas actividades y las consecuencias que podemos obtener serán: la anticipación puede ser un éxito en la implantación, mejorando el esfuerzo de la empresa, (realizando las aplicaciones de forma paulatina).

Si no anticipamos la reacción de los usuarios, el resultado será imprevisible y conducirá casi seguro al fracaso, por no adaptarse los usuarios a las nuevas tecnologías.

Las principales aportaciones de las TI al mundo de la empresa son:

INFORMÁTICA:

Page 6: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 6

NUEVAS TECNOLOGÍAS DE LA INFORMACIÓN

OFIMÁTICA

El proceso de incorporación de las TI a los SI, afecta a toda la empresa (organización, estructura, control...) y no sólo al SI, por eso para que sea un éxito la implantación de los avances tecnológicos, hay que coordinar estos avances con todas las áreas de la empresa, para que el SI resultante sea un conjunto armonioso y que se adapte perfectamente a la estructura de la empresa.

Este enfoque de planteamiento global, implica que la implantación de las TI debe ser compatible con la política general de la organización, y deberá materializarse en un plan estratégico para el sistema informático que vamos a utilizar, como soporte de las necesidades existentes tanto a corto como a largo plazo, teniendo en consideración los objetivos generales de la organización, y ser una expresión lo más real posible de la política informática adoptada.

Por todo ello, la dirección debe tener una participación activa en el proceso de planificación y diseño y la implantación de las TI dentro del SI, en caso contrario podemos tener problemas en la elección de las aplicaciones prioritarias a utilizar, tanto en el diseño de soluciones para secuencias de procesos (decisiones estructuradas y operativas), como en los intervalos de decisión o decisiones no estructuradas que no tienen bien definidas sus necesidades.

Page 7: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 7

Primera Generación (1951 -1958) Usaban tubos al vacío para procesar información. Usaban tarjetas perforadas para entrar los datos y los programas. Usaban cilindros magnéticos para almacenar información e instrucciones

internas. Eran sumamente grandes, utilizaban gran cantidad de electricidad, generaban

gran cantidad de calor y eran sumamente lentas. Se comenzó a utilizar el sistema binario para representar los datos.

Segunda Generación (1958 - 1964) Usaban transistores para procesar información. Los transistores eran más rápidos, pequeños y más confiables que los

tubos al vacío. 200 transistores podían acomodarse en la misma cantidad de espacio

que un tubo al vacío. Usaban pequeños anillos magnéticos para almacenar información e

instrucciones. Se mejoraron los programas de computadoras que fueron desarrollados durante la primera

generación. Se desarrollaron nuevos lenguajes de programación como COBOL y FORTRAN, los cuales

eran comercialmente accesibles. Se usaban en aplicaciones de sistemas de reservaciones de líneas aéreas, control del tráfico

aéreo y simulaciones de propósito general. La marina de los Estados Unidos desarrolla el primer simulador de vuelo, "Whirlwind I". Surgieron las minicomputadoras y los terminales a distancia. Se comenzó a disminuir el tamaño de las computadoras.

Tercera Generación (1964 - 1971) Se desarrollaron circuitos integrados para procesar información. Se desarrollaron los "chips" para almacenar y procesar la información.

Un "chip" es una pieza de silicio que contiene los componentes electrónicos en miniatura llamados semiconductores.

Los circuitos integrados recuerdan los datos, ya que almacenan la información como cargas eléctricas.

Surge la multiprogramación. Las computadoras pueden llevar a cabo ambas tareas de procesamiento o análisis

matemáticos. Emerge la industria del "software". Se desarrollan las minicomputadoras IBM 360 y DEC PDP-1. Otra vez las computadoras se tornan más pequeñas, más ligeras y más eficientes. Consumían menos electricidad, por lo tanto, generaban menos calor.

Cuarta Generación (1971 - 1988) Se desarrolló el microprocesador. Se colocan más circuitos dentro de un "chip". "LSI - Large Scale Integration circuit". "VLSI - Very Large Scale Integration circuit". Cada "chip" puede hacer diferentes tareas. Un "chip" sencillo actualmente contiene la unidad de control y la unidad de aritmética/lógica.

El tercer componente, la memoria primaria, es operado por otros "chips". Se reemplaza la memoria de anillos magnéticos por la memoria de "chips" de silicio. Se desarrollan las microcomputadoras, o sea, computadoras personales o PC. Se desarrollan las supercomputadoras.

Page 8: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 8

Quinta Generación (1983 - al presente) Inteligencia artificial: Es el campo de estudio que trata de aplicar los procesos del pensamiento

humano usados en la solución de problemas a la computadora. La robótica: Es el arte y ciencia de la creación y empleo de robots.

Un robot es un sistema de computación híbrido independiente que realiza actividades físicas y de cálculo. Están siendo diseñados con inteligencia artificial, para que puedan responder de manera más efectiva a situaciones no estructuradas.

Los sistemas expertos. Son programas de ordenador, destinados a simular el razonamiento humano de expertos en un determinado campo, para resolver problemas concretos, poseen los siguientes componentes:

Base de conocimientos con reglas de inferencia y hechos relevantes para los expertos. Memoria de trabajo que recoge la descripción del problema. Motor de inferencia, interpreta y aplica las reglas, a través de un programa informático que

recoge el razonamiento de los expertos. Subsistema de explicaciones, permite obtener explicaciones parciales, de cada parte del

proyecto que se está analizando. Subsistema de adquisición de conocimientos, permite añadir modificaciones o nuevas

aplicaciones en el sistema.

Las funciones que desarrollan los sistemas expertos son:

Interpretación de fenómenos a partir de datos observados. Previsiones o inferencia de consecuencias probables. Diagnóstico de problemas según los datos observados. Configuración de determinadas especificaciones y restricciones del modelo. Planificación de la secuencia de acciones a realizar, teniendo en cuenta las restricciones. Control resultados-previsiones. Formación en la resolución de problemas en la empresa, por el método de consulta. Toma de decisiones en una secuencia de actividades a partir de la identificación del problema.

Los sistemas de expertos aún están en fase de desarrollo, pero constituyen un aprendizaje organizacional en la forma de tomar decisiones. Para perder la rigidez, tendremos que diseñar un proceso flexible que nos permita realizar aproximaciones sucesivas a través de prototipos, así como la participación de los responsables de tomar decisiones en los SAD y no generar desequilibrios en el crecimiento de las TI en la empresa.

BIBLIOGRAFÍA http://coqui.lce.org/ialvarez/GENERA.HTM

Page 9: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 9

1.2 Elementos de un sistema computacional

1.2.1 HARDWARE

Se denomina hardware o soporte físico al conjunto de elementos materiales que componen un ordenador. En dicho conjunto se incluyen los dispositivos electrónicos y electromecánicos, circuitos, cables, tarjetas, armarios o cajas, periféricos de todo tipo y otros elementos físicos.

El hardware se refiere a todos los componentes físicos (que se pueden tocar) de la computadora: discos, unidades de disco, monitor, teclado, mouse, impresora, placas, chips y demás periféricos. En cambio, el software es intocable, existe como ideas, conceptos, símbolos, pero no tiene sustancia. Una buena metáfora sería un libro: las páginas y la tinta son el hardware, mientras que las palabras, oraciones, párrafos y el significado del texto son el software. Una computadora sin software sería tan inútil como un libro con páginas en blanco.

1.2.2 SOFTWARE

Software es la «expresión de un conjunto de instrucciones mediante palabras, códigos, planes o en cualquier otra forma que al ser incorporados en un dispositivo de lectura automatizada, es capaz de hacer que un computador ejecute una tarea u obtenga un resultado. La protección del programa de ordenador comprende también la documentación técnica y los manuales de uso.

TIPOS DE SOFTWARE Existe variedad de clasificación de software, pero por cuestiones académicas se ha dividido en:

- Según la función. - Según el grado de estandarización o uso.

Según la función.- Esta clasificación para nuestro tema es solamente ilustrativa, dentro de este bloque encontramos.

Software de base.- Son los que controlan el funcionamiento interno del ordenador, periféricos que sirva para el correcto funcionamiento de otros programas dentro de ellos se pueden destacar, software de memoria (Memmaker), sistemas operativos (DOS 6.00) lenguaje de programación (Basic), son los que están inmersos en el ordenador.

Software aplicativos.- Son programas de montos o funciones específicos, que el usuario, adquiere de acuerdo a sus necesidades; entre las cuales podemos mencionar:

- Hojas de cálculo (Quattro Pro) - Procesadora de Textos (Word Perfect) - Base de datos (Dbase) - Diseño Gráfico (Corel Draw)

Según el uso o estandarización.- Existen 3 sub divisiones que son considerados software aplicativos debido a que ellos son requeridas atendiendo la necesidad del usuario, y que a mencionar son:

El software aplicativo.- También llamado package, estos programa están dirigidos al mercado en general, lo cual ha originado el origen de empresas creadoras de software, que están pues estas son propia nos bien definidos, bien es hoja calculo, base de datos, o conjuntos de programas en grupo.

Page 10: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 10

El software a medida.- También denominada (Custom mode), son los creados por empresas para sus propias actividades, también son susceptibles de modificación

El software de acuerdo al cliente.- Se les denomina (customized), son programas estándar, modificado de acuerdo a la necesidad de un usuario en particular. La legislación no menciona quien es el autorizado de hacer esta modificación.

El software es un componente esencial de toda actividad basado en el uso de la informática.

1.2.2 FIRMWARE

Firmware o Programación en Firme, es un bloque de instrucciones de programa para propósitos específicos, grabado en una memoria tipo ROM, que establece la lógica de más bajo nivel que controla los circuitos electrónicos de un dispositivo de cualquier tipo. Al estar integrado en la electrónica del dispositivo es en parte hardware, pero también es software, ya que proporciona lógica y se dispone en algún tipo de lenguaje de programación. Funcionalmente, el firmware es el intermediario (interfaz) entre las órdenes externas que recibe el dispositivo y su electrónica, ya que es el encargado de controlar a ésta última para ejecutar correctamente dichas órdenes externas. Encontramos Firmware en memorias ROM de los sistemas de diversos dispositivos periféricos, como en monitores de video, unidades de disco, impresoras, etc., pero también en los propios microprocesadores, chips de memoria principal y en general en cualquier circuito integrado. El firmware es una combinación de software (programa) y hardware (en este caso, chips). En su conjunto son Chips que poseen dentro pequeños programas que son guardados dentro y que se denominan Firmware. Estos chips normalmente son de los siguientes tipos: ROM(s) Read Only Memory (Memoria de solo lectura) PROM(s) Programmable read-only memory (memoria programable de solo lectura) EPROM(s) Erasable programmable read-only memory (memoria programable y con capacidad de ser borrada) El firmware en PROM o EPROM está diseñado para ser modificado si es necesario a través de una actualización de software.

BIBLIOGRAFIA http://es.wikipedia.org/wiki/Soporte_f%C3%ADsico

www.escomposlinux.org/hardware/ http://es.wikipedia.org/wiki/Firmware

Page 11: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 11

1.3 Clasificación de los sistemas operativos

1.3.1FAMILIA WINDOWS

Microsoft Windows es el nombre de una familia de sistemas operativos no libres desarrollados por la empresa de software Microsoft Corporation. Todos ellos tienen en común el estar basados en una interfaz gráfica de usuario basada en el paradigma de ventanas (de ahí su nombre en inglés). Las versiones de Windows que existen hasta el momento se basan en dos líneas separadas de desarrollo que finalmente convergen en una sola con la llegada de Windows XP.

Windows 95 (nombre clave: Chicago) es un sistema operativo gráfico híbrido entre 16 y 32 bits. Windows 98 (nombre clave: Memphis) es un sistema operativo gráfico híbrido entre 16 y 32 bits. Windows 98 fue construido sobre el anterior Windows 95, e incluía mejor soporte para estándares de hardware como USB, MMX y AGP. Otras opciones incluyen el sistema de archivos FAT32, soporte para múltiples monitores, soporte para WebTV y la integración de Internet Explorer como componente esencial del sistema. Windows Me (Millennium Edition). Éste sistema operativo está basado en Windows 95 y Windows 98. Principalmente está compuesto por actualizaciones relativamente pequeñas, como Internet Explorer 5.5. Una de los cambios más significativos fue la introducción del reproductor de medios Windows Media Player 7, el cual estaba pensado para competir con RealPlayer, el reproductor de medios dominante en aquel momento. Windows XP (cuyo nombre en clave inicial fue Whistler) Microsoft inicialmente sacó a la venta dos versiones: Home y Professional. La versión Home está destinada al mercado doméstico, mientras que la versión Professional dispone de características adicionales diseñadas para entornos empresariales, como la autenticación por red y el soporte multiprocesador. Las letras "XP" provienen de la palabra experience.

Windows Server 2003 es una versión mejorada del Windows 2000 utilizado en una topología de red Servidor. Existen varias versiones en el mercado, en función del servicio necesitado. Estas versiones son:

Estándar Enterprise Datacenter Web

1.3.2 ARQUITECTURA MACINTOSH

Mac OS X es la última versión de Mac OS, el sistema operativo de la familia de ordenadores Macintosh. Mac OS X fue comercializado por primera vez en el año 2001 y está basado en BSD y Mach microkernel, y proviene directamente de NextStep. Su núcleo se llama Darwin y cualquier persona puede aportar contribuciones encaminadas a mejorar la plataforma. Por ser de tipo Unix, Mac OS X pertenece a la familia de los sistemas operativos multiusuario, y dispone de una interfaz gráfica de usuario GUI denominada Aqua, desarrollada por Apple. Mac OS X Server fue lanzado también en el año 2001 y se diferencia por incorporar diferentes herramientas administrativas para la gestión de redes, y servicios de red como un servidor de correo, Samba server, un servicio de directorio, y un servidor de nombre de dominio. Las versiones que se crearon fueron las siguientes:

Page 12: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 12

Mac OS X v.10.0 (Cheetah)

Mac OS X v.10.1 (Puma)

Mac OS X v.10.2 (Jaguar)

Mac OS X v.10.3 (Panther)

Mac OS X v.10.4 (Tiger)

Mac OS X v.10.5 (Leopard)

1.3.3 UNIX

El inicio del desarrollo de este sistema operativo (que se cree es uno de los más influyentes en la historia de la computación) fue muy particular, pues nadie habría predicho el éxito de UNIX después de su primera encarnación. Las herramientas o comandos más básicos de UNIX son:

Navegación/creación de directorios/archivos: is, cd, pwd, mkdir, rm, rmdir, cp

Edición/visión de archivos: touch, more, ed, vi, emacs.

Procesamiento de textos: echo, cat, grep, sort, uniq, sed, awk, tail, head.

Comparación de archivos: comm, cmp, diff, patch

Administración del sistema: chmod, chown, ps, find, xargs, sd, w, who.

Comunicación: mail, telnet, ssh, ftp, finger.

1.3.4 LINUX El logotipo oficial de Linux es el pingüino Tux Linux es un sistema operativo y un núcleo. Es uno de los paradigmas del desarrollo de software libre (y de código abierto), donde el código fuente está disponible públicamente y cualquier persona puede libremente usarlo, modificarlo y/o redistribuirlo. El término "Linux" estrictamente se refiere al núcleo Linux, pero es más comúnmente utilizado para describir al sistema operativo tipo Unix, que utiliza primordialmente filosofía y metodologías libres, también conocido como GNU/Linux, que está formado mediante la combinación del núcleo Linux con las bibliotecas y herramientas del proyecto GNU y de muchos otros proyectos/grupos de software (libre o no). El núcleo no es parte oficial del proyecto GNU (el cual posee su propio núcleo en desarrollo, llamado Hurd), pero es distribuido bajo los términos de la licencia GPL (GNU General Public License). Una distribución Linux, o distribución GNU/Linux (abreviada con frecuencia diestro) es un conjunto de aplicaciones reunidas por un grupo, empresa o persona para permitir instalar fácilmente un sistema Linux (también llamado GNU/Linux). Existen numerosas distribuciones Linux. Cada una de ellas puede incluir cualquier número de software adicional (libre o no), como algunos que facilitan la instalación del sistema y una enorme variedad de aplicaciones, entre ellos, entornos gráficos, suites ofimáticas, servidores WEB, servidores de correo, servidores FTP, etc.

BIBLIOGRAFIA

http://es.wikipedia.org/wiki/Sistema_operativo http://encyclopedie-es.snyke.com/articles/sistema_operativo.html

Page 13: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 13

1.4 Paquetería de Software

1.4.1PAQUETERÍA DE OFICCE

Microsoft Word es un procesador de textos muy popular creado por Microsoft, integrado en la suite ofimática Microsoft Office. Originalmente desarrollado por Richard Brodie para el ordenador de IBM con el sistema operativo DOS en 1983. Se crearon versiones posteriores Apple Macintosh en 1984 y Microsoft Windows en 1989.

Microsoft Word utiliza un formato nativo cerrado y muy utilizado, comúnmente llamado DOC (utiliza la extensión de archivo.Doc). Por la amplísima difusión del Microsoft Word, este formato se ha convertido en un estándar de facto en el que transferir textos con o sin formato, o hasta imágenes, siendo preferido por muchos usuarios antes que otras opciones como .txt para el texto sin formato o .jpg para gráficos. El uso de este formato es muy criticado por la comunidad del software libre por impedir la portabilidad de un documento DOC a otro formato o a otro programa. Desde esta comunidad se proponen alternativas a este editor, quizás una de las más interesantes sea Writer de la suite libre de OpenOffice.org, con una funcionalidad similar y una compatibilidad muy grande con la mayoría de los documentos en formato de Word.

1.4.2 MODELOS DE BASES DE DATOS

Una de las características fundamentales de los sistemas de bases de datos es que proporcionan cierto nivel de abstracción de datos, al ocultar las características sobre el almacenamiento físico que la mayoría de usuarios no necesita conocer. Los modelos de datos son el instrumento principal para ofrecer dicha abstracción. Un modelo de datos es un conjunto de conceptos que sirven para describir la estructura de una base de datos: los datos, las relaciones entre los datos y las restricciones que deben cumplirse sobre los datos. Los modelos de datos contienen también un conjunto de operaciones básicas para la realización de consultas (lecturas) y actualizaciones de datos. Además, los modelos de datos más modernos incluyen conceptos para especificar comportamiento, permitiendo especificar un conjunto de operaciones definidas por el usuario.

Los modelos de datos se pueden clasificar dependiendo de los tipos de conceptos que ofrecen para describir la estructura de la base de datos. Los modelos de datos de alto nivel, o modelos conceptuales, disponen de conceptos muy cercanos al modo en que la mayoría de los usuarios percibe los datos, mientras que los modelos de datos de bajo nivel, o modelos físicos, proporcionan conceptos que describen los detalles de cómo se almacenan los datos en el ordenador. Los conceptos de los modelos físicos están dirigidos al personal informático, no a los usuarios finales. Entre estos dos extremos se encuentran los modelos lógicos, cuyos conceptos pueden ser entendidos por los usuarios finales, aunque no están demasiado alejados de la forma en que los datos se organizan físicamente. Los modelos lógicos ocultan algunos detalles de cómo se almacenan los datos, pero pueden implementarse de manera directa en un ordenador.

Los modelos conceptuales utilizan conceptos como entidades, atributos y relaciones. Una entidad representa un objeto o concepto del mundo real como, por ejemplo, un empleado de la empresa inmobiliaria o una oficina. Un atributo representa alguna propiedad de interés de una entidad como, por ejemplo, el nombre o el salario del empleado. Una relación describe una interacción entre dos o más entidades, por ejemplo, la relación de trabajo entre un empleado y su oficina.

BIBLIOGRAFIA http://www3.uji.es/~mmarques/f47/apun/node32.html

http://es.wikipedia.org/wiki/Base_de_datos

Page 14: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 14

II. DESARROLLO DE LÓGICA ALGORÍTMICA

2.1 Metodología para la solución de problemas

2.2 Metodología para el diseño de software: Top Down, Bottom up, Modular y

Programación estructurada.

2.3 Definición de lenguajes algorítmicos

2.3.1 Elementos y reglas de la representación grafica y manuscrita de los

algoritmos (diagrama de flujo, diagrama N-S, diagrama estructurado y

pseudocódigo.

2.3.2 Implementación de algoritmos secuenciales (utilizando notación algebraica)

2.4 Pruebas y depuración

Page 15: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 15

PRESENTACIÓN

En este material contiene los objetivos que se deben lograr al finalizar la unidad, el

método de evaluación del aprendizaje y el contenido. En un mundo cambiante de tecnología como se

tiene el día de hoy se hace necesario evaluar y estudiar parte de esa tecnología. Las computadoras,

el hardware, el software, las grandes máquinas que invaden nuestro mundo requieren de un estudio.

Igualmente contiene los temas relacionados con los lenguajes de programación.

Básicamente se presenta la estructura para conocer de donde surge la tecnología que se está

usando. La información en este tema a cambiando a pasos agigantados aun cuando los lenguajes de

programación son menos cambiantes.

Page 16: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 16

2.1 Metodología para la solución de problemas

2.1.1 PASOS PARA LA SOLUCIÓN DE PROBLEMAS Un algoritmo es el conjunto de operaciones y procedimientos que deben seguirse para resolver un problema. La palabra "algoritmo" deriva del nombre latinizado del gran matemático árabe Mohamed Ibn Moussa Al Kow Rizmi.

Diferencia entre el lenguaje algorítmico y el informático. El lenguaje algorítmico es aquel por medio del cual se realiza un análisis previo del problema a resolver y encontrar un método que permita resolverlo. El conjunto de todas las operaciones a realizar, y el orden en el que deben efectuarse, se le denominan algoritmo. El lenguaje informático es aquel por medio del cual dicho algoritmo se codifica a un sistema comprensible por el ordenador o computadora. Este tipo de lenguaje es más cercano a la máquina que al ser humano y podemos distinguir distintos tipos dependiendo de la proximidad a la maquina. Se denomina lenguaje de alto nivel aquel que es más cercano a la comprensión humana y lenguaje de bajo nivel a aquellos que son más comprensibles por la máquina. En concreto, nosotros vamos a estudiar un lenguaje en la frontera de uno de bajo nivel. Es por ello que el 'C' es tan potente y rápido, pues las funciones principales representan las funciones más básicas del ordenador.

Planteamientos de Problemas. Lo que pretende un algoritmo es sintetizar de alguna forma una tarea, cálculo o mecanismo antes de ser transcrito al ordenador. Los pasos que hay que seguir son los siguientes:

- Análisis previo del problema. - Primera visión del método de resolución. - Descomposición en módulos. - (Programación estructurada). - Búsqueda de soluciones parciales. - Ensamblaje de soluciones finales.

La clasificación de los lenguajes algorítmicos puede anunciarse de la siguiente manera: a) Lenguaje natural: Es aquel que describe los pasos a seguir utilizando un vocabulario cotidiano. b) Lenguaje de diagrama de flujo: Es aquel que se vale de diversos símbolos para representar las ideas o acciones a desarrollar. c) Lenguaje natural de programación: Son aquellos que están orientadas a la solución de problema que se defienden de una manera precisa. d) Lenguaje de programación de algoritmos: Es aquel que se utiliza para introducir en la computadora un lenguaje específico.

Page 17: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 17

SIMBOLOS PARA EL DISEÑO DE ALGORITMOS

INICIO / TERMINAL

ENTRADA / LECTURA

PROCESO

DECISIÓN

DICISIÓN MULTIPLE

CONECTAR

IMPRESORA INDICADOR DE DIRECCION

= OPERADORES ARITMÉTICOS

(+, -, *, / )

= OPERADORES RELACIONADOS

( >, <, <, >, =, # )

Page 18: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 18

EJEMPLOS: 1. El maestro de matemáticas desea saber el porcentaje de hombres y mujeres que hay en el grupo

de Ingeniería Industrial.

2. Determinar si un alumno es bueno, regular o malo en base a su promedio el cual se calcula de la

calificación final de tres materias considerando que si el promedio es mayor o igual a 9 el alumno es bueno, si el promedio es menor que 9 y mayor o igual a 7 el alumno es regular y si es menor que 7 el alumno es malo.

3. Determinar el costo de las llamadas telefónicas dependiendo de la zona geográfica en la que se encuentra el usuario y el número de minutos hablados.

CLAVE ZONA PRECIO

12 AMERICA DEL NORTE 2

15 AMERICA DEL SUR 3

18 AMERICA CENTRAL 4

BIBLIOGRAFIA http://www-etsi2.ugr.es/alumnos/mlii/Algoritmo.htm

http://es.wikipedia.org/wiki/Algoritmo

INICIO

HOMBRES MUJERES

TOTAL = HOMBRES + MUJERES

PM = MUJERES/ TOTAL * 100 PH = HOMBRES / TOTAL * 100

PH, PM

FIN

Page 19: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 19

2.2 Metodología para el diseño de software

2.2.1 Top Down El diseño top down consiste en encontrar la solución de un problema mediante la aplicación sistemática de descomposición en subproblemas cada vez más simples (aplicando la máxima de dividir para vencer).

2.2.2 Bottom Up Con el diseño botton-up el sistema es empezar por el final, sabiendo ya como resolver el problema (y que componentes reutilizables tiene ya a su disposición). Desde allí, puede ir trabajando hacia arriba, hasta la solución del problema principal. Los componentes reutilizables, deben de ser tan "modulares" como sea posible. Un modulo es un componente de un sistema mayor, que interactúa con el resto del sistema de una forma simple, perfectamente definida, por medio de mensajes. La idea es que un modulo pueda ser conectado a un sistema. Los detalles de lo que hace internamente el modulo no es importante al conjunto del sistema, mientras que el modulo realice correctamente la labor asignada. Esto es lo que se llama información oculta y es uno de los principios más importantes de la ingeniería de software.

2.2.3 Modular Uno de los métodos más conocidos para resolver un problema es dividirlo en problemas más pequeños, llamados subproblemas. De esta manera, en lugar de resolver una tarea compleja y tediosa, resolvemos otras más sencillas y a partir de ellas llegamos a la solución. Esta técnica se usa mucho en programación ya que programar no es más que resolver problemas, y se le suele llamar diseño descendente, metodología del divide y vencerás o programación top-down. Es evidente que si esta metodología nos lleva a tratar con subproblemas, entonces también tengamos la necesidad de poder crear y trabajar con subprogramas para resolverlos. A estos subprogramas se les suele llamar módulos, de ahí viene el nombre de programación modular. En Pascal disponemos de dos tipos de módulos: los procedimientos y las funciones.

2.2.4 Programación estructurada La programación estructurada está basada en los siguientes puntos: 1. Diseño del programa de lo general a lo particular (top down). 2. Teorema de estructura. Todo programa puede ser diseñado utilizando únicamente las estructuras básicas: Secuencial, Alternativa o Repetitiva.

Un programa, por largo y complejo que sea, se puede diseñar anidando convenientemente en tres estructuras básicas. Esto ayudara mucho a que los programas sean fácilmente leídos por cualquier persona, a que el número de errores en el proceso de programación sea bajo, a que los programas sean autodocumentados y a que puedan mantenerse fácilmente.

BIBLIOGRAFIA http://www.edu.aytolacoruna.es/aula/programacion/pascal/modular.htm

http://www.edu.aytolacoruna.es/aula/programacion/pascal/modular.htm

Page 20: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 20

2.3 Definición de lenguajes algorítmicos

2.3.1 Elementos y reglas de la representación gráfica y manu scrita de los algoritmos Los diagramas de flujo (o flujogramas) son diagramas que emplean símbolos gráficos para representar los pasos o etapas de un proceso. También permiten describir la secuencia de los distintos pasos o etapas y su interacción. Las personas que no están directamente involucradas en los procesos de realización del producto o servicio, tienen imágenes idealizadas de los mismos, que pocas veces coinciden con la realidad. La creación del diagrama de flujo es una actividad que agrega valor, pues el proceso que representa está ahora disponible para ser analizado, no sólo por quienes lo llevan a cabo, sino también por todas las partes interesadas que aportarán nuevas ideas para cambiarlo y mejorarlo. VENTAJAS DE LOS DIAGRAMAS DE FLUJO Favorecen la comprensión del proceso a través de mostrarlo como un dibujo. El cerebro humano reconoce fácilmente los dibujos. Un buen diagrama de flujo reemplaza varias páginas de texto. Permiten identificar los problemas y las oportunidades de mejora del proceso. Se identifican los pasos redundantes, los flujos de los reprocesos, los conflictos de autoridad, las responsabilidades, los cuellos de botella, y los puntos de decisión. Muestran las interfaces cliente-proveedor y las transacciones que en ellas se realizan, facilitando a los empleados el análisis de las mismas. Son una excelente herramienta para capacitar a los nuevos empleados y también a los que desarrollan la tarea, cuando se realizan mejoras en el proceso. DESARROLLO DEL DIAGRAMA DE FLUJO Los pasos a seguir para construir el diagrama de flujo son:

Establecer el alcance del proceso a describir. De esta manera quedará fijado el comienzo y el final del diagrama. Frecuentemente el comienzo es la salida del proceso previo y el final la entrada al proceso siguiente.

Identificar y listar las principales actividades/subprocesos que están incluidos en el proceso a describir y su orden cronológico.

Si el nivel de destalle definido incluye actividades menores, listarlas también.

Identificar y listar los puntos de decisión.

Construir el diagrama respetando la secuencia cronológica y asignando los correspondientes símbolos.

Asignar un título al diagrama y verificar que esté completo y describa con exactitud el proceso elegido.

Page 21: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 21

2.3.2 Implementación de algoritmos secuenciales ESTRUCTURA SECUENCIAL Cuando se quiere indicar que unas determinadas acciones se deben realizar en secuencia, se escriben unas a continuación de otras. Por ejemplo: Leer cantidad, precio Importe = cantidad * precio Imprime importe ESTRUCTURA ALTERNATIVA Si utilizamos una alternativa, es para indicar que según el resultado cierto o falso de una expresión hay que realizar una acción u otra de las dos especificadas. En general, una estructura alternativa se escribe de la siguiente forma: IF expresión THEN Acción del then ELSE Acción del else ENDIF Por ejemplo, para calcular el importe de la venta de un determinado artículo, sabiendo que al comprar entre 1 y 15 unidades del mismo, el descuento es de un 10%, y si la compra es superior a 15 unidades, el descuento será de un 15%, y escribimos: Leer artículo, cantidad, precio unitario Importe= cantidad* precio unitario IF cantidad>0 AND cantidad<16 THEN Importe= importe*0.9 ELSE Importe=importe*0.85 ENDIF Imprimir cantidad, precio unitario, importe Si en el caso anterior simplemente nos dijeran: calcular el importe de la venta de un determinado artículo, sabiendo que al comparar más de 10 unidades del mismo descuento es de un 10%, escrbiríamos: Leer artículo,cantidad,precio unitario Importe=cantidad * precio unitario IF cantidad> 10 THEN Importe= importe*o.9 EDNIF Imprimir cantidad, precio unitario, importe

BIBLIOGRAFIA http://www.estrucplan.com.ar/Producciones/Entrega.asp?identrega=526

Page 22: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 22

La ejecución de una sentencia alternativa se realiza de la forma siguiente: 1. Se evalúa la expresión para ver si es cierta o falsa. 2. Si es cierta, se ejecutan todas las sentencias situadas después de la palabra reservada THEN, y si es falsa, entonces se ejecutan las sentencias que estén después de la palabra reservada ELSE, si es que ésta existe, continuando la ejecución en la siguiente sentencia en secuencia. En los ejemplos expuestos, se puede observar que la condición expresada en la sentencia IF puede ser simple o compuesta. Cuando la condición es simple, sólo hay una expresión, y cuando es compuesta, hay varias expresiones unidas por los operadores lógicos AND (y) y OR (o)

2.4 Pruebas y depuración

2.4.1Pruebas y depuración Una vez que se ha construido o escrito un programa en algún lenguaje de programación, se requiere desarrollar un procedimiento sistemático para establecer si se trata de un programa correcto. Los pasos básicos de tal procedimiento sistemático son los siguientes: Prueba y depuración (demostración). Un buen programador debe pensar en desarrollar un conjunto de casos prueba, junto con su código. Un caso prueba es un conjunto de datos de entrada que junto con el programa produce una salida conocida de antemano, con los cuales se puede evaluar la funcionalidad y correcto del programa. Si el programa pasa todos los casos prueba, entonces podemos considerar que el programa es correcto.

EJERCICIO Determinar el tipo de compra que un cliente realizo, si la opción es:

1- abarrotes: aplica el 15% de IVA a su compra 2- materiales: aplica el 10 % de IVA a su compra 3- perfumería: aplica el 8% de IVA a su compra 4- farmacia: aplica el 5% de IVA a su compra

Determinar el tipo de compra ( si una cantidad par o impar) mandar a pantalla el sig. texto: subtot-iva a pag- tot comp- tipo com.

BIBLIOGRAFIA http://www.fisica.uson.mx/carlos/Nirvana/CComp/cursos/CC11/lecture7.html

Page 23: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 23

III. CONOCIMIENTO DE PROGRAMACIÓN Y UN

LENGUAJE ESTRUCTURADO

3.1 Introducción a la programación

3.1.1 Definición de programa

3.1.2 Definición de programación

3.1.3 Definición de lenguaje de programación

3.2 Introducción y orígenes del lenguaje

3.3 Estructura básica de un programa

3.4 Datos

3.4.1 Tipos de datos

3.4.2 Identificadores

3.4.3 Almacenamiento, direccionamiento y representación en memoria.

3.4.4 Proposición de asignación.

3.5 Operadores, operandos y expresiones

3.5.1 Prioridad de operadores, evaluación de expresiones

3.6 Proceso de creación de un ejecutable.

Page 24: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 24

PRESENTACIÓN

Este material contiene los objetivos que se deben lograr al finalizar la unidad, el método de

evaluación del aprendizaje y el contenido. En un mundo cambiante de tecnología como se tiene el día

de hoy se hace necesario evaluar y estudiar parte de esa tecnología. Las computadoras, el hardware,

el software, las grandes máquinas que invaden nuestro mundo requieren de un estudio.

Igualmente contiene los temas relacionados con los lenguajes de programación. Básicamente se

presenta la estructura para conocer de donde surge la tecnología que se está usando. La información

en este tema a cambiando a pasos agigantados aun cuando los lenguajes de programación son

menos cambiantes.

Page 25: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 25

3.1 Introducción a la programación

3.1.1Definición de programa Un conjunto de órdenes para un ordenador. Un programa puede estar formado por apenas unas pocas órdenes (por ejemplo, uno que sume dos números) o por varios miles de órdenes (como un programa de gestión completo para una empresa). Cuando se trata de un programa ya terminado que se compra, se suele hablar de una Aplicación Informática. Los programas se deben escribir en un cierto lenguaje de programación. Los lenguajes de programación que se acercan más al lenguaje humano que al del ordenador reciben el nombre de "lenguajes de alto nivel" (como Pascal); los que se acercan más al ordenador.

3.1.2 Definición de programa Programación es el acto de crear un programa de computadora, un conjunto concreto de instrucciones que una computadora puede ejecutar. El programa se escribe en un lenguaje de programación, aunque también se pueda escribir directamente en lenguaje de máquina, con cierta dificultad. Un programa se puede dividir en diversas partes, que pueden estar escritas en lenguajes distintos. La programación estructurada es una teoría de programación que consiste en construir programas de fácil comprensión. La programación estructurada es especialmente útil, cuando se necesitan realizar correcciones o modificaciones después de haber concluido un programa o aplicación. Al haberse utilizado la programación estructurada, es mucho más sencillo entender la codificación del programa, que se habrá hecho en diferentes secciones. La programación estructurada se basa en una metodología de desarrollo de programas llamada refinamiento sucesivo: Se plantea una operación como un todo y se divide en segmentos más sencillos o de menor complejidad. Una vez terminado todos los segmentos del programa, se procede a unificar las aplicaciones realizadas por el pool de programadores. Si se ha utilizado adecuadamente la programación estructurada, esta integración debe ser sencilla y no presentar problemas al integrar la misma, y de presentar algún problema, será rápidamente detectable para su corrección. La representación grafica de la programación estructurada se realiza a través de diagramas de flujo o flow chart, el cual representa el programa con sus entradas, procesos y salidas. La programación estructurada propone segregar los procesos en estructuras lo más simple posibles, las cuales se conocen como secuencia, selección e interacción. Ellas están disponibles en todos los lenguajes modernos de programación imperativa en forma de sentencias. Combinando esquemas sencillos se pueden llegar a construir sistemas amplios y complejos pero de fácil entendimiento.

3.1.3 Definición de Lenguaje de programación. C es un lenguaje de programación de propósito general que ofrece economía sintáctica, control de flujo y estructuras sencillas y un buen conjunto de operadores. No es un lenguaje de muy alto nivel y más bien un lenguaje pequeño, sencillo y no está especializado en ningún tipo de aplicación. Esto lo hace un lenguaje potente, con un campo de aplicación ilimitado y sobre todo, se aprende rápidamente. En poco tiempo, un programador puede utilizar la totalidad del lenguaje.

Page 26: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 26

Este lenguaje ha sido estrechamente ligado al sistema operativo UNIX, puesto que fueron desarrollados conjuntamente. Sin embargo, este lenguaje no está ligado a ningún sistema operativo ni a ninguna máquina concreta. Se le suele llamar lenguaje de programación de sistemas debido a su utilidad para escribir compiladores y sistemas operativos, aunque de igual forma se puede desarrollar cualquier tipo de aplicación. La base del C proviene del BCPL, escrito por Martin Richards, y del B escrito por Ken Thompson en 1970 para el primer sistema UNIX en un DEC PDP-7. Estos son lenguajes sin tipos, al contrario que el C que proporciona varios tipos de datos. Los tipos que ofrece son caracteres, números enteros y en coma flotante, de varios tamaños. Además se pueden crear tipos derivados mediante la utilización de punteros, vectores, registros y uniones. El primer compilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 y escribió el propio sistema operativo en Introducción al lenguaje C (2). La base del C proviene del BCPL, escrito por Martin Richards, y del B escrito por Ken Thompson en 1970 para el primer sistema UNIX en un DEC PDP-7. Estos son lenguajes sin tipos, al contrario que el C que proporciona varios tipos de datos. Los tipos que ofrece son caracteres, números enteros y en coma flotante, de varios tamaños. Además se pueden crear tipos derivados mediante la utilización de punteros, vectores, registros y uniones. El primer compilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 y escribió el propio sistema operativo en C. C trabaja con tipos de datos que son directamente tratables por el hardware de la mayoría de computadoras actuales, como son los caracteres, números y direcciones. Estos tipos de datos pueden ser manipulados por las operaciones aritméticas que proporcionan las computadoras. No proporciona mecanismos para tratar tipos de datos que no sean los básicos, debiendo ser el programador el que los desarrolle. Esto permite que el código generado sea muy eficiente y de ahí el éxito que ha tenido como lenguaje de desarrollo de sistemas. No proporciona otros mecanismos de almacenamiento de datos que no sea el estático y no proporciona mecanismos de entrada ni salida. Ello permite que el lenguaje sea reducido y los compiladores de fácil implementación en distintos sistemas. Por contra, estas carencias se compensan mediante la inclusión de funciones de librería para realizar todas estas tareas, que normalmente dependen del sistema operativo. Originariamente, el manual de referencia del lenguaje para el gran público fue el libro de Kernighan y Ritchie, escrito en 1977. Es un libro que explica y justifica totalmente el desarrollo de aplicaciones en C, aunque en él se utilizaban construcciones, en la definición de funciones, que podían provocar confusión y errores de programación que no eran detectados por el compilador. Como los tiempos cambian y las necesidades también, en 1983 ANSI establece el comité X3J11 para que desarrolle una definición moderna y comprensible del C. El estándar está basado en el manual de referencia original de 1972 y se desarrolla con el mismo espíritu de sus creadores originales. La primera versión de estándar se publicó en 1988 y actualmente todos los compiladores utilizan la nueva definición. Una aportación muy importante de ANSI consiste en la definición de un conjunto de librerías que acompañan al compilador y de las funciones contenidas en ellas. Muchas de las operaciones comunes con el sistema operativo se realizan a través de estas funciones. Una colección de ficheros de encabezamiento, headers, en los que se definen los tipos de datos y funciones incluidas en cada librería. Los programas que utilizan estas bibliotecas para interactuar con el sistema operativo obtendrán un comportamiento equivalente en otro sistema.

BIBLIOGRAFIA www.ctisa.com/diccionario.htm

es.wikipedia.org/wiki/Programaci%C3%B3n

Page 27: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 27

3.2 Introducción y orígenes del lenguaje

PROGRAMACIÓN ORIENTADA A OBJETOS La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real que otros tipos de programación. Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de programación. Motivación Durante años, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvían una y otra vez los mismos problemas. Para conseguir que los esfuerzos de los programadores puedan ser utilizados por otras personas se creó la POO. Que es una serie de normas de realizar las cosas de manera que otras personas puedan utilizarlas y adelantar su trabajo, de manera que consigamos que el código se pueda reutilizar. La POO no es difícil, pero es una manera especial de pensar, a veces subjetiva de quien la programa, de manera que la forma de hacer las cosas puede ser diferente según el programador. Aunque podamos hacer los programas de formas distintas, no todas ellas son correctas, lo difícil no es programar orientado a objetos sino programar bien. Programar bien es importante porque así nos podemos aprovechar de todas las ventajas de la POO. Cómo se piensa en objetos Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Por ejemplo vamos a pensar en un coche para tratar de modelizarlo en un esquema de POO. Diríamos que el coche es el elemento principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar. Pues en un esquema POO el coche sería el objeto, las propiedades serían las características como el color o el modelo y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar. Por poner otro ejemplo vamos a ver cómo modelizaríamos en un esquema POO una fracción, es decir, esa estructura matemática que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2. La fracción será el objeto y tendrá dos propiedades, el numerador y el denominador. Luego podría tener varios métodos como simplificarse, sumarse con otra fracción o número, restarse con otra fracción, etc. Estos objetos se podrán utilizar en los programas, por ejemplo en un programa de matemáticas harás uso de objetos fracción y en un programa que gestione un taller de coches utilizarás objetos coche. Los programas Orientados a objetos utilizan muchos objetos para realizar las acciones que se desean realizar y ellos mismos también son objetos. Es decir, el taller de coches será un objeto que utilizará objetos coche, herramienta, mecánico, recambios, etc.

Page 28: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 28

PROGRAMACIÓN ESTRUCTURADA La programación estructurada es una teoría de programación que consiste en construir programas de fácil comprensión. La programación estructurada es especialmente útil, cuando se necesitan realizar correcciones o modificaciones después de haber concluido un programa o aplicación. Al haberse utilizado la programación estructurada, es mucho más sencillo entender la codificación del programa, que se habrá hecho en diferentes secciones. La programación estructurada se basa en una metodología de desarrollo de programas llamada refinamiento sucesivo: Se plantea una operación como un todo y se divide en segmentos más sencillos o de menor complejidad. Una vez terminado todos los segmentos del programa, se procede a unificar las aplicaciones realizadas por el pool de programadores. Si se ha utilizado adecuadamente la programación estructurada, esta integración debe ser sencilla y no presentar problemas al integrar la misma, y de presentar algún problema, será rápidamente detectable para su corrección. La representación grafica de la programación estructurada se realiza a través de diagramas de flujo o flow chart, el cual representa el programa con sus entradas, procesos y salidas. La programación estructurada propone segregar los procesos en estructuras lo más simple posibles, las cuales se conocen como secuencia, selección e interacción. Ellas están disponibles en todos los lenguajes modernos de programación imperativa en forma de sentencias. Combinando esquemas sencillos se pueden llegar a construir sistemas amplios y complejos pero de fácil entendimiento. Programación Lineal En programación lineal se habla de términos tales como restricciones, que vienen a ser la manipulación del tamaño de funciones que se encuentran sujetas a ciertas limitaciones. Podemos decir que la programación lineal es el conjunto de técnicas matemáticas que intentan resolver la maximización o minimización de una función objetivo, función lineal de varias variables, sujeta a ciertas restricciones, expresadas por inecuaciones lineales. En problemas de programación lineal intervienen: La función f(x,y) = ax + by + c conocida también como función objetivo (a la cual deberemos optimizar). Aquí x e y son las variables de decisión, mientras que a, b y c son constantes. Las restricciones que deben ser inecuaciones lineales, donde su número depende del problema en que trabajemos. También ver que el carácter de desigualdad viene impuesto por las limitaciones, que son: inferiores a... ( menores: < o ); como mínimo de ... (mayores: > o ) . Maximizando o minimizando, las desigualdades pueden darse en cualquiera de los dos sentidos. Valores de x e y que verifican todas y cada una de las restricciones, lo que se conoce como conjunto o región factible. La solución óptima del problema será un par de valores (x0, y0) del conjunto factible que haga que f(x,y) tome el valor máximo o mínimo. Se utilizan las siglas PPL para indicar problema de programación lineal.

Page 29: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 29

Características del lenguaje C El lenguaje C es uno de los más rápidos y potentes que hay hoy en día. Algunos dicen que está desfasado y que el futuro es Java. No sé si tendrá futuro pero está claro que presente si tiene. No hay más que decir que el sistema operativo Linux está desarrollado en C en su práctica totalidad. Así que creo que no sólo no perdemos nada aprendiéndolo sino que ganamos mucho. Para empezar nos servirá como base para aprender C++ e introducirnos en el mundo de la programación Windows. Si optamos por Linux existe una biblioteca llamada gtk (o librería, como prefieras) que permite desarrollas aplicaciones estilo Windows con C. No debemos confundir C con C++, que no son lo mismo. Se podría decir que C++ es una extensión de C. Para empezar en C++ conviene tener una sólida base de C. Existen otros lenguajes como Visual Basic que son muy sencillos de aprender y de utilizar. Nos dan casi todo hecho. Pero cuando queremos hacer algo complicado o que sea rápido debemos recurrir a otros lenguajes (c++, delphi,...). Peculiaridades de C Una de las cosas importantes de C que debes recordar es que es Case Sensitive (sensible a las mayúsculas o algo así). Es decir que para C no es lo mismo escribir Printf que printf. Conviene indicar también que las instrucciones se separan por ";". Compiladores de C Un compilador es un programa que convierte nuestro código fuente en un programa ejecutable (Me imagino que la mayoría ya lo sabe, pero más vale asegurar). El ordenador trabaja con 0 y 1. Si escribiéramos un programa en el lenguaje del ordenador nos volveríamos locos. Para eso están lenguajes como el C. Nos permiten escribir un programa de manera que sea fácil entenderlo por una persona. Luego es el compilador el que se encarga de convertirlo al complicado idioma de un ordenador. En la práctica a la hora de crear un programa nosotros escribimos el código fuente, en nuestro caso en C, que normalmente será un fichero de texto normal y corriente que contiene las instrucciones de nuestro programa. Luego se lo pasamos al compilador y este se encarga de convertirlo en un programa. Siguiendo la filosofía de mi página los compiladores que usaremos serán gratuitos. Yo recomiendo usar el DJGPP para MS-Dos y el GNU C para Linux. Ambos son compiladores de línea de comando así que necesitaremos también un editor para crear nuestros programas. La solución más simple en MS-Dos puede ser usar el edit, en Windows el notepad. Pero no son más que editores sin ninguna otra funcionalidad. Otra posibilidad es un entorno de desarrollo llamado RHIDE, un programa muy útil que automatiza muchas de las tareas del programador (del estilo del Turbo C y Turbo Pascal). Si queremos una herramienta muy avanzada podemos usar Emacs, que es un editor muy potente, aunque para algunos puede parecer muy complicado (valientes y a por ello). Estos dos programas están disponibles tanto en Linux como en MS-Dos. El primer programa: Hola Mundo En un alarde de originalidad vamos a hacer nuestro primer programa: hola mundo. Nadie puede llegar muy lejos en el mundo de la programación sin haber empezado su carrera con este original y funcional programa. Allá va:

Page 30: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 30

#include <stdio.h> int main() { /* Aquí va el cuerpo del programa */ printf( "Hola mundo\n" ); /* Esto imprime hola mundo en pantalla */ return 0; } Comprobado con DJGPP ¿Qué fácil eh? Este programa lo único que hace es sacar por pantalla el mensaje:

Hola mundo Vamos ahora a comentar el programa línea por línea (Esto no va a ser más que una primera aproximación).

#include <stdio.h> #include es lo que se llama una directiva. Sirve para indicar al compilador que incluya otro archivo. Cuando en compilador se encuentra con esta directiva la sustituye por el archivo indicado. En este caso es el archivo stdio.h que es donde está definida la función printf, que veremos luego.

int main() Es la función principal del programa. Todos los programas de C deben tener una función llamada main. Es la que primero se ejecuta. El int (entero) que tiene al principio significa que cuando la función main acabe devolverá un número entero. Este valor se suele usar para saber cómo ha terminado el programa. Normalmente este valor será 0 si todo ha ido bien, o un valor distinto si se ha producido algún error (pero esto lo decidimos nosotros, ya lo veremos). De esta forma si nuestro programa se ejecuta desde otro el programa 'padre' sabe cómo ha finalizado, si ha habido errores o no. Se puede usar la definición 'void main()', que no necesita devolver ningún valor, pero se recomienda la forma con 'int' que es más correcta. A lo largo de este curso verás muchos ejemplos que uso 'void main' y falta el return 0; del final, el código funciona correctamente pero puede dar un 'warning' al compilar. En estos momentos estoy intentando corregir esto, pido perdón por las molestias.

{ Son las llaves que indican el comienzo de una función, en este caso la función main.

/* Aquí va el cuerpo del programa */ Esto es un comentario, no se ejecuta. Sirve para describir el programa. Conviene acostumbrarse a comentar los programas. Un comentario puede ocupar más de una línea. Por ejemplo el comentario:

/* Este es un comentario que ocupa dos filas */

es perfectamente válido. printf( "Hola mundo\n" );

Aquí es donde por fin el programa hace algo que podemos ver al ejecutarlo. La función printf muestra un mensaje por la pantalla. Al final del mensaje "Hola mundo" aparece el símbolo '\n'; este hace que después de imprimir el mensaje se pase a la línea siguiente. Fíjate en el ";" del final. Es la forma que se usa en C para separar una instrucción de otra. Se pueden poner varias en la misma línea siempre que se separen por el punto y coma.

return 0; Como he indicado antes el programa al finalizar develve un valor entero. Como en este programa no se pueden producir errores (nunca digas nunca jamás) la salida siempre será 0. La forma de hacer que el programa devuelva un 0 es usando return. Esta línea significa 'finaliza la función main haz que devuelva un 0.

} ...y cerramos llaves con lo que termina el programa. Todos los programas finalizan cuando se llega al final de la función main.

Page 31: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 31

¿Cómo se hace? Primero debemos crear el código fuente del programa. Para nuestro primer programa el código fuente es el del listado anterior. Arranca tu compilador de C, sea cual sea. Crea un nuevo fichero y copia el código anterior. Llámalo por ejemplo primero.c. Ahora, tenemos que compilar el programa para crear el ejecutable. Si tu compilador es de windows, o con menús busca una opción llamada "compile", o make, build o algo así. Si estamos usando DJGPP (ver información sobre instalación y uso de DJGPP): tenemos que llamarlo desde la línea de comando:

gcc -c primero.c -o primero.exe Si usamos Rhide basta con hacer CTRL-F9. Nota adicional sobre los comentarios Los comentarios se pueden poner casi en cualquier parte. Excepto en medio de una instrucción. Por ejemplo lo siguiente no es válido:

pri/* Esto es un comentario */ntf( "Hola mundo" ); GARRAFAL No podemos cortar a printf por en medio, tendríamos un error al compilar. Lo siguiente no daría error (al menos usando DJGPP), pero es una fea costumbre:

printf( /* Esto es un comentario */ "Hola mundo" ); Y por último tenemos:

printf( "Hola/* Esto es un comentario */ mundo" ); Que no daría error, pero al ejecutar tendríamos:

Hola /* Esto es un comentario */ mundo porque /* Esto es un comentario */ queda dentro de las comillas y C lo interpreta como texto, no como un comentario. ¿Qué sabemos hacer? Pues la verdad es que todavía no hemos aprendido mucho. Lo único que podemos hacer es compilar nuestros programas. Pero paciencia, en seguida avanzaremos. Ejercicios Busca los errores en este programa: int main() { /* Aquí va el cuerpo del programa */ Printf( "Hola mundo\n" ); return 0; } Solución: Si lo compilamos posiblemente obtendremos un error que nos indicará que no hemos definido la función 'Printf'. Esto es porque no hemos incluído la dichosa directiva '#include <stdio.h>'. (En algunos compiladores no es necesario incluir esta directiva, pero es una buena costumbre hacerlo). Si lo corregimos y volvemos a compilar obtendremos un nuevo error. Otra vez nos dice que desconoce 'Printf'. Esta vez el problema es el de las mayúsculas que hemos indicado antes. Lo correcto es poner 'printf' con minúsculas. Parece una tontería, pero seguro que nos da más de un problema.

BIBLIOGRAFIA http://lenguajes-de-programacion.com/programacion-estructurada.shtml

Page 32: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 32

3.3 Estructura básica de un programa

La mejor forma de aprender un lenguaje es programando con él. El programa más sencillo que se puede escribir en C es el siguiente:

main( ) {

} Como nos podemos imaginar, este programa no hace nada, pero contiene la parte más importante de cualquier programa C y además, es el más pequeño que se puede escribir y que se compile correctamente. En él se define la función main, que es la que ejecuta el sistema operativo al llamar a un programa C. El nombre de una función C siempre va seguida de paréntesis, tanto si tiene argumentos como si no. La definición de la función está formada por un bloque de sentencias, que está encerrado entre llaves {}. Un programa algo más complicado es el siguiente: #include <stdio.h> main( ) { printf("Hola amigos!\n"); } Con el visualizamos el mensaje Hola amigos! en el terminal. En la primera línea indica que se tengan en cuenta las funciones y tipos definidos en la librería stdio (standard input/output). Estas definiciones se encuentran en el fichero header stdio.h. Ahora, en la función main se incluye una única sentencia que llama a la función printf. Esta toma como argumento una cadena de caracteres, que se imprimen van encerradas entre dobles comillas " ". El símbolo \n indica un cambio de línea. Hay un grupo de símbolos, que son tratados como caracteres individuales, que especifican algunos caracteres especiales del código ASCII. Los más importantes son: \a Alerta \b Espacio atrás \f Salto de página \n Salto de línea \r Retorno de carro \t Tabulación horizontal \v Tabulación vertical \\ Barra invertida \' Comilla simple \" Comillas dobles \OOO Visualiza un carácter cuyo código ASCII es OOO en octal \xHHH Visualiza un carácter cuyo código ASCII es HHH en hexadecimal Un programa C puede estar formado por diferentes módulos o fuentes. Es conveniente mantener las fuentes de un tamaño no muy grande, para que la compilación sea rápida. También, al dividirse un programa en partes, puede facilitar la legibilidad del programa y su estructuración. Las diferentes fuentes son compiladas de forma separada, únicamente las fuentes que han sido modificados desde la última compilación, y después combinados con las librerías necesarias para formar el programa en su versión ejecutable.

BIBLIOGRAFIA http://lenguajes-de-programacion.com/programacion-estructurada.shtml

Page 33: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 33

3.4 Datos

3.4.1 Tipos de datos Cuando usamos un programa es muy importante manejar datos. En C podemos almacenar los datos en variables. El contenido de las variables se puede ver o cambiar en cualquier momento. Estas variables pueden ser de distintos tipos dependiendo del tipo de dato que queramos meter. No es lo mismo guardar un nombre que un número. Hay que recordar también que la memoria del ordenador es limitada, así que cuando guardamos un dato, debemos usar sólo la memoria necesaria. Por ejemplo si queremos almacenar el número 400 usaremos una variable tipo int (la estudiamos más abajo) que ocupa sólo 16 bits, y no una de tipo long que ocupa 32 bits. Si tenemos un ordenador con 32Mb de Ram parece una tontería ponernos a ahorrar bits (1Mb=1024Kb, 1Kb=1024bytes, 1byte=8bits), pero si tenemos un programa que maneja muchos datos puede no ser una cantidad despreciable. Además ahorrar memoria es una buena costumbre. A las variables no se les puede dar cualquier nombre. No se pueden poner más que letras de la 'a' a la 'z' (la ñ no vale), números y el símbolo '_'. No se pueden poner signos de admiración, ni de interrogación... El nombre de una variable puede contener números, pero su primer carácter no puede serlo. Ejemplos de nombres válidos: camiones numero buffer a1 j10hola29 num_alumnos Ejemplos de nombres no válidos: 1abc nombre? num/alumnos Tampoco valen como nombres de variable las palabras reservadas que usa el compilador. Por ejemplo: for, main, do, while. Por último es interesante señalar que el C distingue entre mayúsculas y minúsculas. Por lo tanto: Nombre nombre NOMBRE serían tres variables distintas. El tipo Int En una variable de este tipo se almacenan números enteros (sin decimales). El rango de valores que admite es -32767 a 32767. Cuando definimos una variable lo que estamos haciendo es decirle al compilador que nos reserve una zona de la memoria para almacenar datos de tipo int. Para guardarla necesitaremos 16 bits de la memoria del ordenador (216=32767). Para poder usar una variable primero hay que declararla (definirla). Hay que decirle al compilador que queremos crear una variable y hay que indicarle de qué tipo. Por ejemplo: int numero; esto hace que declaremos una variable llamada número que va a contener un número entero. ¿Pero dónde se declaran las variables? Tenemos dos posibilidades, una es declararla como global y otra como local. Por ahora vamos a decir

Page 34: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 34

que global es aquella variable que se declara fuera de la función main y local la que se declara dentro: La diferencia práctica es que las variables globales se pueden usar en cualquier procedimiento. Las variables locales sólo pueden usarse en el procedimiento en el que se declaran. Como por ahora sólo tenemos el procedimiento (o función, o rutina, o subrutina, como prefieras) main esto no debe preocuparnos mucho por ahora. Cuando estudiemos cómo hacer un programa con más funciones aparte de main volveremos sobre el tema. Sin embargo debes saber que es buena costumbre usar variables locales que globales. Ya veremos por qué. Podemos declarar más de una variable en una sola línea: int x, y; Mostrar variables por pantalla Vamos a ir u poco más allá con la función printf. Supongamos que queremos mostrar el contenido de la variable x por pantalla: printf( "%i", x ); Suponiendo que x valga 10 (x=10) en la pantalla tendríamos: 10 Empieza a complicarse un poco ¿no? Vamos poco a poco. ¿Recuerdas el símbolo "\" que usábamos para sacar ciertos caracteres? Bueno, pues el uso del "%" es parecido. "%i" no se muestra por pantalla, se sustituye por el valor de la variable que va detrás de las comillas. ( %i, de integer=entero en inglés). Para ver el contenido de dos variables, por ejemplo x e y, podemos hacer: printf( "%i ", x ); printf( "%i", y ); resultado (suponiendo x=10, y=20): 10 20 Pero hay otra forma mejor: printf( "%i %i", x, y ); ... y así podemos poner el número de variables que queramos. Obtenemos el mismo resultado con menos trabajo. No olvidemos que por cada variable hay que poner un %i dentro de las comillas. También podemos mezclar texto con enteros: printf( "El valor de x es %i, ¡qué bien!\n", x ); Que quedará como: El valor de x es 10, ¡qué bien! Como vemos %i al imprimir se sustituye por el valor de la variable. Asignar valores a variables de tipo int La asignación de valores es tan sencilla como: x = 10; También se puede dar un valor inicial a la variable cuando se define: int x = 15; También se pueden inicializar varias variables en una sola línea: int x = 15, y = 20;

Page 35: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 35

Hay que tener cuidado con lo siguiente: int x, y = 20; Podríamos pensar que x e y son igual a 20, pero no es así. La variable x está sin valor inicial y la variable 'y' tiene el valor 20. Veamos un ejemplo para resumir todo: #include <stdio.h> void main() { int x = 10; prinft( "El valor inicial de x es %i\n", x ); x = 50; printf( "Ahora el valor es %i\n", x ); } Cuya salida será: El valor inicial de x es 10 Ahora el valor es 50 Importante! Si imprimimos una variable a la que no hemos dado ningún valor no obtendremos ningún error al compilar pero la variable tendrá un valor cualquiera. Prueba el ejemplo anterior quitando int x = 10; El tipo Char Las variables de tipo char sirven para almacenar caracteres. Los caracteres se almacenan en realidad como números del 0 al 255. Los 128 primeros (0 a 127) son el ASCII estándar. El resto es el ASCII extendido y depende del idioma y del ordenador. Consulta la tabla ASCII en el anexo. Para declarar una variable de tipo char hacemos: char letra; En una variable char sólo podemos almacenar solo una letra, no podemos almacenar ni frases ni palabras. Eso lo veremos más adelante (strings, cadenas). Para almacenar un dato en una variable char tenemos dos posibilidades: letra = 'A'; o letra = 65; En ambos casos se almacena la letra 'A' en la variable. Esto es así porque el código ASCII de la letra 'A' es el 65. Para imprimir un char usamos el símbolo %c (c de character=caracter en inglés): letra = 'A'; printf( "La letra es: %c.", letra ); Resultado: La letra es A. También podemos imprimir el valor ASCII de la variable usando %i en vez de %c: letra = 'A'; printf( "El número ASCII de la letra %c es: %i.", letra, letra );

Page 36: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 36

Resultado: El código ASCII de la letra A es 65. Como vemos la única diferencia para obtener uno u otro es el modificador (%c ó %i) que usemos. Las variables tipo char se pueden usar (y de hecho se usan mucho) para almacenar enteros. Si necesitamos un número pequeño (entre -127 y 127) podemos usar una variable char (8bits) en vez de una int (16bits), con el consiguiente ahorro de memoria. Todo lo demás dicho para los datos de tipo int se aplica también a los de tipo char . Una curiosidad: letra = 'A'; printf( "La letra es: %c y su valor ASCII es: %i\n", letra, letra ); letra = letra + 1; printf( "Ahora es: %c y su valor ASCII es: %i\n", letra, letra ); En este ejemplo letra comienza con el valor 'A', que es el código ASCII 65. Al sumarle 1 pasa a tener el valor 66, que equivale a la letra 'B' (código ASCII 66). La salida de este ejemplo sería: La letra es A y su valor ASCII es 65 Ahora es B y su valor ASCII es 66 El modificador Unsigned Este modificador (que significa sin signo) modifica el rango de valores que puede contener una variable. Sólo admite valores positivos. Si hacemos: unsigned char variable; Esta variable en vez de tener un rango de -128 a 128 pasa a tener un rango de 0 a 255. El tipo Float En este tipo de variable podemos almacenar números decimales, no sólo enteros como en los anteriores. El rango de posibles valores es del 3,4E-38 al 3,4E38. Declaración de una variable de tipo float: float numero; Para imprimir valores tipo float Usamos %f. float num=4060.80; printf( "El valor de num es : %f", num ); Resultado: El valor de num es: 4060.80 Si queremos escribirlo en notación exponencial usamos %e: float num = 4060.80; printf( "El valor de num es: %e", num ); Que da como resultado: El valor de num es: 4.06080e003

Page 37: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 37

El tipo Double En las variables tipo double se almacenan números reales del 1,7E-307 al 1,7E308. Se declaran como double: double numero; Para imprimir se usan los mismos modificadores que en float. Cómo calcular el máximo valor que admite un tipo de datos Lo primero que tenemos que conocer es el tamaño en bytes de ese tipo de dato. Vamos a ver un ejemplo con el tipo INT. Hagamos el siguiente programa: #include <stdio.h> void main() { int num1; printf( "El tipo int ocupa %i bytes\n", sizeof(int) ); } Comprobado con DJGPP En mi ordenador el resultado es: El tipo int ocupa 4 bytes. Como sabemos 1byte = 8bits. Por lo tanto el tipo int ocupa 4*8=32 bits. Ahora para calcular el máximo número debemos elevar 2 al número de bits obtenido. En nuestro ejemplo: 2^32=4.294.967.296. Es decir en un int se podría almacenar un número entre 0 y 4.294.967.296. Sin embargo esto sólo es cierto si usamos un tipo unsigned (sin signo, se hace añadiendo la palabra unsigned antes de int). Para los tipos normales tenemos que almacenar números positivos y negativos. Así que de los 4.294.967.296 posibles números la mitad serán positivos y la mitad negativos. Por lo tanto tenemos que dividir el número anterior entre 2 = 2.147.483.648. Como el 0 se considera positivo el rango de números posibles que se pueden almacenar en un int sería: -2.147.483.648 a 2.147.483.647. Resumen: 1) Obtenemos el número de bytes. 2) Multiplicamos por ocho (ya lo tenemos en bits). 3) Elevamos 2 al número de bits. 4) Dividimos entre 2. Overflow: Qué pasa cuando nos saltamos el rango El overflow es lo que se produce cuando intentamos almacenar en una variable un número mayor del máximo permitido. El comportamiento es distinto para variables de números enteros y para variables de números en coma flotante. Con números enteros En mi ordenador y usando DJGPP bajo Dos el tamaño del tipo int es de 4bytes(4*8=32bits). El número máximo que se puede almacenar en una variable tipo int es por tanto 2.147.483.647 (ver apartado anterior). Si nos pasamos de este número el que se guardará será el siguiente pero empezando desde el otro extremo, es decir, el -2.147.483.648. El compilador seguramente nos dará un aviso (warning) de que nos hemos pasado. #include <stdio.h>

Page 38: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 38

void main() { int num1; num1 = 2147483648; printf( "El valor de num1 es: %i\n", num1 ); } Comprobado con DJGPP El resultado que obtenemos es: El valor de num1 es: -2147483648 Comprueba si quieres que con el número anterior (2.147.483.647) no pasa nada. Con números en coma flotante El comportamiento con números en coma flotante es distinto. Dependiendo del ordenador si nos pasamos del rango al ejecutar un programa se puede producir un error y detenerse la ejecución. Con estos números también existe otro error que es el underflow. Este error se produce cuando almacenamos un número demasiado pequeño (3,4E-38 en float). Resumen de los tipos de datos en C Esto es algo orientativo, depende del sistema. Tipo Datos almacenados Nº de Bits Valores posibles (Rango) Rango usando unsigned char Caracteres 8 -128 a 128 0 a 255 int enteros 16 -32.767 a 32.767 0 a 65.535 long enteros largos 32 -2.147.483.647 a 2.147.483.647 0 a 4.294.967.295 float Nums. reales (coma flotante) 32 3,4E-38 a 3,4E38 double Nums. reales (coma flotante doble) 64 1,7E-307 a 1,7E308 Esto no siempre es cierto, depende del ordenador y del compilador. Para saber en nuestro caso qué tamaño tienen nuestros tipos de datos debemos hacer lo siguiente. Ejemplo para int: #include <stdio.h> void main() { printf( "Tamaño (en bits) de int = %i\n", sizeof( int )*8 ); } Ya veremos más tarde lo que significa sizeof. Por ahora basta con saber que nos dice cual es el tamaño de una variable o un tipo de dato. Ejercicios Ejercicio 1. Busque los errores: #include <stdio.h> void main() { int número; número = 2; }

Page 39: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 39

Solución: Los nombres de variables no pueden llevar acentos, luego al compilar número dará error. #include <stdio.h> void main() { int numero; numero = 2; printf( "El valor es %i" Numero ); }

3.4.2 Identificadores Son los nombres elegidos para las variables, constantes, funciones, clases y similares. El primer carácter debe ser una letra o un subrayado. El resto del nombre puede contener dígitos. Los identificadores que comienzan con dos subrayados están reservados para uso interno del compilador C++.

3.4.3 Almacenamiento, direccionamiento y representación en memoria. La configuración de los platos de discos, cabezales y brazos de acceso hace posible posicionar el cabezal sobre cualquier parte de cualquier superficie de cualquier plato en el dispositivo de almacenamiento. Sin embargo, esto no es suficiente; para utilizar esta capacidad de almacenamiento, debemos tener algún método de dar direcciones a partes uniformes del almacenamiento disponible. Hay un aspecto final requerido de este proceso. Considere todas las pistas en los muchos cilindros presentes en un dispositivo típico de almacenamiento masivo. Puesto que las pistas tienen diámetros variados, sus circunferencias también varían. Por lo tanto, si el almacenamiento fue resuelto solamente a nivel de pistas, cada pista tendrá diferentes cantidades de datos - pista #0 (estando cerca del centro del plato) puede almacenar 10,827 bytes, mientras que la pista #1,258 (cerca del borde externo del plato) puede almacenar 15,382 bytes. La solución es dividir cada pista en múltiples sectores o bloques segmentos de un tamaño consistente (a menudo 512 bytes) de almacenamiento. El resultado es que cada pista contiene un número fijo de sectores. Un efecto secundario es que cada sector contiene espacio inutilizado - el espacio entre sectores. A pesar del número constante de sectores en cada pista, la cantidad de espacio inutilizado varía - relativamente poco espacio inutilizado en las pistas internas y una cantidad mucho mayor de espacio en las pistas más externas. En cualquier caso, este espacio inutilizado se desperdicia, pues allí no se puede almacenar datos. Sin embargo, la ventaja que supera este espacio desperdiciado es que ahora es posible direccionar efectivamente el almacenamiento en un dispositivo de almacenamiento masivo. De hecho, hay dos métodos de direccionamiento - el direccionamiento basado en la geometría y el direccionamiento basado en bloques.

3.4.4 Proposición de asignación Lo mismo que en otros lenguajes de programación, en C se tienen los operadores aritméticos más usuales (+ suma, - resta, * multiplicación, / división y % módulo). El operador de asignación es =, por ejemplo: i=4; ch='y'; Incremento ++ y decremento -- unario. Los cuales son más eficientes que las respectivas asignaciones. Por ejemplo: x++ es más rápido que x=x+1. Los operadores ++ y -- pueden ser prefijos o postfijos. Cuando son prefijos, el valor es calculado antes de que la expresión sea evaluada, y cuando es postfijo el valor es calculado después que la expresión es evaluada.

Page 40: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 40

En el siguiente ejemplo, ++z es prefijo y -- es postfijo: int x,y,z; main() { x=( ( ++z ) - ( y-- ) ) % 100; } Que es equivalente a: int x,y,z; main() { z++; x = ( z-y ) % 100; y--; } El operador % (módulo o residuo) solamente trabaja con enteros, aunque existe una función para flotantes (15.1 fmod() ) de la biblioteca matemática. El operador división / es para división entera y flotantes. Por lo tanto hay que tener cuidado. El resultado de x = 3 / 2; es uno, aún si x es declarado como float. La regla es: si ambos argumentos en una división son enteros, entonces el resultado es entero. Si se desea obtener la división con la fracción, entonces escribirlo como: x = 3.0 / 2; o x = 3 / 2.0 y aún mejor x = 3.0 / 2.0. Por otra parte, existe una forma más corta para expresar cálculos en C. Por ejemplo, si se tienen expresiones como: i = i + 3; o x = x * (y + 2); Por lo que podemos reescribir las expresiones anteriores como: i += 3; y x *= y + 2; respectivamente. Operadores de Comparación El operador para probar la igualdad es ==, por lo que se deberá tener cuidado de no escribir accidentalmente sólo =, ya que: if ( i = j ) ... Es una sentencia legal de C (sintácticamente hablando aunque el compilador avisa cuando se emplea), la cual copia el valor de ``j'' en ``i'', lo cual será interpretado como VERDADERO, si j es diferente de cero. Diferente es !=, otros operadores son: < menor que, > mayor que, <= menor que o igual a y >= (mayor que o igual a). Operadores lógicos Los operadores lógicos son usualmente usados con sentencias condicionales o relacionales, los operadores básicos lógicos son: && Y lógico, || O lógico y ! negación.

BIBLIOGRAFIA

http://dac.escet.urjc.es/docencia/ETC-Superior/teoria-cuat1/HojaEj5.pdf

Page 41: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 41

3.5 Operadores, operandos y expresiones

3.5.1 Prioridad de operaciones, evaluación de expresiones Es necesario ser cuidadosos con el significado de expresiones tales como a + b * c, dependiendo de lo que se desee hacer

(a + b) * c o

a + (b * c)

Todos los operadores tienen una prioridad, los operadores de mayor prioridad son evaluados antes que los que tienen menor prioridad. Los operadores que tienen la misma prioridad son evaluados de izquierda a derecha, por lo que:

a - b - c es evaluado como

(a - b) - c Prioridad Operador(es) Más alta ( ) [ ] -> ! ~ ++ -- - (tipo) * & sizeof * / % + - << >> < <= > >= == != & ^ | && || ? = += -= *= /= Más baja , De acuerdo a lo anterior, la siguiente expresión: a < 10 && 2 * b < c Es interpretada como: (a < 10) && ( (2 * b) < c ) y a = b = 10 / 5 + 2; como a = ( b = ( 10 / 5 ) + 2 );

Page 42: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 42

EVALUACIÓN DE EXPRESIONES

X = A / B - C + D * E - A * C

EXPRESIÓN

Operandos Operadores Delimitadores 5 operandos A,B,C,D,E

Pueden ser cualquier variable o constante válida del lenguaje

Los valores de las variables deben ser coherentes con las operaciones que se realicen con ellas

6 operadores /,-,+,*,-,*

Describen las operaciones que se realizan entre las variables

Pueden ser aritméticos, lógicos, relacionales

EVALUACIÓN DE EXPRESION X = A / B - C + D * E - A * C

Orden en el que se deben realizar las operaciones Cada lenguaje debe definir exactamente dicho orden Si A = 4, B = C = 2, D = E = 3 =>

X = ( ( 4 / 2 ) - 2 ) + ( 3 * 3 ) - ( 4 * 2 ) = 0 + 9 - 8 = 1

X = ( 4 / (2 - 2 + 3 ) ) * ( 3 - 4 ) * 2 = ( 4 / 3 ) * ( -1 ) * 2 = -2.66666666 El orden en el que se deben realizar las operaciones se especifica mediante: prioridades o

paréntesis El lenguaje define prioridades para los operadores El programador puede cambiar las prioridades mediante ( ) A igual prioridad, evaluación de izquierda a derecha Ejemplo: A / B * C ( A / B ) * C (1) A / ( B * C ) (2) Prioridad de / == prioridad de * Si A = B = C = 2 (1) = 2 (2) = 0.5 En C++ se evalúa según (1) Ejemplo X = A / B - C + D * E - A * C se evaluará en C++ X = ( ( (A / B) - C ) + ( D * E ) ) - ( A * C )

Page 43: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 43

Utilizada para que los compiladores puedan traducir expresiones. Si e es una expresión con operadores y operandos, la forma habitual de escritura se conoce como “infix” porque los operadores van entre (in) los operandos (los operadores unarios preceden sus operandos). La forma “postfix” consiste en colocar cada operador inmediatamente después de los operandos Ventajas: No son necesarios los paréntesis La prioridad de los operadores no es relevante La expresión se puede evaluar realizando un recorrido de izquierda a derecha, apilando los operandos y evaluando los operadores utilizando los operandos adecuados extraídos de la pila y apilando el resultado intermedio para repetir el proceso. Este método es más simple que los necesarios cuando se trabaja con la notación “infix”

BIBLIOGRAFIA http://dac.escet.urjc.es/docencia/ETC-Superior/teoria-cuat1/HojaEj5.pdf

Page 44: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 44

3.6 Proceso de creación de un ejecutable

Se puede crear un archivo que contenga el programa completo, como en los ejemplos que se tienen más adelante. Se puede usar cualquier editor de textos ordinario con el que se esté familiarizado. Un editor disponible en la mayoría de los sistemas UNIX es vi, y en Linux se puede usar pico. Por convención el nombre del archivo debe terminar con ``.c'' por ejemplo: miprograma.c progprueba.c. El contenido del archivo deberá obedecer la sintaxis de C. Compilación Existen muchos compiladores de C. El cc es el compilador estándar de Sun. El compilador GNU de C es gcc, el cual es bastante popular y está disponible en varias plataformas. Existen también compiladores equivalentes de C++ los cuales usualmente son nombrados como CC. Por ejemplo, Sun provee CC y GNU GCC. El compilador de GNU es también denotado como g++. Existen otros compiladores menos comunes de C y C++. En general todos los compiladores mencionados operan esencialmente de la misma forma y comparten muchas opciones comunes en la línea de opciones. Más adelante se listan y se dan ejemplos de opciones comunes de los compiladores. Sin embargo, la mejor referencia de cada compilador es a través de las páginas en línea, del manual del sistema. Por ejemplo: man gcc. Para compilar el programa usaremos el comando gcc. El comando deberá ser seguido por el nombre del programa en C que se quiere compilar. Un determinado número de opciones del compilador pueden ser indicadas también. Por el momento no haremos uso de estas opciones todavía, se irán comentando algunas más esenciales. Por lo tanto, el comando básico de compilación es:

gcc programa.c donde programa.c es el nombre del archivo. Si hay errores obvios en el programa (tales como palabras mal escritas, caracteres no tecleados u omisiones de punto y coma), el compilador se detendrá y los reportará. Podría haber desde luego errores lógicos que el compilador no podrá detectar. En el caso que esta fuera la situación se le estará indicando a la computadora que haga las operaciones incorrectas. Cuando el compilador ha terminado con éxito, la versión compilada, o el ejecutable, es dejado en un archivo llamado a.out, o si la opción -o es usada con el compilador, el nombre después de -o es el nombre del programa compilado. Se recomienda y es más conveniente usar la opción -o con el nombre del archivo ejecutable como se muestra a continuación:

gcc -o programa programa.c el cual pone el programa compilado en el archivo del programa señalado, en éste caso en programa, en vez del archivo a.out. Ejecución del programa El siguiente estado es correr el programa ejecutable. Para correr un ejecutable en UNIX, simplemente se escribe el nombre del archivo que lo contiene, en este caso programa (o a.out). Con lo anterior, se ejecuta el programa, mostrando algún resultado en la pantalla. En éste estado, podría haber errores en tiempo de ejecución (run-time errors), tales como división por cero, o bien, podrían hacerse evidentes al ver que el programa no produce la salida correcta. Si lo anterior sucede, entonces se debe regresar a editar el archivo del programa, recompilarlo, y ejecutarlo nuevamente. Esta parte del proceso de compilación será cubierta con más detalle en el capítulo 12 referente al preprocesador. Sin embargo, se da alguna información básica para algunos programas de C. El preprocesador acepta el código fuente como entrada y es responsable de:

• quitar los comentarios

Page 45: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 45

• interpretar las directivas del preprocesador las cuales inician con #. Por ejemplo:

• #include -- incluye el contenido del archivo nombrado. Estos son usualmente llamados archivos de cabecera (header). Por ejemplo:

• #include <math.h> -- Archivo de la biblioteca estándar de matemáticas. • #include <stdio.h> -- Archivo de la biblioteca estándar de Entrada/Salida. • #define -- define un nombre simbólico o constante. Sustitución de macros. • #define TAM_MAX_ARREGLO 100

Compilador de C El compilador de C traduce el código fuente en código de ensamblador. El código fuente es recibido del preprocesador. Ensamblador El ensamblador crea el código fuente o los archivos objeto. En los sistemas con UNIX se podrán ver los archivos con el sufijo .o. Ligador Si algún archivo fuente hace referencia a funciones de una biblioteca o de funciones que están definidas en otros archivos fuentes, el ligador combina estas funciones (con main()) para crear un archivo ejecutable. Las referencias a variables externas en esta etapa son resueltas.

BIBLIOGRAFIA http://dac.escet.urjc.es/docencia/ETC-Superior/teoria-cuat1/HojaEj5.pdf

Page 46: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 46

IV. FUNCIONES

4.1 Funciones

4.1.1 Definición de funciones

4.1.2 Funciones estándar

4.2 Entrada y salida de datos

4.3 Funciones definidas por el usuario

4.3.1 Pase por valor

4.3.2 Pase por referencia

4.4 Punteros

4.4.1 Definición de punteros

4.4.2 Paso de variable

Page 47: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 47

4.1 Funciones

4.1.1 Definición de funciones Las funciones son porciones de código que devuelven un valor. Permiten descomponer el programa en módulos que se llaman entre ellos. En C no existe diferencia entre funciones y procedimientos: a todas las subrutinas se las llama funciones. La definición de una función específica lo siguiente: nombre de la función número de argumentos que lleva y tipo de cada uno de ellos tipo de datos que devuelve Cuerpo de la función (el código que ejecuta) Sintaxis: tipo nombre ( arg1, arg2, ... ) { ... cuerpo ... } Cada argumento se especifica como en una declaración de variable. El cuerpo de la función debería contener una sentencia donde se devuelve el resultado de la función, que se hace de esta forma: return expresión; La función devolverá el resultado de la expresión.

4.1.2 Función estándar El estándar: es muy tolerante y permite los implementadores es decir cuenta con ciertas cuestiones de detalle. Los bloques o zonas de programas englobados se identifican atreves de la las llaves los cuales pueden ser anillados (bloques dentro de otros bloques) sin embargo también se pueden establecer un límite máximo de anidamiento. Por ejemplo. #include(conio.h) # include(studio.h) Int multiplicacion(inta,int,b); { return(a*b); } Main() Inti,j,resuitado; I=5; J=2; Resultado=multiplicación(I,j); Printf(“el resultado de % y % es: %d”,i,j,resultado); Getch(); return0; }

Page 48: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 48

Estructura de una función. Tipo _ retorno Nb_funciones. { Cuerpo de la función (parámetros); Valor de retorno } Retorno: Tipo de dato del valor que devuelve la función. Nb- función: Nombre de k la función la cual se crea respetando las reglas de creación de los identificadores. Parámetros: Lista de variables tipificadas y separadas por coma que permita la comunicación. Cuerpo de la función: Declaraciones e instrucciones que realiza la tarea encomendada a la función. Valor de retorno: Valor que devuelve la función la cual puede ser que no devuelva ningún valor y solo realiza algunas indicaciones. Llamada a una función. Es la forma en la que se emboca a una función. La llamada a la función supone la ejecución de su código y la terminación del proceso que debe realizar la función. Una vez concluida se devuelve el control a la función desde la cual fue llamada. #include(conio.h) # include(studio.h) Int suma(int a, int b) { Suma= a+b; return=(suma); } Float resta (float x, int b); } Char letra (char z); { Letra=z; Return= (letra); Main(); { Int c,d,opercion1; Float c, operacion2; Char f,h; c=3; d=5; e=7.5; f=”b”; operación1= suma(c,d); operación2= resta(e,d);

Page 49: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 49

h= letra(f); getch(); return0; }

4.2 Entrada y salida de datos

La salida de datos es la manera en que la computadora muestra los resultados que produce utilizando los dispositivos de salida. Entrada de datos. Es cualquier cosa que ayuda a introducir información en el sistema ayudado de dispositivos para dicha función. Ejemplo. Enterada de datos en C. Scanf (“tipo de datos” nombre de la variable); Tipos de datos % d enteros % f flotante % c carácter #include(conio.h) # include(studio.h) Main() { Int num1, num2; Printf(“deme un numero”); Scantf(“% d”, & num1), Suma=num1+5; Printf(“%d”,& suma); Getch(); Return 0; } Funciones #include(conio.h) # include(studio.h) Float resta(a-b); } Int multiplicacion(float c, int c) } Char letra(int c); { If e>5 then (“s”); }

Page 50: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 50

Int a,b,d,,e multiplicacion1; { Float b,c,resta, resta1: Char letra; Printf(“deme 3 valores enteros,”); Scanf(“%d”,&a); Scanf(“%d”,&d); Scanf(“%d”,&e); Printf(“dame valores enteros flotantes”); Scanf(“%f”,&b); Scanf(“%f”,&c); resta1= resta(a-b); Multiplicacion1=multiplicacion(c,d); Letra=”N”); Getch(); Return0; } Hacer una función que realiza una división de un numero entero con un numero flotante y que devuelva la letra S si el resultado de esa división es mayor que 2 si no que devuelva la letra N. para los valores que entran a la división se hará la captura a través del teclado. #include(conio.h) # include(studio.h) Float resta(a-b); } Char divicion(int num1, float num 2,) } Divicion=njm1/num2; If (div>2) then return(“S”); else return(“N”); } Main() { Int num 1: Flota num 2; Printf(“deme 1 numero enteros y un numero flotante ,”); Scanf(“%d”,&num1); Scanf(“%d”,&num2); div2= div(num1, num2); Printf(“%,c”,div2); Getch(); Return 0; } EXADECIMAL Puntero: dirección, de la memoria.

Page 51: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 51

4.3 Funciones definidas por el usuario

4.3.1 Pases por valor En “C” todos los argumentos de una función se pasan por valor. El paso de parámetros por valor también llamado paso por copia significa que la función realiza las siguientes instrucciones: 1.- recibe una copia de los valores de cada uno de los parámetros. 2.- los parámetros actuales podrán ser constantes expresiones, variables o funciones. 3.- la función no puede modificar el valor del parámetro.

4.3.2 Pases por referencia Se refiere a que si quisiéramos modificar el valor de los argumentos sería necesario pasar como argumento su dirección en memoria.

4.4 Punteros

4.4.1 Definición de punteros Es una variable que representa la posición (en vez del valor) de otro dato tal como una variable o un elemento de una formación.

4.4.2 Paso de variable Significa que el parámetro recibe la dirección del parámetro actual pasado. Cualquier modificación del parámetro afecta tanto en el interior del puntero como en el exterior. PUNTEROS #include<stdio.h> #include<conio.h> main() { int almacen*puntero; almancen=45; puntero=&almacen; printf(“el contenido de la variable llamado almacén y que está ubicada en %xh es de %d”,puntero,*puntero); getch(); return0; } DECLARACIONES DE PUNTEROS int*A; int*lugar; int*A1; ASIGNACIÓN A UN PUNTERO A=&lugar; S=&A; T=&A1;

Page 52: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 52

MOSTRAR EN PANTALLA contenido printf(“%d”,*A); printi(“%f”,*lugar); printf(“%d”,*A1); ubicacion printf(“%xh”,A); printf(“%xh”,lugar); printf(“%xh”,A1); Realizar una función que devuelva un número flotante bajo las siguientes condiciones. Realizar una multiplicación de dos números enteros si un carácter es A en cualquier otro caso realizar una división, mostrar en pantalla el valor del carácter entre las 2 variables de tipo entero y el resultado de la función. #include(conio.h) # include(studio.h) Float multiplicacion (int num1, int num2, char letra) { If (letra==´A´) then return(num1*num2); else return(num1/num2); } Main() { Int num 1,num2; Float multiplicacion; char letra; Printf(“dame 2 enteros”); Scanf(“%d”,& num1); Scanf(“%,d”& num2); Printf(“dame un caracter”); Scanf(“%c”,& letra); multiplicacion1=multiplicacion(num1,num2,letra); Printf(“%d,%d”,num1,num2); printf(“%c”, letra); printf(“%f”,multiplicacion1); Getch(); Return0; }

BIBLIOGRAFIA http://dac.escet.urjc.es/docencia/ETC-Superior/teoria-cuat1/HojaEj5.pdf

Page 53: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 53

V. ESTRUCTURAS DE SELECTIVAS

5.1 Selectiva simple

5.2 Selectiva doble

5.3 Selectiva anidada

5.4 Selectiva múltiple

Page 54: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 54

5.1 Selectiva simple

La especificación formal de algoritmos tiene realmente utilidad cuando el algoritmo requiere una descripción más complicada que una lista sencilla de instrucciones. Este es el caso cuando existen un número de posibles alternativas resultantes de la evaluación de una determinada condición.

Estas estructuras se identifican porque en la fase de solución del problema existe algún punto en el cual es necesario establecer una pregunta, para decidir si ciertas acciones deben realizarse o no.

Las condiciones se especifican usando expresiones lógicas. La representación de una estructura selectiva se hace con palabras en pseudocódigo (if - then - else o en español si - entonces - sino) y

en flujograma con una figura geométrica en forma de rombo.

Se identifican porque están compuestos únicamente de una condición. La estructura si - entonces evalúa la condición y en tal caso:

Si la condición es verdadera, entonces ejecuta la acción Si (o acciones si son varias). Si la condición es falsa, entonces no se hace nada.

Español Inglés Si <condición> If <condición>

Entonces then <acción Si> <acción Si>

fin_si endif

Page 55: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 55

Ejemplo 1. Construir un algoritmo tal, que dado como dato la calificación de un alumno en un examen, escriba "Aprobado" en caso que esa calificación fuese mayor que 8. Salidas: mensaje de aprobado si se cumple la condición. Entradas: calificación

Datos adicionales: un alumno aprueba si la calificación es mayor que 8 Variables: Cal = calificación Algoritmo: Inicio Leer (cal) Si cal > 8 entonces Escribir ("aprobado") Fin_si Fin

5.2 Selectiva doble

Son estructuras lógicas que permiten controlar la ejecución de varias acciones y se utilizan cuando se tienen dos opciones de acción, por la naturaleza de estas se debe ejecutar una o la otra, pero no ambas a la vez, es decir, son mutuamente excluyentes.

Representación pseudocodificada.

Español Inglés Si <condición> entonces If <condición> then <acción S1> <acción S1> sino else <acción S2> <acción S2> Fin_Si End_if

Page 56: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 56

Entonces, si una condición C es verdadera, se ejecuta la acción S1 y si es falsa, se ejecuta la acción S2.

Ejemplo 1

Dado como dato la calificación de un alumno en un examen, escriba "aprobado" si su calificación es mayor que 8 y "Reprobado" en caso contrario. Algoritmo: Inicio Leer (cal) Si cal > 8 entonces Escribir ("aprobado") Sino Escribir ("reprobado") Fin_si Fin

Page 57: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 57

Ejemplo 2.

Dado como dato el sueldo de un trabajador, aplicar un aumento del 15% si su sueldo es inferior a $1000 y 12% en caso contrario, luego imprimir el nuevo sueldo del trabajador.

EXPRESIONES LÓGICAS

Sirven para plantear condiciones o comparaciones y dan como resultado un valor booleano verdadero o falso, es decir, se cumple o no se cumple la condición. Se pueden clasificar en simples y complejas. Las simples son las que usan operadores relacionales y las complejas las que usan operadores lógicos.

Ejemplos: Un ejemplo en el cual usamos el operador lógico AND sería: Una escuela aplica dos exámenes a sus aspirantes, por lo que cada uno de ellos obtiene dos calificaciones denotadas como C1 y C2. El aspirante que obtenga calificaciones mayores que 80 en ambos exámenes es aceptado; en caso contrario es rechazado. En este ejemplo se dan las condiciones siguientes: Si (C1 >= 80) y (C2 >= 80) entonces Escribir ("aceptado") Sino Escribir ("rechazado") Fin_si

Note que también usa operadores relacionales. Por lo general cuando hay operadores lógicos, éstos van acompañados de operadores relacionales. Un ejemplo usando el operador lógico OR sería: Una escuela aplica dos exámenes a sus aspirantes, por lo que cada uno de ellos obtiene dos calificaciones denotadas como C1 y C2. El aspirante que obtenga una calificación mayor que 90 en cualquiera de los exámenes es aceptado; en caso contrario es rechazado. En este caso se dan las condiciones siguientes: Si (C1 >=90) or (C2 >=90) entonces Escribir ("aceptado") Sino Escribir ("rechazado") Fin_si

Page 58: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 58

La instrucción equivale a OR ya que nos dice que puede ser en cualquiera de los exámenes no necesariamente en los dos. En el ejemplo 1 la palabra ambos equivalía a seleccionar la instrucción AND. Si la instrucción nos dijera que obtenga una nota en cualquiera de los exámenes pero no en ambos, nos estaría indicando una instrucción XOR que es un tipo de OR pero exclusivo. Es decir, no puede considerarse el caso en que tenga la misma nota en los dos exámenes, solo en uno de los dos.

5.3 Selectiva anidada

En la solución de problemas encontramos numerosos casos en los que luego de tomar una decisión y marcar el camino correspondiente a seguir, es necesario tomar otra decisión. Dicho proceso puede repetirse numerosas veces. En aquellos problemas en donde un bloque condicional incluye otro bloque condicional se dice que un bloque está anidado dentro del otro.

Ejemplo 1. Determinar la cantidad de dinero que recibirá un trabajador por concepto de las horas extras trabajadas en una empresa, sabiendo que cuando las horas de trabajo exceden de 40, el resto se consideran horas extras y que éstas se pagan al doble de una hora normal cuando no exceden de 8; si las horas extras exceden de 8 se pagan las primeras 8 al doble de lo que se paga por una hora normal y el resto al triple.

Solución.

Lo primero que hay que determinar es si el trabajador trabajó horas extras o no. Encontrar las horas extras de la siguiente forma: Horas extras = horas trabajadas - 40 En caso que sí trabajó horas extras: Si horas extras > 8 entonces a horas extras excedentes de 8 = horas extras -8 y pago por horas extras = pago por hora normal * 2 * 8 + pago por hora normal * 3 * horas extras excedentes de 8 De otra forma (solo horas al doble) pago por horas extras = pago por hora normal * 2 * horas extras. Finalmente, pago total que recibirá el trabajador será: Pago = pago * hora normal * 40 + pago por horas extras. Si no trabajó horas extras tendremos: Pago = pago por hora normal * horas trabajadas. Datos de salida: Pago. Datos de entrada: número de horas trabajadas y pago por hora normal. Definición de variables: ht = horas trabajadas het = horas extras que exceden de 8 ph = pago por hora normal phe = pago por horas extras he = horas extras pt = pago que recibe el trabajador

Algoritmo:

Inicio Leer (ht, ph) Si ht >40 entonces He= ht - 40 Si he > 8 entonces Het =he - 8

Page 59: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 59

Phe =ph * 2 * 8 + ph * 3 * het Sino Phe = ph * 2 * he Fin_si Pt =ph * 40 + phe Sino Pt = ph * ht Fin_si Escribir (pt) Fin

Ejemplo 2.

Dados los datos A, B y C que representan números enteros diferentes, construir un algoritmo para escribir estos números en forma descendente. Este es un ejemplo de los algoritmos conocidos como de Lógica Pura, ya que poseen muchas decisiones y muchas bifurcaciones.

Salida: A, B y C ordenados descendentemente. Entradas: A, B y C. La dinámica del problema es comparar dos números a la vez para conocer cuál es el mayor.

Page 60: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 60

5.4 Selectiva múltiple

Con frecuencia es necesario que existan más de dos elecciones posibles. Este problema se podría resolver por estructuras selectivas simples o dobles, anidadas o en cascada, pero si el número de alternativas es grande puede plantear serios problemas de escritura y de legibilidad.

Usando la estructura de decisión múltiple se evaluará una expresión que podrá tomar n valores distintos, 1, 2 , 3, ....,n y según que elija uno de estos valores en la condición, se realizará una de las n acciones o lo que es igual, el flujo del algoritmo seguirá sólo un determinado camino entre los n posibles.

Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la acción 1, si toma el valor 2 ejecutará la acción 2, si toma el valor N realizará la acción N.

Ejemplo 1:

Diseñar un algoritmo tal que dados como datos dos variables de tipo entero, obtenga el resultado de la siguiente función:

Page 61: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 61

Ejemplo 2. Dados como datos la categoría y el sueldo de un trabajador, calcule el aumento correspondiente teniendo en cuenta la siguiente tabla. Imprimir la categoría del trabajador y el nuevo sueldo.

Definición de variables: Cate = categoría Sue = sueldo Nsue = nuevo sueldo

ALGORITMO

Inicio Leer (cate, sue) En caso que cate sea 1: hacer nsue <-- sue * 1.15 2: hacer nsue <-- sue * 1.10 3: hacer nsue <-- sue * 1.08 4: hacer nsue <-- sue * 1.07 Fin_caso_que Escribir (cate, nsue) Fin

BIBLIOGRAFIA http://www.mailxmail.com/curso/informatica/programacionestructurada/capitulo13.htm

Page 62: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 62

VI. ESTRUCTURAS DE REPETICIÓN

6.1 Repetir mientras

6.2 Repetir hasta

6.3 Repetir desde

Page 63: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 63

6.1 Repetir mientras

Llamado bucle "mientras", ejecuta una sentencia mientras cierta condición sea verdadera, su forma es la siguiente:

while(condición) sentencia;

Donde sentencia es una sentencia válida o un bloque de sentencias. La condición puede ser cualquier expresión y cualquier valor distinto de 0 es cierto.

#include "stdio.h" main() { int i; float x, suma, promedio; /* lee números desde el teclado para calcular su promedio, termina Cuando se introduce -1 */ x = suma = 0; i = 1; while (x != -1) { printf("\nIntroduzca el valor %d:", i); scanf("%f", &x); suma += x; } promedio := suma/i; printf("\nEl promedio es: %f / %d = %f", suma, i, promedio); }

Condición

Grupo de Instrucciones

NO

SI

Page 64: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 64

6.2 Repetir hasta

El Bucle do-while

A diferencia de los bucles anteriores, que analizan la condición al principio de los mismos, el bucle do-while lo hace al final, esto significa que se ejecuta siempre al menos una vez. Su forma general es:

do{ sentencia; }while(condición);

Las llaves no son necesarias en el caso de una sentencia simple, pero se recomienda colocarlas por razones de legibilidad, este bucle iterará hasta que la condición sea falsa. Ejemplo:

El siguiente bucle lee números desde el teclado hasta que encuentra un número negativo:

do{ scanf("%d", &num); }while(num = 0);

6.3 Repetir desde

El bucle for en C cumple la misma función que en el resto de los lenguajes de programación procedimentales pero además se le añade una potencia y flexibilidad únicas, lo cual lo convierte en una herramienta poderosa. Su forma es la siguiente:

for(inicialización; condición; incremento) Sentencia;

Grupos de Instrucciones

Condición Fin SI NO

Page 65: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 65

Donde inicialización es una sentencia de asignación para inicializar la variable de control del bucle, condición es una expresión relacional que determina el final del bucle e incremento define cómo cambia la variable de control cada vez que se ejecute una iteración del bucle.

Ejemplo:

#include "stdio.h" /* imprime los numeros del 1 al 100 */ main() { int x; for (x=1; x<=100; x++) printf("%d ", x); }

En este ejemplo, x se inicializa a 1 y se compara con 100, ya que la condición es cierta, se ejecuta la función printf() y x se incrementa en 1, este bucle se repite hasta que x es mayor que 100. A continuación, un ejemplo del bucle for con varias sentencias:

#include "stdio.h" /* imprime el cuadrado de los numeros del 10 al 1 */ main() { int i, x; for (i=10; x0; x--){ x := i*i; printf("%d al cuadrado es: %d\n", i, x); }

(Variable) (Exp1) hasta

(Exp2) paso (Exp3)

Grupo de Instrucciones

Page 66: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 66

VII. ARREGLOS

7.1 Arreglo unidimensional

7.1.1 Conceptos básicos

7.1.2 Operaciones aplicaciones.

7.2 Arreglo bidimensional

7.3 Conceptos básicos

7.4 Operaciones

7.5 Aplicaciones

7.6 Registros

7.7 Archivos

Page 67: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 67

7.1 Arreglo unidimensional

7.1.1 Conceptos básicos Conjunto ordenado de variables (arrays).Los arreglos ó conjuntos de datos ordenados (arrays) recolectan variables del MISMO tipo, guardándolas en forma secuencial en la memoria. La cantidad máxima de variables que pueden albergar está sólo limitada por la cantidad de memoria disponible. El tipo de las variables involucradas puede ser cualquiera de los ya vistos, con la única restricción de que todos los componentes de un array deben ser del mismo tipo.

7.1.2 Operaciones aplicaciones La declaración de un array se realiza según la siguiente sintaxis:

Tipo de las variables nombre [cantidad de elementos]; Por ejemplo:

int var1[10] ; char nombre[50] ; float numeros[200] ; long double cantidades[25] ;

B) Inicialización de vectores

entero unidCompradas[10] = {12. 24, 36, ...,100} unidCompradas se inicializan con 10 datos enteros int unidCompradas[10] = {12. 24, 36, ...,100};

caracter Letras[52]={'A','B','C', .,'Z','a','b',...,'z'} Letras se inicializa con 52 datos de tipo caracter char Letras[52]={'A','B','C', .,'Z','a','b',...,'z'};

C) Asignación

int A[15]; char* nombre[5]; double talla[10]; char vocales[5];

Asigna el valor 45 al elemento de índice 10 del arreglo A. A[10] = 45; Asigna 1.56 al elemento de índice 2 del arreglo talla. talla[2] = 1.56; Asigna Fernández al elemento de índice 2 del arreglo nombre. nombre[2] = "Fernandez"; Asigna E al elemento de índice 3 del arreglo vocales. vocales[3] = 'E'; C) Entrada/salida

para (i = 1 ; hasta i <= N ; con i=i+1) { Leer V [ i ]; }

Lee los elementos del vector V cuyo índice i varía desde 1 hasta N (i varia de 1 en 1). Nota: N debe ser conocido.

para (i = 1 ; hasta i<= 5 ; con i=i+1) { Mostrar Peso [ i ]; }

Muestra en pantalla los valores almacenados en cada elemento del array: Peso[1], Peso[2], Peso[3], Peso[4] y Peso[5]

Page 68: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 68

PRACTICA: #include<stdio.h> /*librería para funciones entrada/salida*/ #include<conio.h> /*librería conio.h*/ int a,x[4],y[4],z[4]; /* declaración de variables enteras*/ main() /*función principal*/ { /*inicio del programa*/ clrscr(); /*limpia pantalla*/ printf("escribe una matriz x"); /* imprime un comentario en la pantalla*/ for(a=0;a<4;a++) /*ciclo de repetición cuando a = 0, a menor a 4 e incremento de a*/ { /*inicio del for*/ gotoxy((a+1)*3,3);scanf("%d",&x[a]); /*coordenadas de posición y introducción de valores a las variables*/ } printf("Introduce los valores de la matriz y:"); /*imprime un mensaje en pantalla*/ for(a=0;a<4;a++){ /*ciclo de repetición cuando a = 0, a menor a 4 e incremento de a*/ gotoxy((a+1)*3,6);/*coordenadas de posición*/ scanf("%d",&y[a]); /* lee la variable*/ } for(a=0;a<4;a++) z[a]=x[a]+y[a]; /* operación matemática*/ for(a=0;a<4;a++){ /*ciclo de repeticion cuando a = 0, a menor a 4 e incremento de a*/ gotoxy((a+1)*3,10);printf("%d",z[a]); /*coordenadas de posición e imprime los valores de las variables*/ } getch(); /* pausa*/ }/* fin del programa*/

7.2 Arreglo Bidimensional

1 2 3 4 5 1 [1,1][1,2][1,3][1,4][1,5] 2 [2,1][2,2][2,3][2,4][2,5] 3 [3,1][3,2][3,3][3,4][3,5] 4 [4,1][4,2][4,3][4,4][4,5]

7.3 Conceptos básicos

Un arreglo bidimensional tiene dos dimensiones y es un caso particular de los arreglos multidimensionales. En C, las dimensiones se manejan por medio de un par de corchetes, dentro de los que se escriben, separados por comas, los valores de las dos dimensiones.

Page 69: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 69

7.4 Operaciones

Declaración:

double nota[25][4]; int DocCasacas[3][30]; char Rpta[45][10];

A) Inicialización de Matrices Peso declara e inicializa los pesos promedios de 30 deportistas en cada uno de los 12 meses del 2001. (Total 240 pesos agrupados de 12 en 12). Total 240 datos reales int DocCasacas[3][4]={{20,40,35,80}, {25,70,50,36}, {48,36,64,24}}; int DocCasacas[3][4]={20,40,35,80, 25,70,50,36, 48,36,64,24}; int DocCasacas[ ][4]={{20,40,35,80}, {25,70,50,36}, {48,36,64,24}}; Declara e inicializa DocCasacas, las docenas de casacas de 3 tallas ('S', 'M','L') confeccionadas en cada una de los 4 semanas del mes de Junio-2002 char Rpta[5][4]= { {'a','e','c','d'}, {'e','c','d','a'}, {'c','c','d','c'} }; char Rpta[5][4]={'a','e','c','d','e','c','d','a', 'c','c','d','c' }; char Rpta[ ][4]={'a','e','c','d', 'e','c','d','a', 'c','c','d','c' };

B) Asignación

A[10] [20] = 45 A[10] [20] = 45;

Asigna el valor 45 al elemento de la fila 10 y columna 20 del arreglo bidimensional A.

Rpta [2][5] = 'c' Rpta [2][5] = 'c';

Asigna 'c' al elemento de la fila 2 y columna 5 del arreglo Rpta

C) Operaciones de Entrada/Salida para (i = 0 ; i< 5 ; i = i+1) { para ( j = 0 ; j< 3 ; j = j+1) { Leer V [ i ][ j ]; } }

para (i = 1 ; Hasta i<= 5 ; con i=i+1) { para (j = 1;hasta j<= 3 ; con j=j+1) { Mostrar Peso [ i ][ j ]; }

}

Page 70: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 70

7.5 Aplicaciones

Elaborar un algoritmo que lea los datos numéricos de tipo entero para una matriz de 10 renglones con 15 columnas y mandar a desplegar en contenido de la misma. Algoritmo de PRODUCCIÓN 1. definir variables NUMEROS: arreglo [10,15] entero REN,COL: entero 2. FOR REN=1,10 a.FOR COL=1,15 1. solicitar elemento REN,COL 2. leer NUMEROS[REN,COL] b. END FOR 3. END FOR 4. FOR REN=1,10 a= FOR COL=1,15 1. Imprimir NUMERO [REN, COL] b. END FOR 5. END FOR 6. FIN Código #include<conio.h> #include<stdio.h> main() { int NUMEROS[10][15]; int REN,COL; for(REN=1;REN<=10;REN++) { for(COL=1;COL<=15;COL++) { Printf (“cual es el valor”); Scanf (“%d”,&NUMEROS[REN][COL]); } } for (REN=1;REN<=10;REN++) { for(COL=1;COL<=15;COL++) { printf(“%d”,NUMEROS[REN][COL]); } } getch(); return 0

Page 71: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 71

7.6 Registros

Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo del microprocesador que se emplee. Los registros son direccionables por medio de una viñeta, que es una dirección de memoria. Los bits, por conveniencia, se numeran de derecha a izquierda (15, 14,13…. 3, 2, 1,0), los registros están divididos en seis grupos los cuales tienen un fin específico. Los registros se dividen en:

Registros de segmento Registros de apuntadores de instrucciones Registros apuntadores Registros de propósitos generales Registro índice Registro de bandera.

Registros de segmento. Un registro de segmento se utiliza para alinear en un límite de párrafo o dicho de otra forma codifica la dirección de inicio de cada segmento y su dirección en un registro de segmento supone cuatro bits 0 a su derecha. Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para direccionamientos conocidos como el segmento actual. Los registros de segmento son:

Registro CS Registro DS Registro SS Registro ES Registro FS y GS

Registro CS. El DOS almacena la dirección inicial del segmento de código de un programa en el registro CS. Esta dirección de segmento, más un valor de desplazamiento en el registro de apuntado de instrucción (IP), indica la dirección de una instrucción que es buscada para sí ejecución. Para propósito de programación normal, no necesita referenciar el registro CS.

Registro DS. La dirección inicial de un segmento de datos de programa es almacenada en el registro DS. En términos sencillos, esta dirección, más un valor de desplazamiento en una instrucción, genera una referencia a la localidad de un bytes especifico en el segmento de datos.

Registro SS. El registro SS permite la colocación en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS almacena la dirección de inicio del segmento de pila de un programa en el registro SS. Esta dirección de segmento, más un valor de desplazamiento en el registro del apuntador de la pila (SP), indica la palabra actual en la pila que está siendo direccionada. Para propósitos de programación normal, no se necesita referenciar el registro SS.

Registro ES Algunas operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro esta de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES esta asociado con el registro DI (índice). Un programa que requiere el uso del registro ES puede inicializarlo con una dirección apropiada.

Registros FS y GS.

Page 72: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 72

Son registros extra de segmento en los procesadores 80386y posteriores a estos procesadores.

Registro Apuntador de instrucciones. (IP) El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta. El registro IP está asociado con el registro CS en el sentido de que el IP indica la instrucción actual dentro del segmento de código que se está ejecutando actualmente. En el ejemplo siguiente, el registro CS contiene 25A4[0]H y el IP contiene 412H. Para encontrar la siguiente instrucción que será ejecutada el procesados combina las direcciones en el CS y el IP así: Segmento de dirección en el registro CS: 25A40H Desplazamiento de dirección en el registro IP: + 412H Dirección de la siguiente instrucción: 25E52H

Registros apuntadores. Los registros apuntadores están asociados con el registro SS y permiten al procesador accesar datos en el segmento de pila los registros apuntadores son dos:

El registro SP El registro BP

Registro SP. El apuntador de pila IP de 16 bits está asociado con el registro SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que está siendo procesada en la pila. El ejemplo siguiente el registro SS contiene la dirección de segmento 27B3[0]H y el SP el desplazamiento 312H Para encontrar la palabra actual que está siendo procesada en la pila el microprocesador combina las direcciones en el SS y el PP: Dirección de segmento en el registro SS: 27B30H Desplazamiento en el registro SP: + 312H Dirección en la Pila: 27E42H

…….

27B3[0]H 312H Dirección del segmento SS Desplazamiento del SP

Registro BP. El registro BP de 16 bits facilita la referencia de parámetros, los cuales son datos y direcciones transmitidos vía lapida.

Registros de propósitos generales. Los registros de propósitos generales AX, BX, CX y DX son los caballos de batalla o las herramientas del sistema. Son los únicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte. El último byte de la izquierda es la parte "alta", y el último byte de la derecha es la parte "baja" por ejemplo, el registro CX consta de una parte CH (alta) y una parte CL (baja), y usted puede referirse a cualquier parte por si nombre. Las instrucciones siguientes mueven ceros a los registros CX, CH y CL respectivamente.

Mov CX, 00 Mov CH, 00 Mov CL, 00

Los procesadores 80386 y posteriores permiten el uso de todos registros de propósito general, mas versiones de 32 bits; EAX, EBX y EDCX.

Page 73: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 73

Registros AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmética. Por ejemplo, las instrucciones para multiplicar, dividir y traducir suponen el uso del AX. También, algunas operaciones generan código más eficientes si se refiere al AX en lugar de los otros registros.

Registro BX. El BX es conocido como el registro base ya que es el único registro de propósitos generales que pueden ser unos índices para direccionamiento indexado. También es común emplear al BX para cálculos.

Registro CX. El CX es conocido como el registro contador. Puede contener un valor para controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits, hacia la derecha o hacia la izquierda. El CX también es usado para muchos cálculos.

Registro DX. El DX es conocido como el registro de datos. Algunas operaciones de entrada/salida requieren su uso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y al AX trabajando juntos. Puede usar los registros de propósitos para suma y resta de cifras de 8, 16, 32 bits.

Registro índice. Los registros SI y DI están disponibles para direccionamientos indexados y para sumas y restas. Que son las operaciones de punta.

Registro SI. El registro índice de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI está asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el ESI.

Registro DI. El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el Di está asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el EDI.

Registro de bandera. Los registros de banderas sirven parar indicar el estado actual de la maquina y el resultado del procesamiento, Cuando algunas instrucciones piden comparaciones o cálculos aritméticos cambian el estado de las banderas. Las banderas están en el registro de banderas en las siguientes posiciones: bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

O D I T S Z

A

P

C

Bandera Las banderas más comunes son las siguientes: OF (Over flow flag, desbordamiento). Indica el desbordamiento de un bit de orden alto (mas a la izquierda) después de una operación aritmética. DF (Direction flag, Dirección). Designa la dirección hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres. IF (Interruption flag, Interrupción).

Page 74: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 74

Indica que una interrupción externa, como la entrada desde el teclado sea procesada o ignorada. TF (Trap flag, Trampa). Examina el efecto de una instrucción sobre los registros y la memoria. Los programas depuradores como DEBUG, activan esta bandera de manera que pueda avanzar en la ejecución de una sola interrupción a un tiempo. SF (Sign flag, Signo). Contiene el signo resultante de una operación aritmética (0=positivo y 1= negativo). ZF (Zero flag, Zero). Indica el resultado de una operación aritmética o de comparación (0= resultado diferente de cero y 1=resultado igual a cero). AF (Auxiliary carry flag, Acarreo auxiliar). Contiene un acarreo externo del bit 3 en un dato de 8 bits, para aritmética especializada PF (Parity flag, Paridad). Indica paridad par o impar de una operación en datos de ocho bits de bajo orden (mas a la derecha). CF (Carry flag, Acarreo). Contiene el acarreo de orden más alto (mas a la izquierda) después de una operación aritmética; también lleva el contenido del último bit en una operación de corrimiento o rotación.

Cuadro Comparativo

TIPOS DE REGISTROS FUNCION

Registros de Segmento Un registro de segmento tiene 16 bits de longitud y facilita un área

de memoria para el direccionamiento conocida como el segmento

actual

Registros de Apuntador de

Instrucciones

Este registro está compuesto por 16 bits y contiene el

desplazamiento de la siguiente instrucción que se va a ejecutar. Los

procesadores 80386 y posteriores tienen un IP ampliado de 32 bits

llamado EIP.

Registros Apuntadores Permiten al sistema acceso de datos al segmento de la pila. Los

procesadores 80386 tienen un apuntador de pila de 32 bits llamado

ESP. El sistema maneja de manera automática estos registros.

Registros de Propósito General Son los caballos de batalla del sistema y pueden ser direccionados

como una palabra o como una parte de un bytes. Los procesadores

80386 y posteriores permiten el uso de todos los registros de

propósitos general más sus versiones ampliadas de 32 bits llamados

EAX, EBX, ECX y EDX.

Registros Índices Sirven para el direccionamiento de indexado y para las operaciones de sumas y restas.

Registros de Banderas Sirven para indicar el estado actual de la maquina y el resultado del procesamiento. De los 16 bits de registro de bandera 9 son comunes a toda la familia de los procesadores 8086.

Page 75: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 75

7.6 Archivos

Los archivos también denominados ficheros (file); es una colección de información (datos relacionados entre sí), localizada o almacenada como una unidad en alguna parte de la computadora. Los archivos son el conjunto organizado de informaciones del mismo tipo, que pueden utilizarse en un mismo tratamiento; como soporte material de estas informaciones. Los archivos como colección de datos sirven para la entrada y salida a la computadora y son manejados con programas. Los archivos pueden ser contrastados con Arrays y registros; Lo que resulta dinámico y por esto en un registro se deben especificar los campos, él número de elementos de un arrays (o arreglo), el número de caracteres en una cadena; por esto se denotan como "Estructuras Estáticas". En los archivos no se requiere de un tamaño predeterminado; esto significa que se pueden hacer archivos de datos más grandes o pequeños, según se necesiten. Cada archivo es referenciado por su identificador (su nombre.).

CARACTERÍSTICAS DE LOS ARCHIVOS Las principales características de esta estructura son:

Independencia de las informaciones respecto de los programas

La información almacenada es permanente

Un archivo puede ser accedido por distintos programas en distintos momentos

Gran capacidad de almacenamiento.

CLASIFICACION DE LOS ARCHIVOS Los archivos se clasifican según su uso en tres grupos:

Permanentes o Maestros: Estos contienen información que varia poco. En algunos casos es preciso actualizarlos periódicamente.

De Movimientos Se cercan para actualizar los archivos maestros. Sus registros son de tres tipos: alta, bajas y modificaciones.

De Maniobra o Trabajo. Tienen una vida limitada, normalmente menor que la duración de la ejecución de un programa. Su utilizan como auxiliares de los anteriores.

TIPOS DE ARCHIVOS Los elementos de un archivo pueden ser de cualquier tipo, simples o estructurados o según su función.

SEGÚN SU FUNCION. Se define por: a.- Archivos Permanentes:

Son aquellos cuyos registros sufren pocas o ninguna variación a lo largo del tiempo, se dividen en:

Constantes: Están formados por registros que contienen campos fijos y campos de baja frecuencia de variación en el tiempo. De Situación: Son los que en cada momento contienen información actualizada. Históricos: Contienen información acumulada a lo largo del tiempo de archivos que han sufridos procesos de actualización o bien acumulan datos de variación periódica en el tiempo.

Page 76: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 76

b.- Archivos de Movimiento Son aquellos que se utilizan conjuntamente con los maestros (constantes), y contienen algún campo común en sus registros con aquellos, para el procesamiento de las modificaciones experimentado por los mismos.

c.- Archivo de Maniobra o Transitorio Son los archivos creados auxiliares creados durante la ejecución del programa y borrados habitualmente al terminar el mismo.

SEGÚN SUS ELEMENTOS. Los principales archivos de este tipo son:

Archivo de Entrada: Una colección de datos localizados en un dispositivo de entrada.

Archivo de Salida: Una colección de información visualizada por la computadora.

Constantes: están formados por registros que contienen campos fijos y campos de baja frecuencia de variación en el tiempo.

De Situación: son los que en cada momento contienen información actualizada.

Históricos: Contienen información acumulada a lo largo del tiempo de archivos que han sufrido procesos de actualización, o bien acumulan datos de variación periódica en el tiempo.

Archivos de Movimiento o Transacciones: Son aquellos que se utilizan conjuntamente con los maestros (constantes), y contienen algún campo común en sus registros con aquellos, para el procesamiento de las modificaciones experimentados por los mismos.

Archivos de Maniobra o Transitorios: Son los archivos auxiliares creados durante la ejecución del programa y borrados habitualmente al terminar el mismo.

SEGÚN SUS ELEMENTOS Los principales archivos de este tipo son:

Archivo de Entrada, una colección de datos localizada en un dispositivo de entrada.

Archivo de Salida, una colección de información visualizada por la computadora.

Archivo de Programa, un programa codificado en un lenguaje específico y localizado o almacenado en un dispositivo de almacenamiento.

Archivo de Texto, una colección de caracteres almacenados como una unidad en un dispositivo de almacenamiento.

ACCESO A LOS ARCHIVOS Se refiere al método utilizado para acceder a los registros de un archivo prescindiendo de su organización. Existen distintas formas de acceder a los datos:

Secuenciales; los registros se leen desde el principio hasta el final del archivo, de tal forma que para leer un registro se leen todos los que preceden.

Directo; cada registro puede leerse / escribirse de forma directa solo con expresar su dirección en el fichero por él numero relativo del registro o por transformaciones de la clave de registro en él numero relativo del registro a acceder.

Por Índice; se accede indirectamente a los registros por su clave, mediante consulta secuenciales a una tabla que contiene la clave y la dirección relativa de cada registro, y posterior acceso directo al registro.

Dinámico; es cuando se accede a los archivos en cualquier de los modos anteriormente citados.

La elección del método está directamente relacionada con la estructura de los registros del archivo y del soporte utilizado.

Page 77: Antologia de Algoritmos y Lenguajes de Programación 24feb

Lic. Susana Hernández Rodríguez Ing. Industrial ITSP 77

TIPOS DE ACCESOS

Acceso Secuencial. Exige el tratamiento de elemento, para esto es necesario una exploración secuencial comenzando desde el primer momento (Pascal permite este acceso)

Secuenciales: archivo de texto que debe ser leído del principio hasta el final.

Acceso Directo. Permite procesar o acceder a un elemento determinado y referencia directamente por su posición en el soporte de almacenamiento (Turbo Pascal permite este acceso.

Aleatorios: es un archivo con registros de un mismo largo. Un programa puede accesar directamente cualquier registro sin tener que leer los registros previos.

Binarios: es un archivo que lee byte por byte sin asumir ninguna estructura. Los archivos Binarios no son un nuevo tipo de archivo, pero si una nueva forma de manipular cualquier tipo de archivo. Las técnicas de archivo binarios permiten leer o cambiar cualquier byte de un archivo. Son herramientas extremadamente potentes, pero como toda herramienta potente debe manejarse con cuidado

BIBLIOGRAFIA Estructura de Datos en Pascal, Autor Aarón M. Tenenbaum, Moshe J. Augentein. Primera edición. Diseño y Administración de Base de Datos Gary W. Hansen, James V. Hansen, Segunda Edición.

Guía de Estructura y Procesamiento de Datos Profesor David López, Segundo semestre U.N.I.R. (Maracaibo).