MÓDULO DE PROGRAMACIÓN ESTRUCTURADA. Ing. Edgar Calderón Sánchez. Página 1 UNIDAD # 1 PROGRAMAS. Ing. Edgar Calderón Sánchez. Página 2 1.- SISTEMAS INFORMACIÓN. DE PROCESAMIENTO DE LA Un sistema en general se define como el conjunto de componentes conectados e interactivos, que tiene un propósito. Los sistemas de procesamiento de información son un sistema que transforman los datos en información organizada, significativa y útil. Los componentes de un sistema de proceso de información son tres: entrada, proceso y salida. Entrada: se le dan los datos que el sistema requiere, estos lo da el usuario del sistema. Proceso (procesamiento): este se realiza el CPU del computador, es donde se procesan los datos que el usuario suministro. Salida: este es el resultado o la información que nos suministra el CPU después de procesar los datos de entrada. Existen dos conceptos a considerar en los sistemas de información, el Hardware y el Software. Hardware.- es componentes). la parte física del computador (Dispositivo o Software.- es la parte lógica del computador (Programas). CPU o UPC (Unidad Central de Procesamiento) , este es el conjunto de circuitos eléctricos, que los como suma, resta, multiplicación, división, entre otros. Ing. Edgar Calderón Sánchez. Página 3 Memoria Central.- La información que se procesa, se almacena en este dispositivo hasta terminar los cálculos o el proceso. Dispositivos de almacenamiento secundario (memoria auxiliar) ,tales como disco o cintasmagnéticas, que se utilizan para almacenar grandes cantidades de información. Dispositivos de E/S.- estos permiten la comunicación con el usuario, o sea, usuarioalgunos son Teclado, monitor, impresora, mouse y otros. 2.- EL CICLO DE VIDA DE UNA APLICACIÓN Una de las cosas que se han definido tras el nacimiento de la ingeniería del software ha sido el ciclo de vida de una aplicación. El ciclo de vida define los pasos que sigue el proceso de creación de una aplicación desde que se propone hasta que finaliza su construcción. Los pasos son: Análisis. En esta fase se determinan los requisitos que tiene que cumplir la aplicación. Se anota todo aquello que afecta al futuro funcionamiento de la aplicación. Este paso le realiza un analista Diseño. Se especifican los esquemas de diseño de la aplicación. Estos esquemas forman los planos del programador, los realiza el analista y representan todos los aspectos que requiere la creación de la aplicación. Ing. Edgar Calderón Sánchez. Página 4 Codificación. En esta fase se pasa el diseño a código escrito en algún lenguaje de programación. Esta es la primera labor que realiza el programador. Pruebas. Se trata de comprobar que el funcionamiento de la aplicación es la adecuada. Se realiza en varias fases: a) Prueba del código.- Las realizan programadores. Normalmente programadores distintos a los que crearon el código, de ese modo la prueba es más independiente y generará resultados más óptimos. b) Versión alfa.- Es una primera versión terminada que se revisa a fin de encontrar errores. Estas pruebas conviene que sean hechas por personal no informático. El producto sólo tiene cierta apariencia de acabado. c) Versión beta.- Versión casi definitiva del software en la que no se estiman fallos, pero que se distribuye a los clientes para que encuentren posibles problemas. A veces está versión acaba siendo la definitiva (como ocurre con muchos de los programas distribuidos libremente por Internet). Mantenimiento.- Tiene lugar una vez que la aplicación ha sido ya distribuida, en esta fase se asegura que el sistema siga funcionando aunque cambien los requisitos o el sistema para el que fue diseñado el software. Antes esos cambios se hacen los arreglos pertinentes, por lo que habrá que retroceder a fases anteriores del ciclo de vida. Ing. Edgar Calderón Sánchez. Página 5 3.- TIPO DE ERRORES DE UNA APLICACIÓN. Los errores de programación pertenecen a tres categorías: errores de compilación, errores en tiempo de ejecución y errores lógicos. Las técnicas para depurar cada uno de ellos se tratarán en las tres lecciones siguientes. 3.1.- ERRORES DE COMPILACIÓN. Los errores de compilación, también conocidos como errores del compilador, son errores que impiden que su programa se ejecute. Cuando presiona F5 para ejecutar un programa, Visual Basic compila el código en un lenguaje binario que el equipo entiende. Si el compilador de Visual Basic se encuentra con código que no entiende, emite un error de compilador. La mayoría de los errores del compilador se deben a errores cometidos al escribir el código. Por ejemplo, puede escribir mal una palabra clave, omitir alguna puntuación necesaria o intentar utilizar una instrucción EndIf sin antes utilizar una instrucción If. Afortunadamente, el editor de código de Visual Basic se diseñó para identificar estos errores antes de que se intente ejecutar el programa. Aprenderá a encontrar y corregir los errores de compilación en la lección siguiente, Encontrar y eliminar errores del compilador. 3.2.- ERRORES EN TIEMPO DE EJECUCIÓN. Los errores en tiempo de ejecución son errores que aparecen mientras se ejecuta su programa. Estos errores aparecen normalmente cuando su programa intenta una operación que es imposible que se lleve a cabo. Un ejemplo de esto es la división por cero. Suponga que tiene la instrucción siguiente: Speed = Miles / Hours Si la variable Hours tiene un valor de 0, se produce un error en tiempo de ejecución en la operación de división. El programa se debe ejecutar para que se pueda detectar este error y si Hours contiene un valor válido, no se producirá el error. Ing. Edgar Calderón Sánchez. Página 6 Cuando aparece un error en tiempo de ejecución, puede usar las herramientas de depuración de Visual Basic para determinar la causa. Aprenderá a encontrar y corregir los errores en tiempo de ejecución en la lección ¡No funciona! Encontrar y eliminar errores en tiempo de ejecución. 3.3.- ERRORES LÓGICOS. Los errores lógicos son errores que impiden que su programa haga lo que estaba previsto. Su código puede compilarse y ejecutarse sin errores, pero el resultado de una operación puede generar un resultado no esperado. Por ejemplo, puede tener una variable llamada FirstName y establecida inicialmente en una cadena vacía. Después en el programa, puede concatenar FirstName con otra variable denominada LastName para mostrar un nombre completo. Si olvida asignar un valor a FirstName, sólo se mostrará el apellido, no el nombre completo como pretendía. Los errores lógicos son los más difíciles de detectar y corregir, pero Visual Basic también dispone de herramientas de depuración que facilitan el trabajo. Aprenderá a encontrar y corregir los errores lógicos en ¿Qué? Esto no debiera haber ocurrido. Encontrar errores lógicos. 4.- PROGRAMACIÓN. La programación informática, a menudo acortada como programación, es el proceso de diseñar, codificar, depurar y mantener el código fuente de programas computacionales. El código fuente es escrito en un lenguaje de programación. El propósito de la programación es crear programas que exhiban un comportamiento deseado. El proceso de escribir código requiere frecuentemente conocimientos en varias áreas distintas, además del dominio del lenguaje a utilizar, algoritmos especializados y lógica formal. Programar no involucra necesariamente otras tareas tales como el análisis y diseño de la aplicación (pero sí el diseño del código), aunque sí suelen estar fusionadas en el desarrollo de pequeñas aplicaciones. Ing. Edgar Calderón Sánchez. Página 7 5.- HISTORIA. Para crear un programa, y que la computadora lo intérprete y ejecute las instrucciones escritas en él, debe usarse un lenguaje de programación. En sus inicios las computadoras interpretaban sólo instrucciones en un lenguaje específico, del más bajo nivel, conocido como código máquina, siendo éste excesivamente complicado para programar. De hecho sólo consiste en cadenas de números 1 y 0 (sistema binario). Para facilitar el trabajo de programación, los primeros científicos que trabajaban en el área decidieron reemplazar las instrucciones, secuencias de unos y ceros, por palabras o letras provenientes del inglés; las codificaron y crearon así un lenguaje de mayor nivel, que se conoce como Assembly o lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente lo mismo que hacerlo en lenguaje máquina, pero las letras y palabras son bastante más fáciles de recordar y entender que secuencias de números binarios. A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método sencillo para programar. Entonces, se crearon los lenguajes de alto nivel. Mientras que una tarea tan trivial como multiplicar dos números puede necesitar un conjunto de instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una. Una vez que se termina de escribir un programa, sea en ensamblador o en un lenguaje de alto nivel, es necesario compilarlo, es decir, traducirlo a lenguaje máquina. Ejemplos de multiplicar 2 números en Assembly. TITLE multiplicacion ; CALCULO DE DOS DIGITOS .MODEL SMALL .STACK 100H .DATA D1 DB ? D2 DB ? CRLF DB 10,13,10,13,'$' _TITULO DB 'MULTIPLICACION DE DOS DIGITOS' _DIGITO1 DB 'DIGITO 1 = $' _DIGITO2 DB 'DIGITO 2 = $' _RESULT DB ' EL RESULTADO ES -----> $' .CODE _INICIA_OPERACION: Ing. Edgar Calderón Sánchez. Página 8 MOV AX,@DATA MOV DS,AX MOV DX,OFFSET CRLF ;insertarlinea MOV AH,09H INT 21H MOV DX,OFFSET _TITULO ;mensaje como titulo MOV AH,09H INT 21H MOV DX,OFFSET CRLF ;insertarlinea MOV AH,09H INT 21H MOV DX,OFFSET _DIGITO1 MOV AH,09H INT 21H MOV AH,01H INT 21H MOV D1, AL SUB D1,30H MOV DX,OFFSETcrlf ;insertarlinea MOV AH,09H INT 21H MOV DX,OFFSET _DIGITO2 MOV AH,09H INT 21H MOV AH,01H INT 21H MOV D2,AL SUB D2,30H MOV DX,OFFSET CRLF MOV AH,09H INT 21H MOV DX,OFFSET CRLF MOV AH,09H INT 21H ;CALCULO DE LA MULTIPLICACION---MOV AX,0H ;LIMPIAR EL ACUMULADOR MOV AL,D1 MUL D2 AAM ; (AAM) >> aplicar ajuste ASCII de la multiplicacion *********** MOV BX,AX ;MOSTRAR EL RESULTADO DE LA OPERACION MOV DX,OFFSET _RESULT MOV AH,09H INT 21H Ing. Edgar Calderón Sánchez. Página 9 MOV DL,BH ;mostrar decenas ADD DL,30H MOV AH,02H INT 21H MOV DL,BL ;mostrar unidades ADD DL,30H MOV AH,02H INT 21H ;insertarlinea MOV DX,OFFSETcrlf MOV AH,09H INT 21H _SALIR_A_MODO_DE_MSDOS: MOV AH,4CH INT 21H END _INICIA_OPERACION Líneas de códigos = 74 Ejemplos de multiplicar 2 números en c. #include<conio.h> #include<stdio.h> void main() { int n1,n2,rm; clrscr(); printf("ingrese el primer número”); scanf(“%d”,&n1); printf("ingrese el segundonúmero”); scanf(“%d”,&n2); rm=n1 * n2; printf(“La multiplicación es : %d”,&rm); getch(); } Líneas de códigos = 14 Ing. Edgar Calderón Sánchez. Página 10 6.- LÉXICO Y PROGRAMACIÓN. La programación se rige por reglas y un conjunto más o menos reducido de órdenes, expresiones, instrucciones y comandos que tienden a asemejarse a una lengua natural acotada (en inglés); y que además tienen la particularidad de una reducida ambigüedad. Cuanto menos ambiguo es un lenguaje de programación, se dice, es más potente. Bajo esta premisa, y en el extremo, el lenguaje más potente existente es el binario, con ambigüedad nula (lo cual lleva a pensar así del lenguaje ensamblador). En los lenguajes de programación de alto nivel se distinguen diversos elementos entre los que se incluyen el léxico propio del lenguaje y las reglas semánticas y sintácticas. 7.- TIPOS DE PROGRAMACION. Existen varias clases de programación, dependiendo de los métodos utilizados y las técnicas empleadas. Los tipos o técnicas de programación son bastante variados, aunque puede que muchos de los lectores sólo conozcan una metodología para realizar programas. En la mayoría de los casos, las técnicas se centran en programación modular y programación estructurada, pero existen otros tipos de programación. 7.1.- PROGRAMACIÓN ESTRUCTURADA (PE). La programación estructurada está compuesta por un conjunto de técnicas que han ido evolucionando, aumentando considerablemente la productividad del programa reduciendo el tiempo de depuración y mantenimiento del mismo. Esta programación estructurada utiliza un número limitado de estructuras de control, reduciendo así considerablemente los errores. Ing. Edgar Calderón Sánchez. Página 11 Esta técnica incorpora: Diseño descendente (top-dow): el problema se descompone en etapas o estructuras jerárquicas. Recursos abstractos (simplicidad): consiste en descompones las acciones complejas en otras más simples capaces de ser resueltas con mayor facilidad. Estructuras básicas: existen tres tipos de estructuras básicas: o Estructuras secuénciales: cada acción sigue a otra acción secuencialmente. La salida de una acción es la entrada de otra. o Estructuras selectivas: en estas estructuras se evalúan las condiciones y en función del resultado de las mismas se realizan unas acciones u otras. Se utilizan expresiones lógicas. o Estructuras repetitivas: son secuencias de instrucciones que se repiten un número determinado de veces. Las principales ventajas de la programación estructurada son: Los programas son más fáciles de entender. Se reduce la complejidad de las pruebas. Aumenta la productividad del programador. Los programas queden mejor documentados internamente. Un programa está estructurado si posee un único punto de entrada y sólo uno de salida, existen de "1 a n" caminos desde el principio hasta el fin del programa y por último, que todas las instrucciones son ejecutables sin que aparezcan bucles infinitos. Ing. Edgar Calderón Sánchez. Página 12 7.2.- PROGRAMACIÓN MODULAR(PM). En la programación modular consta de varias secciones dividas de forma que interactúan a través de llamadas a procedimientos, que integran el programa en su totalidad. En la programación modular, el programa principal coordina las llamadas a los módulos secundarios y pasa los datos necesarios en forma de parámetros. A su vez cada módulo puede contener sus propios datos y llamar a otros módulos o funciones. Un 'módulo' es cada una de las partes de un programa que resuelve uno de los subproblemas en que se divide el problema complejo original. Cada uno de estos módulos tiene una tarea bien definida y algunos necesitan de otros para poder operar. En caso de que un módulo necesite de otro, puede comunicarse con éste mediante una interfaz de comunicación que también debe estar bien definida. Si bien un módulo puede entenderse como una parte de un programa en cualquiera de sus formas y variados contextos, en la práctica se los suele tomar como sinónimos de procedimientos y funciones. Pero no necesaria ni estrictamente un módulo es una función o un procedimiento, ya que el mismo puede contener muchos de ellos. No debe confundirse el término "módulo" (en el sentido de programación modular) con términos como "función" o "procedimiento", propios del lenguaje que lo soporte. Ing. Edgar Calderón Sánchez. Página 13 7.3.- PROGRAMACIÓN ORIENTADA A OBJETOS (POO). Se trata de una técnica que aumenta considerablemente la velocidad de desarrollo de los programas gracias a la reutilización de los objetos. El elemento principal de la programación orientada a objetos es el objeto.El objeto es un conjunto complejo de datos y programas que poseen estructura y forman parte de una organización. Un objeto contiene varios datos bien estructurados y pueden ser visibles o no dependiendo del programador y las acciones del programa en ese momento. El polimorfismo y la herencia son unas de sus principales características. La programación orientada a objetos es una forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: 7.3.1.- CLASE. Definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas. 7.3.2.- HERENCIA. (Por ejemplo, herencia de la clase C a la clase D) es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables públicas declaradas en C. Los componentes registrados como "privados" (private) también se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y sólo pueden ser accedidos a Ing. Edgar Calderón Sánchez. Página 14 través de otros métodos públicos. Esto es así para mantener hegemónico el ideal de POO. 7.3.3.- OBJETO. Instancia de una clase. Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos), los mismos que consecuentemente reaccionan a eventos. Se corresponden con los objetos reales del mundo que nos rodea, o con objetos internos del sistema (del programa). Es una instancia a una clase. 7.3.4.- MÉTODO. Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema. 7.3.5.- EVENTO. Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento la reacción que puede desencadenar un objeto; es decir, la acción que genera. 7.3.6.- ATRIBUTOS. Características que tiene la clase. 7.3.7.- MENSAJE. Una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó. Ing. Edgar Calderón Sánchez. Página 15 7.3.8.- PROPIEDAD O ATRIBUTO. Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método. 7.3.9.- ESTADO INTERNO. Es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase. 7.3.10.- COMPONENTES DE UN OBJETO. Atributos, identidad, relaciones y métodos. 7.3.11.- IDENTIFICACIÓN DE UN OBJETO. Un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes. 7.4.- PROGRAMACIÓN CONCURRENTE. Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la vez. Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de forma simultánea. Se trata de una programación más lenta y laboriosa, obteniendo unos resultados lentos en las acciones. Ing. Edgar Calderón Sánchez. Página 16 7.4.1.- PRINCIPIOS GENERALES DE LA CONCURRENCIA. En un sistema multiprogramado con un único procesador, los procesos se intercalan en el tiempo para dar la apariencia de ejecución simultánea En un sistema con varios procesadores, no solo es posible intercalar los procesos, sino también superponerlos. La intercalación y la superposición representan formas de ejecución muy diferentes. Ambas técnicas pueden contemplarse como ejemplos de proceso concurrente y ambas plantean los mismos problemas. En el caso de un sistema monoprocesador, los problemas creados por la multiprogramación parten del hecho de que la velocidad relativa de ejecución de los procesos no puede predecirse. Los procesos concurrentes pueden funcionar en forma totalmente independiente unos de otros, o pueden ser asíncronos, lo cual significa que en ocasiones requieren cierta sincronización o cooperación. Cuando dos o más procesos llegan al mismo tiempo a ejecutarse, se dice que se ha presentado una concurrencia de procesos. Es importante mencionar que para que dos o más procesos sean concurrentes, es necesario que tengan alguna relación entre ellos como puede ser la cooperación para un determinado trabajo o el uso de información o recursos compartidos, por ejemplo: en un sistema de un procesador, la multiprogramación es una condición necesaria pero no suficiente para que exista concurrencia, ya que los procesos pueden ejecutarse de forma totalmente independiente. Ing. Edgar Calderón Sánchez. Página 17 7.5.- PROGRAMACIÓN FUNCIONAL. Se caracteriza principalmente por permitir declarar y llamar a funciones dentro de otras funciones. Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas, en las que se verifican ciertas propiedades como la transparencia referencial (el significado de una expresión depende únicamente del significado de sus subexpresiones), y por tanto, la carencia total de efectos colaterales. Otras características propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteración (lo que obliga en la práctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas). Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los híbridos. La diferencia entre ambos estriba en que los lenguajes funcionales híbridos son menos dogmáticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignación de variables. En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional híbrido. Ing. Edgar Calderón Sánchez. Página 18 7.6.- PROGRAMACIÓN LÓGICA. Se suele utilizar en la inteligencia artificial y pequeños programas infantiles. Se trata de una programación basada en el cálculo de predicados (una teoría matemática que permite lograr que un ordenador basándose en hecho y reglas lógicas, pueda dar soluciones inteligentes). La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer orden, aunque también incorporan algunos comportamientos de orden superior como la lógica difusa. En este sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la única teoría lógica de orden superior que es demostradamente computable (hasta el momento). 7.6.1.- CARACTERISTICAS DE LA PROGRAMACION LOGICA Unificación de términos. Mecanismos de inferencia automática. Recursión como estructura de control básica. Visión lógica de la computación. 7.7.- LENGUAJES DE PROGRAMACION LOGICA. Un lenguaje es el CLP pero el lenguaje de programación lógica por excelencia es el PROLOG. Prolog: es un Lenguaje de Programación diseñado para representar y utilizar el conocimiento que se tiene sobre un determinado dominio. Los programas en Prolog responden preguntas sobre el tema del cual tienes conocimiento. Ing. Edgar Calderón Sánchez. Página 19 8.- OBJETOS DE UN PROGRAMA. Un objeto es una unidad dentro de un programa de computadora que consta de un estado y de un comportamiento, que a su vez constan respectivamente de datos almacenados y de tareas realizables durante el tiempo de ejecución. Un objeto puede ser creado instanciando una clase, como ocurre en la programación orientada a objetos, o mediante escritura directa de código y la replicación otros objetos, como ocurre en la programación basada en prototipos. Estos objetos interactúan unos con otros, en contraposición a la visión tradicional en la cual un programa es una colección de subrutinas (funciones o procedimientos), o simplemente una lista de instrucciones para el computador. Cada objeto es capaz de recibir mensajes, procesar datos y enviar mensajes a otros objetos de manera similar a un servicio. En el mundo de la programación orientada a objetos (POO), un objeto es el resultado de la instanciación de una clase. Una clase es el anteproyecto que ofrece la funcionalidad en ella definida, pero ésta queda implementada sólo al crear una instancia de la clase, en la forma de un objeto. Por ejemplo: dado un plano para construir sillas (una clase de nombre clase_silla), entonces una silla concreta, en la que podemos sentarnos, construida a partir de este plano, sería un objeto de clase_silla. Es posible crear (construir) múltiples objetos (sillas) utilizando la definición de la clase (plano) anterior. Los conceptos de clase y objetos son análogos a los de tipo de datos y variable; es decir, definida una clase podemos crear objetos de esa clase, igual que disponiendo de un determinado tipo de dato (por ejemplo el tipo entero), podemos definir variables de dicho tipo: Ing. Edgar Calderón Sánchez. Página 20 inta,b; ( 'int' es un tipo de dato y 'a' y 'b' son variables de tipo entero con las que podemos operar) Para utilizar la funcionalidad definida en una clase en particular (salvo en las clases abstractas), primeramente es necesario crear un objeto de esa clase. De la misma manera, para una persona que desea sentarse, las especificaciones para construir una silla serán de poca utilidad; lo que se necesita es una silla real construida a partir de esas especificaciones. Siguiendo con la analogía anterior, también se puede decir que para hacer operaciones aritméticas, de nada sirve por sí solo el tipo entero (int); para ello necesitamos variables (o constantes) con las que operar. 9.- TIPOS DE DATOS-CONSTANTES ,VARIABLES. 9.1.- TIPOS DE DATOS. En el lenguaje C estandarizado como C89, existían cuatro tipos de datos básicos que son: los números enteros, los números reales, los caracteres, y los punteros. A partir del estándar C99 se agregan: los valores lógicos (verdadero o falso) y los números complejos. Estos tipos de datos son parte del lenguaje, y por ello se los considera primitivos. Más adelante veremos que con el uso de estructuras y uniones es posible crear tipos compuestos de datos a partir de estos tipos primitivos. En este capítulo veremos los enteros, los reales y los caracteres. Más adelante se verán otros tipos de datos más complejos, como son los vectores, las cadenas de caracteres, y los punteros en general. Ing. Edgar Calderón Sánchez. Página 21 9.2.- ENTEROS. Los enteros son el tipo de dato más primitivo en C. Se usan para representar números enteros. Pero siempre se pueden encontrar otras aplicaciones para los números enteros. En general se pueden usar para representar cualquier variable discreta. Los tipos de datos enteros son: short, int, long y longlong, cada uno representando un número entero de un tamaño o capacidad determinado. Según el compilador y la plataforma de hardware, cada uno de estos tipos de dato puede ocupar desde 1 byte hasta 8 bytes en memoria. Además, el lenguaje C hace la distinción de si el entero es con signo (signed) o sin signo (unsigned). En caso de que no se declare si es con signo o sin signo, se toma con signo. Algunos ejemplos de declaraciones de enteros: int a; unsignedint a; signed long a; signed long long a = 10000000; a=7 a= 158 a= -895 a= 78584 Ing. Edgar Calderón Sánchez. Página 22 9.3.- FLOTANTES. Se denomina flotantes a los tipos de datos que representan a los números reales, ya que utilizan un sistema de representación basado en la técnica de coma flotante, que permite operar con números reales de diversas magnitudes, mediante un número decimal llamado mantisa y un exponente que indica el orden de magnitud. El tipo de dato flotante en lenguaje C sólo tiene dos tamaños: el float y el double, que son 4 bytes y 8 bytes respectivamente. Se los puede utilizar tanto para representar números decimales, como para representar números enteros con un orden de magnitud muy grande. La forma de declarar una variable flotante es escribiendo en una línea uno de los tipos de datos flotantes y a continuación el nombre de la variable y tal vez algún valor que se les quiera dar. Algunos ejemplos: float a; double a = 1e23; double a = 3.1416; float a = 4e-9; double a = -78; Hay que tener en cuenta que aunque los valores flotantes son más convenientes para algunas aplicaciones, hay casos en los que se prefieren los enteros. Esto se debe a que los números flotantes no necesariamente tienen soporte de hardware, en particular en las plataformas integradas. Una alternativa que se utiliza en estas situaciones es interpretar los enteros como decimales de forma que 150 se interprete como 1.5 y 2345 como 23.45. Para el caso de los flotantes de 4 bytes, se utiliza 1 bit para el signo, 8 bits para el exponente y 23 bits para el valor del número. Ing. Edgar Calderón Sánchez. Página 23 9.4.- CARACTERES. Los caracteres se representan utilizando el tipo char, que tiene sólo 1 byte de tamaño. Este tipo se utiliza para representar los 256 caracteres de la tabla de caracteres del sistema. El tipo char es también un tipo entero, ya que puede tomar valores de 0 a 255. Por lo tanto también puede ser signed o unsigned. En cuanto a la forma de declarar variables de tipo char es la misma forma que con los otros tipos. char a; char a = 's'; unsigned char a = 48; Como puedes ver, se le puede asignar un número a una variable char, ya que se trata de un tipo entero. En muchas situaciones se utiliza el tipo char para almacenar números pequeños, ya que ocupa en memoria sólamente un byte. Es importante notar que con la llegada de la codificación UTF-8, los caracteres de los diversos idiomas pueden ocupar 1, 2, 3 o 4 bytes, de modo que el tipo char ya no alcanza para la representación de todos los caracteres posibles. Por ello, el estándar C99 introduce el tipo wchar que puede ocupar más de 1 byte, según sea necesario para la codificación utilizada por el sistema. Ing. Edgar Calderón Sánchez. Página 24 9.5.- CONSTANTES. Una constante es una partida de datos que permanecen sin cambios en el programa (durante el desarrollo y ejecución). Ejemplos: 3.1416 (valor de pi, este valor no debe variar) 2000 (año en que según Nostradamus se acabaría el mundo XD) ‘a’ (primera letra del alfabeto) 9.6.- VARIABLES. Una variable es una partida de datos cuyo valor puede cambiar en el programa (durante el desarrollo y ejecución). Los diferentes tipos de variables dependen del lenguaje de programación, por lo general estas suelen ser enteras, reales, carácter, lógicas y de cadena. Tanto las variables como las constantes tienen un nombre o identificador generalmente conformado por caracteres alfanuméricos (ciertos lenguajes de programación admiten el carácter de subrayado ‘_’ como válido en los identificadores), y el primero de éstos debe ser una letra. Ejemplos: variable1 numerador primer_jugador Ing. Edgar Calderón Sánchez. Página 25 Por estética y comodidad durante el desarrollo del algoritmo se suele usar palabras en MAYUSCULAS para las constantes y en minúsculas para las variables. Si se desea usar varias palabras como nombre para una variable, éstas deben estar unidas, la primera palabra en minúsculas y el primer carácter de la segunda en mayúscula (así se ve más bonito XD). Ejemplos: miVariable MICONSTANTE primerJugador 10.- TIPOS DE OPERADORES. Todo sistema de computación es alimentado con datos. La representación de los datos incide en la elaboración de los algoritmos. El sistema de identificación de los datos se denomina “estructura de datos”, y depende de las características de estos. -Los datos son los siguientes; a) Datos numéricos: • Enteros. • Reales. • Reales decimales. • Reales exponenciales. Ing. Edgar Calderón Sánchez. Página 26 b) Datos alfanuméricos: • De carácter. • De cadena. c) Datos lógicos: • Verdadero [True] • Falso [False] 10.1.- TIPOS DE DATOS: NUMÉRICOS. Son aquellos que se utilizan para realizar operaciones aritméticas. 10.1.1.- Enteros; corresponden a números “completos”, o sea que no tienen parte decimal, pueden ser negativos, positivos o cero. Ejemplo: La edad de una persona (39), el total de estudiantes en un grupo (36). 10.1.2.- Reales; son aquellos números que poseen punto decimal. Pueden ser negativos, positivos o cero. Reales decimales; son los que constan de una parte entera y una decimal (en algunos casos se puede omitir la parte entera o la decimal). Ejemplo: La nota de un estudiante (4.7), el porcentaje de algún impuesto (0.16). 10.1.3.- Reales exponenciales (de punto flotante); son aquellos números que se expresan en función de potencias de 10; esta expresión es conocida como notación científica. Ejemplo: -2.85E03; 0.735E-4; 0.58E-1 Ing. Edgar Calderón Sánchez. Página 27 10.2.- TIPOS DE DATOS: ALFANUMÉRICOS Corresponden al conjunto de caracteres alfabéticos, numéricos, y/o especiales; con ellos no se efectúan operaciones matemáticas. 10.2.1.- Carácter; cuándo se hace referencia a un solo carácter, y debe encerrarse entre apostrofes (‘ ‘). Ej: Sexo de una persona (‘M’ o ‘F’), estado civil (‘S’, ‘C’, ‘V’). 10.2.2.- Cadena; Cuándo se hace referencia a más de un carácter, siempre debe encerrarse entre comillas (“ “). Ej: código de un estudiante (“2041220”), nombre de una persona (“Víctor Hugo Torres”), dirección donde reside una persona (“Calle 100 # 50 - 20), número telefónico (“3002125820”). 10.3.- TIPOS DE DATOS: LÓGICOS. Son aquellos datos que solo pueden tomar dos valores: 1. Valor verdadero – true 2. Valor falso – false 11.- OPERADORES. Un operador es un símbolo que se utiliza para manipular datos. 11.1.- Los operadores se clasifican en: – Aritméticos. – Relacionales. – Lógicos. 11.2.- Operadores: Aritméticos: + Suma - Resta Ing. Edgar Calderón Sánchez. Página 28 * Multiplicación / División (div) % Módulo o residuo (Mod) ^ ó ** Potencia = Asignación 11.3.- Operadores: Relacionales. > Mayor que < Menor que (=) == Igual a (<>) != Diferente de >= Mayor o igual que <= Menor o igual que 11.4.- Operadores: Lógicos. (*) && Conjunción (y) (+) | | Disyunción (o) (~) ! Negación (no) 12.- LENGUAJES DE PROGRAMACION. Un lenguaje de programación es un lenguaje formal diseñado para expresar procesos que pueden ser llevados a cabo por máquinas como las computadoras. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana. Ing. Edgar Calderón Sánchez. Página 29 Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila (de ser necesario) y se mantiene el código fuente de un programa informático se le llama programación. También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos: El desarrollo lógico del programa para resolver un problema en particular. Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa). Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina. Prueba y depuración del programa. Desarrollo de la documentación. Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático'. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo HTML (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación, sino un conjunto de instrucciones que permiten estructurar el contenido de los documentos). Ing. Edgar Calderón Sánchez. Página 30 Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa. 13.- ENSAMBLADORES INTERPRETES Y COMPILADORES 13.1.- ENSAMBLADORES. El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina, ejecutable directamente por la máquina para la que se ha generado. El propósito para el que se crearon este tipo de aplicaciones es la de facilitar la escritura de programas, ya que escribir directamente en código binario, que es el único código entendible por la computadora, es en la práctica imposible. La evolución de los lenguajes de programación a partir del lenguaje ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programa compilador. 13.1.1.- TIPOS DE ENSAMBLADORES. Podemos distinguir entre dos tipos de ensambladores: Ing. Edgar Calderón Sánchez. Página 31 13.2.- ENSAMBLADORES BÁSICOS. Son de muy bajo nivel, y su tarea consiste básicamente en ofrecer nombres simbólicos a las distintas instrucciones, parámetros y cosas tales como los modos. 13.2.1.- ENSAMBLADORES MODULARES 32-BITS O DE ALTO NIVEL. Son ensambladores que aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits, muchos de ellos teniendo compatibilidad hacia atrás pudiendo trabajar con programas con estructuras de 16 bits. Además de realizar la misma tarea que los anteriores, permitiendo también el uso de macros, permiten utilizar estructuras de programación más complejas propias de los lenguajes de alto nivel. 13.3.- INTERPRETES. Un intérprete es un programa capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel. Los intérpretes suelen contraponerse a los compiladores, ya que mientras que los segundos se encargan de traducir un programa desde su descripción en un lenguaje de programación al código máquina del sistema destino, los primeros sólo realizan la traducción a medida que sea necesario y normalmente, no guardan el resultado de dicha traducción. La desventaja principal de los interpretadores es que cuando se interpreta un programa, típicamente corre más lentamente que si hubiera sido compilado. La diferencia en velocidades puede ser minúscula o grande; a menudo un orden de magnitud y a veces más. Generalmente toma más tiempo correr un programa bajo un interpretador que correr el código compilado, pero puede tomar menos tiempo para interpretarlo que el tiempo total requerido para compilarlo y ejecutarlo. Esto es Ing. Edgar Calderón Sánchez. Página 32 especialmente importante si se está haciendo y probando un código prototipo cuando un ciclo de editar, interpretar y depurar del interpretador, a menudo puede ser mucho más corto que el ciclo de editar, compilar, ejecutar y depurar del compilador. 13.4.- COMPILADORES. Un compilador es un programa que, a su vez, traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente. Usualmente el segundo lenguaje es código máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación. La razón principal para querer usar un compilador es querer traducir un programa de un lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje máquina). De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a cómo piensa un ser humano, para luego compilarlo a un programa más manejable por una computadora. La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto. 13.4.1.- Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al Análisis léxico (que consiste componentes en la descomposición léxicos), Análisis del sintáctico programa (agrupación fuente de en los componentes léxicos en frases gramaticales ) y Análisis semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico). Ing. Edgar Calderón Sánchez. Página 33 13.4.2.- Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de código objeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible). Alternativamente, las fases descritas para las tareas de análisis y síntesis se pueden agrupar en Front-end y Back-end: 13.4.3.- Front-end:Es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar, y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio. 13.4.4.- Back-end:Es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End. Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Suele incluir la generación y optimización del código dependiente de la máquina. El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker). Ing. Edgar Calderón Sánchez. Página 34 UNIDAD # 2 PROGRAMACIÓN. Ing. Edgar Calderón Sánchez. Página 35 14.- REPRESENTACIÓN: DIAGRAMA DE FLUJO. Es la representación gráfica de un algoritmo, el cual muestra mediante la utilización de diversos símbolos, los pasos o procesos a seguir para alcanzar la solución de un problema. Se les llama diagrama de flujo por que los símbolos utilizados se conectan por medio de flechas para indicar la secuencia de las operaciones Los símbolos que más se emplean en un diagrama son los siguientes: Símbolo que se utiliza para representar el inicio y el fin de un diagrama de flujo Símbolo que se utiliza para representar la entrada y salida de datos (se declaran las variables) Representa la unidad de entrada de datos por teclado. Representa los procesos (las operaciones y cálculos) Ing. Edgar Calderón Sánchez. Página 36 Representa una decisión en él se escribe una decisión y dependiendo del resultado de la evaluación de la misma se sigue por una de las ramas o caminos alternativos. Representa a la repetición de un conjunto de datos. Se lo utiliza para expresar la conexión dentro de una misma página Representa la conexión entre página diferentes. Símbolo que se utiliza para representar la salida de datos por pantalla. Símbolo que se utiliza para representar la salida de datos por la impresora. Las líneas son las que marcan el orden de las secuencias de operaciones e indican el sentido d ejecución de las operaciones Ing. Edgar Calderón Sánchez. Página 37 15.- REGLAS PARA ELABORAR UN DIAGRAMA DE FLUJO. En el diseño de un diagrama es conveniente seguir las siguientes reglas: o El inicio del diagrama debe parecer en la parte superior. o Los símbolos de inicio y fin deberán aparecer solo una vez. o Todos los símbolos deben estar conectados por medio de líneas de flujo. o El flujo de las operaciones deben representarse, si es posible, de arriba hacia abajo y de izquierda a derecha, en cuyo caso pueden omitirse las puntas de flechas. o La representación de las bifurcaciones y bucles, así como en el conjunto total del diagrama deben tener una cierta simetría. o Las líneas de flujo para indicar la dirección de flujo del diagrama deben ser rectas, verticales y horizontales. Evite los cruces de líneas de flujo. EJEMPLO: Crear el diagrama de flujo que proporcione el precio medio de un producto a partir del precio en tres establecimientos distintos. Ing. Edgar Calderón Sánchez. Página 38 16.- PSEUDOCÓDIGO. El pseudocódigo es un lenguaje de especificación de algoritmos (no de programación) basado en un sistema notacional, con estructuras sintácticas y semánticas, similares a los lenguajes procedurales, aunque menos formales que las de éstos, por lo que no puede ser ejecutado directamente por un computador. El pseudocódigo utiliza para representar las sucesivas acciones, palabras reservadas - similares a sus homónimas en los lenguajes de programación-, tales como start,end, stop, if-thenelse, while-do, repeat-until, (inicio, fin, parar, si-entoncessino,mientras-hacer, repetir-hasta), etc. A lo largo de este capítulo, a medida que vayamos describiendo las estructuras de control utilizadas en los programas, iremos haciendo una lista de las instrucciones más usuales del pseudocódigo. Las ventajas del uso del pseudocódigo residen en: Su uso en la planificación de un programa; permitiendo que el programador se pueda concentrar en la lógica y en las estructuras de control y no tenga que preocuparse, por ahora de detalles acerca de las reglas sintácticas y semánticas de un lenguaje específico. Consiguientemente es más fácil de modificar, en el caso de que se descubran errores o anomalías en la lógica del algoritmo. Aunque el pseudocódigo es independiente del lenguaje de alto nivel que vaya a utilizarse, un algoritmo expresado en pseudocódigo puede ser traducido más fácilmente a muchos de ellos. Ing. Edgar Calderón Sánchez. Página 39 Ejemplo: Realizar un pseudocódigo que permita sumar dos números. 1.- Inicio 2.- Declarar variables: Num1, Num2, Suma 3.- Leer <-- Num1 4. Leer <-- Num2 5.- Suma <-- Num1 + Num2 6.- Mostrar --> Suma 7.- Final 16.- ESTRUCTURA DE UN PROGRAMA EN C. Todo programa escrito en C consta de una o más funciones, una de las cuales se llama main. El programa siempre comenzará por la ejecución de la función main. Cada función debe contener: Una cabecera de la función, que consta del nombre de la función, seguido de una lista opcional de argumentos encerrados con paréntesis. Una lista de declaración de argumentos, si se incluyen estos en la cabecera. Una sentencia compuesta, que contiene el resto de la función. Los argumentos son símbolos que representan información que se le pasa a la función desde otra parte del programa. (También se llaman parámetros a los argumentos). Cada sentencia compuesta se encierra con un par de llaves, {.....}. Las llaves pueden contener combinaciones de sentencias elementales Ing. Edgar Calderón Sánchez. Página 40 (denominadas sentencias de expresión) y otras sentencias compuestas. Así las sentencias compuestas pueden estar anidadas, una dentro de otra. Cada sentencia de expresión debe acabar en punto y coma (;). Los comentarios pueden aparecer en cualquier parte del programa, mientras estén situados entre los delimitadores /* ................ */ (por ejemplo: /*esto es un ejemplo*/). Los comentarios son útiles para identificar los elementos principales de un programa o simplemente para orientar a un posible usuario de ese código. Todo fichero fuente en C sigue la siguiente estructura; para verla más claramente pondremos un ejemplo con sus correspondientes comentarios, que nos vayan explicando cada una de las partes, muchas de las cosas que se vean, no se conocen aún, pero nos servirán para hacernos una idea de cómo se estructura un programa: Ejemplo: #include <stdio.h> #include <conio.h> /*#include del sistema:Se deben especificar todos los ficheros de cabecera (ficheros con extensión .h) correspondientes a las librerías de funciones utilizadas. Son librerías implementadas y listas para que nosotros las usemos, con sólo llamar a la función que tenga implementada dentro dicha librería. Por ejemplo: la instrucción printf está incluida dentro de stdio.h, por tanto, cuando decidamos usarla, Ing. Edgar Calderón Sánchez. Página 41 tendremos que poner en esta sección: #include <stdio.h> */ #include <lista.h> /* #include de la aplicación:Ficheros de cabecera creados para el fichero fuente. Se puede decir que estos son los que yo he creado, que son invocados escribiendo su nombre seguido de .h. (Más tarde explicaremos cómo se crean). Si lo pongo entre signos: < > (como lo tenemos en este ejemplo), dicha librería será buscada en el directorio del compilador INCLUDE que contiene las librerías. Si por el contrario pongo: #include "lista.h", entonces, dicha librería será buscada 1º en el directorio actual, y luego, si no está, será buscada en el directorio del compilador INCLUDE*/ extern void salida(void); /* externvariables globales externas: Variables globales que voy a definir en otros módulos que voy a usar en este módulo. A salida le hemos asignado el tipo de almacenamiento extern, pues tiene que ser accedida desde otro archivo distinto de aquel en que es definida; por tanto, ha de ser una función externa. */ #define CIERTO 1 #define FALSO 0 /* #define definición de macros y constantes simbólicas.*/ Ing. Edgar Calderón Sánchez. Página 42 typedef struct { int dia; int mes; int ano; } FECHA; /* typedef definición de tipos: me sirve para crearme un tipo distinto de los preestablecidos de partida.*/ int suma (int , int); /* Declaración de los prototipos de las funciones implementados en este módulo: La declaración de una función le da información al compilador de una función que va a ser utilizada pero que todavía no ha sido implementada. En particular le dice al compilador qué tipo de datos requiere y cuál devuelve la función. En el ejemplo, la función con nombre suma recibe dos números enteros y da como salida otro número entero.*/ extern int a,b,c; /* Declaración de variables globales de este módulo: extern declaración de funciones externas a este módulo: Funciones que se utilizan en este módulo y que están implementadas en otro módulo. static declaración de las funciones internas no visibles para otros módulos: Funciones que se implementan en este módulo y que no pueden ser utilizadas en otros módulos. */ Ing. Edgar Calderón Sánchez. Página 43 main(){ ............ ............ } int suma(int x,int y){ ........... ........... } /* Implementación de las funciones: Se implementan todas las funciones del módulo incluida la función main().*/ 17.- CLASIFICACIÓN DE LAS INSTRUCCIONES. Una instrucción es lo que le ordenamos a la máquina para que ejecute, por eso se dice que un programa es un conjunto de instrucciones; ya que cuando ejecutamos un programa, se ejecutan así mismo en su interior muchas instrucciones que hacen que la máquina realice algo. 17.1.- Estos son los tipos de instrucciones: - instrucciones declarativas - instrucciones de asignación - instrucciones selectivas - instrucciones repetitivas - instrucciones de entrada y salida de datos - instrucciones de bifurcación Ing. Edgar Calderón Sánchez. Página 44 17.1.1.- INSTRUCCIONES DECLARATIVAS. Sirven para declarar librerías, variables, constantes, arreglos , punteros, estructuras… Por ejemplo: 1.) Para librerías: Las librerías las declaramos porque vamos a usar recursos que contienen ellas. #include <iostream.h> ——> cin , cout.. #include <conio.h> ——> función getch().. #include <string.h> ——> para manipular cadenas #include <math.h> ——> para operaciones numéricas #include <time.h> ——> para usar la hora #include <stdio.h> ——> para usar alternativas de entrada – salida como printf , scanf 2.) Para variables: Las variables las declaramos con el fin de tener un espacio para almacenar algun dato que va a cambiar con el tiempo. char nombre; int a,b,c; ——> Declarando variable tipo carácter ——> Declarando variable tipo entero double sueldo ——> Declarando variable tipo decimal short contador ——> Declarando variable tipo entero-corto Ing. Edgar Calderón Sánchez. Página 45 Sugerencia: leer cuanto espacio ocupa usar cada tipo de variable. Consejo: A las únicas variables que se deben dar valores iníciales son a: - Los contadores - Los acumuladores Acumuladores: se incrementa o decrementa en un valor variable. Ejemplo: sacar el promedio de un alumno, se suman las notas ( que varían ) y se divide para el numero de notas. Contadores: se incrementa o decrementa en una forma constante. Ejemplo: va contando de “1 en 1″ ó de “-3 en -3″ , etc… 3.) Para constantes: Las constantes las declaramos con el fin de tener un espacio para almacenar algún dato que no va a cambiar. Se las puede declarar de dos formas: Tomemos como ejemplo la fórmula para hallar el área de un triangulo: ¿ qué es lo que nunca cambia ? La base puede variar, la altura puede variar. Pero como vemos el “2” es constante, sea cual sea la base o la altura el 2 se queda ahí. Entonces si queremos declarar al “2” como una constante, podemos hacerlo de dos maneras: Ing. Edgar Calderón Sánchez. Página 46 1) Anteponiéndole ” #define ” al nombre de la constante y luego el valor que le corresponde, así: #define nomb 2 Nota: al usar éste método no se le pone el delimitador ” ; ” al final de la línea. A continuación coloco un ejemplo en código, para que tengan una idea de cómo sería: #include <iostream.h> main() { #define nomb 2 ——> Declarada la constante de la forma 1. int base,altura,area; cout<<”Ingrese base: \n”; cin >>base; cout<<”Ingrese altura: \n”; cin >>altura; area = ( base * altura )/nomb; cout<<”El area del triangulo es: “<< area <<endl; system(“pause”); } Ing. Edgar Calderón Sánchez. Página 47 2) Anteponiéndole ” const ” seguido del tipo de variable que és, despues el nombre de la constante y luego el valor que va a contener, asi: const int nomb = 2; Nota: a diferencia del método anterior, éste si lleva el delimitador” ; ” al final de la línea. A continuación coloco un ejemplo en codigo, para que tengan una idea de cómo sería: #include <iostream.h> main() { const int nomb = 2; ——> Declarada la constante de la forma 2. int base,altura,area; cout<<”Ingrese base: \n”; cin >>base; cout<<”Ingrese altura: \n”; cin >>altura; area = ( base * altura )/nomb; cout<<”El area del triangulo es: “<< area <<endl; system(“pause”); } Ing. Edgar Calderón Sánchez. Página 48 4.) Para arreglos: Los arreglos son un conjunto de variables del mismo tipo y nombre, pero indexadas por una posición diferente. float vector [12]; ——> Declarando un arreglo tipo flotante ( decimal ) Ése “vector” que se ha declarado arriba, al ser un arreglo quiere decir que hay 12 variables con el mismo nombre y son del mismo tipo, pero diferenciadas únicamente en su posición, así: vector[0],vector[1],vector[2],vector[3],vector[4],vector[5],vector[6], ………….. ,vector[10],vector[11]. Nota: los arreglos siempre comienzan en la posición cero ( 0 ) por eso llegan hasta una unidad menos, en éste caso como declaramos un arreglo de 12 , su tope será de 11; puesto a que desde cero ( 0 ) hasta once ( 11 ) hay doce ( 12 ) variables ;) 5.) Para punteros: Los punteros son variables que almacenan direcciones de memoria y se los reconoce por llevar un “asterisco” ( * ) delante del nombre de la variable, así: float * ventas ; 6.) Para estructuras: Las estructuras son una agrupación de variables que forman un registro, se las denota de ésta manera: struct alumno { Ing. Edgar Calderón Sánchez. Página 49 int cedula; char nombre; short edad; } 17.1.2.- INSTRUCCIONES DE ASIGNACIÓN. Sirven para dar valores a las variables, y llevan éste formato: nombre_variable = expresión ; Por ejemplo: a = 15 ; x=a+5; z=x/2; 17.1.3.- INSTRUCCIONES SELECTIVAS. Son mediante las cuales podemos ejecutar diferentes acciones, como resultado de una expresión que estemos evaluando en ese momento y pueden ser: - Las selectivas simples - Las selectivas dobles - Las selectivas múltiples 1.) Simples: Las que como resultado de una expresión que se esté evaluando, solo podemos ejecutar una opción por verdadero; ejemplo: if ( expresión a evaluar ) ——> Si ésa expresión es verdadera y solo es verdadera, se ejecutarán las acciones. { Ing. Edgar Calderón Sánchez. Página 50 acción_1; acción_2; } 2.) Dobles: Nos permite seleccionar entre dos diferentes acciones: - Una por verdadero - Otra por falso De ésta manera: if ( expresion a evaluar ) ——> Si ésa expresión es verdadera, se ejecutarán las acciones 1 y 2. { accion_1; accion_2; } else ——> Pero si ésa expresión era falsa, se ejecutarán las acciones 3 y 4. { accion_3; accion_4; } A profundidad: para ver más sobre el manejo de la condición if , puede acceder. Ing. Edgar Calderón Sánchez. Página 51 3.) Múltiples: Podemos ejecutar diferentes acciones como resultado de una expresión que estemos evaluando; ejemplo: switch ( expresión a evaluar ) vamos a evaluar. ——> Esta es la expresión que { case 1 : acción 1 ; case 2 : acción 2 ; case 3 : acción 3 ; } 17.1.4.- INSTRUCCIONES REPETITIVAS. Sirven para repetir una condición N veces, siempre y cuando la condición sea verdadera. a) Cuando no sabemos cuántas veces tendrá que ejecutarse una acción para que sea verdadera, se usa el While y el Do – While. Estas dos instrucciones repetitivas son muy parecidas en su función, y llegan al mismo resultado. Solo cambia la sintaxis: - Para while: While ( expresión ) ——> Mientras esa expresión sea verdadera hará las acciones 1 y 2. { Acción 1; Acción 2; } Ing. Edgar Calderón Sánchez. Página 52 - Para do – while: Do { acción 1; acción 2; } While ( expresión ) ——> Mientras esa expresión sea verdadera hará las acciones 1 y 2. b) Cuando sabemos cuántas veces queremos que se realice una acción, pues usamos la instruccion repetitiva ” for “, su sintaxis es la siguiente: for ( expresión inicial ; expresión final ; incremento / decremento ) { acciónes; ——> Hasta que no llegue a la “expresión final“, se ejecurá la acción una y otra vez. } 17.1.5.- INSTRUCCIONES DE ENTRADA Y SALIDA DE DATOS. El lenguaje C++ no tiene palabras reservadas para ingresar o mostrar datos, para ello usa recursos que se encuentran en las librerías. Por ejemplo: En la libreria <iostream.h> tenemos para la entrada y salida de datos a cin y cout respectivamente. Uso: Ing. Edgar Calderón Sánchez. Página 53 - Para la entrada de datos ( pedir ) cin >> nombre_del_usuario ; - Para la salida de datos ( mostrar ) cout << nombre_del_usuario En la libreria <stdio.h> tenemos para la entrada y salida de datos a scanf y printf respectivamente. Uso: - Para la entrada de datos ( pedir ) scanf ( ” %i %s %f ” , &edad apellido &sueldo ) ; Nota: Los amperson ( & ) van en todo tipo de variable menos en las cadenas de caracteres cuando usamos el scanf. - Para la salida de datos ( mostrar ) printf ( ” su edad es: %i ” , edad ) 17.1.6.- INSTRUCCIONES DE BIFURCACIÓN. Interrumpen el flujo normal de un programa, es decir que evitan que se ejecute alguna instrucción del programa y salta a otra parte del programa. Por ejemplo: el “ break “ Switch ( expresión que estamos evaluando ) { case 1 : cout << ” Hola! “ ; break ; Ing. Edgar Calderón Sánchez. Página 54 case 2 : cout << ” amig@s “ ; } En el ejemplo anterior tenemos, que en caso de que haya sido “1″ pues mostrará “Hola!” y saldrá del programa dejando a un lado lo demás. Entonces hemos comprobado que interrumpió el flujo normal del programa. Pero si tuviéramos algo de ésta manera: Switch (expresión que estamos evaluando) { case 1 : cout << ” Hola! “ ; case 2 : cout << ” amig@s ” ; case 3 : cout << ” bienvenidos a “ ; case 4 : cout << ” Programando: Paso a Paso “ ; break ; } Entonces el flujo normal del programa avanza hasta el caso 4 dónde vemos que está el ” break ” y él pues interrumpe el flujo normal del programa y ahí acabaría nuestro programa, como resultado nos hubiera mostrado lo siguiente: ” Hola! amig@s bienvenidos a Programando: Paso a Paso “. Así mismo, hay otras que cumplen funciones parecidas como por ejemplo: Ing. Edgar Calderón Sánchez. Página 55 continue : éste hace que se salte la instrucción en donde está y pase a la siguiente, por ejemplo: for ( x=1; x<10; x++ ) { if ( x == 5 ) continue; cout << x << endl; } Como resultado muestra: 1 – 2 – 3 – 4 – 6 – 7 – 8 – 9 No muestra el número 5, porque ahí se encuentra el continue. goto : éste nos lleva a una línea que indiquemos por medio de etiquetas. Así: A: if ( x == 100 ) goto A ; Y otros como ” return ” que devuelve un valor ( usado en funciones por lo general ), otro es ” exit ” que obliga a salir. Ing. Edgar Calderón Sánchez. Página 56 UNIDAD # 3 LENGUAJE C. PROGRAMACIÓN ESTRUCTURADA I APLICACIONES INFORMATICAS Ing. Edgar Calderón Sánchez. Página 57 18- C LENGUAJE ESTRUCTURADO. La programación estructurada es un paradigma de programación orientado a mejorar la claridad, calidad y tiempo de desarrollo de un programa de computadora, utilizando únicamente subrutinas y tres estructuras: secuencia, selección (if y switch) e iteración (bucles for y while), considerando innecesario y contraproducente el uso de la instrucción de transferencia incondicional (GOTO), que podría conducir a "código espagueti", que es mucho más difícil de seguir y de mantener, y era la causa de muchos errores de programación. A finales de los años 1970 surgió una nueva forma de programar que no solamente daba lugar a programas fiables y eficientes, sino que además estaban escritos de manera que facilitaba su mejor comprensión, no sólo proveyendo ventajas durante la fase de desarrollo, sino también posibilitando una más sencilla modificación posterior. Todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes: 1. Secuencia 2. Instrucción condicional. 3. Iteración (bucle de instrucciones) con condición al principio. Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor repertorio de estructuras de control, éstas pueden ser construidas mediante las tres básicas citadas. Ing. Edgar Calderón Sánchez. Página 58 19.- HISTORIA Y CARACTARISTICAS DE C. C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido. Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma. Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT. Una particularidad del C++ es la posibilidad de redefinir los operadores, y de poder crear nuevos tipos que se comporten como tipos fundamentales. El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C. Ing. Edgar Calderón Sánchez. Página 59 20.- CARACTERÍSTICAS DE C. 1. Tiene un conjunto completo de instrucciones de control. 2. Permite la agrupación de instrucciones. 3. Incluye el concepto de puntero (variable que contiene la dirección de otra variable). 4. Los argumentos de las funciones se transfieren por su valor. 5. E/S no forma parte del lenguaje, sino que se proporciona a través de una biblioteca de funciones. 6. Permite la separación de un programa en módulos que admiten compilación independiente. 7. Tamaño pequeño. 8. Uso extensivo de llamadas a funciones. 9. Comandos breves (poco tecleo). 10. Lenguaje estructurado. 21.- UN EDITOR DE TEXTO DE ELEMENTOS Un editor de texto es un programa que permite crear y modificar archivos digitales compuestos únicamente por un texto sin formato, conocidos comúnmente como archivos de texto o texto plano. El programa lee el archivo e interpreta los bytes leídos según el código de caracteres que usa el editor. Hoy en día es comúnmente de 7- u 8-bits en ASCII o UTF8, rara vez EBCDIC. Por ejemplo, un editor ASCII de 8 bits que lee el número binario 0110 0001 (decimal 97 o hexadecimal 61) en el archivo lo representará en la Ing. Edgar Calderón Sánchez. Página 60 pantalla por la figura a, que el usuario reconoce como la letra "a" y ofrecerá al usuario las funciones necesarias para cambiar el número binario en el archivo. Los editores de texto son incluidos en el sistema operativo o en algún paquete de software instalado y se usan cuando se deben crear o modificar archivos de texto como archivos de configuración, scripts o el código fuente de algún programa. El archivo creado por un editor de texto incluye por convención en DOS y Microsoft Windows la extensión ".txt", aunque pueda ser cambiada a cualquier otra con posterioridad. Tanto Unix como Linux dan al usuario total libertad en la denominación de sus archivos. Al trasladar archivos de texto de un sistema operativo a otro se debe considerar que existen al menos dos convenciones diferentes para señalar el término de una línea: Unix y Linux usan sólo retorno de carro en cambio Microsoft de carro y salto de línea. 21.1.- DIFERENCIA ENTRE TEXTO "PLANO" ARCHIVOS DE TEXTO CON DIAGRAMACIÓN. Y Los editores de textos "planos" se distinguen de los procesadores de texto en que se usan para escribir sólo texto, sin formato y sin imágenes, es decir sin diagramación. El texto plano es representado en el editor mostrando todos los caracteres presentes en el archivo. Los únicos caracteres de formateo son los caracteres de control del respectivo código de caracteres. En la práctica, éstos son: salto de línea, tabulación Ing. Edgar Calderón Sánchez. Página 61 horizontal y retorno de carro. El código de caracteres más usado en el año 2007 es el ASCII. Los documentos creados por un procesador de texto generalmente contienen más caracteres de control para darle al texto un formato o diagramación particular, a menudo protegidos de ser copiados por una marca registrada como por ejemplo negrilla, cursiva, columnas, tablas, tipografía, etc. En un comienzo se utilizaron tales formatos sólo en autoedición, pero hoy se utilizan incluso en el procesador de texto más sencillo. Los procesadores de texto pueden en la mayoría de los casos almacenar un texto plano en un archivo de texto plano, pero se le debe ordenar explícitamente que se desea esa opción, de otra manera podría guardarlo con algún formato especial. 22.- FUNCIONES DE USUARIO. FUNCIONES DE LIBRERÍA. 22.1.- FUNCIONES DE USUARIO Un programa en C++ se forma por una colección defunciones. Todos los programas se construyen a partir de una o más funciones que se integran para crear una aplicación Todas las funciones contienen uno o más estatutos C++y se crean generalmente para realizar una única tarea. La definición de una función se realiza escribiendo primero el tipo del valor de retorno de la función, después el nombre de la función, posteriormente entre paréntesis las variables que utilizará dicha función (parámetros) y finalmente las instrucciones de la función. Ing. Edgar Calderón Sánchez. Página 62 Las funciones definidas por el usuario se invocan por su nombre y los parámetros opcionales que se puedan tener. Ejemplo: double promedio( int a, int b, int c) { return (a + b + c ) / 3.0; } Declara a la función promedio, la cual recibe tres valores enteros y calcula y regresa el promedio de ellos. 22.2.- FUNCIONES DE LIBRERIAS. Es una colección de clases y funciones, escritas en el núcleo del lenguaje. La biblioteca estándar proporciona varios contenedores genéricos, funciones para utilizar y manipular esos contenedores, funciones objeto, cadenas y flujos genéricos. Ejemplos. #include "stdio.h" #include "conio.h" #include "stdlib.h" #include <string.h> #include <ctype.h> #include <locale.h> #include <math.h> #include <setjmp.h> #include <signal.h> #include <time.h> Ing. Edgar Calderón Sánchez. Página 63 23.- EJECUCION DE UN PROGRAMA EN C. Edición. El código se escribe en un editor de texto o en un editor de código preparado para esta acción. El archivo se suele guardar con extensión .cpp (también en cxx, c++ o cc). Preprocesado. lee Antes de compilar el código, el preprocesador las instrucciones de preprocesador y las convierte al código fuente equivalente. Compilación. El código fuente resultante en lenguaje C++ se compila mediante el software apropiado, obteniendo un código máquina llamado archivo objeto (cuya extensión suele ser .obj). Este código aún no es ejecutable ya que necesita incluir el código máquina relativo a Ing. Edgar Calderón Sánchez. Página 64 las funciones y módulos que se utilizaban en nuestro código. Estas funciones están incluidas en archivos externos (librerías). Enlazado. El código objeto se une al código compilado de las librerías y módulos invocados por el código anterior. El resultado es un archivo ejecutable. Cargado. Normalmente lo realiza el propio entorno de ejecución. El archivo ejecutable se lanza en el Sistemas Operativo. Ejecución de las instrucciones por la CPU. Es entonces cuando el procesador accede al código máquina del programa ya convertido y ejecuta las acciones. Será entonces cuando veamos los resultados. Estas dos últimas fases cubren lo que se conoce como ejecución del programa. Ing. Edgar Calderón Sánchez. Página 65