programacioni

March 22, 2018 | Author: Lautaro Albertuz | Category: Algorithms, Proposition, Programming Language, Computer Program, Truth


Comments



Description

Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación IAPUNTES DE PROGRAMACIÓN I Propósito Este apunte es un apoyo y un elemento de consulta para el curso de Programación I del 4to año de la especialidad Técnico en Informática Profesional y Personal de la EET No 5 Galileo Galilei, pero no constituye en sí mismo un curso de programación. Está dividido en varias secciones que no deben ser leídas en forma lineal, sino relacionándolas entre sí. La parte principal (Problemas, Algoritmos y Programas) muestra la secuencia de pasos en que, a partir de un problema, se llega al programa que permite resolverlo. Los problemas propuestos, salvo en el apartado 'Especificación de Problemas', deben ser resueltos modelando y especificando el problema, desarrollando el algoritmo, realizando la prueba de escritorio, codificando el programa en lenguaje C y probando su ejecución en la computadora. El apéndice A debería ser leído antes de la sección 'Algoritmos Condicionales' y tiene aplicación en esa sección y en 'Algoritmos de Selección Múltiple'. El apéndice B contiene la Norma Internacional que debe respetarse al momento del diseño del algoritmo. El apéndice C servirá como elemento de consulta al momento de codificar el programa, pero no reemplaza a un verdadero libro sobre el lenguaje (que puede consultarse en Biblioteca). Así como este apunte, la carpeta de la materia deberá ser únicamente en formato A4 (normas IRAM 4504 / ISO 216). Problemas, Algoritmos y Programas El uso para el cual fue concebida la computadora es la resolución de problemas de un modo más rápido, para lo cual se desarrollan programas. La naturaleza de los problemas varía con el ámbito o con el contexto donde están planteados; así, existen problemas matemáticos, químicos, filosóficos, etc. Entonces, ¿qué es un problema? La R.A.E. nos da varias definiciones: problema. (Del lat. problēma, y este del gr. πρόβλημα). 1. m. Cuestión que se trata de aclarar. 2. m Proposición o dificultad de solución dudosa. 3. m. Conjunto de hechos o circunstancias que dificultan la consecución de algún fin. 4. m. Disgusto, preocupación. U. m. en pl. Mi hijo solo da problemas. 5. m. Planteamiento de una situación cuya respuesta desconocida debe obtenerse a través de métodos científicos. La última definición es la que se aplica a nuestro trabajo:aquellos problemas cuya solución se puede calcular utilizando una serie de reglas introducidas en un computador. Muchas veces, la mitad del trabajo es saber exactamente que problema hay que resolver. Para ello, debemos comenzar por modelar el problema, es decir construir un modelo teórico que permita analizarlo para elaborar la estrategia de resolución. Ejemplo: -Para calcular la potencia de un acondicionador de aire, es necesario conocer el volumen de la habitación. La forma de la misma es la de un prisma rectangular, por consiguiente modelamos la habitación como un prisma. -Para calcular los materiales para construir una viga de hormigón, es necesario calcular el volumen de la misma. Al modelarla, otra vez nos encontramos con un prisma. Vemos que, frente a dos problemas de características distintas terminamos analizando el mismo modelo Habitualmente, el problema que debemos analizar escapa a nuestro conocimiento, por lo que en la etapa de modelado deberemos recurrir a libros o especialistas sobre el mismo. Una vez construido el modelo, se realiza la especificación del problema, o sea se determinan los datos necesarios para resolverlo, los resultados esperados y la forma de, a partir de los datos, llegar a los resultados. Un mismo problema puede tener más de una especificación posible, dependiendo de los datos que puedan estar disponibles. Una vez modelado el problema, puede buscarse una solución en forma de algoritmo. Un algoritmo es un conjunto finito, y no ambiguo de etapas expresadas en un cierto orden que, para unas condiciones iniciales, permiten resolver el problema en un tiempo finito. Al plantear una solución algorítmica es importante elegir una representación adecuada de los datos para que dicha solución resulte eficiente. 1 Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I Para convertir un algoritmo, que puede estar expresado en una notación informal o seudo-lenguaje, en un programa será necesario pasar por varias etapas de formalización o refinamiento progresivo. El objetivo final es describir una solución algorítmica al problema inicialmente planteado mediante el uso de las construcciones formales de un lenguaje de programación. Dicho programa se podrá ejecutar en un computador, y para un conjunto de datos de entrada producirá unos resultados esperados. Aspectos de la Solución de Problemas No existe un método universal que permita resolver cualquier problema. En general, la solución de problemas es un proceso creativo donde el conocimiento, la habilidad y la experiencia tienen un papel importante. El proceder de manera sistemática puede ayudar en la solución. Es muy importante que el problema tratado esté perfectamente definido: se trata en este momento de saber qué es lo que hay que resolver antes de averiguar cómo resolver el problema. Esta etapa de definición lleva consigo eliminar las ambigüedades y la información irrelevante que aparezcan en el enunciado de un problema, y saber exactamente qué elementos constituyen una solución válida. Al comenzar a abordar un problema es necesario tener en cuenta que, para la mayoría de ellos, hay muchas maneras de resolverlos y pueden existir muchas soluciones. Se plantean sin embargo criterios o estrategias generales que se deben tener en cuenta, para ello se pueden seguir ocho etapas, articuladas de tal forma que cada una depende de las anteriores, lo que indica que se trata de proceso complementario y por lo tanto cada paso exige el mismo cuidado en su elaboración. Las etapas son: 1. Definición y delimitación del problema a solucionar: Por computador se pueden resolver cualquier clase de problema una vez definidos los pasos o instrucciones. 2. Pseudocódigo o diagrama (algoritmo): Este es en realidad el primer paso que se debe de seguir pues generalmente ya se tiene definido el problema. En esta etapa es donde se determinan los pasos o instrucciones a seguir y el orden lógico de su ejecución para darle una eficiente solución al problema. Aquí es donde radica toda la dificultad para solucionar un problema por computador; el resto de las etapas básicamente se circunscriben a la adaptación para que un computador determinado ejecute los pasos o instrucciones planteados en el pseudocódigo y se obtengas los resultados esperados. 3. Prueba de escritorio: Luego de realizar el pseudocódigo viene la prueba de escritorio, la cual consiste en hacer un seguimiento manual de los pasos seguidos que se definieron en el pseudocódigo y comprobar, con base en sus datos, si el resultado al cual se llega es el esperado. 4. Codificación: Es la escritura de las instrucciones o enunciados, determinados en la etapa de la diagramación o la seudo-codificación en un lenguaje de alto nivel (Basic, Cobol, Pascal, C, etc.) incluyendo las instrucciones de control adecuadas al computador donde se vayan a ejecutar. 5. Digitalización: Ya codificadas las instrucciones se convierten a un medio legible para el computador. Es pasar las instrucciones al editor del lenguaje de programación a utilizar. 6. Compilación: Es aquí donde el computador “chequea” si todas las instrucciones están escritas correctamente desde el punto de vista de la sintaxis y gramática de cada lenguaje y las transcribe, dentro de la memoria, del lenguaje de alto nivel al lenguaje de máquina para obtener el llamado programa objeto.1 7. Ejecución del Programa: El programa objeto es ejecutado por el computador para llegar a los resultados esperados, utilizando los dispositivos, unidades y memoria necesaria, según cada paso o programa. 8. Evaluación de Resultados: Obtenidos los resultados se les evalúa para verificar si son correctos. En caso contrario, se revisa en las etapas anteriores para detectar la falla o error, entrar a corregirlo y reiniciar desde este punto los pasos para resolver de nuevo y en forma correcta el problema. Las consideraciones mencionadas hasta ahora corresponden a la solución general de problemas (no necesariamente a problemas informáticos); sin embargo, estas ideas se pueden particularizar para resolver problemas donde se use el computador como herramienta. A veces, la situación más frecuente para mucha gente es comenzar a programar la solución de un problema que no está completamente definido, o pensar en detalles de implementación sin saber cómo abordar el problema independientemente del computador. Es mucho más productivo conocer primero un problema lo suficiente y plantear una estrategia adecuada para su solución, que comenzar prematuramente a programar la solución a un problema incompleto, ambiguo o que no ha sido analizado adecuadamente. Especificación de Problemas La especificación tiene por objetivo el conocimiento exacto de todos los detalles que hacen a la resolución de un problema, separándolos de aquellos que, si bien tienen relación con el mismo, no tienen influencia en dicha resolución. Asimismo, permite saber si se está en condiciones de intentar una resolución y si existe la posibilidad de dividir el problema en problemas menores. La división de un problema en problemas menores es muy conveniente, ya que se pasa a analizar una cierta cantidad de problemas muy simples, en lugar de encarar uno muy complejo. Por otro lado, algunos de esos problemas menores serán comunes a otros problemas, con lo que, con el tiempo, se reduce el proceso de análisis. Por ejemplo, si debemos imprimir una lista de precios, el problema será muy similar a imprimir un listado de alumnos, solo que cambiarán los datos a colocar en cada columna. 2 Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I El procedimiento de especificación Para especificar un problema, simplemente se deben completar los siguientes puntos: 1. 2. 3. 4. 5. Nombre del problema. Descripción. Magnitudes de entrada. Magnitudes de salida. Relación entre magnitudes de entrada y de salida. El nombre del problema debe ser una palabra o una sigla que tenga relación con la naturaleza del mismo. Por ejemplo, son admisibles nombres como viga, listado, SCA (sistema de controlll de acceso), ImpFact (impresión de factura), pero no nombres como Juan, Genio, Ufa, Chaca, etc. Este nombre permite, cuando un grupo de trabajo está abocado a un proyecto, referirse a cada porción del mismo en forma unívoca. Asimismo, es posible que este nombre termine siendo el del programa o porción de programa que resuelve el problema. La descripción debe describir en forma sintética y concisa de qué se trata el problema. No debe ocupar más de uno o dos renglones. Las magnitudes de entrada indican los datos del problema. Para cada una, se indicará el identificador elegido, qué representa dentro del problema y el tipo de magnitud (número entero, número real, palabra, etc). El identificador será una letra, palabra o sigla que tenga relación con la magnitud, y deberá ser único dentro de un problema. Las magnitudes de salida son el/los resultado/s que se espera obtener. Se aplicará todo lo dicho para las magnitudes de entrada. La relación entre magnitudes de entrada y de salida indicará la forma en que se llega de los datos a los resultados. Podrá ser una o más fórmulas matemáticas o la referencia a un procedimiento descripto por separado. Si la relación resulta muy compleja, se intentará dividir el problema en problemas menores. Si se consigue completar los cinco puntos de la especificación, se podrá pasar al desarrollo del algoritmo de resolución. En caso contrario, deberemos obtener información adicional (consultando un especialista o libros al respecto) o será la señal de que el problema no puede ser resuelto en forma algorítmica. Ejemplo: El problema del triángulo. Nos presentan el triángulo de la figura, del cual debe calcularse la superficie y nos todos los datos indicados están disponibles. La especificación sería la siguiente: 1. SupTrian. 2. Calcular la superficie de un triángulo. 3. b (base), h (altura): nos reales. 4. s (superficie): no real. 5. s = b . h / 2 Vemos que, si bien se dispone de cuatro datos, solamente dos de ellos son para resolver el problema. indican que necesarios Ejemplo: El problema del patio. Nos piden calcular la cantidad de baldosas cuadradas necesaria para embaldosar un patio rectangular. Obviamente, se trata de un problema de superficies. La relación entre la superficie del patio y la de una baldosa nos dará la cantidad de las mismas. Se trata de un problema que podemos dividir en otros tres: 1. 2. 3. 4. 5. SupPatio. Calcular la superficie del patio. l (largo), a (ancho): nos reales. Sp (superficie patio): no real. Sp = l . a 1. 2. 3. 4. 5. SupBald. Calcular la superficie de una baldosa. lb (lado de la baldosa): no real. Sb (superficie baldosa): no real. Sb = lb2 1. 2. 3. 4. 5. CantBald. Calcular cantidad de baldosas. Sp(superficie patio), Sb(superficie baldosa): no real. Cb(cantidad de baldosas): no real Cb = Sp / Sb Ejemplo: El problema del patio con cantero. Este problema es igual al anterior, solo que en el patio existe un cantero circular el cual, obviamente, no se embaldosa. Entonces, el cálculo de la superficie del patio no es tan inmediata. 1. SupRect 2. Calcular la superficie de un rectángulo. 3. l (largo), a (ancho): nos reales. 4. Sr (superficie rectángulo): no real. 5. Sr = l . a 1. 2. 3. 4. 5. SupCirc Calcular la superficie de un círculo. d (diámetro): no real. Sc (superficie del círculo): no real. Sc =  . d2 / 4 1. SupPatio. 2. Calcular la superficie del patio. 3. Sr(superficie rectángulo), Sc(superficie círculo): no real. 4. Sp(superficie patio): no real 5. Sp = Sr - Sc Los problemas SupBald y CantBald continúan especificados del mismo modo. Vale decir que el problema del patio con cantero quedó dividido en cinco problemas distintos. Si ahora se nos presenta un problema similar, donde el cantero es triangular, solo deberemos cambiar la especificación SupCirc por SupTrian, 3 Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I y si las baldosas tienen una forma distinta del cuadrado, se cambiará solo SupBald. Ejercicios Propuestos 1. 2. 3. 4. 5. 6. Un tren laminador produce barra redonda a partir de palanquilla. Se necesita saber cuántas barras pueden obtenerse de una palanquilla. Conociendo el rendimiento de una pintura (r[m2/l]), se debe calcular la cantidad necesaria para pintar las paredes de una habitación. Para construir una viga de hormigón, se debe calcular el volumen de piedra partida a utilizar. En un camión, se cargan N cajas de mercadería con un valor V $ cada una. Se debe determinar el valor total de la carga. Se necesita calcular cuántos tambores de aceite, con un peso Pa, pueden cargarse en un camión que soporta un peso Pmax. Se necesita calcular cuántos cajas, con un volumen Vc, pueden cargarse en un camión cuya caja tiene un volumen V. Algoritmos Lineales Un algoritmo es la descripción unívoca y finita de la secuencia de acciones a ejecutar para resolver un problema. Esta definición merece ser analizada detenidamente. 'es la descripción...de la secuencia de acciones': vale decir que el algoritmo no hace, sino que describe (relata, cuenta) lo que se debe hacer. 'unívoca': esto significa que luego de ejecutada una determinada acción, la siguiente está indicada sin ambigüedades. Si después de ejecutada una acción existen dos o más que podrían ejecutarse y no existe un criterio para seleccionar la que corresponde, no es un algoritmo. 'finita': se refiere a que la secuencia de acciones debe finalizar en algún momento, cuando el problema esté resuelto. Una secuencia de acciones que podría llegar a ejecutarse indefinidamente, no es un algoritmo. 'para resolver un problema': o sea que antes de desarrollar un algoritmo, debemos conocer el problema que se quiere resolver, es decir, debemos haber hecho la especificación del mismo. Los algoritmos pueden expresarse de distintas maneras según quién vaya a ejecutar las acciones: una guía de costura, una receta de cocina, una hoja de ruta, son algoritmos desarrollados utilizando lenguajes escritos y/o gráficos orientados a las personas que los ejecutarán. Un algoritmo que será ejecutado en una computadora deberá ser escrito en un lenguaje de programación, pero en la etapa de desarrollo se dispone de dos alternativas: el pseudocódigo y los PSD (program structure diagram) también llamados estructogramas o diagramas de Nassi-Schneiderman (Isaac Nassi y Ben Schneiderman fueron sus creadores). Básicamente, un algoritmo responde al siguiente esquema: INGRESO DE DATOS CÁLCULO DE RESULTADOS SALIDA DE RESULTADOS El pseudocódigo (pseudo: que parece) es un subconjunto del lenguaje natural que utiliza muy pocas palabras, cada una con un significado único, y una sintaxis estricta similar a los lenguajes de programación estructurados: Palabra Significado Pascal C Comienzo Delimitador que indica que se inicia una Begin secuencia de acciones. { Fin Delimitador que indica que finaliza una End secuencia de acciones. } Leer (<ident>) Acción de obtener el valor de una variable Read (magnitud simbolizada con un identificador) Readln scanf Escribir (<ident>) Acción de enviar a la salida el valor de una Write variable. printf 4 “A”. Indica la finalización de una acción. leer(h). s = b  h / 2 Algoritmo Comienzo leer(b). Ej. Asigna a la variable de la izquierda el <ident> := <expr> valor de la expresión que aparece a la derecha.72. 2. Datos y Tipo de Datos Dato es la expresión general que describe los objetos con los cuales opera la computadora. 2. <ident> = <expr> En Pascal se coloca después del último end para indicar el fin del código.09.: a20 ancho superficie_rectangulo Los nombres deben decir algo sobre el propósito para el cual se emplean las variables. 4. “1”. escribir(s). Una constante es un objeto cuyo valor no puede variar en la ejecución de un programa. Tipo numérico entero: comprendidos entre –32768 hasta 32767. una secuencia de acciones será a su vez un rectángulo formado por otros menores (las acciones compuestas que veremos más adelante tienen otras representaciones).Apuntes de Programación I Existen también algunos símbolos especiales: Símbolo .52” “Juan Pérez” Ejemplo: El problema SupTrian consiste en el cálculo de la superficie de un triángulo. s(superficie): no real. Es muy importante tener en cuenta que en muchos lenguajes (C. Un tipo que describe el uso de la variable. DATOS. 5 . CONSTANTES. los siguientes. para su fácil lectura. -8. “*”. es un modo gráfico de representar un algoritmo. 5. VARIABLES Y OPERADORES Una variable es una zona de la memoria que almacena un dato y cuyo valor puede variar en la ejecución del programa. entendimiento y modificaciones. SupTrian.: 0. 3. Fin. Tipo numérico: es el conjunto de los valores numéricos. Tipo numérico real: con decimal. Pascal C Separa una acción de la siguiente. Además posee los siguientes atributos: Un nombre o identificador que lo designe.7652. Por ello se acostumbra utilizar siempre letras minúsculas.0 Tipo lógico: también llamado tipo Booleano. después de este primer carácter.: “Lista” “$ 123. Ej. Calcular la superficie de un triángulo. Nombre de variables(identificadores): En general se exigirá que la variable tenga un nombre que comience con una letra. 3738. En él. b(base). h(altura): nos reales. Ej. cada acción simple se representa como un rectángulo.910.Escuela de Educación Técnica Galileo Galilei . Uso Indica la finalización de una acción. Especificación 1. 3. es el conjunto de los dos valores lógicos verdadero y falso Tipo carácter: Es el conjunto. Los espacios no se permitirán dentro de un nombre de variable. s  b  h / 2. El PSD (program structure diagram). dígitos y algunos caracteres especiales. de caracteres que la PC reconoce. finito y ordenado. “%” Cadena de caracteres: Una cadena de caracteres es una secuencia finita y no vacía de caracteres encerrados entre comillas. pueden seleccionarse de un conjunto de caracteres que contengan letras. por ejemplo) los identificadores se consideran distintos según estén escritos en mayúsculas o minúsculas. <ident>  <expr> . Por ejemplo: todos los caracteres que figuran en el teclado. h. s. que los identificadores b. write(s). readln(h).Apuntes de Programación I leer(b) leer(h) sbh/2 escribir(s) Aparentemente. s = b * h / 2.Escuela de Educación Técnica Galileo Galilei .) indicando en ambos casos. var b. s: real. el PSD no agrega nada al pseudocódigo. s := b * h / 2. end. h. scanf(“%e”. También puede verse que el bloque ejecutable en Pascal es prácticamente la traducción al inglés del pseudocódigo. la cual podrá codificarlo en cualquier lenguaje de programación (ver Apéndice B). } Puede verse que en ambos programas aparecen los puntos 2 y 3 de la especificación (en Pascal b. pero responde a una norma internacional (ISO/IEC 8631:1989) por lo que pueden ser interpretados por cualquier persona en cualquier lugar del mundo. h). h y s representan números reales. s. begin readln(b). main() { scanf(“%e”. printff(“%e\n”. b). s). y en C float b.h> float b. s: real. h. Programa en Pascal Program SupTrian. h. y de diferente modo. NOTA: El código en lenguaje Pascal se muestra a modo de ejemplo y no forma parte del presente curso. 6 . Programa en C #include <stdio. Comentario El perfeccionamiento consiste simplemente en agrupar las acciones. 2.Apuntes de Programación I Queda claro que para poder escribir el algoritmo. Sb(sup. leer(l). debemos tener a la vista la especificación y el algoritmo (en pseudocódigo o PSD). s(superficie): no real. h(altura): nos reales. 5. Calcular la superficie de un cuadrado. debemos primero realizar la especificación del problema y para codificarlo en un lenguaje de programación. Sp ← b * h. escribir(Sb). 4.Escuela de Educación Técnica Galileo Galilei . leer(h). Algoritmos Comienzo leer(b). Cb ← Sp / Sb. escribir(Cb). Sb ← l * l. Ejemplo: El problema CantBald permite calcular la cantidad de baldosas necesaria para cubrir un patio rectangular. 2. Cb(cant. Especificaciones 1. 3. de baldosas): no entero. Si se decide escribir un solo algoritmo. Calcular la cantidad de baldosas. Algoritmo Único Comienzo leer(b). en cuyo caso se eliminará del primero la acción 'escribir' y del segundo la acción 'leer' correspondientes a esa magnitud. patio). Sb ← l * l. 3. Sp(sup. l(lado): no real. Comienzo leer(l). Fin. Fin. Cuando se recurre a esta técnica será necesario realizar el perfeccionamiento del algoritmo antes de codificarlo. debe tenerse en cuenta que las magnitudes de salida de uno pueden ser magnitudes de entrada de otro. escribir(Cb). Fin. Fin. Sp ← b * h. ¿Y qué sucede si hemos dividido el problema en problemas menores y como consecuencia tenemos varias especificaciones? En ese caso tenemos dos opciones: escribir un solo algoritmo con las acciones necesarias para resolver cada uno de los problemas o escribir un algoritmo para cada problema. b(base). CantBald. 3. 4. Esta última alternativa es la más recomendable. baldosa): nos reales. Comienzo leer(Sp). Calcular la superficie de un rectángulo. 4. Algoritmo Perfeccionado Comienzo leer(b). leer(Sb). escribir(Sp). s(superficie): no real. SupCuad. leer(h). escribir(Cb). 2. leer(l). Fin. Sp ← b * h. Cb ← Sp / Sb. Cb ← Sp / Sb. leer(h). SupRect. Cb = Sp/Sb. de modo que la estructura del algoritmo sea: Ingreso de Datos Procesamiento Salida de Resultados 7 . ya que permitirá escribir programas modulares con porciones (procedimientos/funciones) que podrán ser reutilizadas en otros programas. 5. Sb ← l * l. 5s=ll 1. Para su resolución es necesario resolver antes los problemas SupRect para calcular la superficie del patio y SupCuad para calcular la superficie de una baldosa. s = b  h 1. Luego a este valor de E incrementarlo 4 veces con un 12 por ciento (EP) y con el valor de R calcular un nuevo I de prueba (IP). ( F º = 9 C º +32 ) 5 13. Calcular el volumen de un cilindro. Calcular la superficie de un triángulo y de un cuadrado. 6. 12. Mostrar por pantalla y papel los resultados así como los datos ingresados. Calcular la superficie de un círculo. e I: la intensidad de corriente. 11. Diseñar un programa que permita ingresar por teclado dos variables R e I. 15 de 10. 8. Se debe ingresar el nombre y apellido del operador en un solo campo. De acuerdo a la ley de OHM calcular E. teniendo como dato el radio y la altura.Apuntes de Programación I Ejercicios propuestos 1. 9. 10. 16.). que es la tensión (en Volt). Determinar la hipotenusa de un triángulo. 3. 8 . Calcular el promedio de 3 números. Convertir una temperatura dada en celsius a grados fahrenheit. Se desea abonar un pago con tarjeta de crédito. según la siguiente tabla: En 2 cuotas : 5% de recargo En 3 cuotas : 7% de recargo En 4 cuotas : 10% de recargo Informar cuota a pagar por mes en cada uno de los casos. Dadas la cantidad de billetes de cada denominación (Ej. informar el monto total recaudado.Escuela de Educación Técnica Galileo Galilei . Dado un valor en pulgadas pasarlo a milímetros. Calcular el perímetro y la superficie de un rectángulo. Resolver las siguientes fórmulas: A+B A + BxC A +C R= +D R= R= C D D 5. Calcular la suma de dos números enteros positivos. 2. 4. Convertir un valor expresado en metros a pies y a pulgadas (1pie=30cm) 15. Calcular el área de un triángulo en función de las longitudes de sus lados: Area = p ( p −a )( p −b)( p −c ) donde: p=a+b+c/2 14. sabiendo las longitudes de los catetos. Calcular el cubo de un número. etc. 7. 20 de 5. Cabe señalar que se deber diseñar una pantalla de ingreso de datos como así también de muestreo de la información Ley de Ohm E [Volt] = R [Ohm] * I [Amperes] Tensión = resistencia * intensidad de corriente. siendo R: la resistencia. Pero eso alteraría la forma que debe tener un algoritmo para ser fácilmente entendible. ya que toda secuencia de acciones debe estar encerrada entre delimitadores. solo se ejecutarán acciones si el valor de verdad de la proposición es verdadero. En el pseudocódigo. El PSD de la derecha representa una estructura condicional unaria. con lo cual se eliminaría la última acción y la necesidad de utilizar la variabla s. char s[9]. en el código). cuyo valor de verdad determina el camino a seguir.h> main(){ float x. son acciones de primer nivel. Es habitual que. #include <stdio. scanf("%f". Si (x > 0) entonces s ← 'Positivo' si no s ← 'No positivo'.Apuntes de Programación I Algoritmos Condicionales Se sugiere consultar el Apéndice A: Lógica Proposicional. existan diferentes acciones que pueden llegar a ejecutarse. se denominan acciones de segundo nivel. 9 . } printf("%s\n". llegado a un punto de la resolución de un problema. Comienzo Leer(x). las acciones de segundo nivel se escriben dejando una sangría mayor. como una forma de mostrar la estructura. "Positivo"). Esto debemos tenerlo presente en el pseudocódigo (y más adelante. en este caso las dos asignaciones. Escribir(s). Esa condición se expresa como una proposición. sino que existe una condición según la cual ejecutaremos unas u otras acciones. Un algoritmo debe tener la estructura formal: Ingreso de datos ↓ Procesamiento de datos ↓ Salida de resultados Esa estructura se muestra claramente en el algoritmo que hemos escrito. (proposición) (proposición) <acción> <acción> <acción> <acción> <acción> <acción> <acción> <acción> <acción> El PSD de la izquierda representa una estructura condicional binaria. Las que se ejecutan siempre. con vistas a su posible modificación o corrección. podría sugerir la eliminación de las acciones de asignación y reemplazarlas por Escribir('Positivo') y Escribir('No positivo'). Una visión liviana del algoritmo. En ella. y que ocupan la mitad del ancho del PSD.h> #include <string. Si (x > 0) entonces s ← 'Positivo' si no s ← 'No positivo'. Si para uno de los valores de verdad se debe ejecutar más de una acción. Fin.Escuela de Educación Técnica Galileo Galilei . Las acciones que aparecen a la izquierda se ejecutarán si el valor de verdad de la proposición es verdadero. estaremos frente a una secuencia de acciones. &x). Pero la elección de las acciones a ejecutar no se realiza al azar. si es falso. y las situadas a la derecha. Escribir(s). } else{ strcpy(s. } Las acciones que se ejecutan condicionalmente. if(x>0){ strcpy(s."Negativo"). s). Es aquí donde el PSD cobra especial importancia como herramienta de diseño de algoritmos. Fin. Puede suceder que para uno o ambos valores de verdad de la proposición se deba ejecutar una sola acción: Leer(x) (x > 0) s ← 'Positivo' Escribir(s) s ← 'No positivo' Comienzo Leer(x).. lo cual no puede formularse mediante una proposición. case 3: strcpy(s. por ejemplo. fin. el valor ingresado es 2. "dos"). a la salida se obtendrá 'dos tres'. case 3: strcpy(s.h> main(){ int a. casos de a 1: s←”uno” . #include <stdio. el valor de la cual permite seleccionar la secuencia de acciones a ejecutar.Escuela de Educación Técnica Galileo Galilei . "tres"). o a partir de cual acción se ejecutan las siguientes. char s[9]. &a). case 2: strcpy(s. VarC valor1 valor2 valor n <acción> <acción> <acción> <acción> <acción> <acción> <acción> <acción> Ejemplo: Leer a a 1 s←”uno” 2 s←”dos” 3 s←”tres” Escribir s Comienzo leer(a). char s[9]. s). break. "uno"). NOTA: En los distintos lenguajes de programación la implementación de la estructura de selección múltiple es diferente. casos de a 1: s←”uno” . 10 .Apuntes de Programación I Algoritmos de Selección Múltiple (condicionales múltiples.h> #include <string.h> #include <string. el valor de la variable de control indica a partir de cual instrucción se realiza la ejecución. En los algoritmos de selección múltiple incluyente. } printf("%s\n". "uno"). scanf("%d". En su lugar. motivo por el cual es necesario conocer el lenguaje de programación en que se codificará para diseñar el algoritmo de acuerdo a las posibilidades del mismo. por ejemplo. 3: s←”tres” . ramificados) Los algoritmos de selección múltiple se utilizan en aquellos casos en que se presentan más de dos posibilidades. "dos"). Si. s). break. switch(a){ case 1: strcpy(s. switch(a){ case 1: strcpy(s. case 2: strcpy(s. Si. scanf("%d". Fin. } printf("%s\n". Los algoritmos de selección son muy utilizados a la hora de elaborar menues en los programas. 2: s←”dos” . fin. } La sentencia break excluye la ejecución de las restantes acciones (o instrucciones). #include <stdio. Ejemplo: Leer a a 1 s←”uno” Escribir s 2 s←”dos” 3 s←”tres” Comienzo leer(a). el valor ingresado es 2. utilizan una variable de control. 3: s←”tres” . } Nótese que en este caso no aparece la sentencia break. &a). "tres"). Fin. Los primeros se denominan algoritmos de selección múltiple excluyente. 2: s←”dos” . a la salida se obtendrá 'dos'.h> main(){ int a. Realizar un menú que me permita verificar según un código de vehículo ( MOTOS. si su cilindrada es valida. 19. ingresando día. analizarlos de a dos. Informar el monto total recaudado. el cubo. Ingresado un valor en pulgadas pasarlo a milímetros o viceversa. según la siguiente tabla: a) Infantil de 0 a 5 años b) Menores de 6 a 12 años c) Adolescentes de 13 a 17 años d) Juveniles de 18 a 22 años e) Mayores de 23 años en adelante Se ingresa la edad. según se haya cumplido o no el orden preestablecido. 14. Se tiene como dato dos productos y sus precios. Calcular el nuevo monto de la compra. Leer 5 números. Dado un número. Los items analizados son 10 con un valor máximo de 1000 puntos cada uno. Leer cuatro números. informar que categoría debe asignársele 23. CF:Consumidor Final). Se leen una serie de 8 valores analógicos (de 0 a 1.Apuntes de Programación I Ejercicios propuestos 1.Se ingresa el tipo de IVA (I:Inscripto. 8. informar si se hizo generala servida. verificar que sea válido 16.NI:No inscripto. si es de 7.000 puntos. 5. No considerar año bisiesto. 12. el interés varía de 0% para la tarjeta “A”. Se desea saber la recaudación de una caja ingresando la denominación del billete. debe ofrecer un rendimiento promedio del 75% mínimo. Ingresado un horario en segundos transcurridos desde las 0hs. informar cual de ellos es el mayor y en que orden fue ingresado. 18. 2. 22. Intercambiarlos si el primero ingresado fuera menor al segundo y mostrarlos. verificar que sea válido e informar la descripción que corresponda. 11 . 4. Se ingresan el día. Ingresada la cantidad de días transcurridos desde el 1º de Enero. 15. Dados dos números informar el mayor. Ingresar los valores de los 10 puntos y calcular el porcentaje de rendimiento. informar la fecha actual. minutos y segundos. 11. 10. mes y año de nacimiento (solicitar el ingreso de día. decimales inclusive). R 2 = − b ± b 2 − 4ac 2a 3. E:Excento. 17. Ingresado un horario en hora. Dicho promedio se calcula sobre un total de la suma de rendimientos base de 10. Ingresado el costo de un producto. Al terminar imprimir un 0 o un 1. 7. En un club se desea clasificar a cada uno de sus socios por categorías. verificar que sea válido.Escuela de Educación Técnica Galileo Galilei . Informar los resultados que correspondan.AUTOS. las duplas en que un número sea múltiplo exacto del otro. 13. Para que un vehículo sea enviado para la venta.CAMION).. el mes y el año de cumpleaños. Si días es mayor a 365 informar error. Según la tarjeta de crédito que se utilice en la compra. informar la hora actual. 6. 5% para la “B” y la “C “y 10% para la “D” y la “E”. Calcular la edad de una persona. Mostrarlos en forma digital. Informar resultado. el doble. si es múltiplo de 4. CAMIONETA. Dados tres números informar el mayor. convirtiendo a 1 aquellos que sean iguales o superen a 0. Informar si un número es positivo o negativo. 9. aplicar el interés de 5% si es en 2 cuotas y 10% si son 3 cuotas. mes y año actual) 21. Resolver: R1.5 y a 0 los menores a 0. De una tirada de 5 dados. 20. informar si esta aprobado o no. Leer seis números de a uno controlando que estén estrictamente creciente. informar monto de la cuota. si es múltiplo de 3.5. según la tarjeta e informarlo. calcular el cuadrado. e imprimir si existen. Mientras sea verdadera se seguirán ejecutando las acciones. Si la primera vez que se evalúa la proposición tiene valor falso.. pero resulta más compacta (y confusa) al momento de implementar el código. a = 1. Si la primera vez que se evalúa la proposición tiene valor falso. a ← a+1. Fin. En los algoritmos iterativos precondicionales. var = val_inicial a val_final <acción> <acción> <acción> 12 . } } NOTA: La primera acción.. (proposición) <acción> <acción> <acción> Ejemplo: Contador de 1 a 10 Comienzo a ← 1. las acciones no se ejecutan nunca. las acciones no se ejecutan nunca. Los algoritmos iterativos permiten realizar las mismas acciones un cierto número de veces. Se dividen en precondicionales y postcondicionales.a). se ejecutan las acciones y se vuelve a evaluar la proposición. a←1 (a<11) escribir a a ← a+1 #include <stdio. en donde se le da un valor inicial a la variable 'a'. fin. dependiendo la repetición de acciones de una condición o proposición.' La estructura 'para' funciona igual que la estructura 'mientras' cuando se trata de implementar un contador. mientras (a<11) comienzo escribir(a).Escuela de Educación Técnica Galileo Galilei . se evalúa el valor de verdad de una proposición antes de ejecutar las acciones. el valor de verdad de una proposición determina si se ejecutan las acciones indicadas a continuación.Apuntes de Programación I Algoritmos Iterativos (repeticiones. se denomina inicialización y resulta imprescindible para que la proposicoón pueda ser evaluada por primera vez. bucles) Se sugiere consultar el Apéndice A: Lógica Proposicional. a = a+1. La más versatil es la estructura 'mientras'. lo cual lleva a que las mismas se puedan ejecutar cero o más veces. lazos. Estructura 'para. Estructura 'mientras' En esta estructura.h> main(){ int a. while(a<11){ printf(“%d/n”. En caso de ser verdadera. i ← 1 . 13. Calcular la sumatoria de los números impares hasta N. la proposición y el incremento de la variable de control (escrito de una forma más abreviada). Dada una lista de un curso. a ← a+1. Calcular la sumatoria de N números pares. Calcular el producto de los números menores a N por un factor dado. Informar todos los divisores de un número. hacer escribir(a). a = a+1. } Ejercicios Propuestos 1. 4.. realizar un listado con los 13 . for(i=1. mostrar el mismo repetido en toda la pantalla. Se desea saber la recaudación de una caja ingresando de cada billete su denominación y de cada moneda su valor.Apuntes de Programación I Ejemplo: Contador de 1 a 10 Comienzo para i ← 1. N-2 y 3 y así sucesivamente. Mostrar el resultado de la división entre el N y 1. 15. Fin. 6. Ingresar N números. a diferencia de 'mientras'..h> main(){ int a.Escuela de Educación Técnica Galileo Galilei . Leer N números. Si resulta verdadera. Fin. <acción> <acción> <acción> (proposición) Ejemplo: Contador de 1 a 10 a←1 escribir a a ← a+1 (a<10) Comienzo a ← 1. 16. mientras (a<1o). 11. N-1 y 2. verificar que los mismos sean positivos y calcular su raíz cuadrada. } } Compare el código con el correspondiente a la estructura 'mientras' y verá que aparece la inicialización. Se desea calcular independientemente la suma de los números pares e impares comprendidos entre 1 y 200. Esto da por resultado que las acciones se ejecuten al menos una vez aunque la proposición resulte falsa. 3. 10. se vuelven a ejecutar las acciones y se vuelve a evaluar la proposición. Mostrar N números desde N hasta 0. 14. #include <stdio. 8. 12. a = 1. a 10 escribir(i). do{ printf(“%d/n”. Imprimir 2000 números pares. informar cual de ellos es el mayor y en que orden fue ingresado. Calcular el producto de N números por un factor dado.h> main(){ int i. 18. Calcular el producto de dos numero por sumas sucesivas. i<10.mientras' En esta estructura. 7.i). 5. Calcular el cuadrado de los N primeros números.. 2. 9. Estructura 'hacer. Imprimir los primeros 2000 número impares. i++){ printf(“%d/n”. ingresando nombre. 10 escribir i #include <stdio. 17. se evalúa una proposición después de ejecutadas las acciones.a). apellido y fecha de nacimiento de cada uno. Ingresado un numero de una cifra. Informar el monto total recaudado. }while(a<10). Realizar un programa que me permita multiplicar una serie de números. Informar el total de rifas vendidas. Calcular el promedio de un curso. Leer un número. informar cuantos hay de cada uno y el total. 19. y el porcentaje de votos en blanco efectuados.mes.XP y CP. Se realiza una votación con 5 candidados. En una concesionaria se tienen 3 modelos de autos. El final del ingreso de datos sobreviene cuando el operador ingresa el valor de "T" igual a cero (0). que responda a la fórmula X=(T-1)*(J+T)*C . Se ingresa una palabra. Si no alcanzara puede quedar incompleto el renglón. 37. Leer números hasta que se ingrese un 9999 e imprimir la sumatoria de ellos y la cantidad de positivos. Calcular la suma de los números menores a N de a pares. 32. sin que se escriba en la línea de abajo. 28. Toda la información ingresada y calculada deben estar impresa en papel.X. Permitir el reingreso si no cumple la condición. fecha de procesamiento. mostrando el nombre y apellido del operador.. Se desea calcular el incremento en el alquiler si se sabe que se cobra el 1% diario de interés sobre el monto acumulativo. sabiendo que el valor de C es el 95% de "T". 26. Leer una serie de números informar el porcentaje de ellos que sean mayores a un valor dado. mostrar cada una de sus letras.Escuela de Educación Técnica Galileo Galilei . 2+3. negativos y ceros. Informar porcentaje de cada respuesta. Se ingresa monto base y cantidad de días.XP y CP. 36. En una empresa se realiza el inventario anual de productos en stock. expresada en su valor decimal y binario. informar si es un Palíndromo. cada rifa indica el número de alumno vendedor y si está pagada total o parcialmente.cambiando por otras seis cuando el operador quiera continuar. Buscar los primero N números primos y calcular su sumatoria. 22. La pantalla ( MUESTRA2 ) debe tener. 27. 3+4 .J. 25. 23. Calcular el factorial de un numero dado.los valores ingresados y los resultados de X. Leer A y B. también otra en el ángulo inferior derecho ( MUESTRA2 ) que permita ver una vista previa de la impresión en papel. informar el porcentaje de votos logrado por cada uno.Apuntes de Programación I alumnos que hayan cumplido los 18 años. mostrarlo repetido en la pantalla desde la ubicación 0 hasta la 80. Considerando solamente 5 tipos de productos. 1+2. n-1 + n. 31. la cantidad de votantes no se sabe. Mostrar cociente y resto. Diseñar una pantalla de ingreso de datos ( MUESTRA1 ) que además mostrar los resultados.Luego calcular un valor de prueba XP variando el valor de X en un 15% en mas. Leer N números controlando que estén en forma creciente. En un curso se organizó una venta de rifas. Se debe tener en cuenta que solo podran presentarse en pantalla (MUESTRA1 ) seis (6) filas de datos y resultados. Cada alumno pueden tener distinta cantidad de notas. 33. o sea si se lee igual de atrás para adelante que de adelante para atrás. indicar si es capicúa.. Se ingresa una frase. Son 4 vendedores. Ingresar por teclado el nombre y apellido del operador como así también la fecha de procesamiento. 34. 21. 35. mayores que cero. Informar cuantas rifas vendió cada uno de los N alumnos y de ellas cuantas están pagadas total o parcialmente.. 20. consistenciando la misma para que la fecha dia. considerando N alumnos y M notas de cada uno. Diseñar un programa que permita ingresar por teclado dos variables que son "J" y "T". 24. se desea saber cuantos hay de cada modelo y de cual hay más. 30. 14 . recalculando C como CP. solamente cuatro (4) columnas de información numérica para T. Se realiza una encuesta de un producto cuyas opciones son si. Clasificar tickets de venta de un negocio según el vendedor que la haya efectuado. Ej. 0+1. Informar cantidad total y parciales de cada uno. Ingresado un nombre. Informar si un numero es primo. el cuál se debe informar con un texto esta forma de finalización. o bien suspendiendo el ingreso en cualquier momento. hallar el cociente de A por B por restas sucesivas. 39.año este dentro de los valores posibles ( febrero se deber tomar de 28 días y el año no debe ser mayor al corriente. 29. no y no contesta. como así también los títulos de encabezamiento y de final. 38. p: Algunos perros tienen ojos azules. Cada término debe ser un valor. sin embargo. -Tres es mayor que cinco. Operador Significado Otras Formas = Igual a. ≥ Mayor o igual que. al escuchar No seas tonto! o Quién ganará las elecciones?.. pero en este curso identificaremos a cada una de ellas con una letra minúscula. ≠ Distinto de. Las siguientes expresiones son proposiciones: -Todos los jueves llueve. alcánzame aquello. Expresiones como las primeras dos son los elementos fundamentales con los que trabaja la lógica proposicional.. El valor de verdad de una proposición se indica con la letra T si es verdadero o con F si es falso. simplemente. llamado así porque utiliza una serie de símbolos en la formulación de las proposiciones.. una magnitud numérica o una expresión aritmética que incluya valores y/o magnitudes numéricas.. > Mayor que.Escuela de Educación Técnica Galileo Galilei .. empleamos el lenguaje simbólico. Para ello. >= ≤ Menor o igual que <= == <> != Tabla 1: Operadores Relacionales Ejemplos de proposiciones simples: 15 . Nuestro trabajo consiste en formular proposiciones (construir fórmulas) a partir de expresiones en lenguaje natural. Al escuchar algo como La rosa es una flor o El cocodrilo es un mamífero. q: Dos más dos es cinco. El valor de verdad no se indica con la letra V para evitar confusiones con un operador que se verá más adelante. fácilmente se puede determinar si estas expresiones son verdaderas o falsas. < Menor que.. El operador relacional indica la relación entre el término de la izquierda y el de la derecha. Las proposiciones simples están formadas por dos términos vinculados por un operador relacional. Las siguientes expresiones no son proposiciones: -¿Qué hora es? -Por favor. no es posible asociar a ellas un valor de verdad.. No existe una notación generalmente utilizada para representar proposiciones...Apuntes de Programación I Apéndice A Lógica Proposicional La lógica proposicional trabaja con expresiones u oraciones a las cuales se les puede asociar un valor de verdad (verdadero o falso). proposiciones.. Las proposiciones pueden ser simples o compuestas. estas sentencias se conocen como sentencias declarativas o. -Los caballos comen pasto. Ejemplos: La temperatura está entre 15oC y 20oC. En general. Operador Denominación Significado ∧ Conjunción Ambas son verdaderas ∨ Disjunción Incluyente Al menos una es verdadera ∨ Disjunción Excluyente Solo una es verdadera ~ Negación No es verdadera Tabla 2: Operadores Lógicos La formulación de proposiciones compuestas en general se complica por las ambigüedades del lenguaje natural y la utilización de términos distintos para expresar la misma cosa. La temperatura es al menos de 15oC y la temperatura como máximo vale 20oC. (l = 3) ∨ (a = 3) p: (l = 3) p∨ q q: (a = 3) Aquí tenemos una disjunción incluyente dado que es posible que ambas proposiciones simples sean verdaderas. El largo es de 3m o el ancho es de 3m. se requieren varios pasos de descomposición del lenguaje natural para poder llegar a formular con seguridad la proposición en lenguaje simbólico. El largo o el ancho es de 3 m. (h = 3) ∨ (h = 4) p: (h = 3) q: (h = 4) 16 p∨ q .Apuntes de Programación I p: Tres es mayor que cinco (3 > 5) q: La suma de a y b no supera 7 (a+b ≤ 7) o r: La temperatura no alcanza los 20 C (t < 20) Las proposiciones compuestas están formadas por una o más proposiciones simples modificadas o vinculadas por conectivos u operadores lógicos. El largo es mayor a 3m y es menor a 5m. La altura es de 3m o 4m. (t ≥ 15 ) ∧ ( t ≤ 20 ) p: (t ≥ 15 ) q: ( t ≤ 20 ) p∧ q El largo supera los 3m pero no alcanza los 5m. La altura es de 3m o la altura es de 4m.Escuela de Educación Técnica Galileo Galilei . (l > 3) ∧ (l < 5) p: (l > 3) p∧ q q: (l < 5) Nótese que la palabra 'pero' tiene el mismo valor que 'y'. El largo es mayor a 3m y el largo es menor a 5m. • Si consumes alcohol entonces no debes conducir. No es verdad que la capacidad del recipiente es de 6l. La temperatura es mayor a 20oC y la temperatura no supera los 25oC. ¡Buena Suerte! 2) Genere la tabla de verdad sabiendo que a y c es verdadero. • No es cierto que el cigarrillo te da sensación de libertad o independencia.Escuela de Educación Técnica Galileo Galilei . pero no puedes manejar distraído. ~(c = 6) p: (c = 6) ~p La temperatura es mayor a 20oC pero no supera los 25oC. O apruebas el trimestre o te queda para diciembre o marzo.Apuntes de Programación I En este caso se trata de una disjunción excluyente porque es imposible que ambas proposiciones simples sean verdaderas a la vez. • El cigarrillo es nocivo para vos y para el que está al lado aunque no fume. La capacidad del recipiente no es de 6l. no he llegado a tiempo. • El volcán Chaitén está en Argentina y tuvo consecuencia en el ámbito social o ambiental. El 101 es un número par. Hace sol y no hace calor. • Aunque lo he intentado. p: (t > 20) q: (t < 25) p ∧ ~q (t > 20) ∧ ~(t < 25) Ejercicios Propuestos 1) De • • • • • • • • • • los siguientes enunciados. y b es falso • • • • ~a  ~b ~a ^ b ~(a  b) a  ~(b  c) 3) Expresa en lenguaje coloquial las expresiones del punto 2) 4)Formaliza (con los sımbolos de Lógica de Proposiciones) las siguientes proposiciones y coloque el valor de verdad resultante. Existe vida en el planeta Marte. Los dragones existen. 17 . determina cuales son proposiciones. Madrid es un continente. • O hablas por celular o conduces. La formulación de esta proposición es más complicada pues la segunda proposición simple está negada. Barcelona es una capital europea. ¿Existen los elefantes? Sara y María son hermanas de Pedro. la tabla de verdad se confecciona teniendo en cuenta el orden de prioridad de los operadores lógicos. Ejemplos: La temperatura es mayor a 20oC pero no supera los 25oC. Vale decir que se debe verificar si los valores de verdad que ocurren para las distintas combinaciones de valores de verdad de las proposiciones simples son los esperados.Apuntes de Programación I Tablas de Verdad Cuando se formula una proposición compuesta resulta necesario comprobar si realmente corresponde a lo expresado en lenguaje natural. Conjunción Disjunción Incluyente p q p∧ q p q p∨ q T T T T T T T F F T F T F T F F T T F F F F F F Disjunción Excluyente Negación p q p∨ q T T F T F T F T T F F F p ~p T F F T Una vez formada una proposición. (t > 20) ∧ ~(t < 25) p ∧ ~q p q ~q p∧~q T T F F T F T T F T F F F F T F Comprobamos que la proposición compuesta es verdadera cuando la primera proposición simple es verdadera y la segunda es falsa. Las tablas de verdad permiten realizar esa verificación. 18 .Escuela de Educación Técnica Galileo Galilei . se dice que estamos ante una tautología. Si la proposición compuesta es falsa para todas las combinaciones posibles de valores de verdad de las proposiciones simples. se dice que estamos ante una contradicción. p q r p ∧q (p ∧ q) ∨ r T T T T F T F T F T F T T F T F F T F T T T F T T T F F F F F T F F F F F F F F Se han tachado los renglones que corresponden a combinaciones imposibles de valores de verdad de las proposiciones simples (por ejemplo. la proposición compuesta estará mal formulada. q no puede ser falsa).Apuntes de Programación I La temperatura está entre 20oC y 25oC. o bien es menor a 15oC Aquí nos encontramos con tres proposiciones: p: (t ≥ 20) q: (t ≤ 25) r: (t < 15) Tenemos dos posibilidades: que la temperatura esté dentro del rango (conjunción de p y q) o que sea menor de un valor (r). si r es verdadera. existen 8 combinaciones posibles de valores de verdad. pero ambas cosas no pueden suceder a la vez (disjunción excluyente). Tautología y Contradicción Si la proposición compuesta es verdadera para todas las combinaciones posibles de valores de verdad de las proposiciones simples. En ambos casos.Escuela de Educación Técnica Galileo Galilei . y habrá que revisar si corresponde al enunciado en lenguaje natural. 19 . (p ∧ q) ∨ r [(t ≥ 20) ∧ (t ≤ 25)] ∨ (t < 15) Al tratarse de tres proposiciones simples. Ésta consiste en una directiva y un conjunto de condiciones. el control es llamado implícito.2 Selección diádica Esta construcción consiste en dos partes de procedimiento y una parte de control con una condición.Program constructs and conventions for their representation (Extracto traducido) 1 Ámbito Esta Norma Internacional se refiere a la expresión de algoritmos orientados a procedimiento.1 Iteración precondicional Esta construcción consiste en una parte de procedimiento y una parte de control con una condición. La operación de terminación identificará cuál construcción debe terminar.5.5 Construcción de elección selectiva 4. 4. el valor de las cuales selecciona cero o más partes de procedimiento a ser ejecutadas en una secuencia indefinida.2 Iteración postcondicional Esta construcción consiste en una parte de procedimiento y una parte de control con una condición. 4. La parte de control activa o desactiva la/s parte/s de procedimiento dependiendo de la naturaleza de la directiva y el valor de las condiciones.3 Construcción paralelo Esta construcción consiste en dos o más partes de procedimiento y una parte de control que inicia esas partes de procedimiento.1 Construcción imperativa Esta construcción contiene una parte de procedimiento y una parte de control implícita la cual determina que la parte de procedimiento es ejecutada exactamente una vez. 4. 2 Definición de construcciones de programas Una construcción de programa consiste en un conjunto de uno o más partes de procedimiento y una parte de control la cual puede estar implícita.4.4.4. La operación de terminación que finaliza una construcción paralela o una construcción selectiva múltiple inclusiva no está 20 . 4. c) provee especificaciones acerca de un conjunto de constructores.3 Selección múltiple exclusiva Esta construcción consiste en un número de partes de procedimiento con una parte de control con un conjunto de condiciones.2 Construcción serial Esta construcción contiene dos o más partes de procedimiento y una parte de control implícita que determina que las partes de procedimiento son ejecutadas exactamente una vez en la secuencia dada. 4. 3 Cómo pueden combinarse las construcciones El único modo en que las constructoresciones pueden ser combinadas para construir un programa bien estructurado es reemplazando una parte de procedimiento de una construcción por una construcción completa. 4. o puede ser nulo. Si la operación de terminación es ejecutada.5. La parte de control determina la manera en que son ejecutadas las partes de procedimiento.Apuntes de Programación I Apéndice B Norma ISO/IEC 8631 Information technology .4 Construcción iterativa 4. 4.5. la ejecución de un constructor puede ser terminada mediante una operación de terminación ubicada en uno o más partes de procedimiento de la construcción.1 Selección monádica Esta construcción consiste en una parte de procedimiento simple y una parte de control con una condición. Ella a) define la naturaleza de las construcciones de programas. la ejecución de la construcción identificada y todas sus construcciones internas deben cesar inmediatamente.4 Selección múltiple inclusiva Esta construcción consiste en un número de partes de procedimiento con una parte de control con un conjunto de condiciones. 4. el valor de la cual determina cual de las dos partes de procedimiento es ejecutada. el valor de la cual determina si la parte de procedimiento es ejecutada más de una vez.Escuela de Educación Técnica Galileo Galilei .5. Cada parte de procedimiento consiste en una o más operaciones a ejecutar. b) indica la manera en que esas construcciones pueden ser combinadas. 4 Especificación de construcciones 4. 5 Terminación En adición a la terminación de un constructor definida por su parte de control. el valor de las cuales determina cual de las partes de procedimiento es ejecutada. d) permite la definición de una variedad de subconjuntos de las construcciones definidas.3 Iteración continua Esta construcción consiste en una parte de procedimiento y una parte de control con una condición implícita la cual especifica que la parte de procedimiento es repetida indefinidamente. Si no existe directiva ni condición. La ejecución de la construcción finaliza cuando todos las partes de prodecimiento iniciadas son completamente ejecutadas. el valor de la cual determina si la parte de procedimiento es ejecutada cero o más veces. 4. el valor de la cual determina si la parte de procedimiento es ejecutada o no. . CONSTRUCCIÓN Imperativa Paralela PSD CONSTRUCCIÓN (Program structure diagram) Parte de Procedimiento Parte de Proced 1 Parte de Proced 2 Serie Parte de Proced n Parte de procedimiento Iteración postcondicional PSD (Program structure diagram) Parte de Procedimiento 1 Parte de Procedimiento 2 Control Iteración precondicional Parte de procedimiento Control Iteración continua Parte de procedimiento Control Selección monádica Selección múltiple exclusiva Operación de terminación Condición valor Parte de procedimiento Selección diádica Condiciones val 1 val 2 val n Parte Parte proc proc 1 2 Parte proc n .... Identificador de construcción 21 .Escuela de Educación Técnica Galileo Galilei ... . Una operación de terminación que finaliza una construcción externa no cumple con esta Norma Internacional. El uso de construcciones distintas a las definidas en esta Norma Internacional que sean funcionalmente equivalentes a una composición de construcciones definidas en esta Norma Internacional está en conformidad con esta Norma Internacional. . Selección múltiple inclusiva Condición valor 1 valor 2 Parte de Parte de proced 1 proced 2 Condiciones val 1 val 2 val n Parte Parte proc proc 1 2 Parte proc n .. Definición de subconjuntos El uso de un subconjunto de construcciones definidas en esta Norma Internacional y combinadas de acuerdo a esta Norma Internacional se considerarán en conformidad con esta Norma Internacional..Apuntes de Programación I definida.  gedit o geany. que son las que permitirán compilar los programas. El lenguaje de programación C es compilado.   no   es   imprescindible   utilizar   estas  herramientas en particular. kate.wikibooks.   Así   es   que   los   sistemas   operativos   basados   en   UNIX. Las herramientas a instalar dependerán del sistema operativo utilizado. será necesario tener instaladas las herramientas gcc y make y la versión 6 de la  glibc con su documentación. ya que el mismo código  podía   ser   utilizado   en   las   distintas   plataformas.   estos   entornos   incluyen   un   compilador. que es un entorno libre multiplataforma. Si bien su nombre es Dev­ C++.Escuela de Educación Técnica Galileo Galilei . para quienes son novatos en la programación. ya que incluyen  facilidades adicionales para la ejecución y solución de problemas. tanto novatos  como expertos.   y   otras  herramientas.   el   sistema  GNU/Linux y muchos otros fueron desarrollados en C.   para   facilitar   la   tarea   de   los   programadores   existen   los   denominados  Entorno   de   desarrollo  integrados   (IDE). es recomendable utilizar un entorno de desarrollo  como son el Anjuta DevStudio (para el entorno GNOME) o KDevelop (para el entorno KDE). Para escribir y modificar el código.   propiciando   la   reutilización   de   código   y   reduciendo   los  tiempos   de   desarrollo. Los programas mencionados se incluyen dentro de la instalación estándar de la mayoría de las distribuciones  actuales de GNU/Linux. es el Bloodshed Dev­C++. Java o cualquier otro lenguaje de programación.   un   depurador. Sin embargo. como son emacs.   el   sistema   BSD. Historia de C El lenguaje de programación C fue creado por Dennis Ritchie entre 1969 y 1973 cuando trabajaba en Bell  Laboratories de AT&T junto con Ken Thompson en el diseño del sistema operativo UNIX. Además. que será el  encargado de transformar nuestro código fuente en código que la computadora pueda ejecutar. cualquier compilador puede servir. También hay otras alternativas privativas como los compiladores de Borland o de Microsoft (Microsoft Visual  C++). Contar con un lenguaje de alto nivel permitió el avance de los sistemas operativos.   En   muchos   casos. Windows Uno de los entornos de desarrollo más conocidos entre los programadores de C sobre Windows. C fue creado para  poder escribir dicho sistema operativo en un lenguaje de alto nivel.Apuntes de Programación I Apéndice C Programación en C De http://es. independiente del hardware donde se  ejecutara. es posible utilizar cualquier editor (en lo posible que cuente con resaltado  de sintaxis). de modo que para instalarlos sólo será necesario seguir el procedimiento usual de  instalación de aplicaciones para la distribución deseada. necesitamos contar  con aplicaciones o herramientas que nos permitan poner en funcionamiento nuestro programa. como en C++. 22 . vim. Para conseguir el Dev­C++ puede utilizarse la Página de descargas de Bloodshed Dev ­ C++ GNU/Linux En los sistemas GNU/Linux. A continuación se listan algunas  posibilidades   para   el   sistema   operativo   Windows   o   GNU/Linux. así que en este caso necesitaremos un compilador. es posible utilizarlo tanto para C como para C++.org/wiki/Programación_en_C Herramientas Para programar tanto en C.   los operadores =+ y =­ fueron sustituidos por += y ­=. Actualmente es imposible contar la cantidad de aplicaciones y herramientas desarrolladas en C. En   este   estándar   se   tomaron   muchas   de   las   funcionalidades   no   oficiales   y   se   agregaron   funcionalidades  nuevas como los prototipos de función.   Esto. en Bell Laboratories. Evolución A mediados de los años 60s. Bjarne Stroustrup (también de los laboratorios Bell). crea el lenguaje C++. En  este libro se introdujeron nuevas características al lenguaje: los tipo de datos struct. bool y complex. siendo C++ la principal influencia. los comentarios de una sola línea utilizando //. Basándose   en   el   estándar   ANSI   que   estaba   en   preparación.   ha  propiciado el desarrollo de aplicaciones en lenguaje C. con el paso del tiempo se han desarrollado cientos de bibliotecas que permiten a los programadores  de   C   utilizar   el   código   desarrollado   por   otros   para   la   realización   de   tareas   comunes.   Dennis   Ritchie   y   Brian   Kernighan   publicaron   la   primera   edición   del   libro  El   lenguaje   de   programación C. y desde 2007 se está trabajando en el armado  de un nuevo estándar.   a   su   vez. También se cambió la sintaxis de la  declaración de parámetros de funciones. entre otras. Durante   los   siguientes   años. Este estándar es básicamente el  estándar ANSI. como son el diseño de tipos y  las estructuras de datos.   se   añadieron   al   lenguaje   muchas  características no oficiales. Si bien se han creado muchos lenguajes basados en C. Durante los siguientes años. y se trata del mismo lenguaje. el lenguaje C permaneció sin demasiados cambios. que es conocido  como ANSI C.   la  posibilidad de declarar variables en cualquier parte del código. 23 .  Sin embargo. Martin Richards diseñó el lenguaje BCPL con la finalidad de usarlo para escribir  software de sistemas operativos y compiladores. Este libro fue durante años la especificación informal del lenguaje. En 1969. como había  sucedido   antes. Ken Thompson escribió el Lenguaje B.   Este   estándar   incluye   varias   nuevas   características   como   son:   las   funciones   inline.Escuela de Educación Técnica Galileo Galilei . Fue por ello que a finales de los noventa se decidió revisar el estándar de C.Apuntes de Programación I Además. A este estándar se lo conoce. lo que llevó a la publicación del  estándar   C99. long int y unsigned int. C++ es el que ha permanecido más asociado a  C. con el objetivo de recodificar UNIX  (escrito   hasta   ese   momento   en   lenguaje   ensamblador)   usando   un   lenguaje   de   alto   nivel   más   portable   y  flexible.   en   1988   Kernighan   y   Ritchie   publicaron   la  segunda edición de su libro. para que incluyeran el tipo junto con el nombre. Al año siguiente.   Dennis   Ritchie   modificó   el   lenguaje   B.   los   distintos   compiladores   fueron   incorporando   características   adicionales. entonces. que es aún hoy utilizada como una de las referencias principales del lenguaje. con unas pocas modificaciones de formato. A mediados de los años 80. o  C90. añadió características nuevas. siendo la principial que está orientado a  objetos.   llegando   a   crear   el   lenguaje   C   y  reescribiendo el sistema UNIX en dicho lenguaje. que estaban presentes en algunos compiladores y no en otros. El lenguaje descrito en la  primera edición de este libro. con numerosas características adicionales. Fue por ello que en  1989 ANSI (American National Standards Institute) publicó el primer estándar oficial de C.   que   otros  compiladores no tenían. fue conocido como "el C de Kernighan y Ritchie" o simplemente "K&R C". En   los   años   siguientes   a   la   publicación   del   C   de   Kernighan   y   Ritchie. en 1990 se publicó la estandarización ISO del lenguaje. un  lenguaje basado en C. Aún hoy el proceso de evolución del lenguaje sigue avanzando. como C89.  los tipos de datos long long int. y un preprocesador mejorado. En   1978. esto también hace que la dificultad y que los errores que se puedan cometer programando aumenten. no orientado a objetos. y un lenguaje que es de más alto nivel cuanto más lejano esté de la máquina y más cercano al lenguaje humano. C es un lenguaje de alto nivel aunque tiene muchas características de lenguaje de bajo nivel (como el uso que permite hacer de la memoria). que están pensados para distintas finalidades.  • Finalmente. Un lenguaje es de más bajo nivel cuanto más cercano esté al código de máquina.Apuntes de Programación I Fundamentos de programación Definiciones • Se   denomina  algoritmo  a   una   secuencia   de   instrucciones   que   permiten   obtener   un   resultado   en  particular. Alto o bajo nivel Por otro lado. Python. Así que a C se le considera de nivel medio.Escuela de Educación Técnica Galileo Galilei . llamado Programación Orientada a Objetos . siguen  distintos paradigmas. Compilados o interpretados Otra forma de clasificar a los lenguajes de programación que es según la forma en que se ejecutan sus órdenes. En los últimos años ha tomado fuerza otro paradigma de computación. Ese archivo puede ejecutarse luego. Algunas de esas instrucciones pueden hacer que la máquina pase a una instrucción que no sea la siguiente. El programador escribe en algún lenguaje de programación y utiliza las herramientas  provistas por ese lenguaje para transformarlo en lenguaje de máquina. Lenguajes de más alto nivel que C son aquellos en los que el programador no necesita encargarse de manipular la memoria.  • Los  lenguajes   de   programación  son   el   medio   de   comunicación   entre   el   programador   y   una  computadora.   denominamos  programa  a   una   secuencia   de   órdenes   a   ser   ejecutadas   por   una  computadora. Esquemas de programación El esquema de programación llamado Programación Imperativa. Perl o Tcl. que se ejecutarán en orden. los lenguajes de programación se clasifican en niveles. entre otros.  • Las  computadoras. sin recurrir al compilador. tal vez porque se cumpla una condición que hayamos establecido. consiste en escribir una secuencia de instrucciones una detrás de la otra. en el cual se intentan modelar los sistemas creados como extensiones de la realidad mediante la definición de "objetos" que modelan entidades de la vida real y que interactúan entre sí mediante "mensajes" llamadas métodos.  Tipos de lenguajes Existe una gran cantidad de lenguajes de programación. Existen los lenguajes que son interpretados.   son   maquinas   sin   inteligencia   propia. entre muchos otros. El lenguaje C es un lenguaje imperativo. Un programa debe estar escrito en algún lenguaje de programación. como Java. 24 . y de una u otra forma se diferencian de los demás. cuyas órdenes pasan a través de un intérprete que se encarga de ejecutarlas (a partir del código fuente) en el mismo momento en que están siendo leídas. Algunos de los lenguajes interpretados son Python. Estas características hacen que C sea un lenguaje muy potente. La contraparte de los lenguajes interpretados son los lenguajes compilados (como el mismo C) que se diferencian en que las órdenes son transformadas a lenguaje de máquina que se almacena en un archivo ejecutable. C#. Por ende.   una   receta   de   cocina. Ruby.  • El lenguaje de máquina es el único lenguaje que la computadora "entiende" y es capaz de ejecutar. ya que permite optimizar al máximo los recursos de la máquina.   cuya   única   finalidad   es   interpretar   el  código que se les provee. y puede incluir uno  o más algoritmos.   No   necesariamente   son   programas   de   computadora.   o   las  instrucciones para cambiar un neumático son ejemplos de algoritmos de la vida real. 25 .. Imaginemos que la memoria tiene un montón de casillas... y puede contener un número entre 0 y 255.Apuntes de Programación I Los lenguajes compilados tienen la ventaja de la velocidad y la eficiencia. formando octetos (bytes): 1010010 10100001 1010100 10100001 111010 11001001 1010010 11010110 110101 1101010 10110111 . Es exactamente así. pero es más cómodo recordar que esos bits se encuentran agrupados de ocho en ocho. También podemos representar estos números en base hexadecimal: 0x52 0xA1 0x54 0xA1 0x3A 0xC9 0x52 0xD6 0x35 0x6A 0xB7 .. generalmente. Un caracter ocupa exactamente un byte (8 bits) de memoria. pero los interpretados tienen la ventaja de que.. Cada octeto puede contener 28 = 256 combinaciones distintas de ceros y unos. es decir. debemos entender cómo se guardan los datos en la memoria. cualquier número entre 0 y 255: 82 161 84 161 58 201 82 214 181 106 183 .... una enorme fila de casillas. son muy portables y de más alto nivel. cada una de las cuales contiene un dígito binario (bit): 0101001010100001010101001010000100111010110010010101001011010110001101010110101010110111. o entre -128 y 127. dependiendo si queremos considerarlo como sin signo o con él.Escuela de Educación Técnica Galileo Galilei . O considerarlos caracteres: R ¡ T Este es el tipo de dato más elemental que nos podemos encontrar en C: el caracter. ¡ : É R Ö 5 j · . Para entender un poco cómo es posible. Estructura de la memoria Parte de esta potencia de C viene de que permite acceder con mucha libertad a la memoria de la máquina... c.c que se quiere compilar. será posible compilar directamente desde el entorno. se asume que se cuenta con un compilador instalado y se ha editado un archivo hola. mediante un botón o una combinación de teclas.Apuntes de Programación I Primer programa en C En el libro "El Lenguaje de Programación C". Para más información ver la sección Herramientas necesarias. en este caso llamado a.out. Si se tiene el compilador gcc en un entorno UNIX o GNU/Linux. Compilación del código fuente Si se utiliza un entorno de desarrollo. Ejemplo: Hola mundo /* Inclusión de archivos */ #include <stdio. A continuación algunos ejemplos de ciertos comandos según el compilador: 26 .out Hola Mundo $ Es decir que el compilador genera un archivo. la línea será distinta según el compilador utilizado. el archivo puede llamarse hola. En el caso del ejemplo del Hola mundo. la forma sencilla de compilar y ejecutar será: $ gcc holamundo./a. será necesario tener instalado el compilador y un editor o entorno de desarrollo que permitan escribir el código a compilar. sería bueno que se revises la documentación del compilador elegido para conocer los comandos exactos. return 0. ya que seguro que existe algún compilador para ese sistema.h> /* Función principal */ int main (int argc. Pre-requisitos para la compilación de programas Como ya se mencionó. Si tu sistema operativo no aparece en esta lista busca en internet. En las explicaciones a continuación. } Para poder editar y ejecutar este programa será necesario utilizar algún editor y luego un compilador.char **argv) { /* Impresión por pantalla y salida del programa*/ printf("Hola mundo\n").c $ . y la salida generada por ese archivo es "Hola mundo". Antes que nada.Escuela de Educación Técnica Galileo Galilei . Desde entonces se hizo tradición empezar con cualquier lenguaje de programación con el ejemplo del Hola mundo.c. Compilación de programas según la plataforma Windows Para compilar un programa C en entornos Windows. Si se ejecuta el compilador desde la línea de comandos. debemos seguir una serie de pasos que varían según el compilador de C que queramos utilizar. A continuación una explicación detallada sobre el proceso de compilación del programa. y luego un análisis línea por línea del contenido de este ejemplo. como se explicó en la sección Herramientas necesarias. Kernighan y Ritchie introdujeron al lenguaje C utilizando un sencillo programa que mostraba un saludo por la pantalla. por lo cual es especialmente útil verlo como el primer ejemplo de programación en C. En particular en C se involucran muchas partes y sintaxis del lenguaje. El código a compilar debe guardarse con un nombre que represente al programa en cuestión y la extensión . Linux Si bien existen otros compiladores. aunque es posible pedirles que no lo hagan mediante parámetros adicionales.c o cc hola. Así es posible visualizar que la salida de hola.c se completó perfectamente.obj El archivo ejecutable hola. Los compiladores actuales suelen hacer dos funciones de una vez. que incluye la función system y que mediante esta función se ejecute el comando pause del sistema.c En GNU gcc: gcc hola. o modificar la configuración del entorno de desarrollo para que muestre la salida por pantalla al ejecutar el programa. Salida por pantalla Si ejecutamos en entorno Windows el programa directamente desde el navegador de archivos.c Una vez compilado el código fuente se genera un archivo llamado archivo objeto o programa objeto que es luego enlazado mediante el enlazador. la consola se cerrará sin tener el tiempo suficiente de ver nuestro mensaje en pantalla.Escuela de Educación Técnica Galileo Galilei . system ("pause"). lo más usual y más sencillo para compilar un programa en GNU/Linux es el compilador gcc. Al ejecutarlo se producirá la salida deseada en una ventana de consola. compilando y enlazando todo en una sola función.c El archivo objeto hola. se obtendrán dos o tres archivos: El archivo fuente hola.c": /* Inclusión de archivos */ #include <stdio.exe Este último es el que nos interesa. el programa en sí. La solución a ésto es agregar una función adicional a nuestro "hola. konsole. es posible realizar la compilación desde línea de comandos o desde el entorno gráfico.c El C de Zortech: ztc hola. ya que es el que se incluye en todas las distribuciones. gnome-terminal. será necesario contar con una terminal (xterm.c En Visual C de Microsoft: cl hola.c En C++ de Borland: bcc hola. Para realizarla desde línea de comandos. De cualquier forma. No es necesario contar con permisos de root para crear o compilar programas. se mostrará la cadena esperada y luego de terminada la función. lo que sucederá será que apenas abierta la ventana de la consola. Para poder ver la salida por pantalla será necesario ejecutar el programa desde la línea de comandos. return 0.Apuntes de Programación I • • • • • En Turbo C de Borland es: tcc hola. } Las dos líneas agregadas permiten que utilicemos la biblioteca stdlib. En esa terminal será necesario escribir 27 .h> /* Función principal */ int main (int argc. o también desde algunos entornos de desarrollo. para generar el archivo ejecutable.char **argv) { /* Impresión por pantalla y salida del programa*/ printf("Hola mundo\n"). que evita que el programa siga hasta que se presione una tecla.h> #include <stdlib. Según el compilador y la configuración utilizada. etc). puesto a que es el código ejecutable. hay que colocar paréntesis alrededor de lo que queremos imprimir para utilizarla. 28 . diciéndole al sistema que el valor de retorno (el código que el sistema operativo utiliza para saber si el programa ha funcionado bien o ha dado fallos) es 0.c -o hola -Wall -pedantic La opción -Wall nos mostrará todos los avisos que produzca el compilador.c Si no existen errores en el código. Sin el salto de línea. de la siguiente forma: gcc hola. todas las sentencias terminan con un punto y coma. Esta es la línea que hace aparecer la cadena Hola Mundo en nuestra pantalla./a. podemos agregar las siguientes opciones: gcc hola./a.out Hola Mundo$ Es decir que no hay salto de línea entre la cadena impresa. Podemos observar también que la cadena a imprimir termina con una extraña combinación: \n. La combinación \n no representa a dos caracteres independientes. Lo último a notar en la línea es que termina con un punto y coma. el resultado al ejecutar el programa sería: $ .out Hola mundo Es una buena idea especificar el nombre que el archivo ejecutable tendrá. termina el programa. La opción -pedantic nos aporta más información sobre los errores y los avisos mostrados por GCC. Para ejecutarlo.c -o hola Con lo cual. Se trata de la instrucción return finaliza el programa. el nombre del archivo creado será hola.out". pasando como parámetro al compilador la opción -o. Es probable que lo primero que salte a la vista sea la línea: printf("Hola mundo\n"). y la siguiente entrada de la línea de órdenes. Al principio puede parecer obvio dónde termina una sentencia. dependiendo del tipo de programa. es decir. Se denomina invocar una función a la acción de utilizarla para que realice una acción. que imprime su argumento (la cadena Hola Mundo\n) en la pantalla. para poder entender qué hace cada una de las líneas de nuestro sencillo programa.exe. no solamente los errores. pero ya veremos más adelante que no lo es tanto. que no es lo que esperábamos. En C. y que podemos ejecutar desde la línea de comandos de la siguiente forma: . además. haremos los mismo que en el caso anterior: . printf es una función. Diseccionando el "Hola Mundo" A continuación veremos cuál es la estructura básica de un programa en C. Los avisos nos indican dónde y/o porqué podría surgir algún error en nuestro programa. Esto se debe a que en C. Observemos ahora la siguiente sentencia del programa: return 0./hola Hola mundo Existen otros parámetros que podemos especificar al compilador en la línea de comandos.Escuela de Educación Técnica Galileo Galilei . Luego de esta sentencia.Apuntes de Programación I gcc hola. Notamos que en C la sentencia para imprimir algo por pantalla es printf() y. Por ejemplo. y en función de la complejidad del mismo. correcto. Este archivo no tiene extensión ya que es la forma usual de llamar a los archivos ejecutables en los entornos UNIX y GNU/Linux. que por omisión se llama "a. sino que representa un único carácter no imprimible: el salto de línea. sin embargo funcionaría de la misma forma si se llamara hola. este comando nos creará un archivo ejecutable. esa línea no es parte del programa. aunque sea imprescindible. e incorporadas al estándar de C a partir de C99: //. procedentes del lenguaje C++. Los tipos de datos enteros son: short.Escuela de Educación Técnica Galileo Galilei . antes (de ahí el nombre de preprocesador) de que comience la compilación. que representan a la cantidad de argumentos ingresados al ejecutar el programa y a los valores de estos argumentos respectivamente. se trabaja en equipo y no todos programan de la misma manera. En general se pueden usar para representar cualquier variable discreta. Comentarios Una vez escrito un código. existían cuatro tipos de datos básicos que son: los números enteros. porque es la que contiene el programa completo. y cuando ésta acaba. 29 .char **argv) indica al compilador que la función que viene a continuación. hasta el final de la línea. y por ello se los considera primitivos. Enteros Los enteros son el tipo de dato más primitivo en C. comienza a hacerlo por el principio de la función main. que antes utilizamos pero que no escribimos. todo se hace a base de funciones. parece no tener sentido. no se esperará al segundo. es decir. que da nombre) al bloque? Pues es la definición de una función. se llama main. A partir del estándar C99 se agregan: los valores lógicos (verdadero o falso) y los números complejos. se considerará un comentario y el compilador no lo tomará en cuenta. Por esto. Un comentario en C es todo lo que se encuentre entre los símbolos /* y */. ya que forma parte de la biblioteca estándar de C. tratar de entenderlo un año más tarde solo con leerlo puede ser frustrante: no hay manera de saber (si el programa es medianamente complicado) qué es cada variable. como la arriba comentada printf. seguirá siendo el primer */ el que finalice el comentario. cuando el ordenador va a ejecutar el programa. En los próximos capítulos podrán verse mejores usos de los comentarios dentro del código. como nos lo indica el símbolo #. La línea: int main (int argc. o qué hace cada bloque de código. Estos tipos de datos son parte del lenguaje. y un tanto aparte (está separada del resto por una línea en blanco). los números reales. 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 un capítulo posterior podrá ver un ejemplo del uso de estos parámetros. int. en cualquier lenguaje de programación son importantes los comentarios. En este capítulo veremos los enteros. como son los vectores. La línea es una instrucción del preprocesador de C. además. que es el 0 de la instrucción return. Hay que tener en cuenta que los comentarios no se pueden anidar: si dentro de un comentario hay un /*. Finalmente. En el ejemplo presentado pueden verse tres líneas con comentarios. el programa también. y que. y los punteros en general. Tipos de datos Historia En el lenguaje C estandarizado como C89.h es el que contiene la definición de la función printf(). El fichero stdio.Apuntes de Programación I Estas dos sentencias se encuentran encerradas entre llaves. tenemos la línea #include <stdio. En C (y en mucha de la programación estructurada). que documentan someramente las distintas funcionalidades del código. aquí los comentarios son fundamentales. y lo que hace es incluir en ese punto el contenido de otro fichero. De esta manera. entre llaves. Efectivamente. las cadenas de caracteres. puesto que ya hemos definido la función main que hace todo el trabajo. forman un bloque. Pero siempre se pueden encontrar otras aplicaciones para los números enteros. Más adelante se verán otros tipos de datos más complejos.h> Que parece bastante distinta al resto del programa. Todo lo que esté después de estos signos. la función main. y los punteros. cuyos argumentos son int argc y char **argv. La función main es especial. los caracteres. los reales y los caracteres. Hay otro tipo de comentarios en C. ¿Y qué es esa línea que precede (en realidad. un grupo de sentencias que se ejecutarán siempre de correlativa. y da como resultado un número entero (int). Es decir. long y long long. Se usan para representar números enteros. Muchas veces. signed long a. El tipo de dato flotante en lenguaje C sólo tiene dos tamaños: el float y el double. En el caso de los números con signo.Apuntes de Programación I Es decir que para el lenguaje C existen diferentes tamaños de números enteros que. el lenguaje C hace la distinción de si el entero es con signo o sin signo (signed o unsigned). Este tipo se utiliza para representar los 255 caracteres de la tabla de caracteres del sistema. Algunos ejemplos de declaraciones de enteros: int a. El exponente usa la representación de un entero con complemento a dos. mediante un número decimal llamado mantisa y un exponente que indica el orden de magnitud. el bit decimal más significativo vale 1/2. ya que utilizan un sistema de representación basado en la técnica de coma flotante. 2. 4. Se mueve la coma (en la representación binaria de la parte entera) hasta que esté a la derecha del primer uno y éste se descarta (el uno más significativo). que son 4 bytes y 8 bytes respectivamente. unsigned int a. pueden tener desde 1 byte hasta 8 bytes (para más detalles busca en la referencia). ya que puede tomar valores de 0 a 255. en particular en las plataformas integradas. el otro 1/8. Una alternativa que se utiliza en estas situaciones es interpretar los enteros como decimales de forma que 150 se interprete como 1. signed long long a = 10000000. Todos los números son representados en memoria mediante una cadena de bits. Esto se debe a que los números flotantes no necesariamente tienen soporte de hardware. el bit más significativo es el que se usa para representar el signo. Se concatena todo y ese es el valor flotante representado en memoria. float a = 4e-9. 3. se utiliza 1 bit para el signo. double a = 3. el otro 1/16 y así hasta completar lo que falta para los 23bits del valor. El procedimiento para almacenar un número en una variable flotante es el siguiente: 1. Para el caso de los flotantes de 4 bytes. La representación de los números negativos se realiza mediante el complemento a dos. El valor del exponente será el número de posiciones que se movió la coma. que tiene sólo 1 byte de tamaño. El tipo char es también un tipo entero. Esto usando el peso de los bits. Algunos ejemplos: float a. 8 bits para el exponente y 23 bits para el valor del número. La forma de declarar un entero es con uno de los tipos de datos que sean enteros según el tamaño que se quiera.5 y 2345 como 23.45. En cuanto a la forma de declarar variables de tipo char es la misma forma que con los otros tipos. que es una técnica que permite operar con los números negativos de forma lógica. double a = -78. la representación en memoria de un -8 en una variable de 2 bytes. 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. double a = 1e23. según el compilador y la plataforma de hardware.1416. 5. Se convierte en binario la parte decimal del número. entera. como para representar números enteros con un orden de magnitud muy grande. se toma con signo. 30 . Se convierte a binario la parte entera. Sólo a modo de ejemplo. el siguiente vale 1/4. Se los puede utilizar tanto para representar números decimales. char a.y 0 para el +). Además. Hay que tener en cuenta que aunque los valores flotantes son más convenientes para algunas aplicaciones.Escuela de Educación Técnica Galileo Galilei . con signo sería la siguiente: 1000000000001000 Flotantes Se denomina flotantes a los tipos de datos que representan a los números reales. que permite operar con números reales de diversas magnitudes. hay casos en los que se prefieren los enteros. Caracteres Los caracteres se representan utilizando el tipo char. Se coloca el signo en el bit más significativo de la misma manera que en los enteros (1 para el . En caso de que no se declare si es con signo o sin signo. Y eso es justamente lo que hace tan fabulosa y útil a printf(). Veamosla poco a poco. porque permite que ocupen sólo un byte en memoria. 3 o 4 bytes. Lo primero que vemos en la definición es que es una función de tipo int. La entrada de datos se refiere a cualquier forma de influencia del usuario sobre los datos que posee el sistema.Escuela de Educación Técnica Galileo Galilei . el estándar C99 introduce el tipo wchar que puede ocupar más de 1 byte. Si miramos (en la documentación) su definición. Se trata de una función de la biblioteca estándar.) . se le puede asignar un número a una variable char. Como puedes ver.numero*2. 31 . printf() siempre trata las secuencias que comiencen por % como secuencias de control que le dicen que debe imprimir algo que le proporcionamos en los otros argumentos..claro que por algo tiene una sección completa de la documentación para ella sola. Por ello. utilizando printf() como vimos en el primer ejemplo "Hola mundo".. /*imprime la cadena*/ Y vimos que printf() también puede. Y luego vienen esos extraños puntos suspensivos. numero=3. de modo que el tipo char ya no alcanza para la representación de todos los caracteres. Se trata de una cadena de caracteres (char *) que no será modificada por la función (const). 2. Así. Aquí el punto de inserción es la secuencia %i. . imprimir un número entero que hayamos almacenado en una variable: char resultado.resultado). Como ya vimos: printf("Hola Mundo\n"). lo que quiere decir que para utilizarla tenemos que incluir previamente su definición. printf("Resultado de la suma: %i\n". Lectura de datos del teclado La entrada de datos se puede hacer de muchas maneras y entre ellas están desde el uso de dispositivos especiales hasta nuestro simple teclado. ya que se trata de un tipo entero. Imprimir por pantalla Como hemos visto hasta ahora en los ejemplos. La encontraremos en <stdio. no nos aclarará demasiado: int printf (const char *TEMPLATE. así como scanf() para la lectura del teclado.. Es importante notar que con la llegada de la codificación UTF-8. con lo que puede ser una constante de cadena o una variable que contenga una cadena. En algunas situaciones particulares se utiliza el tipo char para contadores.numero*numero). printf("El doble de %i es %i y su cuadrado es %i\n". Interacción con el usuario En este capítulo veremos un póco más sobre como interactuar con el usuario de nuestros programas desde la consola. podemos imprimir varios enteros distintos en los sitios que queramos de la cadena. que se supone que la función sabrá qué hacer con ellos. Ese entero es el número de caracteres impresos en la pantalla.h>. Esa elipsis nos indica que como argumentos adicionales de printf() podemos poner una serie ilimitada de otros argumentos. lo que quiere decir que devuelve un entero. con un argumento extra y una sintaxis especial. los caracteres de los diversos idiomas pueden ocupar 1. hay una función que utilizamos para sacar por pantalla textos arbitrarios o el resultado de alguna operación: la función printf(). El uso más simple de printf() es imprimir una cadena de texto simple y corriente. pero siempre debe acabar con el carácter nulo \0.numero. char a = 48. o un número negativo en caso de que se produzca algún error. según sea necesario para la codificación utilizada por el sistema.. resultado=5+2.Apuntes de Programación I char a = 's'. Lo siguiente a notar es su primer argumento: const char *TEMPLATE. insertando varias de estas secuencias %i: int numero. h> int main() { int a. sólo el scanf. scanf("%i. #include <stdio.&a). resultado=5+2. sólo hay que recordar que se debe usar el símbolo dentro del scanf. Entonces.Escuela de Educación Técnica Galileo Galilei . que realice unas pocas sumas.&b).a). el scanf recibe como argumento una cadena del formato en que se van a capturar los datos y la lista de variables que van a recibir valores y que deben coincidir con los del formato. Expresiones Vamos a tratar ahora de que el ordenador haga un poco de matemáticas para nosotros. Se observa que la funcion printf dejó en pantalla una petición para que el usuario introdujera un valor. En el código se ve lo siguiente: scanf("%i". en el scanf se pueden capturar varios datos en una sola sentencia.&a). El símbolo (&) que precede a la variable a es para especificar que lo que se está mandando como argumento no es el valor que posee la variable a sino la dirección en que se encuentra. printf ("diga un valor para a:"). printf("Resultado de la suma: %i\n". Obviamente el orden de los argumentos es muy importante.h> y que se usa para capturar diferentes tipos de datos. sólo ha cambiado que se ha introducido una nueva variable en el código y que ésta es capturada por el mismo scanf().Apuntes de Programación I Con el fin de mostrar una forma de entrada simple para el aprendizaje vamos a hablar del scanf() que se encuentra definido en el <stdio. printf ("el primer valor : %i\n". scanf("%i". 32 . que es una función un poco quisquillosa. si no el scanf. O sea que como en el printf se pueden mostrar por pantalla los datos de varias variables en una misma sentencia. El primer %i representa la variable a y el segundo representa la b. printf ("introduzca dos valores con el formato \"a. #include <stdio. Se da una cadena con el formato de los datos y luego se ponen las variables en orden que correspondan a ese tipo de datos.b). } Este otro ejemplo no necesita mucha explicación. El scanf() El scanf() es unas de las funciones más usadas por los principiantes para hacer entrada de datos en el lenguaje C. Otro ejemplo del uso de scanf: #include <stdio. En este momento eso no tiene mucha relevancia.b\" :"). resultado=5-2.h> int main() { int a. Por ejemplo.a). puede dar errores. En el momento en que se hable de punteros se darán más detalles de esto. printf ("el valor es: %i\n".b. return 0.h> int main(void) { int resultado. return 0.%i". Tiene una sintaxis muy parecida al printf. } Por ahora no nos interesan las demás sentencias.&a. En el momento de introducir los datos es necesario poner la coma para separar los valores. restas multiplicaciones y divisiones. printf ("el segundo valor : %i\n".resultado). En este caso sólo se muestra a. Además. en el lugar de la cadena donde queremos que aparezca el valor de la variable. como "Hola Mundo\n". para poder después referirnos a él. ¿por qué no da un resultado? ¿No crea una expresión? Operadores Precedencia * / Izq. multiplicación y división. Pero. que llamamos expresiones. En cuanto a los caracteres de punto y coma. pero a la que le podremos dar valor posteriormente. printf("Resultado de la multiplicación: %i\n". introducimos lo que se llama una cadena de conversión de printf().resultado).c). como separador. según la cual siempre ejecuta primero las multiplicaciones y divisiones. del tamaño de un int (4 bytes).Escuela de Educación Técnica Galileo Galilei . resultado=5/2.resultado). Esta línea lo que hace es reservar un trozo de memoria. usando . + - Izq. ya conocemos cinco operadores. y a continuación las asignaciones. y asignarle el nombre resultado. pero hay algo en ellas que no habíamos visto antes. con el nombre ejemplo. con (respectivamente): $ gcc ejemplo. Con él. resta. que es el valor que obtiene el lado izquierdo al realizar la operación. lo compilamos y ejecutamos. notamos aquí que una expresión también puede ser una sentencia por sí misma. Finalmente. que no tiene valor definido. return(0). de izquierda a derecha. } Después de grabarlo (por ejemplo. Empezando por las últimas preguntas. por eso le damos otro argumento (u otros). el operador de asignación sí crea una expresión. La función printf() no sólo sabe imprimir cadenas simples. -. ¿cómo sabe el ordenador qué operador debe ejecutar primero? Y si es un operador. podemos considerar que en nuestro programa existe una variable.c $ . Para ello. una multiplicación y una división entera. Estas cadenas siempre empiezan por %. sin 33 . de izquierda a derecha. Las líneas con printf() ya las conocemos. printf() debe saber qué valor escribir. sino también imprimir variables.resultado). en la que no obtenemos un bonito decimal./a. como es en nuestro caso int resultado. a Izq. como se puede observar en la división. con los operadores +. En el resto del programa hemos visto cómo decirle al ordenador que ejecute una suma. y esa expresión tiene un resultado. En cuanto a saber qué se debe ejecutar primero. que contienen las variables cuyos valores queremos mostrar. A partir de este momento.out Resultado de la Resultado de la Resultado de la Resultado de la $ suma: 7 resta: 3 multiplicación: 10 división: 2 Fijémonos en la línea del principio de la función main: int resultado. de derecha a izquierda. el ordenador tiene una lista de precedencia. Es de notar que el resultado de una operación como estas entre números enteros será siempre otro entero. como = también es un operador. a Der. = Der. hemos visto que el resultado de esas operaciones. Para más detalles acerca de la precedencia de los operadores ver el anexo de los operadores. a Der. siendo %i la cadena para imprimir un entero. resultado=5*2. puede ser asignado a una variable: resultado = 7. printf("Resultado de la división: %i\n". Esos %i y la parte de resultado son nuevas para nosotros. como los operadores de suma. a continuación las sumas y restas.Apuntes de Programación I printf("Resultado de la resta: %i\n". Esa asignación se hace mediante el operador de asignación: =. * y /. una resta. sino un resultado entero. } else { sentencias_si_falso. La estructura condicional if . La indentación (los espacios al comienzo de las líneas) no es necesaria.Apuntes de Programación I necesidad de que haya ninguna función. tomar decisiones y repetir acciones. Son los operadores de comparación. La estructura condicional if . A continuación un listado de los posibles operadores de comparación en C y su significado. A continuación. Instrucciones de control Como ya se ha mencionado. y optativa cuando sólo se quiere escribir una instrucción. la estructura de un condicional es bastante simple: if (condición) { sentencias_si_verdadero.\n"). cuando la condición sea falsa. sólo se realizará la acción correspondiente al bloque if.\n". la sentencia vacía. sino tan sólo una porción de código): if (edad < 18) printf("No puedes acceder.. que devuelve el mayor de dos números: int mayor(int a. mientras que en caso contrario se imprimirá "Bienvenido. Esas decisiones pueden depender de los datos que introduzca el usuario. if (b > a) { elmayor = b. El bloque del else es opcional. Si no se lo encuentra. Traducida literalmente del inglés. es necesario contar con ciertas estructuras que permitan controlar el flujo del programa.. se la podría llamar la estructura "si..\n". C es un ejemplo de programación estructurada. "si se cumple la condición. haz esto. pero ayuda a la claridad del código.\n"). es recomendable utilizarlas aún cuando sólo vaya a haber una instrucción.. } return elmayor. es una sentencia perfectamente válida. Este código de ejemplo dice que si edad es menor que 18 se imprimirá "No puedes acceder. sin embargo.si no". 34 . La utilización de las llaves {. y su resultado puede ser 1 (equivalente a verdadero) o 0 (equivalente a falso). es decir.Escuela de Educación Técnica Galileo Galilei . haz esto otro".. else printf("Bienvenido. Este resultado provocará que se ejecute el código del bloque if o el del bloque else. y si no. es decir. else es la que nos permite tomar ese tipo de decisiones. De hecho. según corresponda. se ejecutarán las sentencias del segundo bloque de código. } Operadores de Comparación Las condiciones son expresiones que utilizan operadores para tomar la decisión apropiada. } Cuando la condición sea verdadera. que sera útil en puntos donde el lenguaje requiera una sentencia pero no sea necesaria para nuestro programa. Como se ve en el ejemplo. de si se ha producido algún error o de cualquier otra cosa.. Un ejemplo sencillo sería el siguiente (no se trata de un programa completo. else En la gran mayoría de los programas será necesario tomar decisiones sobre qué acciones realizar. Por claridad. int b) { int elmayor = a.. La línea: . En este tipo de programación.. un ejemplo con una función. } es obligatoria cuando se quiere utilizar más de una instrucción por bloque. se ejecutarán las sentencias dentro del primer bloque de código. una sentencia puede no tener siquiera una expresión. return 0. } } Agrupación de operadores Además. 35 . el resto de su división entera será cero. en C se toma como falso el valor 0. || y !. } else { printf ("No se puede dividir por cero\n"). Por ejemplo. podemos usar el operador ! para verificar si el número es múltiplo de 4. a menos que también sean divisibles por 400. es posible utilizar varios de estos operadores a la vez. los operadores correspondientes en C son &&. y como verdadero cualquier otro valor.. que obtiene el resto de la división entera de un número por otro. if ( (!(a % 4)) && (a % 100) || (!(a % 400)) ) printf("es un año bisiesto. Evaluación de corto circuito La evaluación en corto circuito es una característica del lenguaje C que se utiliza para optimizar la ejecución de programas. mediante los operadores lógicos "y". se utiliza la operación módulo. pero no si son divisibles por 100.\n"). Consiste en que el programa puede verificar si una expresión es verdadera o falsa antes de haber evaluado toda condición. "o" y "no". es decir. Siendo que cero es equivalente a falso. } else { printf("no es un año bisiesto. afecta sólo al operando que hay a su derecha. } { En este caso. de 100 o de 400.Escuela de Educación Técnica Galileo Galilei .Apuntes de Programación I Operadores de Comparación Operador Significado < estrictamente menor que > estrictamente mayor que <= menor o igual que >= mayor o igual que == igual a != distinto de Por otro lado. Para realizar combinaciones de operadores. Esto nos permite utilizar condiciones sin operador: float division(int dividendo. y cualquier valor distinto de cero es equivalente a verdadero. Los años son bisiestos si son divisibles por 4. Hay que notar que el operador ! es unario. si se tiene una condición como la siguiente: if ((a > 2) || (b < 4)) { . se utilizan paréntesis que agrupan las condiciones. Un ejemplo donde se ven agrupaciones de operadores puede ser la decisión de si un año es bisiesto o no. int divisor) { if (divisor) { return dividendo / divisor. respectivamente. no lleva ningún operando a su izquierda..\n"). Cuando un número es divisible por otro. pero facilitará ciertas operaciones y optimizaciones en programas avanzados. pues permite al compilador trabajar en base a que se trata de una decisión múltiple para una única variable. de realizarse con sentencias if. default. para cada valor de la variable se ejecuta un bloque de sentencias distinto. únicamente. ignoradas. necesitaría cuatro de ellas.. case 2: printf("El semáforo está anaranjado.. En la mayoría de los casos. pondremos sentencias break al final de cada bloque excepto el último. dos resultados. Una estructura switch . por su parte. en el que no necesitamos llaves. break. "dejar caer la cascada switch". A la ausencia de sentencias break se le llama. En el caso en que sea verdadero. uno para verdadero y otro para falso. Las sentencias break son muy importantes. nos permite elegir entre muchas opciones: switch (semaforo) { case 1: printf("El semáforo está verde.\n"). las etiquetas case son puntos de entrada de la ejecución.. case La estructura condicional switch . Esta característica no tiene demasiada importancia al comenzar a programar.\n"). while (/* Condición de ejecución del bucle */) { /* Código */ } La condición ha de ser una sentencia que devuelva un valor booleano. no se evaluará la siguiente condición. Como vemos. Hay un caso especial. break. default: printf("ERROR:¡El semáforo no puede estar en ese estado!. case. } La estructura anterior.Escuela de Educación Técnica Galileo Galilei . en ocasiones. y no implican que al acabarse el bloque case la ejecución salte al final del bloque switch. resultando un enorme bloque muy difícil de leer.. ya que el resultado será falso de todos modos. en todo. no continuará con la siguiente condición. verdadero (true 36 .Apuntes de Programación I } Al ejecutarse el programa. El bucle while El bucle while sirve para ejecutar código reiteradas veces.\n").. Por ello.. Es. se evaluará primero si a > 2. equivalente al bloque else de una sentencia if. y esta puede ser el valor booleano en sí. break. la sentencia switch proporciona una ganancia en velocidad del código. } En este caso.\n"). y que no es necesario poner. cosa que con sentencias if el compilador no tiene por qué detectar. ya que el comportamiento normal de un bloque switch es ejecutarlo todo desde la etiqueta case que corresponda hasta el final.. case 3: printf("El semáforo está anaranjado parpadeante.\n"). si la condición fuera: if ((a > 2) && (b < 4)) { . ya que el resultado será de cualquier modo verdadero. además. De la misma forma. Las etiquetas case siguientes a la que hemos utilizado para entrar son. que se ejecuta si ningún otro corresponde. case 0: printf("El semáforo está rojo. break.. La estructura if nos puede proporcionar. si no se cumple que a > 2. La estructura condicional switch . sencillamente. Es decir. si no queremos que se nos ejecute más de un bloque. case se utiliza cuando queremos evitarnos las llamadas escaleras de decisiones. <=.Apuntes de Programación I o 1) si la condición se cumple. /* incremento o decremento */) { /* código a ejecutar */ } Inicialización: en esta parte se inicia la variable que controla el bucle y es la primera setencia que ejecuta el bucle. While significa "mientras" Su forma es esta: do { /* CODIGO */ } while (/* Condición de ejecución del bucle */) Os muestro un ejemplo sencillo de uso: 37 . con lo que cambiará el valor de la variable "tecla". pero los puntoy-coma entre ellos sí se han de dejar. incremento o decremento: es la ultima sentencia que ejecuta el bucle por lo general incrementar la variable con que se inicio el ciclo. son las sentencias comparativas. si vale 0 será como si la condición no se cumpliera. NOTA: recuerde que en cualquier sentencia donde se evalúa una expresión válida. i < 100. que usan los operandos ==. El bucle for El bucle for es un bucle muy flexible y la vez muy potente ya que tiene varias formas interesantes de implementarlo. Sentencia condicional: es la segunda sentencia que ejecuta el bucle. >. si es verdadera tiene lugar una ejecución más del cuerpo del ciclo. esta parte del bucle también se puede implementar con una variable de tipo bool. que determina si el bucle se ejecutará o no. y la más usada sin duda. /* sentencia condicional */. un valor de retorno=0 se considera falso y cualquier valor distinto de cero es verdadero. junto con otro valor. while (tecla == 0) { tecla = readkey(). así false=0 y true=1. !=. /* Intentamos leer una pulsación de tecla */ } En este ejemplo lo que hacemos es que el programa se ature hasta que el usuario pulse una tecla. i). Aquí muestro un ejemplo de un bucle que se ejecuta 100 veces: for (int i=0. y siempre que sea diferente de 0. es una sentencia condicional válida. después de eso el bucle revisa nuevamente la condición. o falso si esta no se cumple (false o 0). si es falsa se termina el ciclo y así la repetición. Aunque sea una variable no booleana. <.while El bucle do. siempre se podrá usar. El bucle do. se ejecuta una vez. También puede ser el nombre de una variable. i++) { printf("%i\n". por lo menos. <=. Por lo general la sentencia condicional se compone de la variable que se utilizó para la inicialización del bucle a la cual se le aplica alguno de los operadodores relacionales <. este se ejecutará indefinidamente hasta que se ejecute una sentencia break o se termine la función o el programa mediante un return. también se pueden poner allí llamadas a funciones que devuelvan un valor. >=. Creo que es importante comentar que esos tres "parámetros" que se le pasan a la sentencia for se pueden omitir. solo se ejecuta una vez ya que solo se necesita al principio del bucle.Escuela de Educación Técnica Galileo Galilei . su forma más tradicional es la siguiente: for (/* inicialización */. >. La forma más obvia tal vez. int tecla = 0. se considerará que la condición se cumple.while es un bucle que..... Su uso sería así: variable o valor inmediato operador variable o valor inmediato Tened en cuenta que además de las variables y los valores inmediatos. y el valor de la expresión dependerá de su contenido. También cabe destacar que si no se pone la condición de ejecución del bucle. } No es necesaria por ejemplo en la primera la sentencia iniciar la variable que utilizara el bucle si ya ha sido inicializada en otra parte del bloque de sentencias donde se encuentra el bucle. >=. la sentencia de control return no puede llamarse como pseudofunción. La verdad es que es una sentencia poco aceptada por la comunidad de programadores.Apuntes de Programación I int aleatorio. dejando en ésta tan sólo un guión general de lo que hace el programa. } while (aleatorio != 25) La verdad es que este ejemplo puede resultar un poco absurdo.else. Y además nos muestra un principio de buena programación: meter las sentencias que "hacen el trabajo" en otras funciones específicas para sacarlas de main(). o para ir a una parte del código u otra si se combina con una sentencia if.h> void holamundo(void) /*Función donde se ejecuta la lógica del programa*/ { printf("Hola Mundo\n").Escuela de Educación Técnica Galileo Galilei . cuando se ejecute la sentencia goto. cosa que su definición no permite. el programa continuará su ejecución a partir de la etiqueta marcada. Podemos definir una función cualquiera de la misma manera en que definimos la función main(). su nombre. no es indiferente el orden en que se sitúen las diferentes funciones en el fichero: las funciones deben declararse antes de ser llamadas. y mientras esa variable no tenga el valor 25. Basta con poner su tipo. do { aleatorio = rand(). 38 .. entre llaves. y hay muchas más funciones predefinidas. /*imprime la cadena*/ return. printf() otra. /*sale del programa: correcto*/ } Este código es en todo equivalente al "Hola Mundo" original. pero es bastante intuitivo. pero nosotros mismos también podemos definir nuestras propias funciones. /*llamada a la función que lleva el peso*/ return 0. y para la ejecución opcional de bloques de código. no las órdenes específicas. pero para los bucles ya hay estructuras definidas. porque en dicho caso la función void (en nuestro caso holamundo()) devolvería un valor. De hecho. Sólo en ocasiones muy excepcionales será recomendado el uso del goto al crear iteraciones muy complejas. pues puede provocar que se hagan programas un poco "sucios" y confusos. main() es una función. sólo que nos muestra cómo escribir y cómo utilizar una función. y por tanto el futuro trabajo de modificarlo. Como se puede observar se puede usar para crear un bucle. es fundamental hacerlo. De la misma manera que tenemos que declarar una variable antes de utilizarla. /* Código */ Así. ya existen las Funciones. Igualmente vemos que. /*sale de la función*/ } int main(void) /*Función principal del programa*/ { holamundo(). para una función void. Uso de Funciones Funciones Como vimos anteriormente C tiene como bloque básico la función. De esta manera se facilita la comprensión del programa. El código del bucle asigna un valor aleatorio a la variable definida anteriormente. Su sintaxis es más o menos así: /* Código */ ETIQUETA: /* Código */ goto ETIQUETA. El goto La sentencia goto sirve para indicar al programa que continue ejecutándose desde la línea de código indicada.. su código: /* Inclusión de archivos */ #include <stdio. el bucle sigue ejecutándose. sus argumentos entre paréntesis y luego. return 0.h> int sumar(int numero1. suma). valor = 3. /* retornamos la suma de los números */ } Paso de Parámetros Las funciones pueden recibir datos como lo hemos observado. La definición de una función para sumar dos números sería de la siguiente manera: /* * suma.c * */ #include <stdio. */ /* imprimimos la suma de los dos números */ printf("La suma es: %d ". Por Valor El paso por valor envía una copia de los parámetros a la función por lo tanto los cambios que se hagan en ella no son tomados en cuenta dentro de la función main().Apuntes de Programación I Las funciones también permiten recibir tipos de datos. con las cuales observarse que son muy diferentes y que una puede ser muy diferente de la otra. int numero2). } int sumar(int numero1. * suma = sumar(dato. 3). int numero2) { int retsuma. /* asignamos a esa variable la suma de número 1 return retsuma. /* prototipo de la función */ int main(void) { int suma. Así que las funciones también pueden retornar un tipo de dato que hemos definido dentro de la misma. /* definimos una variable*/ suma = sumar(5.Escuela de Educación Técnica Galileo Galilei . /* la variable obtiene el valor retornado de sumar * puede verse que entre los paréntesis se mandan los valores * de los números que se desean sumar en este caso 5 y 3 * pueden haberse declarados estos dos números en otras variables * int dato = 4. /* creamos la variable a retornar*/ y 2*/ retsuma = numero1 + numero2. así pues las funciones nos sirven para hacer de un gran problema pequeñas partes de un problema o sea dividir un gran problema en diferentes problemas más pequeños. valor).c * * */ #include <stdio. haciendo modificaciones en nuestro programa. Ejemplo: /* * por_valor. pero existen dos formas importantes de enviar los datos hacia una función por valor y por referencia.h> 39 . /* enviamos numero a la función */ printf("\nValor de numero dentro de main() es: %d ". /* definimos numero con valor de 57*/ isumar_referencia(&numero). por lo tanto los cambios que haga la función si afectan el valor de la variable. /* podemos notar que el valor de numero se modifica * sólo dentro de la función sumar_valor pero en la principal * número sigue valiendo 57 */ return 0.Escuela de Educación Técnica Galileo Galilei . numero). numero). /* definimos numero con valor de 57*/ sumar_valor(numero). } void sumar_valor(int numero) { numero++. Ejemplo: /* * por_referencia. /* le sumamos 1 al numero */ /* el valor de número recibido se aumenta en 1 * y se modifica dentro de la función sumar_valor() */ printf("Valor de numero dentro sumar_valor() es: %d\n". numero). /* prototipo de la función */ int main(void) { int numero = 57. } Por Referencia El paso por referencia se hace utilizando apuntadores. return. . Se envía la dirección de memoria de la variable.h> void sumar_referencia(int *numero). */ } 40 return 0. /* podemos notar que el valor de numero se modifica * y que ahora dentro de main() también se ha modificado * aunque la función no haya retornado ningún valor.c * */ #include <stdio. /* prototipo de la función */ int main(void) { int numero = 57. /* enviamos numero a la función */ printf("Valor de numero dentro de main() es: %d\n".Apuntes de Programación I void sumar_valor(int numero). esta definida dentro de cada una de las funciones y son totalmente distinta una de otra y no se puede utilizar fuera de esta. num1=%c\n". } return. Ejemplo: /* * locales. /* llamamos a funcion1() */ funcion2(). /* num2 vale z*/ /* imprimimos */ printf("Funcion2. num2). así pues num2 no puede ser utilizada por la funcion1() y num1 tampoco puede ser utilizada por funcion2(). dato=%d. num2=%c\n". dato. Variables Locales y Globales Además de pasar valores a una función. dato.c * */ #include <stdio. } return. *numero).Apuntes de Programación I void sumar_referencia(int *numero) { *numero += 1. /* llamamos a funcion2() */ } return 0. /* definimos dato en 25*/ char num2 = 'z'. /* num1 vale a */ /* imprimimos */ printf("Funcion1. /* definimos dato en 53*/ char num1 = 'a'. estos tipos de datos declarados dentro de una función solo son accesibles dentro de esta misma función y se les conocen como variables locales. void funcion2() { int dato = 25.h> void funcion1() { int dato = 53. /* le sumamos 1 al numero */ /* el valor de numero recibido se aumenta en 1 * y se modifica dentro de la función */ printf("\nValor de numero dentro sumar_referencia() es: %d". así pues podemos definir los mismos nombres de variables en diferentes funciones. } int main(void) { funcion1().Escuela de Educación Técnica Galileo Galilei . return. dato=%d. En este caso la variable dato. ya que estas variables solo son accesibles dentro de esas funciones. 41 . num1). también se pueden declarar tipos de datos dentro de las funciones. que serían. variable_global). en caso contrario. /* inicializamos la variable global */ void funcion(). o la recursividad no podrá terminar nunca. /* llamada a la función misma */ /* Código */ } Uno de los ejemplos más representativos en la recursividad es el factorial de un numero ( n! ): la definición de recursividad del factorial es: 42 . /* llamamos a la función */ funcion(). La recursión permite especificar soluciones naturales. Una función recursiva podría definirse así: funcion_recursiva( /* parámetros recibidos por la función */ ) { /* Código */ funcion_recursiva( ). acceso a variable_global %d\n".h> int variable_global = 99. sencillas. Se puede considerar la recursividad como una alternativa a la iteración. } return 0. int main(void) { /* imprimimos el valor*/ printf("main(). difíciles de resolver. void funcion() { /* imprimimos el valor*/ printf("funcion(). Toda función recursiva debe contemplar un caso base o condición de salida. para terminar. Ejemplo: /* * global. Funciones Recursivas La recursividad (recursión) es la propiedad por la cual una función se llama a sí misma directa o indirectamente. estas variables se les conoce con el nombre de Variables Globales ya que se pueden utilizar dentro de main() y dentro de cualquier función creada por nosotros. acceso a variable_global %d\n". variable_global).c * */ #include <stdio. La recursión indirecta implica utilizar más de una función. } return.Escuela de Educación Técnica Galileo Galilei .Apuntes de Programación I Existen pues variables que se definen fuera de la función principal main() y fuera de cualquier otra función creada por nosotros. Apuntes de Programación I En esta definición.h> long factorial(int n) { if (n == 0) /* caso base */ return 1. } También existen otros tipos de funciones recursivas como lo es el producto de dos números. n = 0. se retorna 1*/ else return n * factorial (n .1). donde a y b Solución iterativa: Solución recursiva: Así pues es: Podemos ver que la multiplicación de dos números a.c * */ #include <stdio. factorial(5)). el caso base se produce cuando b = 0 y el producto es 0. El producto de a son números enteros positivos seria: b.c * */ #include <stdio. int b) { if (b == 0) /* caso base */ 43 . Entonces nuestro programa que calcula el factorial es: /* *factorial. que le da fin a la recursividad. /* como 0! = 1. return 0. es nuestro caso base. b se puede transformar en otro problema más pequeño multiplicar a por (b-1).h> int producto(int a. Ejemplo: /* * producto. /* llamada a esta misma función */ } int main(void) { /* en este caso se llama a la función y se imprime directamente*/ printf("%ld ".Escuela de Educación Técnica Galileo Galilei . h> void funcionA(char c). La iteración termina si la condición del bucle no se cumple. /* a la misma en la función no sea implícita */ int main(void) { funcionA('z'). b . /* llamado a funcionA */ return 0. se retorna 0*/ return a + producto (a.c * */ #include <stdio.Escuela de Educación Técnica Galileo Galilei . /* como b = 0. /* llamado a la funcionB */ printf("%c ". que esta a su vez terminará llamando de nuevo a la primera función. El siguiente programa visualiza el alfabeto utilizando recursión indirecta o mutua: /* * elalfabeto. /* se declara el prototipo de la función para que el llamado */ void funcionB(char c). producto( 7. } return 0. /* llamada a esta misma función */ } int main(void) { /* en este caso se llama a la función y se imprime directamente*/ printf("%i ".Apuntes de Programación I else return 0. 3)). } void funcionA(char c) { if (c > 'a') /* caso base mientras c no sea menor que A */ funcionB(c). c). /* imprimimos el valor de c */ } void funcionB(char c) { funcionA(--c). /* llamado a la funcionA decrementando el valor de 'z' */ } Recursión versus Iteración Tanto la iteración como la recursión se basan en estructura de control: la iteración utiliza una estructura repetitiva y la recursión una estructura de selección. Recursividad indirecta o recursión mutua Esta se produce cuando una función llama a otra. La iteración utiliza explícitamente una estructura repetitiva mientras que la recursión consigue la repetición mediante llamadas repetitivas a funciones.1). mientras que la recursión termina cuando se reconoce un caso base. 44 . La recursión puede presentar desventajas ante la iteración ya que se invoca repetidas veces al mecanismo de llamada de funciones y se necesita un tiempo mayor para realizar cada llamada. factorial( contador )).c * */ #include <stdio. i >= 1. } return resultado. son mas fáciles de implementar. contador <= 10.) resultado *= i. } return 0.h> long factorial(int numero). en consecuencia. /* calcula el factorial de 0 a 10 */ for ( contador = 0. /* declaracion de la función factorial iterativa */ for ( i = numero. contador <= 10. } /* funcion factorial iterativa */ long factorial( int numero ) { long resultado = 1. int main(int argc.c * */ #include <stdio. contador. contador. /* calcula el factorial de 0 a 10 */ for ( contador = 0. char** argv) { int contador = 0. contador++ ) printf("%d! = %ld\n". int main(int argc. /* función factorial recursiva */ 45 .h> long factorial(int numero). factorial( contador )). Ejemplo Iterativo /* * iterativo.Escuela de Educación Técnica Galileo Galilei . int i = 0. return 0.Apuntes de Programación I La razón por la cual se puede elegir u optar por usar recursividad es que existen muchos problemas complejos que poseen naturaleza recursiva y. i-. Ejemplo Recursivo /* * recursivo. contador++ ) printf("%d! = %ld\n". char** argv) { int contador = 0. 1 ). por lo que el lenguaje nos permite escribir: tipo_elemento nombre[]={valor_0. int d). Es decir: tipo_elemento elemento. O también se pueden declarar: tipo_elemento nombre[largo]={valor_0. valor_2}. cada uno de los valores contenidos tiene una posición asociada que se usará para accederlos. Veamos algunos ejemplos: /* * Ejemplo : El producto escalar de dos vectores */ #include <stdio. y cada uno de estos elemento podrá contener un valor de tipo tipo_elemento. Para acceder a un elemento accederemos a través de su posición. En este ejemplo declaramos un vector de 128 elementos del tipo double.. y en principio se define cuando se declara el vector.. De la misma forma que con las otras declaraciones de variables que hemos visto se le puede asignar un valor iniciar a los elementos. Notar que largo debe ser mayor o igual a la cantidad de valores que le estamos asignando al vector. 46 . Esto declara la variable nombre como un vector de tipo_elementos que podrá contener largo cantidad de elementos. Está posición o índice será siempre un número entero positivo. En C la cantidad de elementos que podrá contener un vector es fijo. los índices de los elementos irían entre 0 (para el primer elemento y 127 para el último). int main() { const int largo = 3. Los vectores se pueden declarar de la siguiente forma: tipo_elemento nombre[largo]. en el caso de ser la misma cantidad no aporta información. Asumiendo que tenemos el vector anterior definido estaríamos guardando valor_2 en elemento. En caso estamos asignadole valores a los primeros 3 elementos del vector nombre.Apuntes de Programación I long factorial( int numero ) { if ( numero <= 0 ) /* caso base */ return 1. valor_1. valor_2}. /* llamada a la función factorial */ } Vectores Los vectores son una forma de almacenar datos que permiten contener una serie de valores del mismo tipo. double v2[]. .h> double producto_escalar(double v1[]. Por ejemplo: double valores[128]. valor_1.Escuela de Educación Técnica Galileo Galilei . elemento = nombre[2]. Que declarará nombre como el vector de largo 3. /* casos bases: 0! = 1 y 1! = 1 */ else /* llamada recursiva */ return numero * factorial( numero . i++) { if (valores[i] > valores[maximo_pos]) { maximo_pos = i. int num_valores) { int maximo_pos = 0. } return resultado. vector_2[1]. volveremos a esto en un capítulo posterior.i<largo. double vector_2[largo] = {-1. Mientras tanto usemos esto para definir una función que le aplique otra función que recibe por parámetro a cada elemento del vector. %f) . guardando el resultado en el mismo vector y una llamada de ejemplo a esta. %f) = %f\n". (%f. Otra función clásica es la búsqueda de un máximo o mínimo. vector_2[2]. Esto puede parecer extraño después del énfasis que pusimos en resaltar que todos los parámetros de una función se reciben por valor. } // imprime el resultado printf("(%f. vector_1[0]. i < num_valores. vector_2[0]. que podemos escribirla de la siguiente manera: int buscar_maximo(double valores[].1. calcular el promedio de los valores. largo). for (int i=0. vector_1[2].i<largo.Apuntes de Programación I double vector_1[largo] = {5. } En el ejemplo anterior usamos los vectores de C para representar vectores matemáticos y calcular el producto vectorial entre ellos. i++) { resultado += v1[i] * v2[i]. int d) { double resultado = 0. double resultado = producto_escalar(vector_1. i < d.0}. pero se aclarará en el siguiente capitulo. /* producto escalar entre dos vectores */ double producto_escalar(double v1[]. vector_2. } } return maximo_pos. %f. int largo) { for (int i=0.i++) { suma+=valores[i]. for (int i = 1. Una peculiaridad que se puede notar es que al recibir un arreglo en una función no se especifica el largo. double v2[].i++) { vector[i]=cuadrado(vector[i]). for (i=0. void cuadrados(double vector[].Escuela de Educación Técnica Galileo Galilei . } Cuando una función recibe un vector por parámetro y cambia su contenido y el cambio es permanente (se ve aún fuera de la función). int i. } return suma/largo. vector_1[1]. double promedio(double valores[]. return 0. %f. resultado).3}. } Otro ejemplo sencillo.5. int largo) { double suma=0. } 47 . . estos se  declaran de la siguiente forma: int matriz[3][7]. // Imprime 9 . podemos tener vectores de vectores. 3.11. printf("tabla[0][1]: %i\n".. 6.. double cuadrado(double valor) { return valor*valor. suponiendo que  v[n]  es un vector de cualquier tipo de dato con n  cantidad  de posiciones..Apuntes de Programación I } .. cuadrados(elementos. 4}. } . tabla[0][3]).10. . 8}.. .num_elem).. int tabla[3][4]={ { 1. En este ejemplo tabla es un vector de longitud 3. cuyos elementos son vectores de longitud 4 de elementos de  tipo int. tabla[2][0]). double v[2][2][2]...Escuela de Educación Técnica Galileo Galilei . 7. { 5. La última posición es v[n­1]  3. La primera posición siempre será v[0]  2.. En versiones previas a C99 n es una constante definida antes de la declaración de v[n]  48 . 2. /* los espacios y saltos de líneas no son tomados en cuenta */ { 9. // Imprime 4 printf("tabla[2][0]: %i\n".12} }. En resumen. De la misma forma que venimos usando vectores de tipos básicos. al  vector v se le aplican las siguientes reglas: 1.
Copyright © 2024 DOKUMEN.SITE Inc.