Apuntes de Metodolog Ia y Tecnolog Ia de La Programaci On, IS04
Apuntes de Metodolog Ia y Tecnolog Ia de La Programaci On, IS04
Apuntes de Metodolog Ia y Tecnolog Ia de La Programaci On, IS04
de la Programación, IS04
Curso 2006/2007
27 de septiembre de 2006
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike Li-
cense. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.0/ or send
a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Esta versión de los apuntes surge del trabajo realizado en la asignatura “Metodologı́a y Tecno-
logı́a de la Información, IS04” de la titulación “Ingenierı́a Técnica en Informática de Sistemas” de
la Escuela Superior de Tecnologı́a y Ciencias Experimentales de la Universitat Jaume I, durante los
cursos 2001/02, 2002/03 y 2003/04.
Gran parte del material procede de los apuntes de otra asignatura, “Introducción a la Algorı́tmica,
E45”, realizados por el profesor Luis Amable Garcı́a Fernández y la profesora Gloria Martı́nez
Vidal. Y, por supuesto, en su elaboración los autores han recibido la ayuda y los consejos de sus
compañeros, especialmente de Marı́a de los Ángeles López Malo, Mar Marcos López, Luis Amable
Garcı́a Fernández, Teresa Escrig Monferrer, Javier Olcina Velamazán e Ismael Sanz Blasco. A ellos,
y a todos los demás compañeros que de alguna forma nos ayudaron y alentaron, muchas gracias.
Índice general
1. Introducción 1
1.3. Resumen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4. Glosario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5. Bibliografı́a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2. Conceptos Básicos 11
2.4. Glosario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.5. Bibliografı́a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3. Programación Estructurada 31
I
II Índice general
3.6. Glosario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.7. Bibliografı́a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.3.1. Un Ejemplo en C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
9. Recursividad 261
Introducción
Índice General
1.1. Conceptos Básicos de Programación. . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1. Conceptos Básicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. La Programación como Disciplina de Ingenierı́a. . . . . . . . . . . . . . . . 5
1.2.1. Etapas del Desarrollo del Software. . . . . . . . . . . . . . . . . . . . . 6
1.2.2. Objetivos de la Asignatura. . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3. Resumen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4. Glosario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5. Bibliografı́a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
“La verdadera diferencia entre el hardware y el software es que el hardware se vuelve más rápido,
pequeño y barato con el tiempo mientras que el software se vuelve más grande, lento y caro.”
Origen desconocido. Probablemente apócrifo.
El desarrollo de software es una de las tareas más importantes dentro del ámbito de la informáti-
ca. En esta asignatura se pretende sentar las bases que permitan introducirse en el mundo de la
programación, aprender a construir algoritmos que permitan resolver problemas concretos.
Es frecuente concebir la programación como una labor que consiste en aprender la sintaxis de
un lenguaje y, a partir de ahı́, adquirir una experiencia, mediante el “entrenamiento”, que permita
ir generando programas más y más complejos. Esta es una visión errónea, si bien extendida, que
conviene erradicar. La programación necesita de una técnica y es una disciplina que se debe intentar
sistematizar al máximo.
Aprender a programar no es una tarea sencilla. Entre otras cosas porque por mucho que se hable
de sistematizar, el diseño de un algoritmo es, en última instancia, un proceso creativo. Pero, eviden-
temente, no es lo mismo acometer este proceso creativo de forma improvisada que siguiendo una
determinada metodologı́a. Si se establece una analogı́a, por ejemplo, con la escritura de una novela
parece evidente que a un novelista profesional se le suponen una serie de conocimientos especı́ficos
1
2 ITIS IS04: Capı́tulo 1. Introducción
Uno de los objetivos de este tema es, precisamente, introducir el mundo de la programación
como una disciplina de la ingenierı́a, a fin de determinar claramente cuáles son los objetivos de un
buen programador y poder establecer, por lo tanto, los objetivos fundamentales de la asignatura. Para
comprender bien dicha técnica, se comenzará por explicar cuáles son los conceptos básicos que se
manejarán a lo largo de toda la asignatura, ya que conviene saber de qué se habla antes de entrar en
materia. A partir de estos conceptos, se puede avanzar y describir cómo se debe entender y cómo
se debe emprender el desarrollo de un programa. Una vez situados, ya se estará en condiciones de
comenzar a conocer cuáles son las herramientas básicas de un programador.
El primero de los conceptos es uno de los más importantes en informática y sobre él recaerá la
mayor parte del peso de la asignatura:
Definición 1.2 (Entorno) Conjunto de objetos necesarios para llevar a término una tarea.
Como en toda disciplina, en programación se debe conocer qué objetos se pueden manejar y
cómo se deben manejar. Este será el objetivo principal del próximo tema.
1.1. Conceptos Básicos de Programación. 3
Asociado al concepto de entorno, aparece el de estado del entorno, es decir, la descripción del
estado en que se encuentran los objetos del entorno en un momento dado.
Un algoritmo debe actuar para que el entorno cambie progresivamente de estado. Ası́ se irán
obteniendo los resultados a partir de los datos.
Definición 1.5 (Procesador) La entidad que puede comprender y ejecutar de forma eficaz un
algoritmo.
Se han hecho ya muchas definiciones y aún no se ha dicho nada sobre los programas. Para
distinguir este concepto, se cree conveniente describir antes cómo funciona un ordenador.
Las Unidades de Entrada y/o Salida, que permiten la comunicación con el computador (intro-
ducir datos e instrucciones, visualizar resultados, etc.)
La Unidad Central de Proceso, que es la que dirige el funcionamiento de la máquina, y
La Memoria Central, que es donde se almacenan los datos y los resultados, ası́ como las
instrucciones. Se organiza internamente en posiciones de memoria, y en cada una de estas
posiciones se almacena una cantidad determinada de información (una palabra de memoria).
¿Cómo funciona? La Unidad Central de Proceso tiene dos componentes principales: la Unidad de
Control y la Unidad Aritmético-Lógica. La Unidad de Control conoce en todo momento en qué posi-
ción de memoria se encuentra la siguiente instrucción que debe ejecutar el computador y se encarga
de que se ejecute. Primero recoge de la Memoria Central la información necesaria para ejecutarla
(la instrucción y los datos correspondientes); cuando tiene la instrucción, la interpreta para saber
qué es lo que debe hacerse y la ejecuta. Si es una operación de tipo aritmético o lógico, se encarga
de ordenar a la Unidad Aritmético-Lógica que la realice y le suministra los datos sobre los que debe
operar. Finalmente, si se produjera algún resultado, la Unidad de Control lo almacena en la Memoria
4 ITIS IS04: Capı́tulo 1. Introducción
Memoria
Central
Unidad Unidad
de Aritmét.-
Control Lógica
Unidad
Central de Procesos
Central. Este proceso se repite desde la primera instrucción hasta la última, respetando el orden de
la secuencia.
Esta máquina almacena los datos y las instrucciones en memoria en un determinado formato.
Esto obligará a que los algoritmos deban traducirse a un lenguaje que el computador comprenda, a
un lenguaje de programación. Por lo tanto,
Una vez que se diseñado el algoritmo, la traducción de este a un lenguaje de programación para
obtener un programa es muy directa. Basta con conocer el lenguaje de programación a utilizar y
disponer de un procesador del lenguaje que permita generar el código ejecutable por el computador.
Como ya se ha hecho antes, se puede establecer una analogı́a entre el esfuerzo intelectual de escribir
una novela y el de escribir un algoritmo; la generación del programa a partir del algoritmo serı́a
equivalente al esfuerzo de traducir una novela a otro idioma.
Enunciado de un Problema
⇓
Diseño
Paso Creativo ↓
ALGORITMO
⇓
Codificación
Traducción ↓
PROGRAMA
1.2. La Programación como Disciplina de Ingenierı́a. 5
Hay dos tipos de procesadores de lenguaje, Intérpretes y Compiladores. En ambos casos se trata
de programas que pueden traducir texto escrito en un lenguaje de programación concreto a instruc-
ciones del lenguaje máquina, directamente ejecutables por el computador. Y es entonces cuando el
computador comienza a trabajar tal y como se ha descrito anteriormente. Y, de nuevo, el proceso es
automático: el único paso creativo en este proceso es el diseño del algoritmo; tanto la codificación a
un lenguaje de programación como la traducción posterior a lenguaje máquina como la posterior eje-
cución no suponen esfuerzo creativo alguno. Por lo tanto, si se producen malos resultados al ejecutar
un programa nunca es debido ni al computador ni al procesador del lenguaje. Los malos resultados
son consecuencia de malos algoritmos.
Entre otros, hay dos tipos de paradigmas de programación: el imperativo y el declarativo. Este
último, a su vez, se divide en el paradigma lógico y en el funcional.
En esta asignatura se utilizará la programación imperativa, que consiste en diseñar los algorit-
mos (por lo tanto, los programas) mediante una secuencia de instrucciones que definen cómo resolver
un determinado problema (por lo tanto, es como si se diseñara una secuencia de “órdenes” que el
computador debe seguir para obtener los resultados a partir de los datos). Por contra, en programa-
ción declarativa, los algoritmos son secuencias de instrucciones que definen qué problema hay que
resolver, no cómo.
Hay lenguajes orientados hacia metodologı́as más concretas. Una de las más difundidas es la
denominada Programación Orientada a Objetos, POO, que se caracteriza por el modo en que ma-
nipula la información: un objeto es una entidad lógica que contienen tanto datos como el código
necesario para trabajar con esos datos. Otra metodologı́a bastante difundida en la actualidad es la
Programación Orientada a Eventos, POE, que se caracteriza por que el control de la ejecución de
un programa queda relegado a la aparición de algún suceso externo al propio programa (la aparición
de una interrupción, por ejemplo).
La programación es una disciplina que, al igual que otras disciplinas de ingenierı́a, se fundamenta
en una teorı́a, una metodologı́a y un conjunto de técnicas de diseño.
La informática y, por lo tanto, la programación, son disciplinas jóvenes en relación a otras disci-
plinas de la ingenierı́a. De ahı́, que un informático deba estar dispuesto a asumir el compromiso de
una continua formación, a medida que se obtienen nuevos resultados en este campo.
Pero, además, debe asumir la gran contradicción que representa el ser especialista en un campo
6 ITIS IS04: Capı́tulo 1. Introducción
que, por un lado, está muy presente en la vida diaria (la presencia de computadoras, ası́ como el
número de actividades diarias que se ven influidas por un proceso informático, es cada dı́a mayor)
pero, por otro, es “el gran desconocido”; en particular, el trato con clientes profanos en la materia
suele ser especialmente dı́ficil. El desconocimiento puede tener como consecuencia que se asocie
la “magia” a lo que debe ser una disciplina de trabajo: se piden resultados, antes que una buena
planificación.
Por ello es tan importante, de cara a la actividad profesional, el hecho de adquirir una buena base
metodológica.
La última fase se realiza realmente durante la vida operativa del programa diseñado; si fuera
necesario hacer mejoras o cambios, se habrı́a de retroceder a etapas previas del desarrollo.
Lo deseable es que estos pasos se ejecuten en secuencia, es decir, que no comience una etapa
hasta que no haya finalizado la anterior. Esta serı́a la consecuencia de aplicar una buena metodologı́a
de trabajo, ya que supondrı́a la forma más eficaz y eficiente de trabajar. Y actualmente se dispone de
los conocimientos necesarios para poder desarrollar ası́ el trabajo.
Sin embargo, todavı́a es normal que este desarrollo se vea interrumpido por continuas realimen-
taciones, mucho antes de llegar a la última etapa: clientes que cambian la definición del problema,
errores detectados en la etapa de prueba como consecuencia de un mal diseño del algoritmo... Una
buena medida sobre la calidad y la profesionalidad del programador, o del equipo de programadores,
puede ser, precisamente, el número de realimentaciones que deba realizar en el esquema anterior.
Definición del problema y análisis de requisitos: Un cliente plantea un problema que necesita una
solución informática mediante la construcción de un sistema informático; en este sistema pue-
den integrarse varios equipos, distintos programas y bases de datos. El primer paso consiste en
un análisis del problema y es un paso muy laborioso, bien sea por el nivel de comprensión del
problema, bien por el planteamiento que haya realizado el cliente. Una vez que se ha definido
el sistema (qué partes, cuáles son, qué programas hay que desarrollar, cómo se deben integrar,
cómo deben colaborar), se debe realizar un análisis minucioso de los requisitos que supone la
definición informática del mismo.
El resultado de esta etapa debe ser un enunciado preciso y claro del problema.
Esta etapa entra dentro de la disciplina denominada Ingenierı́a del software y queda fuera de
esta asignatura. Por lo tanto, nosotros partiremos siempre de un enunciado ya definido, a partir
del cual se desarrollarán las etapas posteriores.
1.2. La Programación como Disciplina de Ingenierı́a. 7
Diseño del algoritmo: En esta etapa se debe realizar un diseño que permita obtener la solución
deseada al problema.
Esta es la etapa más importante y costosa del proceso; de su éxito depende, en buena medida,
el coste y el éxito de las etapas posteriores.
Esta etapa es el objetivo básico de esta asignatura.
Implementación del programa: Para ejecutar el algoritmo hay que traducirlo a un lenguaje de
programación. Esta etapa es, pues, una etapa poco costosa y sencilla ya que se trata de traducir
el diseño realizado en la etapa anterior.
Esta etapa es el segundo objetivo de la asignatura.
Pruebas: En esta etapa se trata de probar el programa resultante con diferentes datos de entrada que
reciben el nombre de juegos de prueba.
Es importante saber que los juegos de prueba sólo sirven para comprobar que el programa no
es correcto, cuando para algún juego no se obtienen los resultados previstos. Pero no sirven
para comprobar que el programa es correcto (a no ser que se hagan juegos que permitan
comprobar todas las entradas posibles, lo que es prácticamente imposible). Para comprobar
que un programa es correcto hay que utilizar las Técnicas de Verificación Formal.
Además, es una etapa que suele realizarse mal, a no ser que se adquieran técnicas y pautas que
permitan elegir convenientemente los juegos de prueba. Suele verse como una etapa aburrida,
lo que puede provocar que no se verifiquen casos de entradas de gran tamaño, o que no se
comprueben casos extraños o de condiciones extremas de los datos.
Por lo tanto, el éxito en esta etapa viene dado, primero, por el hecho de haber realizado un
buen diseño del algoritmo, y segundo, por haber realizado una buena implementación y haber
realizado un buen conjunto de juegos de prueba.
Operación, mejora y mantenimiento: Una vez que se ha obtenido y probado el programa, no ha
terminado el proceso. Un programa ya acabado puede cambiar, bien porque se detecten fallos
durante su operatividad que no se habı́an detectado previamente, bien porque sea necesario
mejorar o adaptar algunas de sus prestaciones. Realizar este cambio supone reproducir todo el
proceso desde el inicio.
En esta etapa es donde cobra mayor importancia que el diseño del programa se haya realizado
utilizando un buen estilo de programación. Un programa se escribe una vez, pero se lee muchas
veces. Y, posiblemente, por parte de un equipo ajeno a su diseño. Ello hace necesario un buen
estilo, legible y, además, pone de relieve la importancia de realizar una buena documentación, a
ser posible en todas las etapas de desarrollo, de forma que se ofrezca información significativa,
no superflua, de cada una de las etapas. Especialmente de la de diseño.
Se podrı́a hacer un resumen, un tanto cruel, del proceso: el computador es tonto, pero es muy
rápido y puede desarrollar de forma precisa todas las acciones que se le ordenen; el programador es
inteligente, es creativo y debe ser preciso en la definición de un proceso. Y el cliente es ... imprede-
cible y exigente.
A partir de un enunciado concreto, se deberá hacer el diseño de un algoritmo. Puede haber más
de un algoritmo que permita resolver el mismo problema. Por lo tanto, se han de tener criterios para
escoger el algoritmo más adecuado para la implementación.
8 ITIS IS04: Capı́tulo 1. Introducción
1.3. Resumen.
Debemos entender la programación como una disciplina de la ingenierı́a; por ello, nos impondre-
mos los objetivos descritos en la sección 1.2.2. Resultarı́a una buena idea que los releyeráis a medida
que avanza el curso para no perderlos de vista; además, a medida que avancemos en la materia los
entenderéis mejor.
1.4. Glosario. 9
1.4. Glosario.
algoritmo Conjunto explı́cito de reglas para resolver un problema en tiempo finito.
codificación Traducción de un algoritmo a un lenguaje de programación.
lenguaje natural Cualquier lenguaje que se utiliza como forma natural de comunicación: caste-
llano, catalán, inglés, el lenguaje de signos, etc.
lenguaje de programación lenguaje creado para expresar programas y que puede ser interpretado
por un computador.
programa Codificación de un algoritmo en un lenguaje de programación.
1.5. Bibliografı́a.
1. “Fonaments de Programació I”, M.J. Marco, J. Álvarez & J. Villaplana. Universitat Oberta de
Catalunya, Setembre 2001.
2. “Introducción a la Programación (vol. I)”, Biondi & Clavel. Ed. Masson. 1991.
3. “La crisis crónica de la programación”, W. Wayt Gibbs. Investigación y Ciencia, Noviembre
1994. Pág. 72 – 81.
Como podéis ver, este artı́culo es de 1994; uno esperarı́a (o por lo menos desearı́a)
que ya se hubiera quedado anticuado, pero ... el siguiente que os recomendamos
es de este mismo año y el tı́tulo lo dice todo; es decir, seguimos igual (esperemos
que no peor, aunque nunca se sabe).
Conceptos Básicos
Índice General
2.1. Variables. Tipos Básicos y Expresiones. . . . . . . . . . . . . . . . . . . . . . 11
2.2. C: Estructura Básica de un Programa, Variables y Tipos Básicos. . . . . . . 17
2.2.1. Ejemplo de Programa en C. . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.2. Tratamiento de Variables y Tipos Básicos. . . . . . . . . . . . . . . . . 19
2.2.3. Entrada/Salida de Datos. . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3. Resumen y Consideraciones de Estilo. . . . . . . . . . . . . . . . . . . . . . 28
2.4. Glosario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.5. Bibliografı́a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.6. Actividades y Problemas Propuestos. . . . . . . . . . . . . . . . . . . . . . . 29
“Un programa hace lo que se le ordena hacer, no lo que se quiere que haga.”
Anónimo.
11
12 ITIS IS04: Capı́tulo 2. Conceptos Básicos
A continuación, se propone un ejemplo que permitirá ilustrar algunos de los conceptos referidos a
cómo manipular, representar y procesar los objetos que forman parte del entorno de la programación.
Esta segunda formulación presenta una ventaja sobre la anterior en el sentido de que
además de ser general, también es más fácilmente generalizable. Para ello, considérese
cómo se expresarı́a en ambos casos la solución al problema de calcular la media de
100, o 1000, números enteros.
En el ejemplo anterior se manejan siete objetos. Cada uno se ha identificado con un nombre. En
primera instancia se pueden distinguir dos categorı́as:
Los objetos num1, num2, num3 y num4 son imprescindibles ya que son los datos; si no se les
da un valor concreto, no se puede desarrollar un cálculo efectivo. Y el objeto media también
es imprescindible: es el resultado esperado y si no se da a conocer al final del proceso, éste
habrá sido inútil.
A estos objetos se les denomina parámetros y viene impuestos por la definición del problema:
son necesarios en cualquier formulación del algoritmo, como se puede observar al comparar
las dos versiones propuestas en el ejemplo.
En el tema 4 se introducirá el concepto formalmente. Por ahora basta con la idea intuitiva
de que es preciso que el programa tenga posibilidad de comunicarse con el exterior, de dar
valores concretos a los datos para ası́ poder emitir unos resultados.
2.1. Variables. Tipos Básicos y Expresiones. 13
Los objetos suma y 4 son necesarios para desarrollar los cálculos; por ejemplo, suma se
asocia a la obtención de resultados intermedios que es preciso conservar para llegar a un
resultado final correcto.
Hay una diferencia muy importante entre ellos: a medida que se desarrolle el cálculo, el objeto
suma cambiará de valor, es un objeto de valor variable, mientras que el 4 es un objeto de valor
constante.
Variables.
Del ejemplo anterior se desprende que hay objetos que, según el atributo valor, son constantes
o variables. En el desarrollo de los algoritmos, se invierte la mayor parte del esfuerzo en manipular
correctamente objetos como suma, es decir, variables. No resulta exagerado decir que el principal
objetivo de un programador será saber cuántos objetos necesita y cómo manipularlos, para poder
desarrollar correctamente el algoritmo: los datos y resultados deben quedar especificados al definir
el problema, pero el número y uso correcto de variables forman parte del diseño de la solución. De
ahı́, la importancia que adquieren en la definición del entorno de trabajo.
Tipos.
No todos los objetos del ejemplo son del mismo tipo. Se manejan valores enteros, los de num1,
num2, num3, num4, 4 y suma, pero el resultado del cálculo, media, será un valor real.
El atributo tipo permite clasificar los objetos según su utilidad y las operaciones que se pueden
hacer con ellos.
Un tipo se define indicando el conjunto de valores que lo forman. Esto puede hacerse por com-
prensión - enunciando una propiedad que cumplen todos los objetos de ese tipo - o bien por extensión
- enumerando todos los posibles objetos de un tipo dado.
Los tipos se pueden dividir en básicos y estructurados1 . Hay cuatro tipos básicos:
Tipo ENTERO: Es útil cuando se quiere representar información cuyo valor sólo puede ser un
valor entero. Por ejemplo, el número de personas matriculadas en una asignatura, el número
de volúmenes de una biblioteca o el número de votos que recibe una candidatura polı́tica.
En principio, el tipo entero se puede asimilar al conjunto Z de los enteros. Sus valores se
representan como se hace normalmente en Matemáticas, con o sin signo, dependiendo de que
sean positivos o negativos: 34, -16, 8456, 0, 144,...
Pero, a la hora de diseñar un algoritmo, especialmente cuando se convierta en un programa, se
debe tener en cuenta que en programación el tipo entero debe definirse como un subconjunto
de los números enteros, puesto que el conjunto Z es infinito y la capacidad de almacén de un
computador es finita: se habla entonces del rango de los números enteros en una determinada
máquina y/o lenguaje de programación; es usual utilizar una constante especial, maxentero,
que indica el máximo entero en valor absoluto que es capaz de representar la máquina o el len-
guaje. En general, en el entorno de programación se define el tipo entero como el subconjunto
{x ∈ Z | −maxentero ≤ x < maxentero}.
Tipo REAL: La necesidad de manejar valores reales surge en cuanto se quiere manipular informa-
ción numérica cuyo valor puede ser fraccionario como, por ejemplo, la nota media de acceso
1 Se introducirán en el tema 5
14 ITIS IS04: Capı́tulo 2. Conceptos Básicos
estar familiarizado con la representación “exponente-mantisa”. Lo que se ha dicho es cierto para números pequeños, ya que
la precisión con que se representa un valor es mayor cuanto más cerca está ese valor del cero. Los números muy grandes
suelen representarse con poca precisión. Se volverá a discutir el tema más adelante.
3 Para evitar confusiones, y ya que en prácticas se trabajará en C la mayor parte del tiempo, se ha optado por seguir su
La asignación.
Si el entorno de trabajo de un algoritmo está formado por valores contenidos en objetos, las
acciones que realice un algoritmo por fuerza deben estar relacionadas con lo que se pueda hacer
para cambiar el valor de dichos objetos.
Sólo hay una acción que pueda realizar el procesador para manipular valores. Es la asignación,
la acción de dar un valor a un objeto. Es, una acción destructiva, ya que en el momento en que se da
un valor a un objeto variable, se pierde el valor anterior.
Definición 2.1 (Asignación) Acción destructiva que permite dar un valor a un objeto varia-
ble. La notación que se utilizará para denotarla es la siguiente,
<variable>=<expresión>,
donde <variable> siempre será el nombre de una variable, = representa la acción de asig-
nar y <expresión> el valor a asignar. Este valor será del mismo tipo que la variable y
puede ser,
1. un valor constante (el valor de un objeto constante),
Expresiones.
Definición 2.2 (Expresión) Combinación de operandos y operadores, del mismo tipo, que
expresan un cálculo que se ha de evaluar para obtener un resultado.
De ahı́, que en la definición de la expresión, también haya que hacer referencia al tipo, ya que
del concepto de coherencia, se sigue que también las expresiones tienen tipo. Una expresión no es
más que una combinación de objetos (operandos) de un mismo tipo y operadores asociados a ese
tipo, que expresan un cálculo. El tipo de la expresión es el de sus operandos y operadores. Puesto
que se han definido cuatro tipos básicos de objetos, también se distinguirán cuatro tipos básicos de
16 ITIS IS04: Capı́tulo 2. Conceptos Básicos
operadores,
Operadores ENTEROS: Se aceptará cualquier operador de la aritmética entera. Los más tı́picos
son – (cambio de signo) entre los operadores unarios y, entre los binarios, los siguientes: +
(suma entera), – (resta entera),* (multiplicación entera), el cociente de la división entera y el
resto de la división entera.
Estos operadores tienen implı́cita una jerarquı́a: de mayor a menor, cambio de signo, la mul-
tiplicación y la división y, por último, la suma y la resta. De entre varios operadores con la
misma prioridad, se realiza primero la operación que se lee primero de izquierda a derecha.
Esta prioridad se puede modificar utilizando paréntesis. Por ejemplo, 3+4*5, darı́a como re-
sultado 23, mientras que (3+4)*5, darı́a 35.
Operadores REALES: Serán los usuales en la aritmética real. Se suele disponer también del cam-
bio de signo y de los binarios más tı́picos: + (suma real), – (resta real),* (multiplicación real),
/ (división real) y la potenciación.
La jerarquı́a es similar: primero cambio de signo, la potenciación, después la multiplicación y
la división y, por último, la suma y la resta. También en este caso se recurre al uso de paréntesis
si se desea modificar la prioridad o, simplemente, para mejorar la legibilidad de la expresión.
Operadores de tipo CADENA: Permiten realizar operaciones con cadenas. Uno de lo más tı́picos
es la concatenación, que se suele denotar con el operador + (ver pie de página5 ). Dependiendo
del lenguaje de programación, es habitual encontrar operaciones que permiten determinar la
longitud de una cadena, o acceder a alguno de los caracteres individuales de una cadena, por
ejemplo.
Operadores de tipo BOOLE: Hay dos clases de operadores boole. Por un lado están aquellos ope-
radores que expresan operaciones del álgebra de Boole (conectores). Los más tı́picos son (x e
y representan valores de tipo booleano):
Pero, además, existen los llamados operadores de relación, que se caracterizan por relacionar
objetos del mismo tipo en una expresión cuyo resultado es lógico. Esa relación es una relación
de orden, por lo tanto los operadores de relación son,
En esta subsección se verá cómo adaptar el tratamiento de variables y tipos cuando el lenguaje
de programación es C. Entre los objetivos de la asignatura no se encuentra el de formar expertos pro-
gramadores en lenguaje C, ni en ningún otro lenguaje. La asignatura pretende introducir al alumno
en el mundo de la algorı́tmica y la programación, y en este sentido hay que entender que los lengua-
jes de programación son una herramienta y no un fin. Ni esta sección, ni las equivalentes en temas
posteriores, pretenden ser una guı́a exhaustiva para aprender el lenguaje de programación C; la idea
es ayudar a aquéllos que, teniendo nociones básicas de programación, necesitan conocer y utilizar
dicho lenguaje de programación.
1 int main()
2 {
3 /* Datos */
4 int num1, num2, num3, num4;
5 /* Resultados */
6 float media;
7
8 int suma;
9
Lı́nea 1: int main() define lo que se conoce como la función principal de un programa en
lenguaje C. Esta función siempre debe existir y es la primera que se ejecuta.
Para definir una función en C se indica, en primer lugar, el tipo de datos que devuelve. En este
caso, el estándar ANSI obliga a que la función principal devuelva necesariamente un valor
6 Los números de las lı́neas, en este y otros ejemplo, sólo se muestran por claridad y no se deben escribir en un programa
en C.
18 ITIS IS04: Capı́tulo 2. Conceptos Básicos
entero y eso es lo que indica la palabra reservada int (de integer en inglés). A continuación,
se indica el nombre de la función; en este caso main, y también por indicación del estándar.
Por último se debe indicar, entre paréntesis, los parámetros de la función, si los tiene. Al utili-
zar () se indica que la función no tiene ningún parámetro. Aquı́ el estándar permite distintas
opciones, pero por el momento se utilizará ésta.
Lı́neas 2 y 14: las llaves (“{” y “}”) sirven en C para indicar el inicio y el fin de un bloque de
instrucciones. En el ejemplo, el bloque formado por las instrucciones que forman la función
principal.
Lı́neas 3 y 5: se han utilizado comentarios para indicar cuáles son los datos y cuál es el
resultado.
Un comentario es una o varias lı́neas que no forman parte del programa (de hecho, el proce-
sador del lenguaje los ignora), sino que ayudan a leerlo y entenderlo. Utilizarlos bien es el
primer paso de un programa legible y bien documentado. En C se pueden poner comentarios
en cualquier parte del programa utilizando “/*” para indicar el inicio de un comentario y
“*/” para indicar el final.
Lı́neas 4, 6 y 8: Se está realizando la definición de variables. La definición de variables se
realiza al inicio de una función indicando el tipo de la variable y su nombre. Con int se indica
que una variable es de tipo entero (para los reales, se utiliza float). Para cada variable se
indica qué nombre la identifica. La definición de variables de cada tipo termina con el sı́mbolo
; (punto y coma).
Por convenio, en la asignatura se definirán primero los datos, después los resultados y, por
último, las variables propias del algoritmo.
En las lı́neas de la 10 a la 13, figuran las instrucciones que se utilizaron para realizar el primer
algoritmo ejemplo. En ellas, se utilizan asignaciones, =, y expresiones tal y como se definı́an
en la sección anterior. De nuevo, se utiliza el punto y coma para finalizar una instrucción.
De acuerdo a este ejemplo, se podrı́a hacer un primer esquema básico de cuales son las partes
que forman un programa en C:
/* Función principal*/
int main() {
/* Especificación de datos */
/* Especificación de resultados */
A lo largo de este capı́tulo se irán viendo nuevos conceptos que completarán este primer esquema
de un programa en C.
2.2. C: Estructura Básica de un Programa, Variables y Tipos Básicos. 19
Variables.
<tipoDeDatos> <nombreVariable>;
donde tipoDeDatos indica el tipo de datos de la variable que se quiere definir y nombreVariable
es el nombre (o identificador) de la variable.
El lenguaje C impone las siguientes restricciones para formar el nombre de una variable: obli-
gatoriamente ha de empezar por una letra, pudiendo ser el resto de carácteres del nombre letras,
números o el sı́mbolo de subrayado ( ). No se pueden utilizar sı́mbolos especiales o palabras reser-
vadas del lenguaje. Hay que hacer notar que el C distingue entre mayúsculas y minúsculas.
int a;
int i, j, edad1;
float Peso1, Peso2;
Constantes.
La declaración de objetos de valor constante no es obligatoria en C, pero es útil por tres motivos
principales:
20 ITIS IS04: Capı́tulo 2. Conceptos Básicos
Mejoran la claridad de los programas, puesto que son fácilmente identificables y hacen que
las expresiones sean más fáciles de leer. Es más significativo leer 2*PI*r (habiendo asociado
antes a PI el valor 3.1415927) que 2*3.1415927*r.
Evitan la introducción de errores, ya que se define su valor una vez y después se utiliza su
nombre simbólico. Considérese, por ejemplo, una constante numérica. Si cada vez que se ha
de escribir se han de poner todos los dı́gitos que la forman, puede ocurrir que se introduzcan
errores involuntariamente, siendo además estos errores difı́ciles de localizar. Siguiendo con el
ejemplo del valor de PI, podrı́a ocurrir que en algún sitio, por error, se escribiera involunta-
riamente 3.1425927.
Permiten modificar el valor de una constante de forma sencilla. El valor de una constante
puede cambiar con el tiempo (por ejemplo, si una constante define el valor del IVA y éste se
modifica por algún motivo, o si se quiere aumentar la precisión de un valor real). En estos
casos, se hace necesario modificar el valor constante allá donde aparece (si no se ha defi-
nido como tal). Si se ha definido una constante para dicho valor, sólo hay que modificar la
definición.
En C una constante se puede definir utilizando la directiva #define del preprocesador7 que
simplemente sustituye todas las apariciones de la constante en el programa por su valor:
También se pueden definir objetos constantes tal y como se hace para las variables pero antepo-
niéndoles el calificador const al tipo de datos y asignándoles un valor:
Ejemplos:
#define PI 3.1415927
Por claridad y para distinguirlas fácilmente de las variables, se suele poner el nombre de las
constantes en mayúsculas como se muestra en los ejemplos.
El lenguaje C dispone de varios tipos de datos. El objetivo de esta subsección es comentar cómo
utilizar en este lenguaje los tipos que se han definido anteriormente como básicos:
El tipo entero se define utilizando la palabra reservada int. El tipo int puede ir acompañado
de los calificadores short para enteros pequeños o long para enteros grandes. Los rangos de
7 El preprocesador es un programa residente que se ejecuta antes de la compilación y que realiza determinadas acciones
definidas por las directivas incluidas en nuestros programas, que empiezan por #.
2.2. C: Estructura Básica de un Programa, Variables y Tipos Básicos. 21
valores para cada uno de los calificadores dependen del ordenador y el compilador utilizados.
A efectos de esta asignatura se utilizará int sin calificadores.
El tipo real se define utilizando la palabra reservada float o double si se quiere trabajar
con una mayor precisión o con un rango mayor. El tipo double puede también ir acompañado
del calificador long si se quiere trabajar todavı́a con una mayor precisión o con un rango
mayor.
El tipo carácter se define utilizando la palabra reservada char y sirve para almacenar un
único carácter. Realmente el lenguaje C almacena en las variables de tipo char un valor
entero entre 0 y 255, el correspondiente al código ASCII del carácter que se quiere almacenar.
Más adelante, en el tema 5, se comentará cómo trabajar con cadenas (string) en C.
El tipo lógico o boole no existe como tal en C. Se puede “simular” utilizando el tipo char, por
ejemplo, pero es más habitual utilizar el tipo int, de forma que el valor 0 equivale a FALSO
y cualquier otro valor a CIERTO.
Sin embargo, una solución más elegante es utilizar un tipo enumerado (enum) tal y como se
indica en el siguiente apartado.
Tipos enumerados.
Un tipo enumerado define un nuevo tipo cuyos objetos sólo pueden tomar los valores constantes
definidos en la enumeración. En el lenguaje C se define utilizando la palabra reservada typedef
del siguiente modo:
De esta forma, se ha definido el tipo tDias (cuyos objetos pueden tomar los valores lunes,
martes, ..., domingo) y el tipo boole cuyos objetos pueden tomar los valores FALSO y
CIERTO.
Esta última definición permitirá que se puedan manejar más cómodamente los objetos de tipo
lógico. En el tipo boole, es muy importante el orden en que se definen los valores, ya que en un
enumerado el lenguaje C asigna al primer valor, el valor 0, al segundo el 1 y ası́, sucesivamente.
Siguiendo el orden anterior, se asegura que el valor FALSO se asocia al valor 0; de no proceder de
esta forma, las operaciones con objetos de tipo boole tendrán un funcionamiento erróneo.
Expresiones.
No todos los operadores que se comentaron en la sección 2.1 se pueden utilizar directamente en
C. En este subapartado se pretende comentar sólo los operadores que el lenguaje permite manejar
directamente, y especificar su sintaxis correcta.
22 ITIS IS04: Capı́tulo 2. Conceptos Básicos
Operadores aritméticos: Se englobará en este grupo los operadores enteros y reales. Es convenien-
te recordar el concepto de polisemia, ya que la mayor parte de los operadores que se describen
son válidos para el tipo entero o el real y, dependiendo del tipo de los operandos, expresan la
correspondiente operación entera o real. También es preciso recordar el concepto de coerción
entre enteros y reales. Se comentará, de nuevo, más ampliamente al hablar de conversión de
tipos. Los operadores aritméticos básicos del lenguaje C son:
+ : puede ser un operador unario, indicando el signo o binario, representando la suma.
- : puede ser un operador unario, indicando el signo o binario, representando la resta.
* es el operador binario que denota la multiplicación.
/ es el operador binario para la división.
Si los operandos son enteros, denota el cociente de la división entera. Si al menos uno
de ellos es real, denota la división real. Como ejemplo, notése que en el algoritmo de la
media aritmética la última instrucción ha pasado a ser
media = suma/4.0
% es el operador que representa al resto de la división entera.
Esta lista de operadores básicos no incluye muchos de los operadores o funciones aritméticas
que suelen utilizarse en el diseño de algoritmos, como la exponenciación, o la raı́z cuadrada.
Esto no quiere decir que no se puedan utilizar: el lenguaje C es bastante reducido y, para com-
pletarlo, va acompañado de un conjunto de funciones conocido como biblioteca estándar y
que le añade todas las funcionalidades de las que carece. En concreto, para la exponenciación
y la raı́z cuadrada dispone de las funciones ya definidas pow(x,n) y sqrt(x) en la biblio-
teca math.h. Cuando se quiere utilizar alguna de las funciones de la biblioteca estándar hay
que indicar qué parte de ella se utilizará, con una directiva #include del preprocesador; en
el caso del ejemplo anterior,
#include <math.h>
Operadores lógicos: C es un lenguaje que contiene implı́citamente el tipo boole, es decir, no tiene
el tipo de forma explı́cita, pero puede operar con valores lógicos, asociando el valor 0 a falso
y cualquier valor distinto de 0 a cierto.
Además, el lenguaje C presenta pecualiaridades propias, relacionadas con cómo evaluar las ex-
presiones que forman parte de un programa. Cabe destacar las siguientes:
Precedencia y Asociatividad: Cuando en una expresión aparece más de un operador, deben existir
unas reglas para saber en qué orden se aplican los distintos operadores para obtener el resultado final
de la expresión. Dichas reglas vienen marcadas por la precedencia y la asociatividad.
La asociatividad indica en qué orden se evalúa una expresión en la que aparecen varios operado-
res con la misma precedencia. Los operadores de C que se han presentado tienen mayoritariamente
una asociatividad de izquierda a derecha; es decir, si dos operadores en una expresión tienen la mis-
ma precedencia, se evalúa la expresión de izquierda a derecha. Sin embargo, el cambio de signo y la
negación (!) tienen asociatividad de derecha a izquierda.
La siguiente tabla muestra la precedencia de los operadores de C vistos, de mayor a menor (de
arriba hacia abajo). También muestra la asociatividad de cada uno de estos operadores.
Operador Asociatividad
! de derecha a izquierda
- (cambio de signo) de derecha a izquierda
* /% de izquierda a derecha
+ - de izquierda a derecha
< <= > >= de izquierda a derecha
== != de izquierda a derecha
&& de izquierda a derecha
|| de izquierda a derecha
Conversión de tipos: También se conoce como “cast” y consiste en convertir un objeto de un tipo
de datos dado a otro tipo, para realizar una determinada operación. En muchos casos el C realiza
automáticamente dicha conversión: de nuevo aparece el concepto de coerción que se traduce en, por
ejemplo, permitir que se realice una división entre un real y un entero (3.5/2), sabiendo que el
entero se transforma a su equivalente real (2.0) antes de hacer dicha división y que el resultado
será real y sólo podrá asignarse a un objeto de tipo real.
Sin embargo, en ocasiones se precisa hacer la conversión explı́citamente. Para ello, se indica
entre paréntesis a qué tipo se quiere convertir un determinado objeto, que se escribe a continua-
ción. Por ejemplo, (float)3 convierte la constante entera 3 en la constante real 3.0 (aunque
matemáticamente sea el mismo valor, la representación interna es distinta).
24 ITIS IS04: Capı́tulo 2. Conceptos Básicos
Al diseñar algoritmos, será normal asumir que se conocen los datos (y que se emitirán conve-
nientemente los resultados). Pero cuando se realice el programa, se deberá disponer de algún tipo de
herramienta de comunicación. Si se retoma el ejemplo de la media aritmética,
int main() {
/* Datos */
int num1, num2, num3, num4;
/* Resultados */
float media;
int suma;
Para poder leer datos de la entrada estándar (normalmente, el teclado), se utiliza una función de
la biblioteca estándar, la función scanf. Si se introduce dicha función en el código de la media
aritmética se producen varios cambios:
1 /* Ficheros de Cabecera */
2 #include <stdio.h>
3
4 int main() {
5 /* Datos */
6 int num1, num2, num3, num4;
7 /* Resultados */
8 float media;
9
10 int suma;
11
12 /* Lectura de datos */
13 scanf(" %d", &num1);
14 scanf(" %d", &num2);
15 scanf(" %d", &num3);
16 scanf(" %d", &num4);
17
En la lı́nea 2, se debe añadir la directiva #include <stdio.h>, que indica que se utili-
zarán funciones de entrada/salida (standard input/output en inglés).
En las lı́neas de la 13 a la 16, se está especificando la lectura de dichos valores.
La función scanf se utiliza para leer datos de la entrada estándar y almacenarlos en una varia-
ble8 : se debe indicar entre comillas el tipo de datos que se quiere leer, mediante un código de control,
y a continuación, separado por una coma, la variable (precedida por el sı́mbolo &)9 donde se quiere
almacenar el dato leı́do.
Un código de control indica el tipo de dato que se va a tratar y está formado por el sı́mbolo “ %”
seguido de un carácter: “d” para los enteros, “f” para los reales y “c” para los caracteres (para el
tipo boole se podrı́a utilizar también el carácter “d”).
scanf(" %c",&opcion);
scanf(" %f",&Peso2);
La versión actual del cálculo de la media podrı́a compilarse y ejecutarse. Pero serı́a un programa
completamente inútil, ya que ahora sı́ que se realizan correctamente los cálculos, pero no ofrece
ningún resultado a un posible usuario. Una posible solución serı́a mostrar por la salida estándar
(que, normalmente, es el monitor) el valor que se asigna a la variable media. Para hacerlo, es preciso
utilizar la función, también de la biblioteca estándar, printf. La nueva versión del programa de la
media aritmética serı́a la siguiente:
1 /* Ficheros de Cabecera */
2 #include <stdio.h>
3
4 int main() {
5 /* Datos */
6 int num1, num2, num3, num4;
7 /* Resultados */
8 float media;
9
10 int suma;
11
12 /* Lectura de datos */
13 scanf(" %d", &num1);
14 scanf(" %d", &num2);
15 scanf(" %d", &num3);
16 scanf(" %d", &num4);
17
23
8 Setrata de una función muy completa y compleja (y que, habitualmente, produce muchos dolores de cabeza); aquı́ se
muestra en su forma más simple.
9 Más adelante, cuando se estudien los punteros, se explicará el significado del sı́mbolo &.
26 ITIS IS04: Capı́tulo 2. Conceptos Básicos
24 /* Escritura de resultados */
25 printf(" %f", media);
26 }
La diferencia está en la lı́nea 25, en la que se utiliza printf; tal y como se ha utilizado, muestra
el valor de media en la salida estándar. Para ello, se ha vuelto a utilizar un código de control (" %f",
por float) y, a continuación y separado por comas, se indica qué objeto se visualiza.
Esta versión ya serı́a completamente correcta, se puede compilar, ejecutar y dispone de la capa-
cidad de comunicarse con el exterior. Pero seguirı́a siendo un poco inútil desde el punto de vista de
un usuario que no conociera el código (en caso de incredulidad, se recomienda encarecidamente que
se edite el programa, se compile y ... se pida a un amigo que lo ejecute).
El usuario no tiene ninguna ayuda que le permita saber lo que ocurre: ningún mensaje de ayuda,
nada que le permita deducir que se están esperando sus datos para producir un resultado.
Una versión más “polı́ticamente correcta” del mismo programa serı́a la siguiente, que permite
comentar más peculiaridades sobre el uso de printf y scanf:
1 /* Ficheros de Cabecera */
2 #include <stdio.h>
3
4 int main() {
5 /* Datos */
6 int num1, num2, num3, num4;
7 /* Resultados */
8 float media;
9
10 int suma;
11
28 /* Escritura de resultados */
29 printf("\n\nLa media aritmetica de %4d, %4d, %4d y %4d es %7.2f.", num1,
30 num2, num3, num4, media);
31 }
Lo que se ha hecho ha sido aprovechar la posibilidad que ofrece la función printf de mostrar
mensajes, además de visualizar valores de variables. El efecto de printf("mensaje") es mos-
2.2. C: Estructura Básica de un Programa, Variables y Tipos Básicos. 27
trar mensaje en la salida estándar. Es lo que se ha hecho en la lı́neas 12, 14, 16, 18 y 20. Si se
quiere además visualizar el valor de un objeto o más objetos, como se ha hecho en la lı́nea 29, en
el cuerpo del mensaje hay que poner un código de control (por cada dato) en el punto del mensaje
donde se quiere visualizar y, a continuación del mensaje y separado por comas, los objetos.
Además, en el código de control, entre el sı́mbolo % y el carácter que indica el tipo, se puede
poner un número ( %nd) que indica que se han de utilizar n dı́gitos para visualizar el dato. Si se trata
de un dato real, se puede poner un número decimal ( %n.mf) que indica que se han de utilizar n
dı́gitos para visualizar el dato y, de ellos, se han de mostrar m decimales. Hay que hacer notar que
esto no modifica el valor de los objetos, sólo influye en la forma en que la función printf() los
visualiza.
También se han utilizado otros códigos, que empiezan por el carácter “\”, y que representan
carácteres especiales. Dos de los más utilizados son “\n”, para realizar un salto de lı́nea, y “\t”, para
introducir un tabulador.
Cabe destacar cómo el C realiza una distinción clara entre la entrada y la salida. Ası́, cuando
se quiera mostrar un mensaje previo a la lectura de datos hay que utilizar la función printf y, a
continuación, mediante la función scanf se indica que se va a leer un dato. Por ejemplo, tal y como
se hace en las lı́neas 14 y 15 para leer el valor de num1.
Del ejemplo anterior, se desprende un segundo esquema básico de programa; con respecto al
esquema presentado en la subsección 2.2.1, se añade la posibilidad de incluir ficheros de cabecera
(para incluir funciones de la librerı́a estándar o de otras librerı́as) y una organización básica lectura-
cuerpo de instrucciones-escritura que se procurará mantener siempre que sea posible:
1 /* Ficheros de Cabecera */
2
3 /* Función principal */
4 int main() {
5
6 /* Especificación de datos */
7 /* Especificación de resultados */
8
11 /* Lectura de datos */
12
15 /* Escritura de resultados */
16
17 }
En esta tema se han presentado las herramientas básicas de un programador, los objetos que
puede manipular para realizar un determinado proceso. Cada objeto está definido por tres atributos,
el nombre, el tipo y el valor. Los objetos pueden combinarse en expresiones, que son combinaciones
de operandos y operadores del mismo tipo. Un objeto variable puede cambiar de valor mediante la
asignación, que es la acción básica en un entorno de programación.
Utilizar nombres significativos para las variables. Si una variable va a almacenar el peso de
una persona, es bastante conveniente denominarla peso, Peso, peso pers, peso1, . . . y
no darle un nombre del tipo arfgh, axd, xt123bf . . . Obviamente todos estos nombres
son válidos, pero los del primer grupo reflejan claramente qué es lo que almacena la variable,
mientras que los del segundo grupo no.
En esta asignatura, además, se utilizará un convenio bastante difundido y que consiste en
utilizar mayúsculas para las constantes y minúsculas para nombrar a las variables (y funciones
y procedimientos, y definiciones de tipos, como se verá más adelante). En el caso de que el
nombre de la variable sea compuesto, se utilizará mayúscula al principio de cada nueva palabra
(siguiendo con el ejemplo, pesoPersona).
Es conveniente utilizar comentarios a lo largo del programa que indiquen qué es lo que está ha-
ciendo. Tampoco conviene abusar y poner más lı́neas de comentarios que de código.
2.4. Glosario.
carácter especial: cualquier carácter que en un determinado lenguaje tiene un significado especial
y cuyo uso debe restringirse.
coerción: conversión explı́cita de tipos.
constante: objeto cuyo valor nunca cambia.
instanciar: dar un valor concreto a un objeto, normalmente un parámetro de entrada.
palabra reservada: en un lenguaje de programación, o en pseucódigo, palabra cuyo uso está res-
tringido puesto que es significativa en la interpretación del código ya que indica una acción
especial, un tipo, un identificador del lenguaje...
2.5. Bibliografı́a. 29
2.5. Bibliografı́a.
1. ”Introducción a la Programación (vol. I)”, Biondi & Clavel. Ed. Masson. 1991.
2. “El Lenguaje de Programación C. Diseño e Implementación de Programas”. Félix Garcı́a,
Jesús Carretero, Javier Fernández & Alejandro Calderón. Pearson Education, Madrid 2002.
3. “The C Programming Language”. Brian W. Kernigham & Dennis M. Ritchie. Prentice-Hall
Inc. 1988.
x=y z=x
o la inversa
z=x x=y
3. Escribir un algoritmo que, dados tres valores de tipo real, permita calcular su media aritmética.
4. Diseñar un algoritmo que permita pasar una cantidad de tiempo expresada en segundos al
formato horas, minutos y segundos.
5. Sabiendo que el precio de venta al público de un artı́culo engloba su precio de coste y las
siguientes repercusiones,
Gastos de comercialización, estimados en un 20 % sobre el precio de coste,
Gastos Generales, personal, publicidad ... estimados en un 75 % sobre el precio de coste,
30 ITIS IS04: Capı́tulo 2. Conceptos Básicos
6. Escribir un algoritmo que permita determinar la solución de una ecuación de primer grado, ax
+ b = c.
7. Escribir un algoritmo que, dado un valor de tipo real, permita calcular el área del cuadrado
cuyo lado tiene esa medida.
8. Escribir un algoritmo que, dado un valor de tipo real que representa el área de un cı́rculo,
permita calcular el perı́metro de su circunferencia.