APUNTES DE PROGRAMACIÓN I · Así como este apunte, la carpeta de la materia deberá ser...

48
Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I APUNTES DE PROGRAMACIÓN I Propósito Este apunte es un apoyo y un elemento de consulta para el curso de Programación I del 4 to año de la especialidad Técnico en Informática Profesional y Personal de la EET N o 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

Transcript of APUNTES DE PROGRAMACIÓN I · Así como este apunte, la carpeta de la materia deberá ser...

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    APUNTES DE PROGRAMACIÓN IPropósitoEste 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 ProgramasEl 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 ProblemasNo 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 ProblemasLa 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ónPara especificar un problema, simplemente se deben completar los siguientes puntos:

    1. Nombre del problema.2. Descripción.3. Magnitudes de entrada.4. Magnitudes de salida.5. 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 indican que 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 / 2Vemos que, si bien se dispone de cuatro datos, solamente dos de ellos son necesarios para resolver el problema.

    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. SupPatio.2. Calcular la superficie del patio.3. l (largo), a (ancho): nos reales.4. Sp (superficie patio): no real.5. Sp = l . a

    1. SupBald.2. Calcular la superficie de una

    baldosa.3. lb (lado de la baldosa): no real.4. Sb (superficie baldosa): no real.5. Sb = lb2

    1. CantBald.2. Calcular cantidad de baldosas.3. Sp(superficie patio), Sb(superficie

    baldosa): no real.4. Cb(cantidad de baldosas): no real5. 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. SupRect2. 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. SupCirc2. Calcular la superficie de un círculo.3. d (diámetro): no real.4. Sc (superficie del círculo): no real.5. Sc = . d 2 / 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 real5. 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. Un tren laminador produce barra redonda a partir de palanquilla. Se necesita saber cuántas barras pueden obtenerse de una palanquilla.

    2. Conociendo el rendimiento de una pintura (r[m2/l]), se debe calcular la cantidad necesaria para pintar las paredes de una habitación.

    3. Para construir una viga de hormigón, se debe calcular el volumen de piedra partida a utilizar.4. 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.5. Se necesita calcular cuántos tambores de aceite, con un peso Pa, pueden cargarse en un camión que soporta un peso

    Pmax.6. Se necesita calcular cuántos cajas, con un volumen Vc, pueden cargarse en un camión cuya caja tiene un volumen V.

    Algoritmos LinealesUn 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 secuencia de acciones.

    Begin {

    Fin Delimitador que indica que finaliza una secuencia de acciones.

    End }

    Leer () Acción de obtener el valor de una variable (magnitud simbolizada con un identificador)

    Read

    Readln

    scanf

    Escribir () Acción de enviar a la salida el valor de una variable.

    Write printf

    4

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Existen también algunos símbolos especiales:

    Símbolo Uso Pascal C

    ; Indica la finalización de una acción. Separa una acción de la siguiente. Indica la finalización de una acción.

    Asigna a la variable de la izquierda el valor de la expresión que aparece a la derecha.

    := =

    . En Pascal se coloca después del último end para indicar el fin del código.

    DATOS, CONSTANTES, 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. Además posee los siguientes atributos:Un nombre o identificador que lo designe.Un tipo que describe el uso de la variable.

    Una constante es un objeto cuyo valor no puede variar en la ejecución de un programa.

    Nombre de variables(identificadores): En general se exigirá que la variable tenga un nombre que comience con una letra; después de este primer carácter, los siguientes, pueden seleccionarse de un conjunto de caracteres que contengan letras, dígitos y algunos caracteres especiales. Los espacios no se permitirán dentro de un nombre de variable.

    Ej.:a20anchosuperficie_rectangulo

    Los nombres deben decir algo sobre el propósito para el cual se emplean las variables, para su fácil lectura, entendimiento y modificaciones.Es muy importante tener en cuenta que en muchos lenguajes (C, por ejemplo) los identificadores se consideran distintos según estén escritos en mayúsculas o minúsculas. Por ello se acostumbra utilizar siempre letras minúsculas.

    Datos y Tipo de DatosDato es la expresión general que describe los objetos con los cuales opera la computadora.

    Tipo numérico: es el conjunto de los valores numéricos.Tipo numérico entero: comprendidos entre –32768 hasta 32767.Tipo numérico real: con decimal. Ej.: 0.09, 3.7652, -8.910, 3738.72, 2.0Tipo lógico: también llamado tipo Booleano, es el conjunto de los dos valores lógicos verdadero y falsoTipo carácter: Es el conjunto, finito y ordenado, de caracteres que la PC reconoce. Por ejemplo: todos los caracteres que figuran en el teclado. “*”, “A”, “1”, “%”Cadena de caracteres: Una cadena de caracteres es una secuencia finita y no vacía de caracteres encerrados entre comillas. Ej.: “Lista” “$ 123.52” “Juan Pérez”

    Ejemplo: El problema SupTrian consiste en el cálculo de la superficie de un triángulo.

    Especificación Algoritmo

    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

    Comienzo leer(b); leer(h); s b h / 2; escribir(s);Fin.

    El PSD (program structure diagram), es un modo gráfico de representar un algoritmo. En él, cada acción simple se representa como un rectángulo; 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).

    5

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    leer(b)

    leer(h)

    s b h / 2escribir(s)

    Aparentemente, el PSD no agrega nada al pseudocódigo, pero responde a una norma internacional (ISO/IEC 8631:1989) por lo que pueden ser interpretados por cualquier persona en cualquier lugar del mundo, la cual podrá codificarlo en cualquier lenguaje de programación (ver Apéndice B).

    Programa en Pascal Programa en C

    Program SupTrian;var b, h, s: real;

    begin readln(b); readln(h); s := b * h / 2; write(s);end.

    #include float b, h, s;

    main(){ scanf(“%e”, b); scanf(“%e”, h); s = b * h / 2; printff(“%e\n”, s);}

    Puede verse que en ambos programas aparecen los puntos 2 y 3 de la especificación (en Pascal b, h, s: real; y en C float b, h, s;) indicando en ambos casos, y de diferente modo, que los identificadores b, h y s representan números reales.También puede verse que el bloque ejecutable en Pascal es prácticamente la traducción al inglés del pseudocódigo.

    NOTA: El código en lenguaje Pascal se muestra a modo de ejemplo y no forma parte del presente curso.

    6

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Queda claro que para poder escribir el algoritmo, debemos primero realizar la especificación del problema y para codificarlo en un lenguaje de programación, debemos tener a la vista la especificación y el algoritmo (en pseudocódigo o PSD).

    ¿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. Esta última alternativa es la más recomendable, ya que permitirá escribir programas modulares con porciones (procedimientos/funciones) que podrán ser reutilizadas en otros programas.

    Ejemplo: El problema CantBald permite calcular la cantidad de baldosas necesaria para cubrir un patio rectangular. 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.

    Especificaciones

    1. SupRect.2. Calcular la superficie de un rectángulo.3. b(base), h(altura): nos reales.4. s(superficie): no real.5. s = b h

    1. SupCuad.2. Calcular la superficie de un cuadrado.3. l(lado): no real;4. s(superficie): no real;5 s = l l

    1. CantBald.2. Calcular la cantidad de baldosas.3. Sp(sup. patio), Sb(sup. baldosa): nos reales.4. Cb(cant. de baldosas): no entero.5. Cb = Sp/Sb.

    Algoritmos

    Comienzo leer(b); leer(h); Sp ← b * h; escribir(Sp);Fin.

    Comienzo leer(l); Sb ← l * l; escribir(Sb);Fin.

    Comienzo leer(Sp); leer(Sb); Cb ← Sp / Sb; escribir(Cb);Fin.

    Si se decide escribir un solo algoritmo, debe tenerse en cuenta que las magnitudes de salida de uno pueden ser magnitudes de entrada de otro, en cuyo caso se eliminará del primero la acción 'escribir' y del segundo la acción 'leer' correspondientes a esa magnitud.

    Cuando se recurre a esta técnica será necesario realizar el perfeccionamiento del algoritmo antes de codificarlo.

    Algoritmo Único Algoritmo Perfeccionado Comentario

    Comienzo leer(b); leer(h); Sp ← b * h; leer(l); Sb ← l * l; Cb ← Sp / Sb; escribir(Cb);Fin.

    Comienzo leer(b); leer(h); leer(l); Sp ← b * h; Sb ← l * l; Cb ← Sp / Sb; escribir(Cb);Fin.

    El perfeccionamiento consiste simplemente en agrupar las acciones, de modo que la estructura del algoritmo sea:

    Ingreso de Datos

    Procesamiento

    Salida de Resultados

    7

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Ejercicios propuestos

    1. Calcular la suma de dos números enteros positivos.2. Calcular el promedio de 3 números.3. Calcular el cubo de un número.4. Resolver las siguientes fórmulas:

    DC

    BAR ++= D

    CAR += DBxCAR +=

    5. Dadas la cantidad de billetes de cada denominación (Ej. 20 de 5, 15 de 10, etc.), informar el monto total recaudado.6. Dado un valor en pulgadas pasarlo a milímetros.7. Calcular la superficie de un triángulo y de un cuadrado.8. Calcular el volumen de un cilindro, teniendo como dato el radio y la altura.9. Calcular el perímetro y la superficie de un rectángulo.10. Calcular la superficie de un círculo.11. Determinar la hipotenusa de un triángulo, sabiendo las longitudes de los catetos.

    12. Convertir una temperatura dada en celsius a grados fahrenheit. ( 32º59º += CF )

    13. Calcular el área de un triángulo en función de las longitudes de sus lados: ))()(( cpbpappArea −−−= donde: p=a+b+c/2

    14. Convertir un valor expresado en metros a pies y a pulgadas (1pie=30cm)15. 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 recargoEn 4 cuotas : 10% de recargoInformar cuota a pagar por mes en cada uno de los casos.

    16. Diseñar un programa que permita ingresar por teclado dos variables R e I, siendo R: la resistencia, e I: la intensidad de corriente. De acuerdo a la ley de OHM calcular E, que es la tensión (en Volt). 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). Se debe ingresar el nombre y apellido del operador en un solo campo. Mostrar por pantalla y papel los resultados así como los datos ingresados. 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.

    8

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Algoritmos CondicionalesSe sugiere consultar el Apéndice A: Lógica Proposicional.

    Es habitual que, llegado a un punto de la resolución de un problema, existan diferentes acciones que pueden llegar a ejecutarse. Pero la elección de las acciones a ejecutar no se realiza al azar, sino que existe una condición según la cual ejecutaremos unas u otras acciones..Esa condición se expresa como una proposición, cuyo valor de verdad determina el camino a seguir.Es aquí donde el PSD cobra especial importancia como herramienta de diseño de algoritmos.

    (proposición) (proposición)

    El PSD de la izquierda representa una estructura condicional binaria. Las acciones que aparecen a la izquierda se ejecutarán si el valor de verdad de la proposición es verdadero, y las situadas a la derecha, si es falso.El PSD de la derecha representa una estructura condicional unaria. En ella, solo se ejecutarán acciones si el valor de verdad de la proposición es verdadero.

    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' s ← 'No positivo'

    Escribir(s)

    Comienzo Leer(x); Si (x > 0) entonces s ← 'Positivo' si no s ← 'No positivo'; Escribir(s);Fin.

    #include #include main(){ float x; char s[9]; scanf("%f", &x); if(x>0){ strcpy(s, "Positivo"); } else{ strcpy(s,"Negativo"); } printf("%s\n", s); }

    Las acciones que se ejecutan condicionalmente, en este caso las dos asignaciones, y que ocupan la mitad del ancho del PSD, se denominan acciones de segundo nivel. Las que se ejecutan siempre, son acciones de primer nivel.En el pseudocódigo, las acciones de segundo nivel se escriben dejando una sangría mayor, como una forma de mostrar la estructura.Una visión liviana del algoritmo, podría sugerir la eliminación de las acciones de asignación y reemplazarlas por Escribir('Positivo') y Escribir('No positivo'), con lo cual se eliminaría la última acción y la necesidad de utilizar la variabla s.Pero eso alteraría la forma que debe tener un algoritmo para ser fácilmente entendible, con vistas a su posible modificación o corrección.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.Comienzo Leer(x); Si (x > 0) entonces s ← 'Positivo' si no s ← 'No positivo'; Escribir(s);Fin.

    Si para uno de los valores de verdad se debe ejecutar más de una acción, estaremos frente a una secuencia de acciones. Esto debemos tenerlo presente en el pseudocódigo (y más adelante, en el código), ya que toda secuencia de acciones debe estar encerrada entre delimitadores.

    9

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Algoritmos de Selección Múltiple(condicionales múltiples, ramificados)

    Los algoritmos de selección múltiple se utilizan en aquellos casos en que se presentan más de dos posibilidades, lo cual no puede formularse mediante una proposición.En su lugar, utilizan una variable de control, el valor de la cual permite seleccionar la secuencia de acciones a ejecutar, o a partir de cual acción se ejecutan las siguientes.Los primeros se denominan algoritmos de selección múltiple excluyente.

    VarC valor1 valor2 valor n

    Ejemplo:

    Leer a

    a

    1 2 3

    s←”uno” s←”dos” s←”tres”

    Escribir s

    Comienzo leer(a); casos de a 1: s←”uno” ; 2: s←”dos” ; 3: s←”tres” ; fin;Fin.

    #include #include main(){ int a; char s[9]; scanf("%d", &a); switch(a){ case 1: strcpy(s, "uno"); break; case 2: strcpy(s, "dos"); break; case 3: strcpy(s, "tres"); } printf("%s\n", s); }

    La sentencia break excluye la ejecución de las restantes acciones (o instrucciones).Si, por ejemplo, el valor ingresado es 2, a la salida se obtendrá 'dos'.

    En los algoritmos de selección múltiple incluyente, el valor de la variable de control indica a partir de cual instrucción se realiza la ejecución.

    Ejemplo:

    Leer a

    a

    1 2 3

    s←”uno” s←”dos” s←”tres”

    Escribir s

    Comienzo leer(a); casos de a 1: s←”uno” ; 2: s←”dos” ; 3: s←”tres” ; fin;Fin.

    #include #include main(){ int a; char s[9]; scanf("%d", &a); switch(a){ case 1: strcpy(s, "uno"); case 2: strcpy(s, "dos"); case 3: strcpy(s, "tres"); } printf("%s\n", s); }

    Nótese que en este caso no aparece la sentencia break.Si, por ejemplo, el valor ingresado es 2, a la salida se obtendrá 'dos tres'.Los algoritmos de selección son muy utilizados a la hora de elaborar menues en los programas.

    NOTA: En los distintos lenguajes de programación la implementación de la estructura de selección múltiple es diferente, 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.

    10

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Ejercicios propuestos

    1. Informar si un número es positivo o negativo.

    2. Resolver: a

    acbbRR2

    42,12 −±−=

    3. Dados dos números informar el mayor. 4. Dados tres números informar el mayor. 5. Leer 5 números, informar cual de ellos es el mayor y en que orden fue ingresado. 6. Leer cuatro números, analizarlos de a dos, e imprimir si existen, las duplas en que un número sea múltiplo exacto del

    otro.Se ingresa el tipo de IVA (I:Inscripto,NI:No inscripto, E:Excento, CF:Consumidor Final), verificar que sea válido e informar la descripción que corresponda.

    7. Dado un número, si es múltiplo de 3, calcular el cuadrado; si es múltiplo de 4, el cubo; si es de 7, el doble. Informar los resultados que correspondan.

    8. Se leen una serie de 8 valores analógicos (de 0 a 1, decimales inclusive). Mostrarlos en forma digital, convirtiendo a 1 aquellos que sean iguales o superen a 0,5 y a 0 los menores a 0,5.

    9. Ingresado el costo de un producto, informar monto de la cuota, aplicar el interés de 5% si es en 2 cuotas y 10% si son 3 cuotas.

    10. Ingresado un valor en pulgadas pasarlo a milímetros o viceversa. Informar resultado. 11. De una tirada de 5 dados, informar si se hizo generala servida. 12. Ingresada la cantidad de días transcurridos desde el 1º de Enero, informar la fecha actual. No considerar año bisiesto.

    Si días es mayor a 365 informar error. 13. Ingresado un horario en segundos transcurridos desde las 0hs., informar la hora actual. 14. Se ingresan el día, el mes y el año de cumpleaños, verificar que sea válido. 15. Ingresado un horario en hora, minutos y segundos, verificar que sea válido 16. Se desea saber la recaudación de una caja ingresando la denominación del billete. Informar el monto total recaudado. 17. Leer seis números de a uno controlando que estén estrictamente creciente. Al terminar imprimir un 0 o un 1, según se

    haya cumplido o no el orden preestablecido. 18. Se tiene como dato dos productos y sus precios. Intercambiarlos si el primero ingresado fuera menor al segundo y

    mostrarlos. 19. Realizar un menú que me permita verificar según un código de vehículo ( MOTOS,AUTOS,

    CAMIONETA,CAMION), si su cilindrada es valida. 20. Calcular la edad de una persona, ingresando día, mes y año de nacimiento (solicitar el ingreso de día, mes y año

    actual) 21. Para que un vehículo sea enviado para la venta, debe ofrecer un rendimiento promedio del 75% mínimo. Dicho

    promedio se calcula sobre un total de la suma de rendimientos base de 10.000 puntos. Los items analizados son 10 con un valor máximo de 1000 puntos cada uno. Ingresar los valores de los 10 puntos y calcular el porcentaje de rendimiento, informar si esta aprobado o no.

    22. En un club se desea clasificar a cada uno de sus socios por categorías, 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 adelanteSe ingresa la edad, informar que categoría debe asignársele

    23. Según la tarjeta de crédito que se utilice en la compra, el interés varía de 0% para la tarjeta “A”, 5% para la “B” y la “C “y 10% para la “D” y la “E”. Calcular el nuevo monto de la compra, según la tarjeta e informarlo.

    11

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Algoritmos Iterativos(repeticiones, lazos, bucles)

    Se sugiere consultar el Apéndice A: Lógica Proposicional.

    Los algoritmos iterativos permiten realizar las mismas acciones un cierto número de veces, dependiendo la repetición de acciones de una condición o proposición.Se dividen en precondicionales y postcondicionales.En los algoritmos iterativos precondicionales, se evalúa el valor de verdad de una proposición antes de ejecutar las acciones, lo cual lleva a que las mismas se puedan ejecutar cero o más veces.La más versatil es la estructura 'mientras'.

    Estructura 'mientras'

    En esta estructura, el valor de verdad de una proposición determina si se ejecutan las acciones indicadas a continuación. En caso de ser verdadera, se ejecutan las acciones y se vuelve a evaluar la proposición. Mientras sea verdadera se seguirán ejecutando las acciones.Si la primera vez que se evalúa la proposición tiene valor falso, las acciones no se ejecutan nunca.

    (proposición)

    Ejemplo: Contador de 1 a 10

    a ← 1

    (a

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Ejemplo: Contador de 1 a 10

    i ← 1 .. 10

    escribir i

    Comienzo para i ← 1; a 10 escribir(i);Fin.

    #include main(){ int i; for(i=1; i

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    alumnos que hayan cumplido los 18 años.19. Leer una serie de números informar el porcentaje de ellos que sean mayores a un valor dado.20. Ingresado un nombre, mostrarlo repetido en la pantalla desde la ubicación 0 hasta la 80, sin que se escriba en la línea

    de abajo. Si no alcanzara puede quedar incompleto el renglón. 21. Leer números hasta que se ingrese un 9999 e imprimir la sumatoria de ellos y la cantidad de positivos, negativos y

    ceros.22. Leer A y B, mayores que cero, hallar el cociente de A por B por restas sucesivas. Mostrar cociente y resto.23. En una empresa se realiza el inventario anual de productos en stock, Considerando solamente 5 tipos de productos,

    informar cuantos hay de cada uno y el total.24. Calcular la suma de los números menores a N de a pares. Ej. 0+1, 1+2, 2+3, 3+4 .... n-1 + n.25. Informar si un numero es primo.26. Buscar los primero N números primos y calcular su sumatoria.27. Calcular el factorial de un numero dado.28. Leer N números controlando que estén en forma creciente. Permitir el reingreso si no cumple la condición.29. Se desea calcular el incremento en el alquiler si se sabe que se cobra el 1% diario de interés sobre el monto

    acumulativo. Se ingresa monto base y cantidad de días.30. Se realiza una encuesta de un producto cuyas opciones son si, no y no contesta. Informar porcentaje de cada

    respuesta.31. Clasificar tickets de venta de un negocio según el vendedor que la haya efectuado. Son 4 vendedores. Informar

    cantidad total y parciales de cada uno.32. Calcular el promedio de un curso, considerando N alumnos y M notas de cada uno. Cada alumno pueden tener distinta

    cantidad de notas.33. En una concesionaria se tienen 3 modelos de autos, se desea saber cuantos hay de cada modelo y de cual hay más.34. En un curso se organizó una venta de rifas, cada rifa indica el número de alumno vendedor y si está pagada total o

    parcialmente. Informar cuantas rifas vendió cada uno de los N alumnos y de ellas cuantas están pagadas total o parcialmente. Informar el total de rifas vendidas.

    35. Se realiza una votación con 5 candidados, la cantidad de votantes no se sabe, informar el porcentaje de votos logrado por cada uno, y el porcentaje de votos en blanco efectuados.

    36. Se ingresa una frase, informar si es un Palíndromo, o sea si se lee igual de atrás para adelante que de adelante para atrás.

    37. Leer un número, indicar si es capicúa.38. Se ingresa una palabra, mostrar cada una de sus letras, expresada en su valor decimal y binario.39. Diseñar un programa que permita ingresar por teclado dos variables que son "J" y "T", que responda a la fórmula

    X=(T-1)*(J+T)*C , sabiendo que el valor de C es el 95% de "T".Luego calcular un valor de prueba XP variando el valor de X en un 15% en mas, recalculando C como CP. Ingresar por teclado el nombre y apellido del operador como así también la fecha de procesamiento, consistenciando la misma para que la fecha dia,mes,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. Diseñar una pantalla de ingreso de datos ( MUESTRA1 ) que además mostrar los resultados, también otra en el ángulo inferior derecho ( MUESTRA2 ) que permita ver una vista previa de la impresión en papel, mostrando el nombre y apellido del operador, fecha de procesamiento,los valores ingresados y los resultados de X,XP y CP. Se debe tener en cuenta que solo podran presentarse en pantalla (MUESTRA1 ) seis (6) filas de datos y resultados,cambiando por otras seis cuando el operador quiera continuar, o bien suspendiendo el ingreso en cualquier momento. La pantalla ( MUESTRA2 ) debe tener, solamente cuatro (4) columnas de información numérica para T,J,X,XP y CP. Toda la información ingresada y calculada deben estar impresa en papel, como así también los títulos de encabezamiento y de final. El final del ingreso de datos sobreviene cuando el operador ingresa el valor de "T" igual a cero (0), el cuál se debe informar con un texto esta forma de finalización.

    14

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Apéndice ALógica ProposicionalLa lógica proposicional trabaja con expresiones u oraciones a las cuales se les puede asociar un valor de verdad (verdadero o falso); estas sentencias se conocen como sentencias declarativas o, simplemente, proposiciones.

    Al escuchar algo como La rosa es una flor o El cocodrilo es un mamífero, fácilmente se puede determinar si estas expresiones son verdaderas o falsas; sin embargo, al escuchar No seas tonto! o Quién ganará las elecciones?, no es posible asociar a ellas un valor de verdad. Expresiones como las primeras dos son los elementos fundamentales con los que trabaja la lógica proposicional.

    Las siguientes expresiones son proposiciones:-Todos los jueves llueve.-Los caballos comen pasto.-Tres es mayor que cinco.

    Las siguientes expresiones no son proposiciones:-¿Qué hora es?-Por favor, alcánzame aquello.

    No existe una notación generalmente utilizada para representar proposiciones, pero en este curso identificaremos a cada una de ellas con una letra minúscula.p: Algunos perros tienen ojos azules.q: Dos más dos es cinco.

    El valor de verdad de una proposición se indica con la letra T si es verdadero o con F si es falso.

    El valor de verdad no se indica con la letra V para evitar confusiones con un operador que se verá más adelante.

    Nuestro trabajo consiste en formular proposiciones (construir fórmulas) a partir de expresiones en lenguaje natural.Para ello, empleamos el lenguaje simbólico, llamado así porque utiliza una serie de símbolos en la formulación de las proposiciones.

    Las proposiciones pueden ser simples o compuestas.

    Las proposiciones simples están formadas por dos términos vinculados por un operador relacional.Cada término debe ser un valor, una magnitud numérica o una expresión aritmética que incluya valores y/o magnitudes numéricas. El operador relacional indica la relación entre el término de la izquierda y el de la derecha.

    Operador Significado Otras Formas

    = Igual a... ==

    ≠ Distinto de... !=

    > Mayor que...

    < Menor que...

    ≥ Mayor o igual que... >=

    ≤ Menor o igual que

  • Escuela de Educación Técnica Galileo Galilei - 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)r: La temperatura no alcanza los 20oC (t < 20)

    Las proposiciones compuestas están formadas por una o más proposiciones simples modificadas o vinculadas por conectivos u operadores lógicos.

    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. En general, se requieren varios pasos de descomposición del lenguaje natural para poder llegar a formular con seguridad la proposición en lenguaje simbólico.Ejemplos:

    La temperatura está entre 15oC y 20oC.La temperatura es al menos de 15oC y la temperatura como máximo vale 20oC.(t ≥ 15 ) ∧ ( t ≤ 20 )p: (t ≥ 15 )

    q: ( t ≤ 20 )p ∧ q

    El largo supera los 3m pero no alcanza los 5m.El largo es mayor a 3m y es menor a 5m.El largo es mayor a 3m y el largo es menor a 5m.(l > 3) ∧ (l < 5)p: (l > 3)

    q: (l < 5)p ∧ q

    Nótese que la palabra 'pero' tiene el mismo valor que 'y'.

    El largo o el ancho es de 3 m.El largo es de 3m o el ancho es de 3m.(l = 3) ∨ (a = 3)p: (l = 3)

    q: (a = 3)p ∨ q

    Aquí tenemos una disjunción incluyente dado que es posible que ambas proposiciones simples sean verdaderas.

    La altura es de 3m o 4m.La altura es de 3m o la altura es de 4m.(h = 3) ∨ (h = 4)p: (h = 3)

    q: (h = 4)p ∨ q

    16

  • Escuela de Educación Técnica Galileo Galilei - 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.

    La capacidad del recipiente no es de 6l.No es verdad que la capacidad del recipiente es de 6l.~(c = 6)p: (c = 6) ~p

    La temperatura es mayor a 20oC pero no supera los 25oC.La temperatura es mayor a 20oC y la temperatura no supera los 25oC.La formulación de esta proposición es más complicada pues la segunda proposición simple está negada.

    p: (t > 20)

    q: (t < 25)p ∧ ~q

    (t > 20) ∧ ~(t < 25)

    Ejercicios Propuestos

    1) De los siguientes enunciados, determina cuales son proposiciones.• Existe vida en el planeta Marte.• El 101 es un número par.• ¿Existen los elefantes?• Sara y María son hermanas de Pedro.• Madrid es un continente.• Hace sol y no hace calor.• Los dragones existen.• O apruebas el trimestre o te queda para diciembre o marzo.• Barcelona es una capital europea.• ¡Buena Suerte!

    2) Genere la tabla de verdad sabiendo que a y c es verdadero, 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.

    • El cigarrillo es nocivo para vos y para el que está al lado aunque no fume.• No es cierto que el cigarrillo te da sensación de libertad o independencia.• Aunque lo he intentado, no he llegado a tiempo.• El volcán Chaitén está en Argentina y tuvo consecuencia en el ámbito social o ambiental.• O hablas por celular o conduces, pero no puedes manejar distraído.• Si consumes alcohol entonces no debes conducir.

    17

  • Escuela de Educación Técnica Galileo Galilei - 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. 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.Las tablas de verdad permiten realizar esa verificación.

    Conjunción

    p q p ∧ q

    T T T

    T F F

    F T F

    F F F

    Disjunción Incluyente

    p q p ∨ q

    T T T

    T F T

    F T T

    F F F

    Disjunción Excluyente

    p q p ∨ q

    T T F

    T F T

    F T T

    F F F

    Negación

    p ~p

    T F

    F T

    Una vez formada una proposición, 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.(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.

    18

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    La temperatura está entre 20oC y 25oC, o bien es menor a 15oCAquí 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), pero ambas cosas no pueden suceder a la vez (disjunción excluyente).

    (p q) r [(t ≥ 20) (t ≤ 25)] (t < 15)∧ ∨ ∧ ∨

    Al tratarse de tres proposiciones simples, existen 8 combinaciones posibles de valores de verdad.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, si r es verdadera, q no puede ser falsa).

    Tautología y ContradicciónSi la proposición compuesta es verdadera para todas las combinaciones posibles de valores de verdad de las proposiciones simples, 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. En ambos casos, la proposición compuesta estará mal formulada, y habrá que revisar si corresponde al enunciado en lenguaje natural.

    19

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Apéndice BNorma ISO/IEC 8631Information technology - Program constructs and conventions for their representation(Extracto traducido)

    1 ÁmbitoEsta Norma Internacional se refiere a la expresión de algoritmos orientados a procedimiento. Ella

    a) define la naturaleza de las construcciones de programas;b) indica la manera en que esas construcciones pueden ser combinadas;c) provee especificaciones acerca de un conjunto de constructores;d) permite la definición de una variedad de subconjuntos de las construcciones definidas.

    2 Definición de construcciones de programasUna 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.Cada parte de procedimiento consiste en una o más operaciones a ejecutar, o puede ser nulo.La parte de control determina la manera en que son ejecutadas las partes de procedimiento. Ésta consiste en una directiva y un conjunto de condiciones. 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. Si no existe directiva ni condición, el control es llamado implícito.3 Cómo pueden combinarse las construccionesEl ú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 Especificación de construcciones4.1 Construcción imperativaEsta 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 Construcción serialEsta 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 Construcción paraleloEsta construcción consiste en dos o más partes de procedimiento y una parte de control que inicia esas partes de procedimiento. La ejecución de la construcción finaliza cuando todos las partes de prodecimiento iniciadas son completamente ejecutadas.4.4 Construcción iterativa4.4.1 Iteración precondicionalEsta construcción consiste en una parte de procedimiento y una parte de control con una condición, el valor de la cual determina si la parte de procedimiento es ejecutada cero o más veces.4.4.2 Iteración postcondicionalEsta construcción consiste en una parte de procedimiento y una parte de control con una condición, el valor de la cual determina si la parte de procedimiento es ejecutada más de una vez.4.4.3 Iteración continuaEsta 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.4.5 Construcción de elección selectiva4.5.1 Selección monádicaEsta construcción consiste en una parte de procedimiento simple y una parte de control con una condición, el valor de la cual determina si la parte de procedimiento es ejecutada o no.4.5.2 Selección diádicaEsta construcción consiste en dos partes de procedimiento y una parte de control con una condición, el valor de la cual determina cual de las dos partes de procedimiento es ejecutada.4.5.3 Selección múltiple exclusivaEsta construcción consiste en un número de partes de procedimiento con una parte de control con un conjunto de condiciones, el valor de las cuales determina cual de las partes de procedimiento es ejecutada.4.5.4 Selección múltiple inclusivaEsta construcción consiste en un número de partes de procedimiento con una parte de control con un conjunto de condiciones, el valor de las cuales selecciona cero o más partes de procedimiento a ser ejecutadas en una secuencia indefinida.5 TerminaciónEn adición a la terminación de un constructor definida por su parte de control, 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. La operación de terminación identificará cuál construcción debe terminar. Si la operación de terminación es ejecutada, la ejecución de la construcción identificada y todas sus construcciones internas deben cesar inmediatamente.La operación de terminación que finaliza una construcción paralela o una construcción selectiva múltiple inclusiva no está

    20

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    definida.Una operación de terminación que finaliza una construcción externa no cumple con esta Norma Internacional.Definición de subconjuntosEl 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.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.

    CONSTRUCCIÓNPSD

    (Program structure diagram)CONSTRUCCIÓN

    PSD

    (Program structure diagram)

    Imperativa Serie

    Paralela Iteración precondicional

    Iteración postcondicional Iteración continua

    Selección monádica Selección diádica

    Selección múltiple exclusiva Selección múltiple inclusiva

    Operación de terminación

    21

    Parte deProcedimiento

    Parte deProcedimiento 1

    Parte deProcedimiento 2

    Parte deProced

    1

    Parte deProced

    2

    Parte deProced

    n

    Control

    Control

    Control

    Condiciónvalor

    Condiciónvalor 1 valor 2

    Condicionesval 1 val 2 val n

    Condicionesval 1 val 2 val n

    Identificador de

    construcción

    Parte deprocedimiento

    Parte deprocedimiento

    Parte deprocedimiento

    Parte deprocedimiento

    Parte de proced 1

    Parte de proced 2

    Parte proc

    1

    Parte proc

    2... ...

    Parte proc

    n

    Parte proc

    1

    Parte proc

    2... ...

    Parte proc

    n

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Apéndice CProgramación en CDe http://es.wikibooks.org/wiki/Programación_en_C

    HerramientasPara programar tanto en C, como en C++, Java o cualquier otro lenguaje de programación, necesitamos contar con aplicaciones o herramientas que nos permitan poner en funcionamiento nuestro programa.

    El lenguaje de programación C es compilado, así que en este caso necesitaremos un compilador, que será el encargado de transformar nuestro código fuente en código que la computadora pueda ejecutar.

    Además,  para   facilitar   la   tarea  de   los  programadores   existen   los  denominados  Entorno de desarrollo integrados   (IDE).   En   muchos   casos,   estos   entornos   incluyen   un   compilador,   un   depurador,   y   otras herramientas.

    Las herramientas a instalar dependerán del sistema operativo utilizado. A continuación se listan algunas posibilidades   para   el   sistema   operativo   Windows   o   GNU/Linux,   no   es   imprescindible   utilizar   estas herramientas en particular, cualquier compilador puede servir.

    WindowsUno de los entornos de desarrollo más conocidos entre los programadores de C sobre Windows, tanto novatos como expertos, es el Bloodshed DevC++, que es un entorno libre multiplataforma. Si bien su nombre es DevC++, es posible utilizarlo tanto para C como para C++.

    También hay otras alternativas privativas como los compiladores de Borland o de Microsoft (Microsoft Visual C++).

    Para conseguir el DevC++ puede utilizarse la Página de descargas de Bloodshed Dev  C++

    GNU/LinuxEn los sistemas GNU/Linux, será necesario tener instaladas las herramientas gcc y make y la versión 6 de la glibc con su documentación, que son las que permitirán compilar los programas.

    Para escribir y modificar el código, es posible utilizar cualquier editor (en lo posible que cuente con resaltado de sintaxis), como son emacs, vim, kate, gedit o geany.

    Sin embargo, para quienes son novatos en la programación, es recomendable utilizar un entorno de desarrollo como son el Anjuta DevStudio (para el entorno GNOME) o KDevelop (para el entorno KDE), ya que incluyen facilidades adicionales para la ejecución y solución de problemas.

    Los programas mencionados se incluyen dentro de la instalación estándar de la mayoría de las distribuciones actuales de GNU/Linux, de modo que para instalarlos sólo será necesario seguir el procedimiento usual de instalación de aplicaciones para la distribución deseada.

    Historia de CEl 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. C fue creado para poder escribir dicho sistema operativo en un lenguaje de alto nivel, independiente del hardware donde se ejecutara.

    Contar con un lenguaje de alto nivel permitió el avance de los sistemas operativos, ya que el mismo código podía   ser   utilizado   en   las   distintas   plataformas,   propiciando   la   reutilización  de   código   y   reduciendo   los tiempos de  desarrollo.  Así   es  que   los  sistemas operativos basados  en UNIX,  el   sistema BSD,  el  sistema GNU/Linux y muchos otros fueron desarrollados en C.

    22

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Además, 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.  Esto,  a  su  vez,  ha propiciado el desarrollo de aplicaciones en lenguaje C.

    Actualmente es imposible contar la cantidad de aplicaciones y herramientas desarrolladas en C.

    EvoluciónA mediados de los años 60s, Martin Richards diseñó el lenguaje BCPL con la finalidad de usarlo para escribir software de sistemas operativos y compiladores.

    En 1969, Ken Thompson escribió el Lenguaje B, en Bell Laboratories, con el objetivo de recodificar UNIX (escrito   hasta  ese   momento  en   lenguaje   ensamblador)  usando   un   lenguaje  de  alto  nivel   más  portable  y flexible.

    Durante   los   siguientes   años,   Dennis   Ritchie   modificó   el   lenguaje   B,   llegando   a   crear   el   lenguaje   C   y reescribiendo el sistema UNIX en dicho lenguaje; añadió características nuevas, como son el diseño de tipos y las estructuras de datos.

    En   1978,   Dennis   Ritchie   y   Brian   Kernighan   publicaron   la   primera   edición   del   libro  El   lenguaje   de  programación C. Este libro fue durante años la especificación informal del lenguaje. El lenguaje descrito en la primera edición de este libro, fue conocido como "el C de Kernighan y Ritchie" o simplemente "K&R C". En este libro se introdujeron nuevas características al lenguaje: los tipo de datos struct, long int y unsigned int; los operadores =+ y = fueron sustituidos por += y =.

    A mediados de los años 80, Bjarne Stroustrup (también de los laboratorios Bell), crea el lenguaje C++, un lenguaje basado en C, con numerosas características adicionales, siendo la principial que está  orientado a objetos. Si bien se han creado muchos lenguajes basados en C, C++ es el que ha permanecido más asociado a C.

    En los  años  siguientes  a   la  publicación del  C de  Kernighan y  Ritchie,   se  añadieron al   lenguaje  muchas características no oficiales, que estaban presentes en algunos compiladores y no en otros. Fue por ello que en 1989 ANSI (American National Standards Institute) publicó el primer estándar oficial de C, que es conocido como ANSI C.

    En este  estándar  se   tomaron  muchas de   las   funcionalidades  no  oficiales  y  se  agregaron  funcionalidades nuevas como los prototipos de función, y un preprocesador mejorado. También se cambió  la sintaxis de la declaración de parámetros de funciones, para que incluyeran el tipo junto con el nombre.

    Al año siguiente, en 1990 se publicó la estandarización ISO del lenguaje. Este estándar es básicamente el estándar ANSI, con unas pocas modificaciones de formato. A este estándar se lo conoce, entonces, como C89, o C90, y se trata del mismo lenguaje.

    Basándose  en el   estándar  ANSI  que estaba  en preparación,   en 1988  Kernighan  y  Ritchie  publicaron   la segunda edición de su libro, que es aún hoy utilizada como una de las referencias principales del lenguaje.

    Durante los siguientes años, el lenguaje C permaneció  sin demasiados cambios.  Sin embargo, como había sucedido   antes,   los   distintos   compiladores   fueron   incorporando   características   adicionales,   que   otros compiladores no tenían, siendo C++ la principal influencia.

    Fue por ello que a finales de los noventa se decidió revisar el estándar de C, lo que llevó a la publicación del estándar   C99.   Este   estándar   incluye   varias   nuevas   características   como   son:   las   funciones   inline;   la posibilidad de declarar variables en cualquier parte del código; los comentarios de una sola línea utilizando //; los tipos de datos long long int, bool y complex, entre otras.

    Aún hoy el proceso de evolución del lenguaje sigue avanzando, y desde 2007 se está trabajando en el armado de un nuevo estándar.

    23

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Fundamentos de programaciónDefiniciones

    • Se denomina  algoritmo  a  una secuencia  de   instrucciones  que permiten obtener  un resultado en particular.   No   necesariamente   son   programas   de   computadora,   una   receta   de   cocina,   o   las instrucciones para cambiar un neumático son ejemplos de algoritmos de la vida real. 

    • Las  computadoras,   son maquinas sin  inteligencia  propia,   cuya única   finalidad es   interpretar  el código que se les provee. 

    • El lenguaje de máquina es el único lenguaje que la computadora "entiende" y es capaz de ejecutar. 

    • Los  lenguajes   de   programación  son   el   medio   de   comunicación   entre   el   programador   y   una computadora. 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. 

    • Finalmente,   denominamos  programa  a   una   secuencia   de   órdenes   a   ser   ejecutadas   por   una computadora. Un programa debe estar escrito en algún lenguaje de programación, y puede incluir uno o más algoritmos. 

    Tipos de lenguajesExiste una gran cantidad de lenguajes de programación, que están pensados para distintas finalidades, siguen distintos paradigmas, y de una u otra forma se diferencian de los demás.

    Esquemas de programaciónEl esquema de programación llamado Programación Imperativa, consiste en escribir una secuencia de instrucciones una detrás de la otra, que se ejecutarán en orden. Algunas de esas instrucciones pueden hacer que la máquina pase a una instrucción que no sea la siguiente, tal vez porque se cumpla una condición que hayamos establecido.

    En los últimos años ha tomado fuerza otro paradigma de computación, llamado Programación Orientada a Objetos , 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.

    El lenguaje C es un lenguaje imperativo, no orientado a objetos.

    Alto o bajo nivelPor otro lado, los lenguajes de programación se clasifican en niveles. Un lenguaje es de más bajo nivel cuanto más cercano esté al código de máquina, 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). Estas características hacen que C sea un lenguaje muy potente, ya que permite optimizar al máximo los recursos de la máquina. Por ende, esto también hace que la dificultad y que los errores que se puedan cometer programando aumenten. Así que a C se le considera de nivel medio.

    Lenguajes de más alto nivel que C son aquellos en los que el programador no necesita encargarse de manipular la memoria, como Java, C#, Python, Ruby, entre otros.

    Compilados o interpretadosOtra forma de clasificar a los lenguajes de programación que es según la forma en que se ejecutan sus órdenes. Existen los lenguajes que son interpretados, 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, Perl o Tcl, entre muchos otros.

    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. Ese archivo puede ejecutarse luego, sin recurrir al compilador.

    24

    http://es.wikipedia.org/wiki/Algoritmohttp://es.wikipedia.org/wiki/Lenguaje_compiladohttp://es.wikipedia.org/wiki/Tclhttp://es.wikipedia.org/wiki/Perlhttp://es.wikipedia.org/wiki/Pythonhttp://es.wikipedia.org/wiki/Lenguaje_interpretadohttp://es.wikipedia.org/wiki/Rubyhttp://es.wikipedia.org/wiki/Pythonhttp://es.wikipedia.org/wiki/C_Sharphttp://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Javahttp://es.wikipedia.org/wiki/Lenguaje_de_alto_nivelhttp://es.wikipedia.org/wiki/Lenguaje_de_bajo_nivelhttp://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetoshttp://es.wikipedia.org/wiki/Programaci%C3%B3n_imperativahttp://es.wikipedia.org/wiki/Programa_(computaci%C3%B3n)http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttp://es.wikipedia.org/wiki/Lenguaje_de_m%C3%A1quinahttp://es.wikipedia.org/wiki/Computadora

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Los lenguajes compilados tienen la ventaja de la velocidad y la eficiencia, pero los interpretados tienen la ventaja de que, generalmente, son muy portables y de más alto nivel.

    Estructura de la memoriaParte de esta potencia de C viene de que permite acceder con mucha libertad a la memoria de la máquina. Para entender un poco cómo es posible, debemos entender cómo se guardan los datos en la memoria.

    Imaginemos que la memoria tiene un montón de casillas, una enorme fila de casillas, cada una de las cuales contiene un dígito binario (bit):

    0101001010100001010101001010000100111010110010010101001011010110001101010110101010110111...

    Es exactamente así, pero es más cómodo recordar que esos bits se encuentran agrupados de ocho en ocho, formando octetos (bytes):

    1010010 10100001 1010100 10100001 111010 11001001 1010010 11010110 110101 1101010 10110111 ...

    Cada octeto puede contener 28 = 256 combinaciones distintas de ceros y unos, es decir, cualquier número entre 0 y 255:

    82 161 84 161 58 201 82 214 181 106 183 ...

    También podemos representar estos números en base hexadecimal:

    0x52 0xA1 0x54 0xA1 0x3A 0xC9 0x52 0xD6 0x35 0x6A 0xB7 ...

    O considerarlos caracteres:

    R ¡ T ¡ : É R Ö 5 j · ...

    Este es el tipo de dato más elemental que nos podemos encontrar en C: el caracter. Un caracter ocupa exactamente un byte (8 bits) de memoria, y puede contener un número entre 0 y 255, o entre -128 y 127, dependiendo si queremos considerarlo como sin signo o con él.

    25

    http://es.wikipedia.org/wiki/Bithttp://es.wikipedia.org/wiki/Bit

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Primer programa en CEn el libro "El Lenguaje de Programación C", Kernighan y Ritchie introdujeron al lenguaje C utilizando un sencillo programa que mostraba un saludo por la pantalla. Desde entonces se hizo tradición empezar con cualquier lenguaje de programación con el ejemplo del Hola mundo.

    En particular en C se involucran muchas partes y sintaxis del lenguaje, por lo cual es especialmente útil verlo como el primer ejemplo de programación en C.

    Ejemplo: Hola mundo

    /* Inclusión de archivos */#include /* Función principal */int main (int argc,char **argv){ /* Impresión por pantalla y salida del programa*/ printf("Hola mundo\n"); return 0;}

    Para poder editar y ejecutar este programa será necesario utilizar algún editor y luego un compilador, como se explicó en la sección Herramientas necesarias.

    Si se tiene el compilador gcc en un entorno UNIX o GNU/Linux, la forma sencilla de compilar y ejecutar será:

    $ gcc holamundo.c$ ./a.outHola Mundo$

    Es decir que el compilador genera un archivo, en este caso llamado a.out, y la salida generada por ese archivo es "Hola mundo". 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.

    Pre-requisitos para la compilación de programasComo ya se mencionó, será necesario tener instalado el compilador y un editor o entorno de desarrollo que permitan escribir el código a compilar. Para más información ver la sección Herramientas necesarias.

    El código a compilar debe guardarse con un nombre que represente al programa en cuestión y la extensión .c. En el caso del ejemplo del Hola mundo, el archivo puede llamarse hola.c.

    En las explicaciones a continuación, se asume que se cuenta con un compilador instalado y se ha editado un archivo hola.c que se quiere compilar. Si tu sistema operativo no aparece en esta lista busca en internet, ya que seguro que existe algún compilador para ese sistema.

    Compilación de programas según la plataforma

    WindowsPara compilar un programa C en entornos Windows, debemos seguir una serie de pasos que varían según el compilador de C que queramos utilizar. Antes que nada, sería bueno que se revises la documentación del compilador elegido para conocer los comandos exactos.

    Compilación del código fuente

    Si se utiliza un entorno de desarrollo, será posible compilar directamente desde el entorno, mediante un botón o una combinación de teclas.

    Si se ejecuta el compilador desde la línea de comandos, la línea será distinta según el compilador utilizado. A continuación algunos ejemplos de ciertos comandos según el compilador:

    26

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

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    • En Turbo C de Borland es: tcc hola.c • En C++ de Borland: bcc hola.c • En Visual C de Microsoft: cl hola.c • En GNU gcc: gcc hola.c o cc hola.c • El C de Zortech: ztc hola.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, para generar el archivo ejecutable.

    Los compiladores actuales suelen hacer dos funciones de una vez, compilando y enlazando todo en una sola función, aunque es posible pedirles que no lo hagan mediante parámetros adicionales.

    Según el compilador y la configuración utilizada, se obtendrán dos o tres archivos:

    El archivo fuente

    hola.c

    El archivo objeto

    hola.obj

    El archivo ejecutable

    hola.exe

    Este último es el que nos interesa, puesto a que es el código ejecutable, el programa en sí. Al ejecutarlo se producirá la salida deseada en una ventana de consola.

    Salida por pantalla

    Si ejecutamos en entorno Windows el programa directamente desde el navegador de archivos, o también desde algunos entornos de desarrollo, lo que sucederá será que apenas abierta la ventana de la consola, se mostrará la cadena esperada y luego de terminada la función, la consola se cerrará sin tener el tiempo suficiente de ver nuestro mensaje en pantalla.

    Para poder ver la salida por pantalla será necesario ejecutar el programa desde la línea de comandos, o modificar la configuración del entorno de desarrollo para que muestre la salida por pantalla al ejecutar el programa.

    La solución a ésto es agregar una función adicional a nuestro "hola.c":

    /* Inclusión de archivos */#include #include /* Función principal */int main (int argc,char **argv){ /* Impresión por pantalla y salida del programa*/ printf("Hola mundo\n"); system ("pause"); return 0;}

    Las dos líneas agregadas permiten que utilicemos la biblioteca stdlib, que incluye la función system y que mediante esta función se ejecute el comando pause del sistema, que evita que el programa siga hasta que se presione una tecla.

    Así es posible visualizar que la salida de hola.c se completó perfectamente.

    LinuxSi bien existen otros compiladores, lo más usual y más sencillo para compilar un programa en GNU/Linux es el compilador gcc, ya que es el que se incluye en todas las distribuciones.

    De cualquier forma, es posible realizar la compilación desde línea de comandos o desde el entorno gráfico.

    Para realizarla desde línea de comandos, será necesario contar con una terminal (xterm, konsole, gnome-terminal, etc). No es necesario contar con permisos de root para crear o compilar programas. En esa terminal será necesario escribir

    27

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    gcc hola.c

    Si no existen errores en el código, este comando nos creará un archivo ejecutable, que por omisión se llama "a.out", y que podemos ejecutar desde la línea de comandos de la siguiente forma:

    ./a.outHola mundo

    Es una buena idea especificar el nombre que el archivo ejecutable tendrá, pasando como parámetro al compilador la opción -o, de la siguiente forma:

    gcc hola.c -o hola

    Con lo cual, el nombre del archivo creado será hola. 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, sin embargo funcionaría de la misma forma si se llamara hola.exe.

    Para ejecutarlo, haremos los mismo que en el caso anterior:

    ./holaHola mundo

    Existen otros parámetros que podemos especificar al compilador en la línea de comandos, dependiendo del tipo de programa, y en función de la complejidad del mismo. Por ejemplo, podemos agregar las siguientes opciones:

    gcc hola.c -o hola -Wall -pedantic

    La opción -Wall nos mostrará todos los avisos que produzca el compilador, no solamente los errores. Los avisos nos indican dónde y/o porqué podría surgir algún error en nuestro programa.

    La opción -pedantic nos aporta más información sobre los errores y los avisos mostrados por GCC.

    Diseccionando el "Hola Mundo"A continuación veremos cuál es la estructura básica de un programa en C, para poder entender qué hace cada una de las líneas de nuestro sencillo programa.

    Es probable que lo primero que salte a la vista sea la línea:

    printf("Hola mundo\n");

    Esta es la línea que hace aparecer la cadena Hola Mundo en nuestra pantalla. Notamos que en C la sentencia para imprimir algo por pantalla es printf() y, además, hay que colocar paréntesis alrededor de lo que queremos imprimir para utilizarla.

    Esto se debe a que en C, printf es una función, que imprime su argumento (la cadena Hola Mundo\n) en la pantalla. Se denomina invocar una función a la acción de utilizarla para que realice una acción.

    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, sino que representa un único carácter no imprimible: el salto de línea. Sin el salto de línea, el resultado al ejecutar el programa sería:

    $ ./a.outHola Mundo$

    Es decir que no hay salto de línea entre la cadena impresa, y la siguiente entrada de la línea de órdenes, que no es lo que esperábamos.

    Lo último a notar en la línea es que termina con un punto y coma. En C, todas las sentencias terminan con un punto y coma. Al principio puede parecer obvio dónde termina una sentencia, pero ya veremos más adelante que no lo es tanto.

    Observemos ahora la siguiente sentencia del programa:

    return 0;

    Luego de esta sentencia, termina el programa. Se trata de la instrucción return finaliza el programa, 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, es decir, correcto.

    28

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Estas dos sentencias se encuentran encerradas entre llaves. De esta manera, forman un bloque, es decir, un grupo de sentencias que se ejecutarán siempre de correlativa.

    ¿Y qué es esa línea que precede (en realidad, que da nombre) al bloque? Pues es la definición de una función, la función main. En C (y en mucha de la programación estructurada), todo se hace a base de funciones, como la arriba comentada printf. La función main es especial, porque es la que contiene el programa completo. Es decir, cuando el ordenador va a ejecutar el programa, comienza a hacerlo por el principio de la función main, y cuando ésta acaba, el programa también.

    La línea:

    int main (int argc,char **argv)

    indica al compilador que la función que viene a continuación, entre llaves, se llama main, cuyos argumentos son int argc y char **argv, que representan a la cantidad de argumentos ingresados al ejecutar el programa y a los valores de estos argumentos respectivamente, y da como resultado un número entero (int), que es el 0 de la instrucción return. En un capítulo posterior podrá ver un ejemplo del uso de estos parámetros.

    Finalmente, y un tanto aparte (está separada del resto por una línea en blanco), tenemos la línea

    #include

    Que parece bastante distinta al resto del programa, y que, además, parece no tener sentido, puesto que ya hemos definido la función main que hace todo el trabajo.

    Efectivamente, esa línea no es parte del programa, aunque sea imprescindible. La línea es una instrucción del preprocesador de C, como nos lo indica el símbolo #, y lo que hace es incluir en ese punto el contenido de otro fichero, antes (de ahí el nombre de preprocesador) de que comience la compilación. El fichero stdio.h es el que contiene la definición de la función printf(), que antes utilizamos pero que no escribimos, ya que forma parte de la biblioteca estándar de C.

    ComentariosUna vez escrito un código, 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, o qué hace cada bloque de código. Por esto, en cualquier lenguaje de programación son importantes los comentarios. Muchas veces, se trabaja en equipo y no todos programan de la misma manera, aquí los comentarios son fundamentales.

    Un comentario en C es todo lo que se encuentre entre los símbolos /* y */. Hay que tener en cuenta que los comentarios no se pueden anidar: si dentro de un comentario hay un /*, seguirá siendo el primer */ el que finalice el comentario, no se esperará al segundo.

    Hay otro tipo de comentarios en C, procedentes del lenguaje C++, e incorporadas al estándar de C a partir de C99: //. Todo lo que esté después de estos signos, hasta el final de la línea, se considerará un comentario y el compilador no lo tomará en cuenta.

    En el ejemplo presentado pueden verse tres líneas con comentarios, que documentan someramente las distintas funcionalidades del código. En los próximos capítulos podrán verse mejores usos de los comentarios dentro del código.

    Tipos de datosHistoria

    En el lenguaje C estandarizado como C89, existían cuatro tipos de datos básicos que son: los números enteros, los números reales, los caracteres, y los punteros. A partir del estándar C99 se agregan: los valores lógicos (verdadero o falso) y los números complejos.

    Estos tipos de datos son parte del lenguaje, y por ello se los considera primitivos. Más adelante veremos que con el uso de estructuras y uniones es posible crear tipos compuestos de datos a partir de estos tipos primitivos.

    En este capítulo veremos los enteros, los reales y los caracteres. Más adelante se verán otros tipos de datos más complejos, como son los vectores, las cadenas de caracteres, y los punteros en general.

    EnterosLos enteros son el tipo de dato más primitivo en C. Se usan para representar números enteros. Pero siempre se pueden encontrar otras aplicaciones para los números enteros. En general se pueden usar para representar cualquier variable discreta.

    Los tipos de datos enteros son: short, int, long y long long.

    29

    http://es.wikipedia.org/wiki/C%2B%2B

  • Escuela de Educación Técnica Galileo Galilei - Apuntes de Programación I

    Es decir que para el lenguaje C existen diferentes tamaños de números enteros que, según el compilador y la plataforma de hardware, pueden tener desde 1 byte hasta 8 bytes (para más detalles busca en la referencia).

    Además, el lenguaje C hace la distinción de si el entero es con signo o sin signo (signed o unsigned). 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. En caso de que no se declare si es con signo o sin signo, se toma con signo.

    Algunos ejemplos de declaraciones de enteros:

    int a; unsigned int a; signed long a; signed long long a = 10000000;

    Todos los números son representados en memoria mediante una cadena de bits. En el caso de los números con signo, el bit más significativo es el que se usa para representar el signo. La representación de los números negativos se realiza mediante el complemento a dos, que es una técnica que permite operar con los números negativos de forma lógica.

    Sólo a modo de ejemplo, la representación en memoria de un -8 en una variable de 2 bytes, entera, con signo sería la siguiente:

    1000000000001000

    FlotantesSe denomina flotantes a los tipos de datos que representan a los números reales, ya que utilizan un sistema de representación basado en la técnica de coma flotante, que permite operar con números reales de diversas magnitudes, mediante un número decimal llamado mantisa y un exponente que indica el orden de magnitud.

    El tipo de dato flotante en lenguaje C sólo tiene dos tamaños: el float y el double, que son 4 bytes y 8 bytes respectivamente. Se los puede utilizar tanto para representar números decimales, como para representar números enteros con un orden de magnitud muy grande.

    La forma de declarar una variable flotante es escribiendo en una línea uno de los tipos de datos flotantes y a continuación el nombre de la variable y tal vez algún valor que se les quiera dar.

    Algunos ejemplos:

    float a; double a = 1e23; double a = 3.1416; float a = 4e-9; double a = -78;

    Hay que tener en cuenta que aunque los valores flotantes son más convenientes para algunas aplicaciones, hay casos en los que se prefieren los enteros. Esto se debe a que los números flotantes no necesariamente tienen soporte de hardware, en particular en las plataformas integradas. Una alternativa que se utiliza en estas situaciones es interpretar los enteros co