Está en la página 1de 48

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

APUNTES DE PROGRAMACIN I
Propsito
Este apunte es un apoyo y un elemento de consulta para el curso de Programacin I del 4to ao de la especialidad Tcnico en
Informtica Profesional y Personal de la EET No 5 Galileo Galilei, pero no constituye en s mismo un curso de programacin.
Est dividido en varias secciones que no deben ser ledas en forma lineal, sino relacionndolas 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 'Especificacin 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 ejecucin en la computadora.
El apndice A debera ser ledo antes de la seccin 'Algoritmos Condicionales' y tiene aplicacin en esa seccin y en
'Algoritmos de Seleccin Mltiple'.
El apndice B contiene la Norma Internacional que debe respetarse al momento del diseo del algoritmo.
El apndice 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 resolucin de problemas de un modo ms rpido, para lo cual se
desarrollan programas.
La naturaleza de los problemas vara con el mbito o con el contexto donde estn planteados; as, existen problemas
matemticos, qumicos, filosficos, etc.
Entonces, qu es un problema?
La R.A.E. nos da varias definiciones:
problema.
(Del lat. problma, y este del gr. ).
1. m. Cuestin que se trata de aclarar.
2. m Proposicin o dificultad de solucin dudosa.
3. m. Conjunto de hechos o circunstancias que dificultan la consecucin de algn fin.
4. m. Disgusto, preocupacin. U. m. en pl. Mi hijo solo da problemas.
5. m. Planteamiento de una situacin cuya respuesta desconocida debe obtenerse a travs de mtodos cientficos.

La ltima definicin es la que se aplica a nuestro trabajo:aquellos problemas cuya solucin 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 terico que permita analizarlo para
elaborar la estrategia de resolucin.
Ejemplo:
-Para calcular la potencia de un acondicionador de aire, es necesario conocer el volumen de la habitacin. La forma
de la misma es la de un prisma rectangular, por consiguiente modelamos la habitacin como un prisma.
-Para calcular los materiales para construir una viga de hormign, es necesario calcular el volumen de la misma. Al
modelarla, otra vez nos encontramos con un prisma.
Vemos que, frente a dos problemas de caractersticas 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 especificacin 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
ms de una especificacin posible, dependiendo de los datos que puedan estar disponibles.
Una vez modelado el problema, puede buscarse una solucin 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 solucin algortmica es importante elegir una representacin adecuada de los datos para que
dicha solucin resulte eficiente.

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Para convertir un algoritmo, que puede estar expresado en una notacin informal o seudo-lenguaje, en un programa ser
necesario pasar por varias etapas de formalizacin o refinamiento progresivo. El objetivo final es describir una solucin
algortmica al problema inicialmente planteado mediante el uso de las construcciones formales de un lenguaje de
programacin. Dicho programa se podr ejecutar en un computador, y para un conjunto de datos de entrada producir unos
resultados esperados.

Aspectos de la Solucin de Problemas


No existe un mtodo universal que permita resolver cualquier problema. En general, la solucin de problemas es un proceso
creativo donde el conocimiento, la habilidad y la experiencia tienen un papel importante. El proceder de manera sistemtica
puede ayudar en la solucin. 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 cmo resolver el problema. Esta etapa de definicin lleva consigo
eliminar las ambigedades y la informacin irrelevante que aparezcan en el enunciado de un problema, y saber exactamente
qu elementos constituyen una solucin vlida.
Al comenzar a abordar un problema es necesario tener en cuenta que, para la mayora 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 elaboracin.
Las etapas son:
1.

Definicin y delimitacin del problema a solucionar: Por computador se pueden resolver cualquier clase de
problema una vez definidos los pasos o instrucciones.
2. Pseudocdigo 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
lgico de su ejecucin para darle una eficiente solucin al problema. Aqu es donde radica toda la dificultad para
solucionar un problema por computador; el resto de las etapas bsicamente se circunscriben a la adaptacin para que
un computador determinado ejecute los pasos o instrucciones planteados en el pseudocdigo y se obtengas los
resultados esperados.
3. Prueba de escritorio: Luego de realizar el pseudocdigo viene la prueba de escritorio, la cual consiste en hacer un
seguimiento manual de los pasos seguidos que se definieron en el pseudocdigo y comprobar, con base en sus datos,
si el resultado al cual se llega es el esperado.
4. Codificacin: Es la escritura de las instrucciones o enunciados, determinados en la etapa de la diagramacin o la
seudo-codificacin 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. Digitalizacin: Ya codificadas las instrucciones se convierten a un medio legible para el computador. Es pasar las
instrucciones al editor del lenguaje de programacin a utilizar.
6. Compilacin: Es aqu donde el computador chequea si todas las instrucciones estn escritas correctamente desde el
punto de vista de la sintaxis y gramtica de cada lenguaje y las transcribe, dentro de la memoria, del lenguaje de alto
nivel al lenguaje de mquina para obtener el llamado programa objeto.1
7. Ejecucin del Programa: El programa objeto es ejecutado por el computador para llegar a los resultados esperados,
utilizando los dispositivos, unidades y memoria necesaria, segn cada paso o programa.
8. Evaluacin de Resultados: Obtenidos los resultados se les evala 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 solucin general de problemas (no necesariamente a
problemas informticos); sin embargo, estas ideas se pueden particularizar para resolver problemas donde se use el computador
como herramienta. A veces, la situacin ms frecuente para mucha gente es comenzar a programar la solucin de un problema
que no est completamente definido, o pensar en detalles de implementacin sin saber cmo abordar el problema
independientemente del computador. Es mucho ms productivo conocer primero un problema lo suficiente y plantear una
estrategia adecuada para su solucin, que comenzar prematuramente a programar la solucin a un problema incompleto,
ambiguo o que no ha sido analizado adecuadamente.

Especificacin de Problemas
La especificacin tiene por objetivo el conocimiento exacto de todos los detalles que hacen a la resolucin de un problema,
separndolos de aquellos que, si bien tienen relacin con el mismo, no tienen influencia en dicha resolucin.
Asimismo, permite saber si se est en condiciones de intentar una resolucin y si existe la posibilidad de dividir el problema en
problemas menores.
La divisin 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 sern comunes a otros problemas, con lo que, con el tiempo, se reduce el
proceso de anlisis. Por ejemplo, si debemos imprimir una lista de precios, el problema ser muy similar a imprimir un listado
de alumnos, solo que cambiarn los datos a colocar en cada columna.
2

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

El procedimiento de especificacin
Para especificar un problema, simplemente se deben completar los siguientes puntos:
1.
2.
3.
4.
5.

Nombre del problema.


Descripcin.
Magnitudes de entrada.
Magnitudes de salida.
Relacin entre magnitudes de entrada y de salida.

El nombre del problema debe ser una palabra o una sigla que tenga relacin con la naturaleza del mismo. Por ejemplo, son
admisibles nombres como viga, listado, SCA (sistema de controlll de acceso), ImpFact (impresin 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 porcin del mismo en forma
unvoca.
Asimismo, es posible que este nombre termine siendo el del programa o porcin de programa que resuelve el problema.
La descripcin debe describir en forma sinttica y concisa de qu se trata el problema. No debe ocupar ms 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 (nmero entero, nmero real, palabra, etc).
El identificador ser una letra, palabra o sigla que tenga relacin 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 relacin entre magnitudes de entrada y de salida indicar la forma en que se llega de los datos a los resultados.
Podr ser una o ms frmulas matemticas o la referencia a un procedimiento descripto por separado.
Si la relacin resulta muy compleja, se intentar dividir el problema en problemas menores.
Si se consigue completar los cinco puntos de la especificacin, se podr pasar al desarrollo del algoritmo de resolucin. En
caso contrario, deberemos obtener informacin adicional (consultando un especialista o libros al respecto) o ser la seal de
que el problema no puede ser resuelto en forma algortmica.
Ejemplo: El problema del tringulo.
Nos presentan el tringulo de la figura, del cual debe calcularse la superficie y nos
todos los datos indicados estn disponibles. La especificacin sera la siguiente:
1. SupTrian.
2. Calcular la superficie de un tringulo.
3. b (base), h (altura): nos reales.
4. s (superficie): no real.
5. s = b . h / 2
Vemos que, si bien se dispone de cuatro datos, solamente dos de ellos son
para resolver el problema.

indican

que

necesarios

Ejemplo: El problema del patio.


Nos piden calcular la cantidad de baldosas cuadradas necesaria para embaldosar un patio rectangular.
Obviamente, se trata de un problema de superficies. La relacin entre la superficie del patio y la de una baldosa nos dar la cantidad de las
mismas. Se trata de un problema que podemos dividir en otros tres:
1.
2.
3.
4.
5.

SupPatio.
Calcular la superficie del patio.
l (largo), a (ancho): nos reales.
Sp (superficie patio): no real.
Sp = l . a

1.
2.
3.
4.
5.

SupBald.
Calcular la superficie de una
baldosa.
lb (lado de la baldosa): no real.
Sb (superficie baldosa): no real.
Sb = lb2

1.
2.
3.
4.
5.

CantBald.
Calcular cantidad de baldosas.
Sp(superficie patio), Sb(superficie
baldosa): no real.
Cb(cantidad de baldosas): no real
Cb = Sp / Sb

Ejemplo: El problema del patio con cantero.


Este problema es igual al anterior, solo que en el patio existe un cantero circular el cual, obviamente, no se embaldosa. Entonces, el clculo
de la superficie del patio no es tan inmediata.
1. SupRect
2. Calcular la superficie de un
rectngulo.
3. l (largo), a (ancho): nos reales.
4. Sr (superficie rectngulo): no real.
5. Sr = l . a

1.
2.
3.
4.
5.

SupCirc
Calcular la superficie de un crculo.
d (dimetro): no real.
Sc (superficie del crculo): no real.
Sc = . d2 / 4

1. SupPatio.
2. Calcular la superficie del patio.
3. Sr(superficie rectngulo), Sc(superficie
crculo): no real.
4. Sp(superficie patio): no real
5. Sp = Sr - Sc

Los problemas SupBald y CantBald continan 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 especificacin SupCirc por SupTrian,
3

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

y si las baldosas tienen una forma distinta del cuadrado, se cambiar solo SupBald.

Ejercicios Propuestos
1.
2.
3.
4.
5.
6.

Un tren laminador produce barra redonda a partir de palanquilla. Se necesita saber cuntas barras pueden obtenerse de
una palanquilla.
Conociendo el rendimiento de una pintura (r[m2/l]), se debe calcular la cantidad necesaria para pintar las paredes de
una habitacin.
Para construir una viga de hormign, se debe calcular el volumen de piedra partida a utilizar.
En un camin, se cargan N cajas de mercadera con un valor V $ cada una. Se debe determinar el valor total de la
carga.
Se necesita calcular cuntos tambores de aceite, con un peso Pa, pueden cargarse en un camin que soporta un peso
Pmax.
Se necesita calcular cuntos cajas, con un volumen Vc, pueden cargarse en un camin cuya caja tiene un volumen V.

Algoritmos Lineales
Un algoritmo es la descripcin unvoca y finita de la secuencia de acciones a ejecutar para resolver un problema.
Esta definicin merece ser analizada detenidamente.
'es la descripcin...de la secuencia de acciones': vale decir que el algoritmo no hace, sino que describe (relata, cuenta) lo que
se debe hacer.
'unvoca': esto significa que luego de ejecutada una determinada accin, la siguiente est indicada sin ambigedades. Si
despus de ejecutada una accin existen dos o ms que podran 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 algn momento, cuando el problema est resuelto. Una
secuencia de acciones que podra 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 especificacin del mismo.
Los algoritmos pueden expresarse de distintas maneras segn quin vaya a ejecutar las acciones: una gua de costura, una
receta de cocina, una hoja de ruta, son algoritmos desarrollados utilizando lenguajes escritos y/o grficos orientados a las
personas que los ejecutarn.
Un algoritmo que ser ejecutado en una computadora deber ser escrito en un lenguaje de programacin, pero en la etapa de
desarrollo se dispone de dos alternativas: el pseudocdigo y los PSD (program structure diagram) tambin llamados
estructogramas o diagramas de Nassi-Schneiderman (Isaac Nassi y Ben Schneiderman fueron sus creadores).
Bsicamente, un algoritmo responde al siguiente esquema:
INGRESO DE DATOS
CLCULO DE RESULTADOS
SALIDA DE RESULTADOS

El pseudocdigo (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 programacin estructurados:
Palabra

Significado

Pascal

Comienzo

Delimitador que indica que se inicia una Begin


secuencia de acciones.

Fin

Delimitador que indica que finaliza una End


secuencia de acciones.

Leer (<ident>)

Accin de obtener el valor de una variable Read


(magnitud simbolizada con un identificador)
Readln

scanf

Escribir (<ident>)

Accin de enviar a la salida el valor de una Write


variable.

printf

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Existen tambin algunos smbolos especiales:


Smbolo
;
<ident> <expr>

Uso
Indica la finalizacin de una accin.

Pascal

Separa una accin de la siguiente.

Asigna a la variable de la izquierda el <ident> := <expr>


valor de la expresin que aparece a la
derecha.

Indica la finalizacin de una accin.


<ident> = <expr>

En Pascal se coloca despus del ltimo end para indicar el fin del cdigo.

DATOS, CONSTANTES, VARIABLES Y OPERADORES


Una variable es una zona de la memoria que almacena un dato y cuyo valor puede variar en la ejecucin del programa. Adems
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 ejecucin de un programa.
Nombre de variables(identificadores): En general se exigir que la variable tenga un nombre que comience con una letra;
despus de este primer carcter, los siguientes, pueden seleccionarse de un conjunto de caracteres que contengan letras, dgitos
y algunos caracteres especiales. Los espacios no se permitirn dentro de un nombre de variable.
Ej.:
a20
ancho
superficie_rectangulo
Los nombres deben decir algo sobre el propsito para el cual se emplean las variables, para su fcil lectura, entendimiento y
modificaciones.
Es muy importante tener en cuenta que en muchos lenguajes (C, por ejemplo) los identificadores se consideran distintos segn
estn escritos en maysculas o minsculas. Por ello se acostumbra utilizar siempre letras minsculas.
Datos y Tipo de Datos
Dato es la expresin general que describe los objetos con los cuales opera la computadora.
Tipo numrico: es el conjunto de los valores numricos.
Tipo numrico entero: comprendidos entre 32768 hasta 32767.
Tipo numrico real: con decimal. Ej.: 0.09, 3.7652, -8.910, 3738.72, 2.0
Tipo lgico: tambin llamado tipo Booleano, es el conjunto de los dos valores lgicos verdadero y falso
Tipo carcter: 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 vaca de caracteres encerrados entre
comillas. Ej.: Lista $ 123.52 Juan Prez
Ejemplo: El problema SupTrian consiste en el clculo de la superficie de un tringulo.
Especificacin
1. SupTrian.
2. Calcular la superficie de un tringulo.
3. b(base), h(altura): nos reales.
4. s(superficie): no real.
5. s = b h / 2

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

El PSD (program structure diagram), es un modo grfico de representar un algoritmo. En l, cada accin simple se representa
como un rectngulo; una secuencia de acciones ser a su vez un rectngulo formado por otros menores (las acciones
compuestas que veremos ms adelante tienen otras representaciones).
5

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

leer(b)
leer(h)
sbh/2
escribir(s)
Aparentemente, el PSD no agrega nada al pseudocdigo, 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 programacin (ver Apndice B).
Programa en Pascal
Program SupTrian;
var
b, h, s: real;
begin
readln(b);
readln(h);
s := b * h / 2;
write(s);
end.

Programa en C
#include <stdio.h>
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 especificacin (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 nmeros reales.
Tambin puede verse que el bloque ejecutable en Pascal es prcticamente la traduccin al ingls del pseudocdigo.
NOTA: El cdigo en lenguaje Pascal se muestra a modo de ejemplo y no forma parte del presente curso.

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Queda claro que para poder escribir el algoritmo, debemos primero realizar la especificacin del problema y para codificarlo
en un lenguaje de programacin, debemos tener a la vista la especificacin y el algoritmo (en pseudocdigo 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 ms recomendable, ya que permitir
escribir programas modulares con porciones (procedimientos/funciones) que podrn ser reutilizadas en otros programas.
Ejemplo: El problema CantBald permite calcular la cantidad de baldosas necesaria para cubrir un patio rectangular. Para su
resolucin 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 rectngulo.
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;
5s=ll

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 accin 'escribir' y del segundo la accin 'leer' correspondientes a esa
magnitud.
Cuando se recurre a esta tcnica ser necesario realizar el perfeccionamiento del algoritmo antes de codificarlo.
Algoritmo nico
Comienzo
leer(b);
leer(h);
Sp b * h;
leer(l);
Sb l * l;
Cb Sp / Sb;
escribir(Cb);
Fin.

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

Comentario
El
perfeccionamiento
consiste
simplemente en agrupar las acciones, de
modo que la estructura del algoritmo sea:
Ingreso de Datos
Procesamiento
Salida de Resultados

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Ejercicios propuestos
1.
2.
3.
4.

Calcular la suma de dos nmeros enteros positivos.


Calcular el promedio de 3 nmeros.
Calcular el cubo de un nmero.
Resolver las siguientes frmulas:
A+B
A + BxC
A +C
R=
+D
R=
R=
C
D
D
5. Dadas la cantidad de billetes de cada denominacin (Ej. 20 de 5, 15 de 10, etc.), informar el monto total recaudado.
6. Dado un valor en pulgadas pasarlo a milmetros.
7. Calcular la superficie de un tringulo y de un cuadrado.
8. Calcular el volumen de un cilindro, teniendo como dato el radio y la altura.
9. Calcular el permetro y la superficie de un rectngulo.
10. Calcular la superficie de un crculo.
11. Determinar la hipotenusa de un tringulo, sabiendo las longitudes de los catetos.
12. Convertir una temperatura dada en celsius a grados fahrenheit. ( F =

9
C +32 )
5

13. Calcular el rea de un tringulo en funcin de las longitudes de sus lados: Area = p ( p a )( p b)( p c )
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 crdito, segn la siguiente tabla:
En 2 cuotas : 5% de recargo
En 3 cuotas : 7% de recargo
En 4 cuotas : 10% de recargo
Informar cuota a pagar por mes en cada uno de los casos.
16. Disear 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 tensin (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 sealar que se deber disear una pantalla de ingreso de datos como as tambin de muestreo
de la informacin Ley de Ohm E [Volt] =
R [Ohm] *
I [Amperes] Tensin = resistencia * intensidad de
corriente.

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Algoritmos Condicionales
Se sugiere consultar el Apndice A: Lgica Proposicional.

Es habitual que, llegado a un punto de la resolucin de un problema, existan diferentes acciones que pueden llegar a ejecutarse.
Pero la eleccin de las acciones a ejecutar no se realiza al azar, sino que existe una condicin segn la cual ejecutaremos unas
u otras acciones..
Esa condicin se expresa como una proposicin, cuyo valor de verdad determina el camino a seguir.
Es aqu donde el PSD cobra especial importancia como herramienta de diseo de algoritmos.
(proposicin)

(proposicin)

<accin>

<accin>

<accin>

<accin>

<accin>

<accin>

<accin>

<accin>

<accin>

El PSD de la izquierda representa una estructura condicional binaria. Las acciones que aparecen a la izquierda se ejecutarn si
el valor de verdad de la proposicin 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 ejecutarn acciones si el valor de verdad de
la proposicin es verdadero.
Puede suceder que para uno o ambos valores de verdad de la proposicin se deba ejecutar una sola accin:

Leer(x)
(x > 0)
s 'Positivo'
Escribir(s)

s 'No positivo'

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

#include <stdio.h>
#include <string.h>
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 pseudocdigo, las acciones de segundo nivel se escriben dejando una sangra mayor, como una forma de mostrar la
estructura.
Una visin liviana del algoritmo, podra sugerir la eliminacin de las acciones de asignacin y reemplazarlas por Escribir('Positivo') y
Escribir('No positivo'), con lo cual se eliminara la ltima accin y la necesidad de utilizar la variabla s.
Pero eso alterara la forma que debe tener un algoritmo para ser fcilmente entendible, con vistas a su posible modificacin o correccin.
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 ms de una accin, estaremos frente a una secuencia de acciones. Esto debemos tenerlo presente en el
pseudocdigo (y ms adelante, en el cdigo), ya que toda secuencia de acciones debe estar encerrada entre delimitadores.

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Algoritmos de Seleccin Mltiple


(condicionales mltiples, ramificados)
Los algoritmos de seleccin mltiple se utilizan en aquellos casos en que se presentan ms de dos posibilidades, lo cual no
puede formularse mediante una proposicin.
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 accin se ejecutan las siguientes.
Los primeros se denominan algoritmos de seleccin mltiple excluyente.
VarC
valor1

valor2

valor n

<accin>

<accin>

<accin>

<accin>

<accin>

<accin>

<accin>

<accin>

Ejemplo:
Leer a
a
1
suno

2
sdos

3
stres

Escribir s

Comienzo
leer(a);
casos de a
1: suno ;
2: sdos ;
3: stres ;
fin;
Fin.

#include <stdio.h>
#include <string.h>
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 ejecucin de las restantes acciones (o instrucciones).


Si, por ejemplo, el valor ingresado es 2, a la salida se obtendr 'dos'.
En los algoritmos de seleccin mltiple incluyente, el valor de la variable de control indica a partir de cual instruccin se
realiza la ejecucin.
Ejemplo:
Leer a
a
1
suno
Escribir s

2
sdos

3
stres

Comienzo
leer(a);
casos de a
1: suno ;
2: sdos ;
3: stres ;
fin;
Fin.

#include <stdio.h>
#include <string.h>
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);
}

Ntese 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 seleccin son muy utilizados a la hora de elaborar menues en los programas.
NOTA: En los distintos lenguajes de programacin la implementacin de la estructura de seleccin mltiple es diferente,
motivo por el cual es necesario conocer el lenguaje de programacin en que se codificar para disear el algoritmo de acuerdo
a las posibilidades del mismo.

10

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Ejercicios propuestos
1. Informar si un nmero es positivo o negativo.
2. Resolver: R1, R 2 =

b b 2 4ac
2a

3.
4.
5.
6.

Dados dos nmeros informar el mayor.


Dados tres nmeros informar el mayor.
Leer 5 nmeros, informar cual de ellos es el mayor y en que orden fue ingresado.
Leer cuatro nmeros, analizarlos de a dos, e imprimir si existen, las duplas en que un nmero sea mltiplo exacto del
otro.Se ingresa el tipo de IVA (I:Inscripto,NI:No inscripto, E:Excento, CF:Consumidor Final), verificar que sea vlido
e informar la descripcin que corresponda.
7. Dado un nmero, si es mltiplo de 3, calcular el cuadrado; si es mltiplo de 4, el cubo; si es de 7, el doble. Informar
los resultados que correspondan.
8. Se leen una serie de 8 valores analgicos (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 inters de 5% si es en 2 cuotas y 10% si son
3 cuotas.
10. Ingresado un valor en pulgadas pasarlo a milmetros o viceversa. Informar resultado.
11. De una tirada de 5 dados, informar si se hizo generala servida.
12. Ingresada la cantidad de das transcurridos desde el 1 de Enero, informar la fecha actual. No considerar ao bisiesto.
Si das es mayor a 365 informar error.
13. Ingresado un horario en segundos transcurridos desde las 0hs., informar la hora actual.
14. Se ingresan el da, el mes y el ao de cumpleaos, verificar que sea vlido.
15. Ingresado un horario en hora, minutos y segundos, verificar que sea vlido
16. Se desea saber la recaudacin de una caja ingresando la denominacin del billete. Informar el monto total recaudado.
17. Leer seis nmeros de a uno controlando que estn estrictamente creciente. Al terminar imprimir un 0 o un 1, segn 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 segn un cdigo de vehculo ( MOTOS,AUTOS,
CAMIONETA,CAMION), si su cilindrada es valida.
20. Calcular la edad de una persona, ingresando da, mes y ao de nacimiento (solicitar el ingreso de da, mes y ao
actual)
21. Para que un vehculo sea enviado para la venta, debe ofrecer un rendimiento promedio del 75% mnimo. 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 mximo 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 categoras, segn la siguiente tabla:
a) Infantil de 0 a 5 aos
b) Menores de 6 a 12 aos
c) Adolescentes de 13 a 17 aos
d) Juveniles de 18 a 22 aos
e) Mayores de 23 aos en adelante
Se ingresa la edad, informar que categora debe asignrsele
23. Segn la tarjeta de crdito que se utilice en la compra, el inters vara 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, segn la tarjeta e informarlo.

11

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Algoritmos Iterativos
(repeticiones, lazos, bucles)
Se sugiere consultar el Apndice A: Lgica Proposicional.

Los algoritmos iterativos permiten realizar las mismas acciones un cierto nmero de veces, dependiendo la repeticin de
acciones de una condicin o proposicin.
Se dividen en precondicionales y postcondicionales.
En los algoritmos iterativos precondicionales, se evala el valor de verdad de una proposicin antes de ejecutar las acciones, lo
cual lleva a que las mismas se puedan ejecutar cero o ms veces.
La ms versatil es la estructura 'mientras'.
Estructura 'mientras'
En esta estructura, el valor de verdad de una proposicin determina si se ejecutan las acciones indicadas a continuacin. En
caso de ser verdadera, se ejecutan las acciones y se vuelve a evaluar la proposicin. Mientras sea verdadera se seguirn
ejecutando las acciones.
Si la primera vez que se evala la proposicin tiene valor falso, las acciones no se ejecutan nunca.
(proposicin)
<accin>
<accin>
<accin>

Ejemplo: Contador de 1 a 10
Comienzo
a 1;
mientras (a<11) comienzo
escribir(a);
a a+1;
fin;
Fin.

a1
(a<11)
escribir a
a a+1

#include <stdio.h>
main(){
int a;
a = 1;
while(a<11){
printf(%d/n,a);
a = a+1;
}
}

NOTA: La primera accin, en donde se le da un valor inicial a la variable 'a', se denomina inicializacin y resulta
imprescindible para que la proposicon pueda ser evaluada por primera vez.
Estructura 'para...'
La estructura 'para' funciona igual que la estructura 'mientras' cuando se trata de implementar un contador, pero resulta ms
compacta (y confusa) al momento de implementar el cdigo.
Si la primera vez que se evala la proposicin tiene valor falso, las acciones no se ejecutan nunca.
var = val_inicial a val_final
<accin>
<accin>
<accin>

12

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Ejemplo: Contador de 1 a 10
Comienzo
para i 1; a 10
escribir(i);
Fin.

i 1 .. 10
escribir i

#include <stdio.h>
main(){
int i;
for(i=1; i<10; i++){
printf(%d/n,i);
}
}

Compare el cdigo con el correspondiente a la estructura 'mientras' y ver que aparece la inicializacin, la proposicin y el
incremento de la variable de control (escrito de una forma ms abreviada).
Estructura 'hacer...mientras'
En esta estructura, a diferencia de 'mientras', se evala una proposicin despus de ejecutadas las acciones.
Si resulta verdadera, se vuelven a ejecutar las acciones y se vuelve a evaluar la proposicin.
Esto da por resultado que las acciones se ejecuten al menos una vez aunque la proposicin resulte falsa.
<accin>
<accin>
<accin>
(proposicin)

Ejemplo: Contador de 1 a 10

a1
escribir a
a a+1
(a<10)

Comienzo
a 1;
hacer
escribir(a);
a a+1;
mientras (a<1o);
Fin.

#include <stdio.h>
main(){
int a;
a = 1;
do{
printf(%d/n,a);
a = a+1;
}while(a<10);
}

Ejercicios Propuestos
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

Se desea calcular independientemente la suma de los nmeros pares e impares comprendidos entre 1 y 200.
Se desea saber la recaudacin de una caja ingresando de cada billete su denominacin y de cada moneda su valor.
Informar el monto total recaudado.
Realizar un programa que me permita multiplicar una serie de nmeros.
Informar todos los divisores de un nmero.
Calcular el producto de dos numero por sumas sucesivas.
Imprimir 2000 nmeros pares.
Imprimir los primeros 2000 nmero impares.
Calcular la sumatoria de los nmeros impares hasta N.
Calcular la sumatoria de N nmeros pares.
Ingresar N nmeros, verificar que los mismos sean positivos y calcular su raz cuadrada.
Calcular el cuadrado de los N primeros nmeros.
Calcular el producto de N nmeros por un factor dado.
Calcular el producto de los nmeros menores a N por un factor dado.
Ingresado un numero de una cifra, mostrar el mismo repetido en toda la pantalla.
Leer N nmeros, informar cual de ellos es el mayor y en que orden fue ingresado.
Mostrar N nmeros desde N hasta 0.
Mostrar el resultado de la divisin entre el N y 1, N-1 y 2, N-2 y 3 y as sucesivamente.
Dada una lista de un curso, ingresando nombre, apellido y fecha de nacimiento de cada uno, realizar un listado con los
13

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

alumnos que hayan cumplido los 18 aos.


19. Leer una serie de nmeros informar el porcentaje de ellos que sean mayores a un valor dado.
20. Ingresado un nombre, mostrarlo repetido en la pantalla desde la ubicacin 0 hasta la 80, sin que se escriba en la lnea
de abajo. Si no alcanzara puede quedar incompleto el rengln.
21. Leer nmeros 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 nmeros 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 nmeros primos y calcular su sumatoria.
27. Calcular el factorial de un numero dado.
28. Leer N nmeros controlando que estn en forma creciente. Permitir el reingreso si no cumple la condicin.
29. Se desea calcular el incremento en el alquiler si se sabe que se cobra el 1% diario de inters sobre el monto
acumulativo. Se ingresa monto base y cantidad de das.
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 segn 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 ms.
34. En un curso se organiz una venta de rifas, cada rifa indica el nmero de alumno vendedor y si est pagada total o
parcialmente. Informar cuantas rifas vendi cada uno de los N alumnos y de ellas cuantas estn pagadas total o
parcialmente. Informar el total de rifas vendidas.
35. Se realiza una votacin 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 Palndromo, o sea si se lee igual de atrs para adelante que de adelante para
atrs.
37. Leer un nmero, indicar si es capica.
38. Se ingresa una palabra, mostrar cada una de sus letras, expresada en su valor decimal y binario.
39. Disear un programa que permita ingresar por teclado dos variables que son "J" y "T", que responda a la frmula
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 tambin la fecha de procesamiento, consistenciando la misma para que la fecha dia,mes,ao este dentro de los
valores posibles ( febrero se deber tomar de 28 das y el ao no debe ser mayor al corriente. Disear una pantalla de
ingreso de datos ( MUESTRA1 ) que adems mostrar los resultados, tambin otra en el ngulo inferior derecho
( MUESTRA2 ) que permita ver una vista previa de la impresin 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 informacin numrica para T,J,X,XP y CP. Toda la
informacin ingresada y calculada deben estar impresa en papel, como as tambin los ttulos 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 cul se
debe informar con un texto esta forma de finalizacin.

14

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Apndice A
Lgica Proposicional
La lgica 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 mamfero, fcilmente se puede determinar si estas expresiones
son verdaderas o falsas; sin embargo, al escuchar No seas tonto! o Quin 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 lgica
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, alcnzame aquello.
No existe una notacin generalmente utilizada para representar proposiciones, pero en este curso identificaremos a cada una de
ellas con una letra minscula.
p: Algunos perros tienen ojos azules.
q: Dos ms dos es cinco.
El valor de verdad de una proposicin 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 ms adelante.
Nuestro trabajo consiste en formular proposiciones (construir frmulas) a partir de expresiones en lenguaje natural.
Para ello, empleamos el lenguaje simblico, llamado as porque utiliza una serie de smbolos en la formulacin de las
proposiciones.
Las proposiciones pueden ser simples o compuestas.
Las proposiciones simples estn formadas por dos trminos vinculados por un operador relacional.
Cada trmino debe ser un valor, una magnitud numrica o una expresin aritmtica que incluya valores y/o magnitudes
numricas.
El operador relacional indica la relacin entre el trmino 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

<=

==
<>

!=

Tabla 1: Operadores Relacionales


Ejemplos de proposiciones simples:

15

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

p: Tres es mayor que cinco

(3 > 5)

q: La suma de a y b no supera 7

(a+b 7)
o

r: La temperatura no alcanza los 20 C

(t < 20)

Las proposiciones compuestas estn formadas por una o ms proposiciones simples modificadas o vinculadas por conectivos
u operadores lgicos.
Operador

Denominacin

Significado

Conjuncin

Ambas son verdaderas

Disjuncin Incluyente

Al menos una es verdadera

Disjuncin Excluyente

Solo una es verdadera

Negacin

No es verdadera

Tabla 2: Operadores Lgicos


La formulacin de proposiciones compuestas en general se complica por las ambigedades del lenguaje natural y la utilizacin
de trminos distintos para expresar la misma cosa.
En general, se requieren varios pasos de descomposicin del lenguaje natural para poder llegar a formular con seguridad la
proposicin en lenguaje simblico.
Ejemplos:
La temperatura est entre 15oC y 20oC.
La temperatura es al menos de 15oC y la temperatura como mximo 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)

p q
q: (l < 5)
Ntese 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)

p q
q: (a = 3)
Aqu tenemos una disjuncin 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)

16

p q

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

En este caso se trata de una disjuncin 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 formulacin de esta proposicin es ms complicada pues la segunda proposicin 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 nmero par.
Existen los elefantes?
Sara y Mara 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 smbolos de Lgica 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 sensacin de libertad o independencia.
Aunque lo he intentado, no he llegado a tiempo.
El volcn Chaitn est en Argentina y tuvo consecuencia en el mbito social o ambiental.
O hablas por celular o conduces, pero no puedes manejar distrado.
Si consumes alcohol entonces no debes conducir.

17

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Tablas de Verdad
Cuando se formula una proposicin 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 verificacin.
Conjuncin
Disjuncin Incluyente
p

p q

p q

Disjuncin Excluyente

Negacin

p q

~p

Una vez formada una proposicin, la tabla de verdad se confecciona teniendo en cuenta el orden de prioridad de los operadores
lgicos.
Ejemplos:
La temperatura es mayor a 20oC pero no supera los 25oC.
(t > 20) ~(t < 25)
p ~q
p
q
~q

p~q

Comprobamos que la proposicin compuesta es verdadera cuando la primera proposicin simple es verdadera y la segunda es
falsa.

18

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

La temperatura est entre 20oC y 25oC, o bien es menor a 15oC


Aqu nos encontramos con tres proposiciones:
p: (t 20)
q: (t 25)
r: (t < 15)
Tenemos dos posibilidades: que la temperatura est dentro del rango (conjuncin de p y q) o que sea menor de un valor (r),
pero ambas cosas no pueden suceder a la vez (disjuncin 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

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).

Tautologa y Contradiccin
Si la proposicin compuesta es verdadera para todas las combinaciones posibles de valores de verdad de las proposiciones
simples, se dice que estamos ante una tautologa.
Si la proposicin compuesta es falsa para todas las combinaciones posibles de valores de verdad de las proposiciones simples,
se dice que estamos ante una contradiccin.
En ambos casos, la proposicin compuesta estar mal formulada, y habr que revisar si corresponde al enunciado en lenguaje
natural.

19

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Apndice B
Norma ISO/IEC 8631
Information technology - Program constructs and conventions for their representation
(Extracto traducido)
1 mbito
Esta Norma Internacional se refiere a la expresin 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 definicin de una variedad de subconjuntos de las construcciones definidas.
2 Definicin de construcciones de programas
Una construccin de programa consiste en un conjunto de uno o ms partes de procedimiento y una parte de control la cual
puede estar implcita.
Cada parte de procedimiento consiste en una o ms 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 condicin, el control es llamado implcito.
3 Cmo pueden combinarse las construcciones
El nico modo en que las constructoresciones pueden ser combinadas para construir un programa bien estructurado es
reemplazando una parte de procedimiento de una construccin por una construccin completa.
4 Especificacin de construcciones
4.1 Construccin imperativa
Esta construccin contiene una parte de procedimiento y una parte de control implcita la cual determina que la parte de
procedimiento es ejecutada exactamente una vez.
4.2 Construccin serial
Esta construccin contiene dos o ms partes de procedimiento y una parte de control implcita que determina que las partes de
procedimiento son ejecutadas exactamente una vez en la secuencia dada.
4.3 Construccin paralelo
Esta construccin consiste en dos o ms partes de procedimiento y una parte de control que inicia esas partes de procedimiento.
La ejecucin de la construccin finaliza cuando todos las partes de prodecimiento iniciadas son completamente ejecutadas.
4.4 Construccin iterativa
4.4.1 Iteracin precondicional
Esta construccin consiste en una parte de procedimiento y una parte de control con una condicin, el valor de la cual
determina si la parte de procedimiento es ejecutada cero o ms veces.
4.4.2 Iteracin postcondicional
Esta construccin consiste en una parte de procedimiento y una parte de control con una condicin, el valor de la cual
determina si la parte de procedimiento es ejecutada ms de una vez.
4.4.3 Iteracin continua
Esta construccin consiste en una parte de procedimiento y una parte de control con una condicin implcita la cual especifica
que la parte de procedimiento es repetida indefinidamente.
4.5 Construccin de eleccin selectiva
4.5.1 Seleccin mondica
Esta construccin consiste en una parte de procedimiento simple y una parte de control con una condicin, el valor de la cual
determina si la parte de procedimiento es ejecutada o no.
4.5.2 Seleccin didica
Esta construccin consiste en dos partes de procedimiento y una parte de control con una condicin, el valor de la cual
determina cual de las dos partes de procedimiento es ejecutada.
4.5.3 Seleccin mltiple exclusiva
Esta construccin consiste en un nmero 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 Seleccin mltiple inclusiva
Esta construccin consiste en un nmero de partes de procedimiento con una parte de control con un conjunto de condiciones,
el valor de las cuales selecciona cero o ms partes de procedimiento a ser ejecutadas en una secuencia indefinida.
5 Terminacin
En adicin a la terminacin de un constructor definida por su parte de control, la ejecucin de un constructor puede ser
terminada mediante una operacin de terminacin ubicada en uno o ms partes de procedimiento de la construccin. La
operacin de terminacin identificar cul construccin debe terminar. Si la operacin de terminacin es ejecutada, la
ejecucin de la construccin identificada y todas sus construcciones internas deben cesar inmediatamente.
La operacin de terminacin que finaliza una construccin paralela o una construccin selectiva mltiple inclusiva no est
20

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

definida.
Una operacin de terminacin que finaliza una construccin externa no cumple con esta Norma Internacional.
Definicin de subconjuntos
El uso de un subconjunto de construcciones definidas en esta Norma Internacional y combinadas de acuerdo a esta Norma
Internacional se considerarn en conformidad con esta Norma Internacional.
El uso de construcciones distintas a las definidas en esta Norma Internacional que sean funcionalmente equivalentes a una
composicin de construcciones definidas en esta Norma Internacional est en conformidad con esta Norma Internacional.
CONSTRUCCIN

Imperativa

Paralela

PSD

CONSTRUCCIN

(Program structure diagram)


Parte de
Procedimiento

Parte de
Proced
1

Parte de
Proced
2

Serie

Parte de
Proced
n

Parte de
procedimiento

Iteracin postcondicional

PSD
(Program structure diagram)
Parte de
Procedimiento 1
Parte de
Procedimiento 2

Control

Iteracin precondicional

Parte de
procedimiento

Control

Iteracin continua

Parte de
procedimiento

Control

Seleccin mondica

Seleccin mltiple exclusiva

Operacin de terminacin

Condicin
valor
Parte de
procedimiento

Seleccin didica

Condiciones
val 1 val 2

val n

Parte Parte
proc proc
1
2

Parte
proc
n

...

...

Seleccin mltiple inclusiva

Condicin
valor 1
valor 2
Parte de
Parte de
proced 1
proced 2
Condiciones
val 1 val 2

val n

Parte Parte
proc proc
1
2

Parte
proc
n

...

...

Identificador
de
construccin

21

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Apndice C
Programacin en C
De http://es.wikibooks.org/wiki/Programacin_en_C

Herramientas
ParaprogramartantoenC,comoenC++,Javaocualquierotrolenguajedeprogramacin,necesitamoscontar
conaplicacionesoherramientasquenospermitanponerenfuncionamientonuestroprograma.
EllenguajedeprogramacinCescompilado,asqueenestecasonecesitaremosuncompilador,queserel
encargadodetransformarnuestrocdigofuenteencdigoquelacomputadorapuedaejecutar.
Adems, 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.
Lasherramientasainstalardependerndelsistemaoperativoutilizado.Acontinuacinselistanalgunas
posibilidades para el sistema operativo Windows o GNU/Linux, no es imprescindible utilizar estas
herramientasenparticular,cualquiercompiladorpuedeservir.

Windows
UnodelosentornosdedesarrollomsconocidosentrelosprogramadoresdeCsobreWindows,tantonovatos
comoexpertos,eselBloodshedDevC++,queesunentornolibremultiplataforma.SibiensunombreesDev
C++,esposibleutilizarlotantoparaCcomoparaC++.
TambinhayotrasalternativasprivativascomoloscompiladoresdeBorlandodeMicrosoft(MicrosoftVisual
C++).
ParaconseguirelDevC++puedeutilizarselaPginadedescargasdeBloodshedDevC++

GNU/Linux
EnlossistemasGNU/Linux,sernecesariotenerinstaladaslasherramientasgccymakeylaversin6dela
glibcconsudocumentacin,quesonlasquepermitirncompilarlosprogramas.
Paraescribirymodificarelcdigo,esposibleutilizarcualquiereditor(enloposiblequecuenteconresaltado
desintaxis),comosonemacs,vim,kate,geditogeany.
Sinembargo,paraquienessonnovatosenlaprogramacin,esrecomendableutilizarunentornodedesarrollo
comosonelAnjutaDevStudio(paraelentornoGNOME)oKDevelop(paraelentornoKDE),yaqueincluyen
facilidadesadicionalesparalaejecucinysolucindeproblemas.
Losprogramasmencionadosseincluyendentrodelainstalacinestndardelamayoradelasdistribuciones
actualesdeGNU/Linux,demodoqueparainstalarlosslosernecesarioseguirelprocedimientousualde
instalacindeaplicacionesparaladistribucindeseada.

Historia de C
EllenguajedeprogramacinCfuecreadoporDennisRitchieentre1969y1973cuandotrabajabaenBell
LaboratoriesdeAT&TjuntoconKenThompsoneneldiseodelsistemaoperativoUNIX.Cfuecreadopara
poderescribirdichosistemaoperativoenunlenguajedealtonivel,independientedelhardwaredondese
ejecutara.
Contarconunlenguajedealtonivelpermitielavancedelossistemasoperativos,yaqueelmismocdigo
poda ser utilizado en las distintas plataformas, propiciando la reutilizacin de cdigo y reduciendo los
tiempos de desarrollo. As es que los sistemas operativos basados en UNIX, el sistema BSD, el sistema
GNU/LinuxymuchosotrosfuerondesarrolladosenC.

22

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Adems,conelpasodeltiemposehandesarrolladocientosdebibliotecasquepermitenalosprogramadores
de C utilizar el cdigo desarrollado por otros para la realizacin de tareas comunes. Esto, a su vez, ha
propiciadoeldesarrollodeaplicacionesenlenguajeC.
ActualmenteesimposiblecontarlacantidaddeaplicacionesyherramientasdesarrolladasenC.

Evolucin
Amediadosdelosaos60s,MartinRichardsdiseellenguajeBCPLconlafinalidaddeusarloparaescribir
softwaredesistemasoperativosycompiladores.
En1969,KenThompsonescribielLenguajeB,enBellLaboratories,conelobjetivoderecodificarUNIX
(escrito hasta ese momento en lenguaje ensamblador) usando un lenguaje de alto nivel ms portable y
flexible.
Durante los siguientes aos, Dennis Ritchie modific el lenguaje B, llegando a crear el lenguaje C y
reescribiendoelsistemaUNIXendicholenguaje;aadicaractersticasnuevas,comosoneldiseodetiposy
lasestructurasdedatos.
En 1978, Dennis Ritchie y Brian Kernighan publicaron la primera edicin del libro El lenguaje de
programacinC.Estelibrofueduranteaoslaespecificacininformaldellenguaje.Ellenguajedescritoenla
primeraedicindeestelibro,fueconocidocomo"elCdeKernighanyRitchie"osimplemente"K&RC".En
estelibroseintrodujeronnuevascaractersticasallenguaje:lostipodedatosstruct,longintyunsignedint;
losoperadores=+y=fueronsustituidospor+=y=.
Amediadosdelosaos80,BjarneStroustrup(tambindeloslaboratoriosBell),creaellenguajeC++,un
lenguajebasadoenC,connumerosascaractersticasadicionales,siendolaprincipialqueestorientadoa
objetos.SibiensehancreadomuchoslenguajesbasadosenC,C++eselquehapermanecidomsasociadoa
C.
En los aos siguientes a la publicacin del C de Kernighan y Ritchie, se aadieron al lenguaje muchas
caractersticasnooficiales,queestabanpresentesenalgunoscompiladoresynoenotros.Fueporelloqueen
1989ANSI(AmericanNationalStandardsInstitute)publicelprimerestndaroficialdeC,queesconocido
comoANSIC.
En este estndar se tomaron muchas de las funcionalidades no oficiales y se agregaron funcionalidades
nuevascomolosprototiposdefuncin,yunpreprocesadormejorado.Tambinsecambilasintaxisdela
declaracindeparmetrosdefunciones,paraqueincluyeraneltipojuntoconelnombre.
Alaosiguiente,en1990sepubliclaestandarizacinISOdellenguaje.Esteestndaresbsicamenteel
estndarANSI,conunaspocasmodificacionesdeformato.Aesteestndarseloconoce,entonces,comoC89,o
C90,ysetratadelmismolenguaje.
Basndose en el estndar ANSI que estaba en preparacin, en 1988 Kernighan y Ritchie publicaron la
segundaedicindesulibro,queesanhoyutilizadacomounadelasreferenciasprincipalesdellenguaje.
Durantelossiguientesaos,ellenguajeCpermanecisindemasiadoscambios. Sinembargo,comohaba
sucedido antes, los distintos compiladores fueron incorporando caractersticas adicionales, que otros
compiladoresnotenan,siendoC++laprincipalinfluencia.
FueporelloqueafinalesdelosnoventasedecidirevisarelestndardeC,loquellevalapublicacindel
estndar C99. Este estndar incluye varias nuevas caractersticas como son: las funciones inline; la
posibilidaddedeclararvariablesencualquierpartedelcdigo;loscomentariosdeunasolalneautilizando//;
lostiposdedatoslonglongint,boolycomplex,entreotras.
Anhoyelprocesodeevolucindellenguajesigueavanzando,ydesde2007seesttrabajandoenelarmado
deunnuevoestndar.

23

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Fundamentos de programacin
Definiciones

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
instruccionesparacambiarunneumticosonejemplosdealgoritmosdelavidareal.

Las computadoras, son maquinas sin inteligencia propia, cuya nica finalidad es interpretar el
cdigoqueselesprovee.

Ellenguajedemquinaeselnicolenguajequelacomputadora"entiende"yescapazdeejecutar.

Los lenguajes de programacin son el medio de comunicacin entre el programador y una


computadora.Elprogramadorescribeenalgnlenguajedeprogramacinyutilizalasherramientas
provistasporeselenguajeparatransformarloenlenguajedemquina.

Finalmente, denominamos programa a una secuencia de rdenes a ser ejecutadas por una
computadora.Unprogramadebeestarescritoenalgnlenguajedeprogramacin,ypuedeincluiruno
omsalgoritmos.

Tipos de lenguajes
Existeunagrancantidaddelenguajesdeprogramacin,queestnpensadosparadistintasfinalidades,siguen
distintosparadigmas,ydeunauotraformasediferenciandelosdems.

Esquemas de programacin
El esquema de programacin llamado Programacin Imperativa, consiste en escribir una secuencia de instrucciones una
detrs de la otra, que se ejecutarn en orden. Algunas de esas instrucciones pueden hacer que la mquina pase a una instruccin
que no sea la siguiente, tal vez porque se cumpla una condicin que hayamos establecido.
En los ltimos aos ha tomado fuerza otro paradigma de computacin, llamado Programacin Orientada a Objetos , en el
cual se intentan modelar los sistemas creados como extensiones de la realidad mediante la definicin de "objetos" que modelan
entidades de la vida real y que interactan entre s mediante "mensajes" llamadas mtodos.
El lenguaje C es un lenguaje imperativo, no orientado a objetos.

Alto o bajo nivel


Por otro lado, los lenguajes de programacin se clasifican en niveles. Un lenguaje es de ms bajo nivel cuanto ms cercano
est al cdigo de mquina, y un lenguaje que es de ms alto nivel cuanto ms lejano est de la mquina y ms cercano al
lenguaje humano.
C es un lenguaje de alto nivel aunque tiene muchas caractersticas de lenguaje de bajo nivel (como el uso que permite hacer de
la memoria). Estas caractersticas hacen que C sea un lenguaje muy potente, ya que permite optimizar al mximo los recursos
de la mquina. Por ende, esto tambin 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 ms 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 interpretados
Otra forma de clasificar a los lenguajes de programacin que es segn la forma en que se ejecutan sus rdenes. Existen los
lenguajes que son interpretados, cuyas rdenes pasan a travs de un intrprete que se encarga de ejecutarlas (a partir del
cdigo fuente) en el mismo momento en que estn siendo ledas. 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 mquina que se almacena en un archivo ejecutable. Ese archivo puede ejecutarse
luego, sin recurrir al compilador.

24

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin 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 ms alto nivel.

Estructura de la memoria
Parte de esta potencia de C viene de que permite acceder con mucha libertad a la memoria de la mquina. Para entender un
poco cmo es posible, debemos entender cmo se guardan los datos en la memoria.
Imaginemos que la memoria tiene un montn de casillas, una enorme fila de casillas, cada una de las cuales contiene un dgito
binario (bit):
0101001010100001010101001010000100111010110010010101001011010110001101010110101010110111...
Es exactamente as, pero es ms cmodo 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 nmero entre 0 y 255:
82

161

84

161

58

201

82

214

181

106

183

...

Tambin podemos representar estos nmeros en base hexadecimal:


0x52

0xA1

0x54

0xA1

0x3A

0xC9

0x52

0xD6

0x35

0x6A

0xB7

...

...

O considerarlos caracteres:
R

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

25

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Primer programa en C
En el libro "El Lenguaje de Programacin C", Kernighan y Ritchie introdujeron al lenguaje C utilizando un sencillo programa
que mostraba un saludo por la pantalla. Desde entonces se hizo tradicin empezar con cualquier lenguaje de programacin 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 programacin en C.
Ejemplo: Hola mundo
/* Inclusin de archivos */
#include <stdio.h>
/* Funcin principal */
int main (int argc,char **argv)
{
/* Impresin por pantalla y salida del programa*/
printf("Hola mundo\n");
return 0;
}
Para poder editar y ejecutar este programa ser necesario utilizar algn editor y luego un compilador, como se explic en la
seccin 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.out
Hola 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 continuacin una explicacin detallada sobre el proceso de compilacin del programa, y luego un anlisis lnea por
lnea del contenido de este ejemplo.

Pre-requisitos para la compilacin de programas


Como ya se mencion, ser necesario tener instalado el compilador y un editor o entorno de desarrollo que permitan escribir el
cdigo a compilar. Para ms informacin ver la seccin Herramientas necesarias.
El cdigo a compilar debe guardarse con un nombre que represente al programa en cuestin y la extensin .c. En el caso del
ejemplo del Hola mundo, el archivo puede llamarse hola.c.
En las explicaciones a continuacin, 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 algn
compilador para ese sistema.

Compilacin de programas segn la plataforma


Windows
Para compilar un programa C en entornos Windows, debemos seguir una serie de pasos que varan segn el compilador de C
que queramos utilizar. Antes que nada, sera bueno que se revises la documentacin del compilador elegido para conocer los
comandos exactos.
Compilacin del cdigo fuente
Si se utiliza un entorno de desarrollo, ser posible compilar directamente desde el entorno, mediante un botn o una
combinacin de teclas.
Si se ejecuta el compilador desde la lnea de comandos, la lnea ser distinta segn el compilador utilizado. A continuacin
algunos ejemplos de ciertos comandos segn el compilador:
26

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin 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 cdigo 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 funcin, aunque es
posible pedirles que no lo hagan mediante parmetros adicionales.
Segn el compilador y la configuracin utilizada, se obtendrn 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 cdigo 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 tambin 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 funcin, 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 lnea de comandos, o modificar la
configuracin del entorno de desarrollo para que muestre la salida por pantalla al ejecutar el programa.
La solucin a sto es agregar una funcin adicional a nuestro "hola.c":
/* Inclusin de archivos */
#include <stdio.h>
#include <stdlib.h>
/* Funcin principal */
int main (int argc,char **argv)
{
/* Impresin por pantalla y salida del programa*/
printf("Hola mundo\n");
system ("pause");
return 0;
}
Las dos lneas agregadas permiten que utilicemos la biblioteca stdlib, que incluye la funcin system y que mediante esta
funcin 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.

Linux
Si bien existen otros compiladores, lo ms usual y ms 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 compilacin desde lnea de comandos o desde el entorno grfico.
Para realizarla desde lnea 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 Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

gcc hola.c
Si no existen errores en el cdigo, este comando nos crear un archivo ejecutable, que por omisin se llama "a.out", y que
podemos ejecutar desde la lnea de comandos de la siguiente forma:
./a.out
Hola mundo
Es una buena idea especificar el nombre que el archivo ejecutable tendr, pasando como parmetro al compilador la opcin
-o, de la siguiente forma:
gcc hola.c -o hola
Con lo cual, el nombre del archivo creado ser hola. Este archivo no tiene extensin ya que es la forma usual de llamar a los
archivos ejecutables en los entornos UNIX y GNU/Linux, sin embargo funcionara de la misma forma si se llamara
hola.exe.
Para ejecutarlo, haremos los mismo que en el caso anterior:
./hola
Hola mundo
Existen otros parmetros que podemos especificar al compilador en la lnea de comandos, dependiendo del tipo de programa, y
en funcin de la complejidad del mismo. Por ejemplo, podemos agregar las siguientes opciones:
gcc hola.c -o hola -Wall -pedantic
La opcin -Wall nos mostrar todos los avisos que produzca el compilador, no solamente los errores. Los avisos nos indican
dnde y/o porqu podra surgir algn error en nuestro programa.
La opcin -pedantic nos aporta ms informacin sobre los errores y los avisos mostrados por GCC.

Diseccionando el "Hola Mundo"


A continuacin veremos cul es la estructura bsica de un programa en C, para poder entender qu hace cada una de las lneas
de nuestro sencillo programa.
Es probable que lo primero que salte a la vista sea la lnea:
printf("Hola mundo\n");
Esta es la lnea que hace aparecer la cadena Hola Mundo en nuestra pantalla. Notamos que en C la sentencia para imprimir
algo por pantalla es printf() y, adems, hay que colocar parntesis alrededor de lo que queremos imprimir para utilizarla.
Esto se debe a que en C, printf es una funcin, que imprime su argumento (la cadena Hola Mundo\n) en la pantalla. Se
denomina invocar una funcin a la accin de utilizarla para que realice una accin.
Podemos observar tambin que la cadena a imprimir termina con una extraa combinacin: \n. La combinacin \n no
representa a dos caracteres independientes, sino que representa un nico carcter no imprimible: el salto de lnea. Sin el salto
de lnea, el resultado al ejecutar el programa sera:
$ ./a.out
Hola Mundo$
Es decir que no hay salto de lnea entre la cadena impresa, y la siguiente entrada de la lnea de rdenes, que no es lo que
esperbamos.
Lo ltimo a notar en la lnea es que termina con un punto y coma. En C, todas las sentencias terminan con un punto y coma. Al
principio puede parecer obvio dnde termina una sentencia, pero ya veremos ms 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 instruccin return finaliza el programa, dicindole al sistema
que el valor de retorno (el cdigo 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 Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Estas dos sentencias se encuentran encerradas entre llaves. De esta manera, forman un bloque, es decir, un grupo de sentencias
que se ejecutarn siempre de correlativa.
Y qu es esa lnea que precede (en realidad, que da nombre) al bloque? Pues es la definicin de una funcin, la funcin main.
En C (y en mucha de la programacin estructurada), todo se hace a base de funciones, como la arriba comentada printf. La
funcin 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 funcin main, y cuando sta acaba, el programa tambin.
La lnea:
int main (int argc,char **argv)
indica al compilador que la funcin que viene a continuacin, 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 nmero entero (int), que es el 0 de la instruccin return. En un
captulo posterior podr ver un ejemplo del uso de estos parmetros.
Finalmente, y un tanto aparte (est separada del resto por una lnea en blanco), tenemos la lnea
#include <stdio.h>
Que parece bastante distinta al resto del programa, y que, adems, parece no tener sentido, puesto que ya hemos definido la
funcin main que hace todo el trabajo.
Efectivamente, esa lnea no es parte del programa, aunque sea imprescindible. La lnea es una instruccin del preprocesador de
C, como nos lo indica el smbolo #, 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 compilacin. El fichero stdio.h es el que contiene la definicin de la funcin
printf(), que antes utilizamos pero que no escribimos, ya que forma parte de la biblioteca estndar de C.

Comentarios
Una vez escrito un cdigo, tratar de entenderlo un ao ms 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 cdigo. Por esto, en cualquier
lenguaje de programacin 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 smbolos /* 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 estndar de C a partir de C99: //. Todo lo
que est despus de estos signos, hasta el final de la lnea, se considerar un comentario y el compilador no lo tomar en
cuenta.
En el ejemplo presentado pueden verse tres lneas con comentarios, que documentan someramente las distintas funcionalidades
del cdigo. En los prximos captulos podrn verse mejores usos de los comentarios dentro del cdigo.

Tipos de datos
Historia
En el lenguaje C estandarizado como C89, existan cuatro tipos de datos bsicos que son: los nmeros enteros, los nmeros
reales, los caracteres, y los punteros. A partir del estndar C99 se agregan: los valores lgicos (verdadero o falso) y los
nmeros complejos.
Estos tipos de datos son parte del lenguaje, y por ello se los considera primitivos. Ms 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 captulo veremos los enteros, los reales y los caracteres. Ms adelante se vern otros tipos de datos ms complejos,
como son los vectores, las cadenas de caracteres, y los punteros en general.

Enteros
Los enteros son el tipo de dato ms primitivo en C. Se usan para representar nmeros enteros. Pero siempre se pueden
encontrar otras aplicaciones para los nmeros enteros. En general se pueden usar para representar cualquier variable discreta.
Los tipos de datos enteros son: short, int, long y long long.

29

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Es decir que para el lenguaje C existen diferentes tamaos de nmeros enteros que, segn el compilador y la plataforma de
hardware, pueden tener desde 1 byte hasta 8 bytes (para ms detalles busca en la referencia).
Adems, el lenguaje C hace la distincin 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 segn el tamao 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 nmeros son representados en memoria mediante una cadena de bits. En el caso de los nmeros con signo, el bit
ms significativo es el que se usa para representar el signo. La representacin de los nmeros negativos se realiza mediante el
complemento a dos, que es una tcnica que permite operar con los nmeros negativos de forma lgica.
Slo a modo de ejemplo, la representacin en memoria de un -8 en una variable de 2 bytes, entera, con signo sera la siguiente:
1000000000001000

Flotantes
Se denomina flotantes a los tipos de datos que representan a los nmeros reales, ya que utilizan un sistema de representacin
basado en la tcnica de coma flotante, que permite operar con nmeros reales de diversas magnitudes, mediante un nmero
decimal llamado mantisa y un exponente que indica el orden de magnitud.
El tipo de dato flotante en lenguaje C slo tiene dos tamaos: el float y el double, que son 4 bytes y 8 bytes
respectivamente. Se los puede utilizar tanto para representar nmeros decimales, como para representar nmeros enteros con
un orden de magnitud muy grande.
La forma de declarar una variable flotante es escribiendo en una lnea uno de los tipos de datos flotantes y a continuacin el
nombre de la variable y tal vez algn 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 ms convenientes para algunas aplicaciones, hay casos en los que
se prefieren los enteros. Esto se debe a que los nmeros flotantes no necesariamente tienen soporte de hardware, en particular
en las plataformas integradas. Una alternativa que se utiliza en estas situaciones es interpretar los enteros como decimales de
forma que 150 se interprete como 1.5 y 2345 como 23.45.
Para el caso de los flotantes de 4 bytes, se utiliza 1 bit para el signo, 8 bits para el exponente y 23 bits para el valor del nmero.
El procedimiento para almacenar un nmero en una variable flotante es el siguiente:
1. Se convierte a binario la parte entera.
2. Se coloca el signo en el bit ms significativo de la misma manera que en los enteros (1 para el - y 0 para el +).
3. Se mueve la coma (en la representacin binaria de la parte entera) hasta que est a la derecha del primer uno y ste se
descarta (el uno ms significativo). El valor del exponente ser el nmero de posiciones que se movi la coma. El
exponente usa la representacin de un entero con complemento a dos.
4. Se convierte en binario la parte decimal del nmero. Esto usando el peso de los bits. el bit decimal ms significativo
vale 1/2, el siguiente vale 1/4, el otro 1/8, el otro 1/16 y as hasta completar lo que falta para los 23bits del valor.
5. Se concatena todo y ese es el valor flotante representado en memoria.

Caracteres
Los caracteres se representan utilizando el tipo char, que tiene slo 1 byte de tamao. Este tipo se utiliza para representar los
255 caracteres de la tabla de caracteres del sistema. El tipo char es tambin un tipo entero, ya que puede tomar valores de 0 a
255.
En cuanto a la forma de declarar variables de tipo char es la misma forma que con los otros tipos.
char a;
30

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

char a = 's';
char a = 48;
Como puedes ver, se le puede asignar un nmero a una variable char, ya que se trata de un tipo entero. En algunas situaciones
particulares se utiliza el tipo char para contadores, porque permite que ocupen slo un byte en memoria.
Es importante notar que con la llegada de la codificacin UTF-8, los caracteres de los diversos idiomas pueden ocupar 1, 2, 3 o
4 bytes, de modo que el tipo char ya no alcanza para la representacin de todos los caracteres. Por ello, el estndar C99
introduce el tipo wchar que puede ocupar ms de 1 byte, segn sea necesario para la codificacin utilizada por el sistema.

Interaccin con el usuario


En este captulo veremos un pco ms sobre como interactuar con el usuario de nuestros programas desde la consola,
utilizando printf() como vimos en el primer ejemplo "Hola mundo", as como scanf() para la lectura del teclado.

Imprimir por pantalla


Como hemos visto hasta ahora en los ejemplos, hay una funcin que utilizamos para sacar por pantalla textos arbitrarios o el
resultado de alguna operacin: la funcin printf().
Si miramos (en la documentacin) su definicin, no nos aclarar demasiado:
int printf (const char *TEMPLATE, ...)
...claro que por algo tiene una seccin completa de la documentacin para ella sola.
Veamosla poco a poco. Se trata de una funcin de la biblioteca estndar, lo que quiere decir que para utilizarla tenemos que
incluir previamente su definicin. La encontraremos en <stdio.h>.
Lo primero que vemos en la definicin es que es una funcin de tipo int, lo que quiere decir que devuelve un entero. Ese
entero es el nmero de caracteres impresos en la pantalla, o un nmero negativo en caso de que se produzca algn error.
Lo siguiente a notar es su primer argumento: const char *TEMPLATE. Se trata de una cadena de caracteres (char *) que
no ser modificada por la funcin (const), con lo que puede ser una constante de cadena o una variable que contenga una
cadena, pero siempre debe acabar con el carcter nulo \0.
Y luego vienen esos extraos puntos suspensivos. Esa elipsis nos indica que como argumentos adicionales de printf()
podemos poner una serie ilimitada de otros argumentos, que se supone que la funcin sabr qu hacer con ellos. Y eso es
justamente lo que hace tan fabulosa y til a printf().
El uso ms simple de printf() es imprimir una cadena de texto simple y corriente. Como ya vimos:
printf("Hola Mundo\n"); /*imprime la cadena*/
Y vimos que printf() tambin puede, con un argumento extra y una sintaxis especial, imprimir un nmero entero que
hayamos almacenado en una variable:
char resultado;
resultado=5+2;
printf("Resultado de la suma: %i\n",resultado);
Aqu el punto de insercin es la secuencia %i. printf() siempre trata las secuencias que comiencen por % como secuencias
de control que le dicen que debe imprimir algo que le proporcionamos en los otros argumentos. As, podemos imprimir varios
enteros distintos en los sitios que queramos de la cadena, insertando varias de estas secuencias %i:
int

numero;

numero=3;
printf("El doble de %i es %i y su cuadrado es %i\n",numero,numero*2,numero*numero);

Lectura de datos del teclado


La entrada de datos se puede hacer de muchas maneras y entre ellas estn desde el uso de dispositivos especiales hasta nuestro
simple teclado. La entrada de datos se refiere a cualquier forma de influencia del usuario sobre los datos que posee el sistema.
31

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Con el fin de mostrar una forma de entrada simple para el aprendizaje vamos a hablar del scanf() que se encuentra definido en
el <stdio.h> y que se usa para capturar diferentes tipos de datos.
El scanf()
El scanf() es unas de las funciones ms usadas por los principiantes para hacer entrada de datos en el lenguaje C. Tiene una
sintaxis muy parecida al printf. Se da una cadena con el formato de los datos y luego se ponen las variables en orden que
correspondan a ese tipo de datos. O sea que como en el printf se pueden mostrar por pantalla los datos de varias variables
en una misma sentencia, en el scanf se pueden capturar varios datos en una sola sentencia.
#include <stdio.h>
int main() {
int a;
printf ("diga un valor para a:");
scanf("%i",&a);
printf ("el valor es: %i\n",a);
return 0;
}

Por ahora no nos interesan las dems sentencias, slo el scanf. En el cdigo se ve lo siguiente:
scanf("%i",&a);

Se observa que la funcion printf dej en pantalla una peticin para que el usuario introdujera un valor. Entonces, el scanf
recibe como argumento una cadena del formato en que se van a capturar los datos y la lista de variables que van a recibir
valores y que deben coincidir con los del formato. En este caso slo se muestra a. El smbolo (&) que precede a la variable a
es para especificar que lo que se est mandando como argumento no es el valor que posee la variable a sino la direccin en que
se encuentra. En este momento eso no tiene mucha relevancia, slo hay que recordar que se debe usar el smbolo dentro del
scanf. En el momento en que se hable de punteros se darn ms detalles de esto.
Otro ejemplo del uso de scanf:
#include <stdio.h>
int main() {
int a,b;
printf ("introduzca dos valores con el formato \"a,b\" :");
scanf("%i,%i",&a,&b);
printf ("el primer valor : %i\n",a);
printf ("el segundo valor : %i\n",b);
return 0;
}
Este otro ejemplo no necesita mucha explicacin, slo ha cambiado que se ha introducido una nueva variable en el cdigo y
que sta es capturada por el mismo scanf(). Obviamente el orden de los argumentos es muy importante. El primer %i
representa la variable a y el segundo representa la b. En el momento de introducir los datos es necesario poner la coma para
separar los valores, si no el scanf, que es una funcin un poco quisquillosa, puede dar errores.

Expresiones
Vamos a tratar ahora de que el ordenador haga un poco de matemticas para nosotros. Por ejemplo, que realice unas pocas
sumas, restas multiplicaciones y divisiones.
#include <stdio.h>
int main(void)
{
int resultado;
resultado=5+2;
printf("Resultado de la suma: %i\n",resultado);
resultado=5-2;

32

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

printf("Resultado de la resta: %i\n",resultado);


resultado=5*2;
printf("Resultado de la multiplicacin: %i\n",resultado);
resultado=5/2;
printf("Resultado de la divisin: %i\n",resultado);
return(0);
}
Despus de grabarlo (por ejemplo, con el nombre ejemplo.c), lo compilamos y ejecutamos, con (respectivamente):
$ gcc ejemplo.c
$ ./a.out
Resultado de la
Resultado de la
Resultado de la
Resultado de la
$

suma: 7
resta: 3
multiplicacin: 10
divisin: 2

Fijmonos en la lnea del principio de la funcin main:


int resultado;
Esta lnea lo que hace es reservar un trozo de memoria, del tamao de un int (4 bytes), y asignarle el nombre resultado,
para poder despus referirnos a l. A partir de este momento, podemos considerar que en nuestro programa existe una variable,
que no tiene valor definido, pero a la que le podremos dar valor posteriormente.
Las lneas con printf() ya las conocemos, pero hay algo en ellas que no habamos visto antes. Esos %i y la parte de
resultado son nuevas para nosotros.
La funcin printf() no slo sabe imprimir cadenas simples, como "Hola Mundo\n", sino tambin imprimir variables. Para
ello, en el lugar de la cadena donde queremos que aparezca el valor de la variable, introducimos lo que se llama una cadena de
conversin de printf(). Estas cadenas siempre empiezan por %, siendo %i la cadena para imprimir un entero, como es en
nuestro caso int resultado. Finalmente, printf() debe saber qu valor escribir, por eso le damos otro argumento (u otros),
usando , como separador, que contienen las variables cuyos valores queremos mostrar.
En el resto del programa hemos visto cmo decirle al ordenador que ejecute una suma, una resta, una multiplicacin y una
divisin entera, con los operadores +, -, * y /. Es de notar que el resultado de una operacin como estas entre nmeros enteros
ser siempre otro entero, como se puede observar en la divisin, en la que no obtenemos un bonito decimal, sino un resultado
entero. Adems, hemos visto que el resultado de esas operaciones, que llamamos expresiones, puede ser asignado a una
variable:
resultado = 7;
Esa asignacin se hace mediante el operador de asignacin: =. Con l, ya conocemos cinco operadores.
Pero, como = tambin es un operador, cmo sabe el ordenador qu operador debe ejecutar primero? Y si es un operador, por
qu no da un resultado? No crea una expresin?
Operadores

Precedencia

* /

Izq. a Der.

+ -

Izq. a Der.

Der. a Izq.

Empezando por las ltimas preguntas, el operador de asignacin s crea una expresin, como los operadores de suma, resta,
multiplicacin y divisin, y esa expresin tiene un resultado, que es el valor que obtiene el lado izquierdo al realizar la
operacin. En cuanto a saber qu se debe ejecutar primero, el ordenador tiene una lista de precedencia, segn la cual siempre
ejecuta primero las multiplicaciones y divisiones, de izquierda a derecha, a continuacin las sumas y restas, de izquierda a
derecha, y a continuacin las asignaciones, de derecha a izquierda. Para ms detalles acerca de la precedencia de los
operadores ver el anexo de los operadores.
En cuanto a los caracteres de punto y coma, notamos aqu que una expresin tambin puede ser una sentencia por s misma, sin
33

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

necesidad de que haya ninguna funcin. De hecho, una sentencia puede no tener siquiera una expresin. La lnea: ; es una
sentencia perfectamente vlida, la sentencia vaca, que sera til en puntos donde el lenguaje requiera una sentencia pero no sea
necesaria para nuestro programa.

Instrucciones de control
Como ya se ha mencionado, C es un ejemplo de programacin estructurada. En este tipo de programacin, es necesario contar
con ciertas estructuras que permitan controlar el flujo del programa, es decir, tomar decisiones y repetir acciones.

La estructura condicional if ... else


En la gran mayora de los programas ser necesario tomar decisiones sobre qu acciones realizar. Esas decisiones pueden
depender de los datos que introduzca el usuario, de si se ha producido algn error o de cualquier otra cosa.
La estructura condicional if ... else es la que nos permite tomar ese tipo de decisiones. Traducida literalmente del ingls, se la
podra llamar la estructura "si...si no", es decir, "si se cumple la condicin, haz esto, y si no, haz esto otro".
Un ejemplo sencillo sera el siguiente (no se trata de un programa completo, sino tan slo una porcin de cdigo):
if (edad < 18)
printf("No puedes acceder.\n");
else
printf("Bienvenido.\n");
Este cdigo de ejemplo dice que si edad es menor que 18 se imprimir "No puedes acceder.\n", mientras que en caso contrario
se imprimir "Bienvenido.\n".
Como se ve en el ejemplo, la estructura de un condicional es bastante simple:
if (condicin) {
sentencias_si_verdadero;
} else {
sentencias_si_falso;
}
Cuando la condicin sea verdadera, se ejecutarn las sentencias dentro del primer bloque de cdigo, cuando la condicin sea
falsa, se ejecutarn las sentencias del segundo bloque de cdigo.
La indentacin (los espacios al comienzo de las lneas) no es necesaria, pero ayuda a la claridad del cdigo. La utilizacin de
las llaves {... } es obligatoria cuando se quiere utilizar ms de una instruccin por bloque, y optativa cuando slo se quiere
escribir una instruccin. Por claridad, sin embargo, es recomendable utilizarlas an cuando slo vaya a haber una instruccin.
El bloque del else es opcional. Si no se lo encuentra, slo se realizar la accin correspondiente al bloque if.
A continuacin, un ejemplo con una funcin, que devuelve el mayor de dos nmeros:
int mayor(int a, int b)
{
int elmayor = a;
if (b > a) {
elmayor = b;
}
return elmayor;
}

Operadores de Comparacin
Las condiciones son expresiones que utilizan operadores para tomar la decisin apropiada. Son los operadores de comparacin,
y su resultado puede ser 1 (equivalente a verdadero) o 0 (equivalente a falso). Este resultado provocar que se ejecute el cdigo
del bloque if o el del bloque else, segn corresponda.
A continuacin un listado de los posibles operadores de comparacin en C y su significado.

34

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Operadores de Comparacin
Operador

Significado

<

estrictamente menor que

>

estrictamente mayor que

<=

menor o igual que

>=

mayor o igual que

==

igual a

!=

distinto de

Por otro lado, en C se toma como falso el valor 0, y como verdadero cualquier otro valor. Esto nos permite utilizar condiciones
sin operador:
float division(int dividendo, int divisor)
{
if (divisor) {
return dividendo / divisor;
} else {
printf ("No se puede dividir por cero\n");
return 0;
}
}

Agrupacin de operadores
Adems, es posible utilizar varios de estos operadores a la vez, mediante los operadores lgicos "y", "o" y "no"; los operadores
correspondientes en C son &&, || y !, respectivamente. Para realizar combinaciones de operadores, se utilizan parntesis que
agrupan las condiciones.
Hay que notar que el operador ! es unario, es decir, no lleva ningn operando a su izquierda, afecta slo al operando que hay a
su derecha.
Un ejemplo donde se ven agrupaciones de operadores puede ser la decisin de si un ao es bisiesto o no. Los aos son bisiestos
si son divisibles por 4, pero no si son divisibles por 100, a menos que tambin sean divisibles por 400.
if ( (!(a % 4)) && (a % 100) || (!(a % 400)) )
printf("es un ao bisiesto.\n");
} else {
printf("no es un ao bisiesto.\n");
}

En este caso, se utiliza la operacin mdulo, que obtiene el resto de la divisin entera de un nmero por otro. Cuando un
nmero es divisible por otro, el resto de su divisin entera ser cero. Siendo que cero es equivalente a falso, y cualquier valor
distinto de cero es equivalente a verdadero, podemos usar el operador ! para verificar si el nmero es mltiplo de 4, de 100 o
de 400.

Evaluacin de corto circuito


La evaluacin en corto circuito es una caracterstica del lenguaje C que se utiliza para optimizar la ejecucin de programas.
Consiste en que el programa puede verificar si una expresin es verdadera o falsa antes de haber evaluado toda condicin.
Por ejemplo, si se tiene una condicin como la siguiente:
if ((a > 2) || (b < 4)) {
...
35

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

}
Al ejecutarse el programa, se evaluar primero si a > 2. En el caso en que sea verdadero, no continuar con la siguiente
condicin, ya que el resultado ser de cualquier modo verdadero.
De la misma forma, si la condicin fuera:
if ((a > 2) && (b < 4)) {
...
}
En este caso, si no se cumple que a > 2, no se evaluar la siguiente condicin, ya que el resultado ser falso de todos modos.
Esta caracterstica no tiene demasiada importancia al comenzar a programar, pero facilitar ciertas operaciones y
optimizaciones en programas avanzados.

La estructura condicional switch ... case


La estructura condicional switch ... case se utiliza cuando queremos evitarnos las llamadas escaleras de decisiones. La
estructura if nos puede proporcionar, nicamente, dos resultados, uno para verdadero y otro para falso. Una estructura switch ...
case, por su parte, nos permite elegir entre muchas opciones:
switch (semaforo) {
case 1:
printf("El semforo est verde.\n");
break;
case 0:
printf("El semforo est rojo.\n");
break;
case 2:
printf("El semforo est anaranjado.\n");
break;
case 3:
printf("El semforo est anaranjado parpadeante.\n");
break;
default:
printf("ERROR:El semforo no puede estar en ese estado!.\n");
}
La estructura anterior, de realizarse con sentencias if, necesitara cuatro de ellas, resultando un enorme bloque muy difcil de
leer. En la mayora de los casos, adems, la sentencia switch proporciona una ganancia en velocidad del cdigo, pues permite
al compilador trabajar en base a que se trata de una decisin mltiple para una nica variable, cosa que con sentencias if el
compilador no tiene por qu detectar.
Como vemos, para cada valor de la variable se ejecuta un bloque de sentencias distinto, en el que no necesitamos llaves. Hay
un caso especial, default, que se ejecuta si ningn otro corresponde, y que no es necesario poner. Es, en todo, equivalente al
bloque else de una sentencia if.
Las sentencias break son muy importantes, ya que el comportamiento normal de un bloque switch es ejecutarlo todo desde la
etiqueta case que corresponda hasta el final. Por ello, si no queremos que se nos ejecute ms de un bloque, pondremos
sentencias break al final de cada bloque excepto el ltimo.
Es decir, las etiquetas case son puntos de entrada de la ejecucin, y no implican que al acabarse el bloque case la ejecucin
salte al final del bloque switch. Las etiquetas case siguientes a la que hemos utilizado para entrar son, sencillamente, ignoradas.
A la ausencia de sentencias break se le llama, en ocasiones, "dejar caer la cascada switch".

El bucle while
El bucle while sirve para ejecutar cdigo reiteradas veces.
while (/* Condicin de ejecucin del bucle */) {
/* Cdigo */
}
La condicin ha de ser una sentencia que devuelva un valor booleano, y esta puede ser el valor booleano en s, verdadero (true
36

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

o 1) si la condicin se cumple, o falso si esta no se cumple (false o 0). Tambin puede ser el nombre de una variable, y el valor
de la expresin depender de su contenido. Aunque sea una variable no booleana, siempre se podr usar, si vale 0 ser como si
la condicin no se cumpliera, y siempre que sea diferente de 0, se considerar que la condicin se cumple.
La forma ms obvia tal vez, y la ms usada sin duda, son las sentencias comparativas, que usan los operandos ==, !=, <=, >=,
<, >. Su uso sera as:
variable o valor inmediato operador variable o valor inmediato
Tened en cuenta que adems de las variables y los valores inmediatos, tambin se pueden poner all llamadas a funciones que
devuelvan un valor.
int tecla = 0;
while (tecla == 0) {
tecla = readkey(); /* Intentamos leer una pulsacin de tecla */
}
En este ejemplo lo que hacemos es que el programa se ature hasta que el usuario pulse una tecla, con lo que cambiar el valor
de la variable "tecla".

El bucle for
El bucle for es un bucle muy flexible y la vez muy potente ya que tiene varias formas interesantes de implementarlo, su forma
ms tradicional es la siguiente:
for (/* inicializacin */; /* sentencia condicional */; /* incremento o decremento
*/) {
/* cdigo a ejecutar */
}
Inicializacin: en esta parte se inicia la variable que controla el bucle y es la primera setencia que ejecuta el bucle, solo se
ejecuta una vez ya que solo se necesita al principio del bucle.
Sentencia condicional: es la segunda sentencia que ejecuta el bucle, es una sentencia condicional vlida, que determina si el
bucle se ejecutar o no. incremento o decremento: es la ultima sentencia que ejecuta el bucle por lo general incrementar la
variable con que se inicio el ciclo, despus de eso el bucle revisa nuevamente la condicin, si es verdadera tiene lugar una
ejecucin ms del cuerpo del ciclo, si es falsa se termina el ciclo y as la repeticin. Aqu muestro un ejemplo de un bucle que
se ejecuta 100 veces:
for (int i=0; i < 100; i++) {
printf("%i\n", i);
}
No es necesaria por ejemplo en la primera la sentencia iniciar la variable que utilizara el bucle si ya ha sido inicializada en otra
parte del bloque de sentencias donde se encuentra el bucle.
Por lo general la sentencia condicional se compone de la variable que se utiliz para la inicializacin del bucle a la cual se le
aplica alguno de los operadodores relacionales <, <=, >, >=; junto con otro valor; esta parte del bucle tambin se puede
implementar con una variable de tipo bool.
NOTA: recuerde que en cualquier sentencia donde se evala una expresin vlida, un valor de retorno=0 se considera falso y
cualquier valor distinto de cero es verdadero, as false=0 y true=1.
Creo que es importante comentar que esos tres "parmetros" que se le pasan a la sentencia for se pueden omitir, pero los puntoy-coma entre ellos s se han de dejar. Tambin cabe destacar que si no se pone la condicin de ejecucin del bucle, este se
ejecutar indefinidamente hasta que se ejecute una sentencia break o se termine la funcin o el programa mediante un return.
El bucle do...while
El bucle do...while es un bucle que, por lo menos, se ejecuta una vez. While significa "mientras"
Su forma es esta:
do {

/* CODIGO */
} while (/* Condicin de ejecucin del bucle */)
Os muestro un ejemplo sencillo de uso:
37

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

int aleatorio;
do {
aleatorio = rand();
} while (aleatorio != 25)
La verdad es que este ejemplo puede resultar un poco absurdo, pero es bastante intuitivo. El cdigo del bucle asigna un valor
aleatorio a la variable definida anteriormente, y mientras esa variable no tenga el valor 25, el bucle sigue ejecutndose.

El goto
La sentencia goto sirve para indicar al programa que continue ejecutndose desde la lnea de cdigo indicada. La verdad es que
es una sentencia poco aceptada por la comunidad de programadores, pues puede provocar que se hagan programas un poco
"sucios" y confusos.
Su sintaxis es ms o menos as:
/* Cdigo */
ETIQUETA:
/* Cdigo */
goto ETIQUETA;
/* Cdigo */
As, cuando se ejecute la sentencia goto, el programa continuar su ejecucin a partir de la etiqueta marcada. Como se puede
observar se puede usar para crear un bucle, o para ir a una parte del cdigo u otra si se combina con una sentencia if...else. pero
para los bucles ya hay estructuras definidas, y para la ejecucin opcional de bloques de cdigo, ya existen las Funciones.
Slo en ocasiones muy excepcionales ser recomendado el uso del goto al crear iteraciones muy complejas.

Uso de Funciones
Funciones
Como vimos anteriormente C tiene como bloque bsico la funcin. main() es una funcin, printf() otra, y hay muchas ms
funciones predefinidas, pero nosotros mismos tambin podemos definir nuestras propias funciones. De hecho, es fundamental
hacerlo.
Podemos definir una funcin cualquiera de la misma manera en que definimos la funcin main(). Basta con poner su tipo, su
nombre, sus argumentos entre parntesis y luego, entre llaves, su cdigo:
/* Inclusin de archivos */
#include <stdio.h>
void holamundo(void) /*Funcin donde se ejecuta la lgica del programa*/
{
printf("Hola Mundo\n"); /*imprime la cadena*/
return; /*sale de la funcin*/
}
int main(void) /*Funcin principal del programa*/
{
holamundo(); /*llamada a la funcin que lleva el peso*/
return 0; /*sale del programa: correcto*/
}
Este cdigo es en todo equivalente al "Hola Mundo" original, slo que nos muestra cmo escribir y cmo utilizar una funcin.
Y adems nos muestra un principio de buena programacin: meter las sentencias que "hacen el trabajo" en otras funciones
especficas para sacarlas de main(), dejando en sta tan slo un guin general de lo que hace el programa, no las rdenes
especficas. De esta manera se facilita la comprensin del programa, y por tanto el futuro trabajo de modificarlo.
De la misma manera que tenemos que declarar una variable antes de utilizarla, no es indiferente el orden en que se siten las
diferentes funciones en el fichero: las funciones deben declararse antes de ser llamadas.
Igualmente vemos que, para una funcin void, la sentencia de control return no puede llamarse como pseudofuncin, porque en
dicho caso la funcin void (en nuestro caso holamundo()) devolvera un valor, cosa que su definicin no permite.

38

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Las funciones tambin permiten recibir tipos de datos, as pues las funciones nos sirven para hacer de un gran problema
pequeas partes de un problema o sea dividir un gran problema en diferentes problemas ms pequeos. As que las funciones
tambin pueden retornar un tipo de dato que hemos definido dentro de la misma.
La definicin de una funcin para sumar dos nmeros sera de la siguiente manera:
/*
* suma.c
*
* */
#include <stdio.h>
int sumar(int numero1, int numero2); /* prototipo de la funcin */
int main(void)
{
int suma; /* definimos una variable*/
suma = sumar(5, 3);
/* la variable obtiene el valor retornado de sumar
* puede verse que entre los parntesis se mandan los valores
* de los nmeros que se desean sumar en este caso 5 y 3
* pueden haberse declarados estos dos nmeros en otras variables
* int dato = 4, valor = 3;
* suma = sumar(dato, valor);
*/
/* imprimimos la suma de los dos nmeros */
printf("La suma es: %d ", suma);
return 0;
}
int sumar(int numero1, int numero2)
{
int retsuma; /* creamos la variable a retornar*/
y 2*/

retsuma = numero1 + numero2; /* asignamos a esa variable la suma de nmero 1


return retsuma; /* retornamos la suma de los nmeros */

Paso de Parmetros
Las funciones pueden recibir datos como lo hemos observado, pero existen dos formas importantes de enviar los datos hacia
una funcin por valor y por referencia, con las cuales observarse que son muy diferentes y que una puede ser muy diferente
de la otra, haciendo modificaciones en nuestro programa.
Por Valor
El paso por valor enva una copia de los parmetros a la funcin por lo tanto los cambios que se hagan en ella no son tomados
en cuenta dentro de la funcin main(). Ejemplo:
/*
* por_valor.c
*
*/
#include <stdio.h>
39

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

void sumar_valor(int numero); /* prototipo de la funcin */


int main(void)
{
int numero = 57; /* definimos numero con valor de 57*/
sumar_valor(numero); /* enviamos numero a la funcin */
printf("Valor de numero dentro de main() es: %d\n", numero);
/* podemos notar que el valor de numero se modifica
* slo dentro de la funcin sumar_valor pero en la principal
* nmero sigue valiendo 57
*/
return 0;
}
void sumar_valor(int numero)
{
numero++; /* le sumamos 1 al numero */
/* el valor de nmero recibido se aumenta en 1
* y se modifica dentro de la funcin sumar_valor()
*/
printf("Valor de numero dentro sumar_valor() es: %d\n", numero);
return;
}

Por Referencia
El paso por referencia se hace utilizando apuntadores. Se enva la direccin de memoria de la variable, por lo tanto los cambios
que haga la funcin si afectan el valor de la variable. Ejemplo:
/*
* por_referencia.c
*
*/
#include <stdio.h>
void sumar_referencia(int *numero); /* prototipo de la funcin */
int main(void)
{
int numero = 57; /* definimos numero con valor de 57*/
isumar_referencia(&numero); /* enviamos numero a la funcin */
printf("\nValor de numero dentro de main() es: %d ", numero);
/* podemos notar que el valor de numero se modifica
* y que ahora dentro de main() tambin se ha modificado
* aunque la funcin no haya retornado ningn valor.
*/
}
40

return 0;

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

void sumar_referencia(int *numero)


{
*numero += 1; /* le sumamos 1 al numero */
/* el valor de numero recibido se aumenta en 1
* y se modifica dentro de la funcin
*/
printf("\nValor de numero dentro sumar_referencia() es: %d", *numero);
}

return;

Variables Locales y Globales


Adems de pasar valores a una funcin, tambin se pueden declarar tipos de datos dentro de las funciones, estos tipos de datos
declarados dentro de una funcin solo son accesibles dentro de esta misma funcin y se les conocen como variables locales, as
pues podemos definir los mismos nombres de variables en diferentes funciones, ya que estas variables solo son accesibles
dentro de esas funciones. Ejemplo:
/*
* locales.c
*
*/
#include <stdio.h>
void funcion1()
{
int dato = 53; /* definimos dato en 53*/
char num1 = 'a'; /* num1 vale a */
/* imprimimos */
printf("Funcion1, dato=%d, num1=%c\n", dato, num1);
}

return;

void funcion2()
{
int dato = 25; /* definimos dato en 25*/
char num2 = 'z'; /* num2 vale z*/
/* imprimimos */
printf("Funcion2, dato=%d, num2=%c\n", dato, num2);
return;
}
int main(void)
{
funcion1(); /* llamamos a funcion1() */
funcion2(); /* llamamos a funcion2() */
}

return 0;

En este caso la variable dato, esta definida dentro de cada una de las funciones y son totalmente distinta una de otra y no se
puede utilizar fuera de esta, as pues num2 no puede ser utilizada por la funcion1() y num1 tampoco puede ser utilizada por
funcion2().
41

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

Existen pues variables que se definen fuera de la funcin principal main() y fuera de cualquier otra funcin creada por
nosotros, estas variables se les conoce con el nombre de Variables Globales ya que se pueden utilizar dentro de main() y dentro
de cualquier funcin creada por nosotros. Ejemplo:
/*
* global.c
*
*/
#include <stdio.h>
int variable_global = 99; /* inicializamos la variable global */
void funcion();
int main(void)
{
/* imprimimos el valor*/
printf("main(), acceso a variable_global %d\n", variable_global);
/* llamamos a la funcin */
funcion();
}

return 0;

void funcion()
{
/* imprimimos el valor*/
printf("funcion(), acceso a variable_global %d\n", variable_global);
}

return;

Funciones Recursivas
La recursividad (recursin) es la propiedad por la cual una funcin se llama a s misma directa o indirectamente. La recursin
indirecta implica utilizar ms de una funcin.
Se puede considerar la recursividad como una alternativa a la iteracin. La recursin permite especificar soluciones naturales,
sencillas, que seran, en caso contrario, difciles de resolver. Toda funcin recursiva debe contemplar un caso base o condicin
de salida, para terminar, o la recursividad no podr terminar nunca.
Una funcin recursiva podra definirse as:
funcion_recursiva( /* parmetros recibidos por la funcin */ )
{
/* Cdigo */
funcion_recursiva( ); /* llamada a la funcin misma */
/* Cdigo */
}
Uno de los ejemplos ms representativos en la recursividad es el factorial de un numero ( n! ):

la definicin de recursividad del factorial es:

42

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

En esta definicin, n = 0, es nuestro caso base, que le da fin a la recursividad.


Entonces nuestro programa que calcula el factorial es:
/*
*factorial.c
*
*/
#include <stdio.h>
long factorial(int n)
{
if (n == 0) /* caso base */
return 1; /* como 0! = 1, se retorna 1*/
else
return n * factorial (n - 1); /* llamada a esta misma funcin */
}
int main(void)
{
/* en este caso se llama a la funcin y se imprime directamente*/
printf("%ld ", factorial(5));
return 0;
}
Tambin existen otros tipos de funciones recursivas como lo es el producto de dos nmeros. El producto de a
son nmeros enteros positivos seria:

b, donde a y b

Solucin iterativa:

Solucin recursiva:

As pues

es:

Podemos ver que la multiplicacin de dos nmeros a, b se puede transformar en otro problema ms pequeo multiplicar a por
(b-1), el caso base se produce cuando b = 0 y el producto es 0. Ejemplo:
/*
* producto.c
*
*/
#include <stdio.h>
int producto(int a, int b)
{
if (b == 0) /* caso base */
43

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

else

return 0; /* como b = 0, se retorna 0*/


return a + producto (a, b - 1); /* llamada a esta misma funcin */

int main(void)
{
/* en este caso se llama a la funcin y se imprime directamente*/
printf("%i ", producto( 7, 3));
}

return 0;

Recursividad indirecta o recursin mutua


Esta se produce cuando una funcin llama a otra, que esta a su vez terminar llamando de nuevo a la primera funcin. El
siguiente programa visualiza el alfabeto utilizando recursin indirecta o mutua:
/*
* elalfabeto.c
*
*/
#include <stdio.h>
void funcionA(char c); /* se declara el prototipo de la funcin para que el llamado
*/
void funcionB(char c); /* a la misma en la funcin no sea implcita */
int main(void)
{
funcionA('z'); /* llamado a funcionA */
return 0;
}
void funcionA(char c)
{
if (c > 'a') /* caso base mientras c no sea menor que A */
funcionB(c); /* llamado a la funcionB */
printf("%c ", c); /* imprimimos el valor de c */
}
void funcionB(char c)
{
funcionA(--c); /* llamado a la funcionA decrementando el valor de 'z' */
}

Recursin versus Iteracin


Tanto la iteracin como la recursin se basan en estructura de control: la iteracin utiliza una estructura repetitiva y la
recursin una estructura de seleccin. La iteracin utiliza explcitamente una estructura repetitiva mientras que la recursin
consigue la repeticin mediante llamadas repetitivas a funciones.
La iteracin termina si la condicin del bucle no se cumple, mientras que la recursin termina cuando se reconoce un caso
base.
La recursin puede presentar desventajas ante la iteracin ya que se invoca repetidas veces al mecanismo de llamada de
funciones y se necesita un tiempo mayor para realizar cada llamada.
44

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

La razn por la cual se puede elegir u optar por usar recursividad es que existen muchos problemas complejos que poseen
naturaleza recursiva y, en consecuencia, son mas fciles de implementar.
Ejemplo Iterativo
/*
* iterativo.c
*
*/
#include <stdio.h>
long factorial(int numero);
int main(int argc, char** argv)
{
int contador = 0;
/* calcula el factorial de 0 a 10 */
for ( contador = 0; contador <= 10; contador++ )
printf("%d! = %ld\n", contador, factorial( contador ));
return 0;
}
/* funcion factorial iterativa */
long factorial( int numero )
{
long resultado = 1;
int i = 0;
/* declaracion de la funcin factorial iterativa */
for ( i = numero; i >= 1; i-- )
resultado *= i;
}

return resultado;

Ejemplo Recursivo
/*
* recursivo.c
*
*/
#include <stdio.h>
long factorial(int numero);
int main(int argc, char** argv)
{
int contador = 0;
/* calcula el factorial de 0 a 10 */
for ( contador = 0; contador <= 10; contador++ )
printf("%d! = %ld\n", contador, factorial( contador ));
}

return 0;

/* funcin factorial recursiva */


45

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

long factorial( int numero )


{
if ( numero <= 0 ) /* caso base */
return 1; /* casos bases: 0! = 1 y 1! = 1 */
else /* llamada recursiva */
return numero * factorial( numero - 1 ); /* llamada a la funcin
factorial */
}

Vectores
Los vectores son una forma de almacenar datos que permiten contener una serie de valores del mismo tipo, cada uno de los
valores contenidos tiene una posicin asociada que se usar para accederlos. Est posicin o ndice ser siempre un nmero
entero positivo.
En C la cantidad de elementos que podr contener un vector es fijo, y en principio se define cuando se declara el vector. Los
vectores se pueden declarar de la siguiente forma:
tipo_elemento nombre[largo];
Esto declara la variable nombre como un vector de tipo_elementos que podr contener largo cantidad de elementos, y cada uno
de estos elemento podr contener un valor de tipo tipo_elemento.
Por ejemplo:
double valores[128];
En este ejemplo declaramos un vector de 128 elementos del tipo double, los ndices de los elementos iran entre 0 (para el
primer elemento y 127 para el ltimo).
De la misma forma que con las otras declaraciones de variables que hemos visto se le puede asignar un valor iniciar a los
elementos.
O tambin se pueden declarar:
tipo_elemento nombre[largo]={valor_0, valor_1, valor_2};
En caso estamos asignadole valores a los primeros 3 elementos del vector nombre. Notar que largo debe ser mayor o igual a la
cantidad de valores que le estamos asignando al vector, en el caso de ser la misma cantidad no aporta informacin, por lo que
el lenguaje nos permite escribir:
tipo_elemento nombre[]={valor_0, valor_1, valor_2};
Que declarar nombre como el vector de largo 3.
Para acceder a un elemento accederemos a travs de su posicin. Es decir:
tipo_elemento elemento;
...
elemento = nombre[2];
Asumiendo que tenemos el vector anterior definido estaramos guardando valor_2 en elemento.
Veamos algunos ejemplos:
/*
* Ejemplo : El producto escalar de dos vectores
*/
#include <stdio.h>
double producto_escalar(double v1[], double v2[], int d);
int main()
{
const int largo = 3;
46

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

double vector_1[largo] = {5,1,0};


double vector_2[largo] = {-1,5,3};
double resultado = producto_escalar(vector_1, vector_2, largo);

// imprime el resultado
printf("(%f, %f, %f) . (%f, %f, %f) = %f\n",
vector_1[0], vector_1[1], vector_1[2],
vector_2[0], vector_2[1], vector_2[2],
resultado);
return 0;

/* producto escalar entre dos vectores */


double producto_escalar(double v1[], double v2[], int d)
{
double resultado = 0;
int i;
for (i=0; i < d; i++) {
resultado += v1[i] * v2[i];
}
return resultado;
}
En el ejemplo anterior usamos los vectores de C para representar vectores matemticos y calcular el producto vectorial entre
ellos. Una peculiaridad que se puede notar es que al recibir un arreglo en una funcin no se especifica el largo, volveremos a
esto en un captulo posterior.
Otra funcin clsica es la bsqueda de un mximo o mnimo, que podemos escribirla de la siguiente manera:
int buscar_maximo(double valores[], int num_valores)
{
int maximo_pos = 0;
for (int i = 1; i < num_valores; i++) {
if (valores[i] > valores[maximo_pos]) {
maximo_pos = i;
}
}
return maximo_pos;
}
Otro ejemplo sencillo, calcular el promedio de los valores.
double promedio(double valores[], int largo)
{
double suma=0;
for (int i=0;i<largo;i++) {
suma+=valores[i];
}
return suma/largo;
}
Cuando una funcin recibe un vector por parmetro y cambia su contenido y el cambio es permanente (se ve an fuera de la
funcin). Esto puede parecer extrao despus del nfasis que pusimos en resaltar que todos los parmetros de una funcin se
reciben por valor, pero se aclarar en el siguiente capitulo.
Mientras tanto usemos esto para definir una funcin que le aplique otra funcin que recibe por parmetro a cada elemento del
vector, guardando el resultado en el mismo vector y una llamada de ejemplo a esta.
void cuadrados(double vector[], int largo)
{
for (int i=0;i<largo;i++) {
vector[i]=cuadrado(vector[i]);
}
47

Escuela de Educacin Tcnica Galileo Galilei - Apuntes de Programacin I

}
...
double cuadrado(double valor) {
return valor*valor;
}
...
cuadrados(elementos,num_elem);
...
Delamismaformaquevenimosusandovectoresdetiposbsicos,podemostenervectoresdevectores,estosse
declarandelasiguienteforma:
int matriz[3][7];
int tabla[3][4]={ { 1, 2, 3, 4},
{ 5, 6, 7, 8}, /* los espacios y saltos de lneas no son tomados
en cuenta */
{ 9,10,11,12} };
double v[2][2][2];
...
printf("tabla[0][1]: %i\n", tabla[0][3]); // Imprime 4
printf("tabla[2][0]: %i\n", tabla[2][0]); // Imprime 9
...
Enesteejemplotablaesunvectordelongitud3,cuyoselementossonvectoresdelongitud4deelementosde
tipoint.
Enresumen,suponiendoque v[n] esunvectordecualquiertipodedatoconn cantidad deposiciones,al
vectorvseleaplicanlassiguientesreglas:
1. Laprimeraposicinsiempreserv[0]
2. Laltimaposicinesv[n1]
3. EnversionespreviasaC99nesunaconstantedefinidaantesdeladeclaracindev[n]

48