Está en la página 1de 238

PROGRAMACION EN EL LENGUAJE C/C++

i
CAPITULO 1
Proceso de creacin del softare!
Se define como proceso al conjunto ordenado de pasos a seguir para llegar a la
solucin de un problema u obtencin de un producto, en este caso particular, para
lograr un producto software que resuelva un problema especfico.
El proceso de creacin de software puede llegar a ser muy complejo,
dependiendo de su porte, caractersticas y criticidad del mismo. Por ejemplo la
creacin de un sistema operativo es una tarea que requiere proyecto, gestin,
numerosos recursos y todo un equipo disciplinado de trabajo. En el otro extremo, si
se trata de un sencillo programa, ste puede ser reali!ado por un solo programador
f"cilmente. Es as que normalmente se dividen en tres categoras seg#n su tama$o
%lneas de cdigo& o costo.
'onsiderando los de gran porte, es necesario reali!ar complejas tareas, tanto
tcnicas como de gerencia, una fuerte gestin y an"lisis diversos, la complejidad de
ello (a llevado a que desarrolle una ingeniera especfica para tratar su estudio y
reali!acin) es conocida como *ngeniera de Software.
En tanto que en los de mediano porte, peque$os equipos de trabajo %incluso un
ave!ado analista+programador solitario& pueden reali!ar la tarea. ,unque, siempre en
casos de mediano y gran porte %y a veces tambin en algunos de peque$o porte, seg#n
su complejidad&, se deben seguir ciertas etapas que son necesarias para la
construccin del software. -ales etapas, si bien deben existir, son flexibles en su
forma de aplicacin, de acuerdo a la metodologa o proceso de desarrollo escogido y
utili!ado por el equipo de desarrollo o por el analista+programador solitario %si fuere
el caso&.
.os "rocesos de desarrollo de softare poseen reglas preestablecidas, y deben
ser aplicados en la creacin del software de mediano y gran porte, ya que en caso
contrario lo m"s seguro es que el proyecto o no logre concluir o termine sin cumplir
los objetivos previstos, y con variedad de fallos inaceptables. Entre tales /procesos0
los (ay "giles o livianos %ejemplo 1P&, pesados y lentos %ejemplo 23P&, y variantes
intermedias. 4ormalmente se aplican de acuerdo al tipo y porte del software a
desarrollar, a criterio del lder %si lo (ay& del equipo de desarrollo. ,lgunos de esos
procesos son Programacin Extrema %en ingls e1treme Programming o 1P&,
Proceso 3nificado de 2ational %en ingls 2ational 3nified Process o 23P&, 5eature
6riven 6evelopment %566&, etc.
'ualquiera sea el proceso utili!ado y aplicado al desarrollo del software, y casi
independientemente de l, siempre se debe aplicar un modelo de ciclo de vida.
'uando un proyecto fracasa, rara ve! es debido a fallas tcnicas, la principal
causa de fallos y fracasos es la falta de aplicacin de una buena metodologa o
proceso de desarrollo. Entre otras, una fuerte tendencia, desde (ace pocas dcadas, es
mejorar las metodologas o procesos de desarrollo, o crear nuevas y concienti!ar a los
profesionales de la inform"tica a su utili!acin adecuada. 4ormalmente los
especialistas en el estudio y desarrollo de estas "reas y afines son los ingenieros en
software, es su orientacin. .os especialistas en cualquier otra "rea de desarrollo
inform"tico normalmente aplican sus conocimientos especiali!ados pero utili!ando
modelos, paradigmas y procesos ya elaborados.
Es com#n para el desarrollo de software de mediano porte que los equipos
(umanos involucrados apliquen metodologas propias, normalmente un (brido de los
procesos anteriores y a veces con criterios propios.
El proceso de desarrollo puede involucrar numerosas y variadas tareas , desde
lo administrativo, pasando por lo tcnico y (asta la gestin y el gerenciamiento. Pero,
casi rigurosamente, siempre se cumplen ciertas etapas mnimas7 las que se pueden
resumir como sigue)
'aptura, elicitacin, especificacin y an"lisis de requisitos %E2S&
6ise$o
'odificacin
Pruebas %unitarias y de integracin&
*nstalacin y paso a produccin
8antenimiento
En las anteriores etapas pueden variar ligeramente sus nombres, o ser m"s
globales, o contrariamente, ser m"s refinadas7 por ejemplo indicar como una #nica
fase %a los fines documentales e interpretativos& de an"lisis y dise$o7 o indicar como
implementacin lo que est" dic(o como codificacin7 pero en rigor, todas existen e
incluyen, b"sicamente, las mismas tareas especficas.
Len#$a%es de "ro#ra&acin!
'efinicin!
3n len#$a%e de "ro#ra&acin es un conjunto de smbolos y reglas sint"cticas
y sem"nticas que definen su estructura y el significado de sus elementos y
expresiones. Es utili!ado para controlar el comportamiento fsico y lgico de una
m"quina.
3n len#$a%e de "ro#ra&acin es un lenguaje dise$ado para describir el
conjunto de acciones que un equipo debe ejecutar. Por lo tanto, un lenguaje de
programacin es un modo pr"ctico para que los seres (umanos puedan dar
instrucciones a un equipo.
.os primeros lenguajes de programacin surgieron de la idea de '(arles
9abagge, la cual se le ocurri a este (ombre a mediados del siglo 1*1, predijo
muc(as de las teoras en que se basan los actuales ordenadores. 'onsista en lo que l
denominaba la maquina analtica, pero que por motivos tcnicos no pudo construirse
(asta mediados del siglo 11. 'on l colaboro ,da .ovedby, la cual es considerada
como la primera programadora de la (istoria, pues reali!o programas para aqulla
supuesta maquina de 9abagge, en tarjetas perforadas.
.os lenguajes de programacin son los medios de comunicacin entre los
programadores o usuarios y la computadora. 'on ellos se construyen los programas
que despus ser"n ejecutados por la computadora.
Clasificacion de los len#$a%es de "ro#ra&acin!
3n lenguaje de programacin es un conjunto limitado de palabras y de
smbolos que representan procedimientos, c"lculos, decisiones y otras operaciones
que pueden ejecutar una computadora.
Len#$a%es de Pro#ra&acion se#(n s$ ni)el!
'alsificamos los lenguajes seg#n su nivel de programacin en)
Len#$a%es de &*+$ina
El lenguaje m"quina de una computadora consta de cadenas de n#meros
binarios %ceros y unos& y es el #nico que :entienden: directamente los
procesadores. -odas las instrucciones preparadas en cualquier lenguaje de
m"quina tienen por lo menos dos partes. .a primera es el comando u
operacin, que dice a la computadora cu"l es la funcin que va a reali!ar.
-odas las computadoras tienen un cdigo de operacin para cada una de
sus funciones. .a segunda parte de la instruccin es el operando, que
indica a la computadora dnde (allar o almacenar los datos y otras
instrucciones que se van a manipular7 el n#mero de operandos de una
instruccin vara en las distintas computadoras.
Seg#n los est"ndares actuales, las primeras computadoras eran poco
tolerantes. .os programadores tenan que traducir las instrucciones de
manera directa a la forma de lenguaje de m"quina que comprendan las
computadoras. Por ejemplo, un programador que escribiera la instruccin
:S38,2 ;<=>: para una de las primeras m"quinas *98 (ubiera escrito)
;;;=;;;;;;;;;;;;;;;;;;;;;;;;=;===;;;
,dem"s de recordar las docenas de cdigos numricos para los comandos
del conjunto de instrucciones de la m"quina, el programador tena que
conocer las posiciones donde se almacenan los datos y las instrucciones.
.a codificacin inicial muc(as veces requera meses, por lo que era
costosa y era frecuente que originara errores.
Len#$a%es ensa&,ladores
, principios de la dcada de =?@;, y con el fin de facilitar la labor de los
programadores, se desarrollaron cdigos nemotcnicos para las
operaciones y direcciones simblicas. .a palabra nemotcnico se refiere a
una ayuda para la memori!acin. 3no de los primeros pasos para mejorar
el proceso de preparacin de programas fue sustituir los cdigos de
operaciones numricos del lenguaje de m"quina por smbolos alfabticos,
que son los cdigos nemotcnicos. -odas las computadoras actuales tienen
cdigos nemotcnicos aunque, naturalmente, los smbolos que se usan
varan en las diferentes marcas y modelos. .a computadora sigue
utili!ando el lenguaje de m"quina para procesar los datos, pero los
programas ensambladores traducen antes los smbolos de cdigo de
operacin especificados a sus equivalentes en lenguaje de m"quina. Este
procedimiento prepar avances posteriores. .a tcnica de
direccionamiento simblico permite expresar una direccin no en trminos
de su locali!acin numrica absoluta, sino en trminos de smbolos
convenientes para el programador.
6urante las primeras etapas del direccionamiento simblico, el
programador asigna un nombre simblico y una direccin real a un dato.
,s, durante el resto del programa, el programador se referir" a los
nombres simblicos, m"s que a las direcciones, cuando fuera preciso
procesar estos datos. 8"s adelante se (i!o otra mejora. Se dej a la
computadora la tarea de asignar y recordar las direcciones de las
instrucciones. .o #nico que tena que (acer el programador era indicar a la
computadora la direccin de la primera instruccin, y el programa
ensamblador se encargaba de almacenar, de manera autom"tica, todas las
dem"s en forma secuencial a partir de ese punto. ,s, si se agregaba m"s
tarde otra instruccin al programa, no era necesario modificar las
direcciones de todas las instrucciones que seguan al punto de insercin.
En ve! de ello, el procesador ajustaba autom"ticamente las localidades de
memoria la prxima ve! que se ejecutaba el programa.En la actualidad, los
programadores no asignan n#meros de direccin reales a los datos
simblicos, simplemente especifican dnde quieren que se coloque la
primera localidad del programa, y el programa ensamblador se encarga de
lo dem"s) asigna localidades tanto para las instrucciones como para los
datos.Estos programas de ensamble, o ensamblador, tambin permite a la
computadora convertir las instrucciones en lenguaje ensamblador del
programador en su propio cdigo de m"quina. 3n programa de
instrucciones escrito en lenguaje ensamblador por un programador se
llama programa fuente. 6espus de que el ensamblador convierte el
programa fuente en cdigo de m"quina a ste se le denomina programa
objeto. Para los programadores es m"s f"cil escribir instrucciones en un
lenguaje ensamblador que en cdigos de lenguajes de m"quina, pero es
posible que se requieran dos corridas de computadora antes de que se
puedan utili!ar las instrucciones del programa fuente para producir las
salidas deseadas.
.os lenguajes ensambladores tienen ventajas sobre los lenguajes de
m"quina. ,(orran tiempo y requieren menos atencin a detalles. Se
incurren en menos errores y los que se cometen son m"s f"ciles de
locali!ar.
Len#$a%es de alto ni)el
.os primeros programas ensambladores producan slo una instruccin en
lenguaje de m"quina por cada instruccin del programa fuente. Para
agili!ar la codificacin, se desarrollaron programas ensambladores que
podan producir una cantidad variable de instrucciones en lenguaje de
m"quina por cada instruccin del programa fuente. 6ic(o de otra manera,
un sola macroinstruccin poda producir varias lneas de cdigo en
lenguaje de m"quina. Por ejemplo, el programador podra escribir :.EE2
,2'A*BC:, y el programa traductor producira una serie detallada de
instrucciones al lenguaje de m"quina previamente preparada, con lo que se
copiara un registro del arc(ivo que estuviera leyendo el dispositivo de
entrada a la memoria principal. ,s, el programador no se tena que ocupar
de escribir una instruccin por cada operacin de m"quina reali!ada.
El desarrollo de las tcnicas nemotcnicas y las macroinstrucciones
condujo, a su ve!, al desarrollo de lenguajes de alto nivel que a menudo
est"n orientados (acia una clase determinada de problemas de proceso. ,
diferencia de los programas de ensamble, los programas en lenguaje de
alto nivel se pueden utili!ar con diferentes marcas de computadores sin
tener que (acer modificaciones considerables. Esto permite reducir
sustancialmente el costo de la reprogramacin cuando se adquiere equipo
nuevo. Ctras ventajas de los lenguajes de alto nivel son)
o Son m"s f"ciles de aprender que los lenguajes ensambladores.
o Se pueden escribir m"s r"pidamente.
o Permiten tener mejor documentacin.
o Son m"s f"ciles de mantener.
o 3n programador que sepa escribir programas en uno de estos
lenguajes no est" limitado a utili!ar un solo tipo de m"quina.
Len#$a%es co&"ilados!
4aturalmente, un programa que se escribe en un lenguaje de alto nivel tambin
tiene que traducirse a un cdigo que pueda utili!ar la m"quina. .os programas
traductores que pueden reali!ar esta operacin se llaman co&"iladores! Dstos, como
los programas ensambladores avan!ados, pueden generar muc(as lneas de cdigo de
m"quina por cada proposicin del programa fuente. Se requiere una corrida de
compilacin antes de procesar los datos de un problema.
.os compiladores son aquellos cuya funcin es traducir un programa escrito en
un determinado lenguaje a un idioma que la computadora entienda %lenguaje m"quina
con cdigo binario&.
,l usar un lenguaje compilado, el programa desarrollado nunca se ejecuta
mientras (aya errores, sino (asta que luego de (aber compilado el programa, ya no
aparecen errores en el cdigo.
Len#$a%es inter"retados!
Se puede tambin utili!ar una alternativa diferente de los compiladores para
traducir lenguajes de alto nivel. En ve! de traducir el programa fuente y grabar en
forma permanente el cdigo objeto que se produce durante la corrida de compilacin
para utili!arlo en una corrida de produccin futura, el programador slo carga el
programa fuente en la computadora junto con los datos que se van a procesar. ,
continuacin, un programa intrprete, almacenado en el sistema operativo del disco, o
incluido de manera permanente dentro de la m"quina, convierte cada proposicin del
programa fuente en lenguaje de m"quina conforme vaya siendo necesario durante el
proceso de los datos. 4o se graba el cdigo objeto para utili!arlo posteriormente.
.a siguiente ve! que se utilice una instruccin, se le debe interpretar otra ve! y
traducir a lenguaje m"quina. Por ejemplo, durante el procesamiento repetitivo de los
pasos de un ciclo, cada instruccin del ciclo tendr" que volver a ser interpretado cada
ve! que se ejecute el ciclo, lo cual (ace que el programa sea m"s lento en tiempo de
ejecucin %porque se va revisando el cdigo en tiempo de ejecucin& pero m"s r"pido
en tiempo de dise$o %porque no se tiene que estar compilando a cada momento el
cdigo completo&. El intrprete elimina la necesidad de reali!ar una corrida de
compilacin despus de cada modificacin del programa cuando se quiere agregar
funciones o corregir errores7 pero es obvio que un programa objeto compilado con
antelacin deber" ejecutarse con muc(a mayor rapide! que uno que se debe
interpretar a cada paso durante una corrida de produccin.
Len#$a%es de "ro#ra&acin declarati)os!
Se les conoce como lenguajes declarativos en ciencias computacionales a
aquellos lenguajes de programacin en los cuales se le indica a la computadora qu es
lo que se desea obtener o qu es lo que se esta buscando.
.a programacin declarativa es una forma de programacin que implica la
descripcin de un problema dado en lugar de proveer una solucin para dic(o
problema, dejando la interpretacin de los pasos especficos para llegar a dic(a
solucin a un intrprete no especificado. .a programacin declarativa adopta, por lo
tanto, un enfoque diferente al de la programacin imperativa tradicional.
En otras palabras, la programacin declarativa provee el :qu:, pero deja el
:cmo: liberado a la implementacin particular del intrprete. Por lo tanto se puede
ver que la programacin declarativa tiene dos fases bien diferenciadas, la declaracin
y la interpretacin.
.os lenguajes declarativos est"n orientados a buscar la solucin del problema,
sin preocuparse por la forma de llegar a ello7 es decir, el programador debe
concentrarse en la lgica del algoritmo, m"s que en el control de la secuencia. .os
programas est"n formados por un conjunto de definiciones o ecuaciones, las cuales
describen lo que debe ser calculado, no en s la forma de (acerlo. .as variables slo
pueden tener asignado un solo valor a lo largo de la ejecucin del programa, lo cual
implica que no puede existir asignacin destructiva. 6ebido a esto, cobra especial
importancia el uso del anidamiento y la recursividad.
.as listas representan la estructura fundamental de datos.
El orden de la ejecucin no resulta importante debido a que no existen efectos
colaterales7 es decir, que al calcular un valor, resulta imposible afectar el c"lculo de
otros y con esto se puede afirmar que cualquier secuencia de ejecucin deber"
conducir al mismo resultado.
.as expresiones o definiciones pueden ser usadas como valores y por lo tanto se
pueden tratar como argumentos de otras definiciones.El control de la ejecucin no es
responsabilidad del programador.
Entre los lenguajes declarativos podemos clasificar)
Pro#ra&acin l#ica
.a idea fundamental de la programacin lgica consiste en emplear la lgica
como lenguaje de programacin. .a lgica no es imperativa porque no sirve
para indicar cmo resolver un problema. .a lgica es declarativa porque sirve
para especificar qu problema resolver.
En la programacin lgica, se especifican las condiciones que satisfacen las
soluciones, se deducen las soluciones a partir de las condiciones y el nfasis
de todo est" en qu problema resolver. El problema se describe especificando
qu caracteri!a a sus posibles soluciones.
.a programacin lgica, junto con la funcional, forma parte de lo que se
conoce como programacin declarativa. En los lenguajes tradicionales, la
programacin consiste en indicar cmo resolver un problema mediante
sentencias7 en la programacin lgica, se trabaja de forma descriptiva,
estableciendo relaciones entre entidades, indicando no cmo, sino qu (acer.
Se establece entonces que la idea esencial de la programacin lgica es)
al#orit&os - l#ica + control! Es decir, un algoritmo se construye
especificando conocimiento en un lenguaje formal y el problema se resuelve
mediante un mecanismo de inferencia que act#a sobre aqul.
,l (acer un recorrido por la programacin lgica, aparece como uno de sus
lenguajes m"s representativos, Prolog, que es un cl"sico de la inteligencia
artificial y que se aplica de m#ltiples formas en el desarrollo de software
comercial.
Pro#ra&acin f$ncional
.a programacin funcional es un paradigma de programacin declarativa
basado en la utili!acin de funciones matem"ticas. El objetivo de la
programacin funcional es conseguir lenguajes expresivos y matem"ticamente
elegantes, en los que no sea necesario bajar al nivel de la m"quina para
describir el proceso llevado a cabo por el programa.
.os programas escritos en un lenguaje funcional est"n constituidos
#nicamente por definiciones de funciones, entendiendo stas no como
subprogramas cl"sicos de un lenguaje imperativo, sino como funciones
puramente matem"ticas, en las que se verifican ciertas propiedades como la
transparencia referencial, y por tanto, la carencia total de efectos laterales.
Ctras caractersticas propias de estos lenguajes son la no existencia de
asignaciones de variables y la falta de construcciones estructuradas como la
secuencia o la iteracin. Existen dos grandes categoras de lenguajes
funcionales) los funcionales puros y los (bridos. .a diferencia entre ambos
estriba en que los lenguajes funcionales (bridos son menos dogm"ticos que
los puros, al permitir conceptos tomados de los lenguajes imperativos, como
las secuencias de instrucciones o la asignacin de variables. En contraste, los
lenguajes funcionales puros tienen una mayor potencia expresiva,
conservando a la ve! su transparencia referencial, algo que no se cumple
siempre con un lenguaje (brido.
Pro#ra&acin orientada a ,ases de datos
.as bases de datos son programas que administran informacin y (acen m"s
ordenada la informacin, aparte de (acer la f"cil de buscar y por supuesto de
encontrar.
.as caractersticas de las bases de datos pueden ser ventajosas o
desventajosas) pueden ayudar a almacenar, organi!ar, recuperar, comunicar y
manejar informacin en formas que seran imposibles sin las computadoras,
pero tambin afecta de alguna manera ya que existen enormes cantidades de
informacin en bases de datos de las que no se tiene control del acceso.
.as bases de datos tienen muc(os usos) facilitan el almacenamiento de
grandes cantidades de informacin7 permiten la recuperacin r"pida y flexible
de informacin, con ellas se puede organi!ar y reorgani!ar la informacin, as
como imprimirla o distribuirla en formas diversas.
Es claro que los lenguajes orientados a bases de datos son declarativos y no
imperativos, pues el problema es :qu: se quiere (acer o :qu: se necesita
buscar y encontrar en la base de datos, y no se enfati!a el :cmo:.
3na base de datos tambin se puede definir como un banco de datos o
conjunto de datos que pertenecen al mismo contexto, almacenados
sistem"ticamente para su posterior uso. .os sistemas gestores de bases de
datos %SE96& permiten almacenar y posteriormente acceder a los datos de
forma r"pida y estructurada.
Len#$a%es de "ro#ra&acin i&"erati)os!
Se llama lenguajes imperativos a aquellos en los cuales se le ordena a la
computadora cmo reali!ar una tarea siguiendo una serie de pasos o instrucciones. El
proceso anterior se puede reali!ar con un lenguaje imperativo como por ejemplo
9,S*', ', 'FF, Gava, 'lipper, 6base, 'H, PAP, Perl, etc.
6entro de la programacin imperativa, se tiene un conjunto de instrucciones
que le indican al computador c&o reali!ar una tarea.
.os lenguajes imperativos se basan en comandos u rdenes que se le dan a la
computadora para que (aga algo, con el fin de organi!ar o cambiar valores en ciertas
partes de la memoria.
.a ejecucin de estos comandos se reali!a, en la mayor parte de ellos,
secuencialmente, es decir, (asta que un comando no (a sido ejecutado no se lee el
siguiente. Seg#n el dominio, o mejor dic(o con el propsito que se utili!a el
programa, se puede (ablar de lenguajes de dominio especfico y de dominio general.
.enguajes imperativos procedurales es la aplicacin quien controla qu
porciones de cdigo se ejecuta, y la secuencia en que este se ejecuta. .a ejecucin de
la aplicacin se inicia con la primera lnea de cdigo, y sigue una ruta predefinida a
travs de la aplicacin, llamando procedimientos seg#n sea necesario. .os lenguajes
procedurales est"n fundamentados en la utili!acin de variables para almacenar
valores y en la reali!acin de operaciones con los datos almacenados.
En este tipo de lenguajes, la arquitectura consta de una secuencia de celdas,
llamadas memoria, en las cuales se pueden guardar en forma codificada, lo mismo
datos que instrucciones7 y de un procesador, el cual es capa! de ejecutar de manera
secuencial una serie de operaciones, principalmente aritmticas y booleanas, llamadas
comandos. En general, un lenguaje procedural ofrece al programador conceptos que
se traducen de forma natural al modelo de la m"quina. El programador tiene que
traducir la solucin abstracta del problema a trminos muy primitivos, cercanos a la
m"quina.
'on un lenguaje procedural el usuario %normalmente ser" un programador&
especifica qu datos se necesitan y cmo obtenerlos. Esto quiere decir que el usuario
debe especificar todas las operaciones de acceso a datos llamando a los
procedimientos necesarios para obtener la informacin requerida. Estos lenguajes
acceden a un registro, lo procesan y bas"ndose en los resultados obtenidos, acceden a
otro registro, que tambin deben procesar. ,s se va accediendo a registros y se van
procesando (asta que se obtienen los datos deseados. .as sentencias de un lenguaje
procedural deben estar embebidas en un lenguaje de alto nivel, ya que se necesitan
sus estructuras %bucles, condicionales, etc.& para obtener y procesar cada registro
individual.
Len#$a%es de "ro#ra&acin orientados a o,%etos
En la Programacin Crientada a Cbjetos se definen los programas en trminos
de :clases de objetos:, objetos que son entidades que combinan estado %es decir,
datos& comportamiento %esto es, procedimientos o mtodos& e identidad %propiedad
del objeto que lo diferencia del resto&. .a programacin orientada a objetos expresa
un programa como un conjunto de estos objetos, que colaboran entre ellos para
reali!ar tareas. Esto permite (acer los programas mdulos m"s f"ciles de escribir,
mantener y reutili!ar.
6e esta forma, un objeto contiene toda la informacin, %los denominados
atributos& que permite definirlo e identificarlo frente a otros objetos pertenecientes a
otras clases %e incluso entre objetos de la misma clase, al poder tener valores bien
diferenciados en sus atributos&. , su ve!, dispone de mecanismos de interaccin %los
llamados mtodos& que favorecen la comunicacin entre objetos %de una misma clase
o de distintas&, y en consecuencia, el cambio de estado en los propios objetos. Esta
caracterstica lleva a tratarlos como unidades indivisibles, en las que no se separan %ni
deben separarse& informacin %datos& y procesamiento %mtodos&.
.as principales diferencias entre la programacin imperativa y la programacin
orientada a objetos)
.a programacin orientada a objetos es m"s moderna, es una evolucin de la
programacin imperativa plasmada en el dise$o de una familia de lenguajes
conceptos que existan previamente, con algunos nuevos.
.a programacin orientada a objetos se basa en lenguajes que soportan
sint"ctica y sem"nticamente la unin entre los tipos abstractos de datos y sus
operaciones %a esta unin se la suele llamar clase&.
.a programacin orientada a objetos incorpora en su entorno de ejecucin
mecanismos tales como el polimorfismo y el envo de mensajes entre objetos.
Trad$ctores!
'efinicin!
3n traductor %compilador o intrprete& es un software que lee un programa
escrito en un lenguaje %len#$a%e f$ente& y lo traduce a un programa equivalente en
otro lenguaje %len#$a%e o,%eto&. 'omo parte importante de este proceso de
traduccin, el traductor informa a su usuario de la presencia de errores en el programa
fuente. %5ig. =.>&
.i#$ra 1! 1! Trad$ctor!
Eta"as del "roceso de trad$ccin!
El proceso de traduccin se divide en dos fases o etapas)
.ase de an*lisis.+ .a parte del an"lisis divide al programa fuente en sus
elementos componentes y crea una representacin intermedia del programa
fuente.
.ase de s/ntesis.+ .a parte de la sntesis construye el programa objeto deseado
a partir de la representacin intermedia.
6e las dos partes, la sntesis es la que requiere las tcnicas m"s especiali!adas.
,dem"s de un traductor, se pueden necesitar otros programas para crear un
programa objeto ejecutable. 3n programa fuente se puede dividir en mdulos
almacenados en arc(ivos distintos. .a tarea de reunir el programa fuente a menudo se
confa a un programa distinto, llamado preprocesador. El preprocesador tambin
puede expandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente.
Es #til pensar en estas fases como en pie!as separadas dentro del traductor, y
pueden en realidad escribirse como operaciones codificadas separadamente aunque en
la pr"ctica a menudo se integren juntas.
.ase de An*lisis
Anlisis lxico
El an"lisis lxico constituye la primera fase, aqu se lee el programa fuente de
i!quierda a derec(a y se agrupa en co&"onentes l01icos %toIens&, que son secuencias
de caracteres que tienen un significado. ,dem"s, todos los espacios en blanco, lneas
en blanco, comentarios y dem"s informacin innecesaria se elimina del programa
fuente. -ambin se comprueba que los smbolos del lenguaje %palabras clave,
operadores,...& se (an escrito correctamente.
'omo la tarea que reali!a el anali!ador lxico es un caso especial de
coincidencia de patrones, se necesitan los mtodos de especificacin y
reconocimiento de patrones, y estos mtodos son principalmente las expresiones
regulares y los autmatas finitos. Sin embargo, un anali!ador lxico tambin es la
parte del traductor que maneja la entrada del cdigo fuente, y puesto que esta entrada
a menudo involucra un importante gasto de tiempo, el anali!ador lxico debe
funcionar de manera tan eficiente como sea posible.
Anlisis sintctico
En esta fase los caracteres o componentes lxicos se agrupan jer"rquicamente
en frases gramaticales que el compilador utili!a para sinteti!ar la salida. Se
comprueba si lo obtenido de la fase anterior es sint"cticamente correcto %obedece a la
gram"tica del lenguaje&. Por lo general, las frases gramaticales del programa fuente se
representan mediante un *r,ol de an*lisis sint*ctico.
.a estructura jer"rquica de un programa normalmente se expresa utili!ando
reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la
definicin de expresiones)
=. 'ualquier identificador es una expresin.
J. 'ualquier n(&ero es una expresin.
K. Si e1"resin1 y e1"resin2 son expresiones, entonces tambin lo son)
e1"resin1 F e1"resin2
e1"resin1 L e1"resin2
% e1"resin1 &
.as reglas = y J son reglas b"sicas %no recursivas&, en tanto que la regla K define
expresiones en funcin de operadores aplicados a otras expresiones.
.a divisin entre an"lisis lxico y an"lisis sint"ctico es algo arbitraria. 3n factor
para determinar la divisin es si una construccin del lenguaje fuente es
in(erentemente recursiva o no. .as construcciones lxicas no requieren recursin,
mientras que las construcciones sint"cticas suelen requerirla. 4o se requiere recursin
para reconocer los identificadores, que suelen ser cadenas de letras y dgitos que
comien!an con una letra. 4ormalmente, se reconocen los identificadores por el
simple examen del flujo de entrada, esperando (asta encontrar un car"cter que no sea
ni letra ni dgito, y agrupando despus todas las letras y dgitos encontrados (asta ese
punto en un componente lxico llamado identificador. Por otra parte, esta clase de
an"lisis no es suficientemente poderoso para anali!ar expresiones o proposiciones.
Por ejemplo, no podemos emparejar de manera apropiada los parntesis de las
expresiones, o las palabras ,e#in y end en proposiciones sin imponer alguna clase de
estructura jer"rquica o de anidamiento a la entrada.
Anlisis semntico
.a fase de an"lisis sem"ntico revisa el programa fuente para tratar de encontrar
errores sem"nticos y re#ne la informacin sobre los tipos para la fase posterior de
generacin de cdigo. En ella se utili!a la estructura jer"rquica determinada por la
fase de an"lisis sint"ctico para identificar los operadores y operandos de expresiones
y proposiciones.
3n componente importante del an"lisis sem"ntico es la verificacin de tipos.
,qu, el compilador verifica si cada operador tiene operandos permitidos por la
especificacin del lenguaje fuente. Por ejemplo, las definiciones de muc(os lenguajes
de programacin requieren que el compilador indique un error cada ve! que se use un
n#mero real como ndice de una matri!. Sin embargo, la especificacin del lenguaje
puede imponer restricciones a los operandos, por ejemplo, cuando un operador
aritmtico binario se aplica a un n#mero entero y a un n#mero real.
.ase de s/ntesis

'onsiste en generar el cdigo objeto equivalente al programa fuente. Slo se
genera cdigo objeto cuando el programa fuente est" libre de errores de an"lisis, lo
cual no quiere decir que el programa se ejecute correctamente, ya que un programa
puede tener errores de concepto o expresiones mal calculadas. Por lo general el
cdigo objeto es cdigo de m"quina relocali!able o cdigo ensamblador. .as
posiciones de memoria se seleccionan para cada una de las variables usadas por el
programa. 6espus, cada una de las instrucciones intermedias se traduce a una
secuencia de instrucciones de m"quina que ejecuta la misma tarea. 3n aspecto
decisivo es la asignacin de variables a registros.
Generacin de cdi#o inter&edio
6espus de los an"lisis sint"ctico y sem"ntico, algunos compiladores generan
una representacin intermedia explcita del programa fuente. Se puede considerar esta
representacin intermedia como un programa para una m"quina abstracta. Esta
representacin intermedia debe tener dos propiedades importantes7 debe ser f"cil de
producir y f"cil de traducir al programa objeto.
.a representacin intermedia puede tener diversas formas. Existe una forma
intermedia llamada :cdigo de tres direcciones: que es como el lenguaje ensamblador
de una m"quina en la que cada posicin de memoria puede actuar como un registro.
El cdigo de tres direcciones consiste en una secuencia de instrucciones, cada una de
las cuales tiene como m"ximo tres operandos. Esta representacin intermedia tiene
varias propiedades)
Primera.+ 'ada instruccin de tres direcciones tiene a lo sumo un
operador, adem"s de la asignacin, por tanto, cuando se generan estas
instrucciones, el traductor tiene que decidir el orden en que deben
efectuarse las operaciones.
Segunda.+ El traductor debe generar un nombre temporal para guardar los
valores calculados por cada instruccin.
-ercera.+ ,lgunas instrucciones de :tres direcciones: tienen menos de tres
operandos, por ejemplo, la asignacin.
O"ti&i3acin de cdi#o
.a fase de optimi!acin de cdigo consiste en mejorar el cdigo intermedio, de
modo que resulte un cdigo m"quina m"s r"pido de ejecutar. Esta fase de la etapa de
sntesis es posible sobre todo si el traductor es un compilador %difcilmente un
interprete puede optimi!ar el cdigo objeto&. Aay muc(a variacin en la cantidad de
optimi!acin de cdigo que ejecutan los distintos compiladores. En los que (acen
muc(a optimi!acin, llamados :compiladores optimi!adores:, una parte significativa
del tiempo del compilador se ocupa en esta fase. Sin embargo, (ay optimi!aciones
sencillas que mejoran sensiblemente el tiempo de ejecucin del programa objeto sin
retardar demasiado la compilacin.
Ti"os de trad$ctores
Existen dos tipos importantes de traductores)
.os que van adaptando las instrucciones conforme son encontradas. , este
proceso se lo llama inter"retar y a los programas que lo (acen se los conoce
como int0r"retes. .a traduccin es simult"nea y se produce de forma
dialogada con el programador.
.os que convierten el conjunto de instrucciones en lenguaje de programacin,
al programa equivalente escrito en lenguaje de m"quina. , ese proceso se lo
llama co&"ilar y al programa traductor se le denomina co&"ilador. 4o se
reali!a simult"neamente y no (ay un dialogo con el programador durante la
programacin.
Int0r"rete
3n int0r"rete es un programa inform"tico capa! de anali!ar y ejecutar otros
programas, escritos en un lenguaje de alto nivel. .os intrpretes se diferencian de los
compiladores en que mientras estos traducen un programa desde su descripcin en un
lenguaje de programacin al cdigo m"quina del sistema destino, los primeros %los
intrpretes& slo reali!an la traduccin a medida que sea necesario, tpicamente,
instruccin por instruccin, y normalmente no guardan el resultado de dic(a
traduccin.
.os programas interpretados suelen ser m"s lentos que los compilados debido a
la necesidad de traducir el programa mientras se ejecuta, pero a cambio son m"s
flexibles como entornos de programacin y depuracin %lo que se traduce, por
ejemplo, en una mayor facilidad para reempla!ar partes enteras del programa o a$adir
mdulos completamente nuevos&, y permiten ofrecer al programa interpretado un
entorno no dependiente de la m"quina donde se ejecuta el intrprete, sino del propio
intrprete %lo que se conoce com#nmente como m"quina virtual&.
'omparando su actuacin con la de un ser (umano, un compilador equivale a
un traductor profesional que, a partir de un texto, prepara otro independiente
traducido a otra lengua, mientras que un intrprete corresponde al intrprete (umano,
que traduce de viva vo! las palabras que oye, sin dejar constancia por escrito.
En la actualidad, uno de los entornos m"s comunes de uso de los intrpretes
inform"ticos es *nternet, debido a la posibilidad que estos tienen de ejecutarse
independientemente de la plataforma.
Co&"ilador
3n co&"ilador es un programa inform"tico que traduce un programa escrito en
un lenguaje de programacin a otro lenguaje de programacin, generando un
programa equivalente que la m"quina ser" capa! de interpretar. 3sualmente el
segundo lenguaje es cdigo m"quina, pero tambin puede ser simplemente texto. Este
proceso de traduccin se conoce como compilacin.
3n co&"ilador es un programa que permite traducir el cdigo fuente de un
programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior %tpicamente
lenguaje m"quina&. 6e esta manera un programador puede dise$ar un programa en un
lenguaje muc(o m"s cercano a cmo piensa un ser (umano, para luego compilarlo a
un programa m"s manejable por una computadora.
4ormalmente los compiladores est"n divididos en dos partes %5ig. =.@&)
Front End) es la parte que anali!a el cdigo fuente, comprueba su valide!,
genera el "rbol de derivacin y rellena los valores de la tabla de smbolos.
Esta parte suele ser independiente de la plataforma o sistema para el cual
se vaya a compilar.
Back End) es la parte que genera el cdigo m"quina, especfico de una
plataforma, a partir de los resultados de la fase de an"lisis, reali!ada por el
Front End.
.i#$ra 1! 2! Partes de $n co&"ilador
Esta divisin permite que el mismo Back End se utilice para generar el cdigo
m"quina de varios lenguajes de programacin distintos y que el mismo Front End que
sirve para anali!ar el cdigo fuente de un lenguaje de programacin concreto sirva
para generar cdigo m"quina en varias plataformas distintas.
El cdigo que genera el Back End normalmente no se puede ejecutar
directamente, sino que necesita ser enla!ado por un programa enla!ador %linker&.
CAPITULO 2
INTRO'UCCI4N A LA PROGRAMACI4N ORIENTA'A A
O5JETO6
2!1! Introd$ccin a la "ro#ra&acin orientada a o,%etos!
6esde principios de la era computacional se crearon diversas tcnicas de
programacin que a medida (an evolucionado para poder adaptarse a nuevos retos y
poder crear soluciones m"s realistas que se amolden a el entorno real.
Podemos notar que a inicios la programacin era no estructurada. Este estilo de
Pro#ra&acin No Estr$ct$rada, consista en un solo programa principal, el cual se
establece como una secuencia de comandos o instrucciones que modifican datos que
son a su ve! globales en el transcurso de todo el programa.
Esta tcnica de programacin no estructurada ofrece tremendas desventajas una
ve! que el programa se (ace suficientemente grande. Por ejemplo, si la misma
secuencia de instrucciones se necesita en diferentes situaciones dentro del programa,
la secuencia debe ser repetida. Esto (a llevado a la idea de extraer estas secuencias,
dando origen a nuevas tcnicas como lo son la programacin procedimental y
modular, conducindonos a un estilo de programacin estructurada.
.a Pro#ra&acin Estr$ct$rada es un mtodo de programacin basado sobre
el concepto de la unidad y del alcance. .a programacin estructurada ofrece muc(as
ventajas sobre la programacin secuencial, es m"s f"cil de leer y m"s conservable7
siendo muy flexible, facilitando el buen dise$o de programas.
.a programacin estructurada, es un estilo de programacin con el cual el
programador elabora programas, cuya estructura es la m"s clara posible, mediante el
uso de tres estructuras b"sicas de control lgico) secuencia, seleccin e iteracin.
.os programas son m"s f"ciles de entender. 3n programa estructurado puede
ser ledo en secuencia, de arriba (acia abajo, sin necesidad de estar saltando de un
sitio a otro en la lgica, lo cual es tpico de otros estilos de programacin. .a
estructura del programa es m"s clara puesto que las instrucciones est"n m"s ligadas o
relacionadas entre si, por lo que es m"s f"cil comprender lo que (ace cada funcin.
2educcin del esfuer!o en las pruebas. El programa se puede tener listo para
produccin normal en un tiempo menor del tradicional7 por otro lado, el seguimiento
de las fallas o depuracin se facilita debido a la lgica m"s visible, de tal forma que
los errores se pueden detectar y corregir m"s f"cilmente. .os programas quedan
mejor documentados internamente.
, pesar de las m#ltiples ventajas que ofrecen la programacin estructurada,
surge necesidades y problemas complejos los cuales necesitan recrear o representar
mundos reales, lo cual, se dificulta con la tcnicas de programacin estructurada.
.a Pro#ra&acin Orientada a O,%etos %PCC& aporta un nuevo enfoque a los
retos que se plantean en la programacin estructurada cuando los problemas a
resolver son complejos. ,l contrario que la programacin procedimental que enfati!a
en los algoritmos, la PCC enfati!a en los datos. En lugar de intentar ajustar un
problema al enfoque procedimental de un lenguaje, PCC intenta ajustar el lenguaje al
problema. .a idea es dise$ar formatos de datos que se correspondan con las
caractersticas esenciales de un problema. .os lenguajes orientados combinan en una
#nica unidad o mdulo, tanto los datos como las funciones que operan sobre esos
datos. -al unidad se llama objeto. Si se desea modificar los datos de un objeto, (ay
que reali!arlo mediante las funciones miembro del objeto. 4inguna otra funcin
puede acceder a los datos. Esto simplifica la escritura, depuracin y mantenimiento
del programa.
.a tecnologa orientada a objetos se define como una metodologa de dise$o de
software que modela las caractersticas de objetos reales o abstractos por medio del
uso de clases y objetos. Aoy en da, la orientacin a objetos es fundamental en el
desarrollo de software, sin embargo, esta tecnologa no es nueva, sus orgenes se
remontan a la dcada de los a$os sesenta %Simula, uno de los lenguajes de
programacin orientados a objetos m"s antiguos, fue desarrollado en =?MN&.
.a Pro#ra&acin Orientada a O,%etos, la podemos definir como una tcnica
o estilo de programacin que utili!a objetos como bloque esencial de construccin.
,S'3*
El o,%eto, es el concepto principal sobre el cual se fundamenta la programacin
orientada a objetos, el cual puede ser visto como una entidad que posee atributos y
efect#a acciones. En el mundo real podemos encontrar cientos de ejemplos que
cumplen con sta definicin, algunos de ellos son) una bicicleta, un automvil, una
persona, una computadora, etc.
.os programas creados con la PCC, se organi!an como un conjunto finito de
objetos que contienen datos y operaciones %funciones miembro en C++& que llaman a
esos datos y que se comunican entre s mediante mensajes.%5igura J.=&.

.i#$ra 2! 1! Re"resentacin POO!
3n programa orientado a objetos es una coleccin de clases.
4ecesita de una funcin principal que cree objetos y comience la ejecucin
mediante la invocacin de sus funciones o mtodos.
En primer lugar, se crean los objetos. Segundo, los mensajes se envan desde
unos objetos y se reciben en otros a medida que el programa se ejecuta. O tercero, se
borran los objetos cuando ya no son necesarios y se recupera la memoria ocupada por
ellos.
.os objetos son tipos de datos abstractos definidos por el programador. En
realidad son unidades que contienen datos y funciones que operan sobre esos datos.
, los objetos tambin se les conoce como instancias de clase. , los elementos
de un objeto se les conoce como miembros %datos miembros y funciones miembro&.
2!1!1! Caracter/sticas de la POO
.as caractersticas m"s importantes que debe soportar un lenguaje que lo
definen como :orientado a objetos:, son)
,bstraccin.
Encapsulamiento.
Principio de ocultacin.
Polimorfismo.
Aerencia.
2ecoleccin de basura.
2!1!1!1! A,straccin!
6enota las caractersticas esenciales de un objeto, donde se capturan sus
comportamientos. 'ada objeto en el sistema sirve como modelo de un :agente:
abstracto que puede reali!ar trabajo, informar y cambiar su estado, y :comunicarse:
con otros objetos en el sistema sin revelar cmo se implementan estas caractersticas.
.os procesos, las funciones o los mtodos pueden tambin ser abstrados y cuando lo
est"n, una variedad de tcnicas son requeridas para ampliar una abstraccin.
3n ejemplo de esto puede identificarse en un automvil. ,unque se observa un
automvil como un #nico ente, este estar" compuesto por) caractersticas y mtodos o
funciones. %5igura J.J&.
.i#$ra 2! 2! O,%eto a,stracto7 a$to&)il!
2!1!1!2! Enca"s$la&iento!
Significa reunir a todos los elementos que pueden considerarse pertenecientes a
una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar la co(esin
de los componentes del sistema.
.a encapsulacin es un mecanismo que consiste en organi!ar datos y mtodos
de una estructura, conciliando el modo en que el objeto se implementa, es decir,
evitando el acceso a datos por cualquier otro medio distinto a los especificados. Por lo
tanto, la encapsulacin garanti!a la integridad de los datos que contiene un objeto.
El encapsulamiento nos permite considerar a los objetos como cajas negras)
como objetos que podemos utili!ar sin enfocarnos en la forma en que trabajan.
Ejemplo) en un automvil, un mec"nico debe saber cmo trabaja el motor, la
transmisin, etc., pero un conductor, puede usar estos componentes sin preocuparse
por estos detalles, el automvil encapsula todos los detalles de las partes que lo
constituyen, por lo que un conductor tan solo necesita conocer su interfa!) el
acelerador, el freno y el volante.
2!1!1!8! Princi"io de oc$ltacin!
'ada objeto est" aislado del exterior, es un mdulo natural, y cada tipo de
objeto expone una interfa! a otros objetos que especfica cmo pueden interactuar
con los objetos de la clase. El aislamiento protege a las propiedades de un objeto
contra su modificacin por quien no tenga derec(o a acceder a ellas, solamente los
propios mtodos internos del objeto pueden acceder a su estado. Esto asegura que
otros objetos no pueden cambiar el estado interno de un objeto de maneras
inesperadas, eliminando efectos secundarios e interacciones inesperadas. ,lgunos
lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto
de una manera controlada y limitando el grado de abstraccin. .a aplicacin entera se
reduce a un agregado o rompecabe!as de objetos.
El usuario de una clase en particular no necesita saber cmo est"n estructurados
los datos dentro de ese objeto, es decir, un usuario no necesita conocer la
implementacin ,l evitar que el usuario modifique los atributos directamente y
for!"ndolo a utili!ar funciones definidas para modificarlos %llamadas interfaces&, se
garanti!a la integridad de los datos %por ejemplo, uno puede asegurarse de que el tipo
de datos suministrados cumple con nuestras expectativas bien que los se encuentran
dentro del periodo de tiempo esperado&.
.a encapsulacin define los niveles de acceso para elementos de esa clase.
Estos niveles de acceso definen los derec(os de acceso para los datos, permitindonos
el acceso a datos a travs de un mtodo de esa clase en particular, desde una clase
(eredada o incluso desde cualquier otra clase. Existen tres niveles de acceso)
P(,lico) funciones de toda clase pueden acceder a los datos o mtodos de una
clase que se define con el nivel de acceso pblico. Este es el nivel de
proteccin de datos m"s bajo
Pri)ado) el acceso a los datos est" restringido a los mtodos de esa clase en
particular. Este es nivel m"s alto de proteccin de datos
Prote#ido) el acceso a los datos est" restringido a las funciones de clases
(eredadas, es decir, las funciones miembro de esa clase y todas las subclases
2!1!1!9! Poli&orfis&o
'omportamientos diferentes, asociados a objetos distintos, pueden compartir el
mismo nombre, al llamarlos por ese nombre se utili!ar" el comportamiento
correspondiente al objeto que se est usando. C dic(o de otro modo, las referencias y
las colecciones de objetos pueden contener objetos de diferentes tipos, y la
invocacin de un comportamiento en una referencia producir" el comportamiento
correcto para el tipo real del objeto referenciado. 'uando esto ocurre en :tiempo de
ejecucin:, esta #ltima caracterstica se llama asignacin tarda o asignacin
din"mica. ,lgunos lenguajes proporcionan medios m"s est"ticos %en :tiempo de
compilacin:& de polimorfismo, tales como las plantillas y la sobrecarga de
operadores de 'FF.
Poli&orfis&o de so,recar#a! El polimorfismo de sobrecarga ocurre cuando
las funciones del mismo nombre existen, con funcionalidad similar, en clases que son
completamente independientes una de otra %stas no tienen que ser clases secundarias
de la clase objeto&. Por ejemplo, la clase complex, la clase image y la clase linI
pueden todas tener la funcin :display:. Esto significa que no necesitamos
preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que
deseamos es verlo en la pantalla. Por lo tanto, el polimorfismo de sobrecarga nos
permite definir operadores cuyos comportamientos varan de acuerdo a los
par"metros que se les aplican. ,s es posible, por ejemplo, agregar el operador + y
(acer que se comporte de manera distinta cuando est" (aciendo referencia a una
operacin entre dos n#meros enteros %suma& o bien cuando se encuentra entre dos
cadenas de caracteres %concatenacin&.
Poli&orfis&o "ara&0trico %tambin llamado polimorfismo de plantillas&. El
polimorfismo paramtrico es la capacidad para definir varias funciones utili!ando el
mismo nombre, pero usando par"metros diferentes %nombre yPo tipo&. El
polimorfismo paramtrico selecciona autom"ticamente el mtodo correcto a aplicar
en funcin del tipo de datos pasados en el par"metro. Por lo tanto, podemos por
ejemplo, definir varios mtodos (omnimos de addition%& efectuando una suma de
valores.
El mtodo int addition%int, int& devolvera la suma de dos enteros.
float addition%float, float& devolvera la suma de dos flotantes.
c(ar addition%c(ar, c(ar& dara por resultado la suma de dos caracteres.
Poli&orfis&o de incl$sin %tambin llamado redefinicin o subtipado&. .a
(abilidad para redefinir un mtodo en clases que se (ereda de una clase base se llama
es"eciali3acin. Por lo tanto, se puede llamar un mtodo de objeto sin tener que
conocer su tipo intrnseco) esto es "oli&orfis&o de s$,ti"ado. Permite no tomar en
cuenta detalles de las clases especiali!adas de una familia de objetos,
enmascar"ndolos con una interfa! com#n %siendo esta la clase b"sica&. *magine un
juego de ajedre! con los objetos rey, reina, alfil, caballo, torre y pen, cada uno
(eredando el objeto pie!a. El mtodo movimiento podra, usando polimorfismo de
subtipado, (acer el movimiento correspondiente de acuerdo a la clase objeto que se
llama. Esto permite al programa reali!ar el movimiento de pie!a sin tener que verse
conectado con cada tipo de pie!a en particular.
2!1!1!:! ;erencia!
Por (erencia se entiende la capacidad de poder crear nuevas clases a partir de
alguna anterior, de forma que las nuevas :(eredan: las caractersticas de sus ancestros
%propiedades y mtodos&. Se trata por tanto de la capacidad de crear nuevos tipos de
datos a partir de los anteriores. 3na caracterstica especial de la (erencia es que si se
cambia el comportamiento de la clase antecesora %tambin llamada padre, base o
super&, tambin cambiar" el comportamiento de las clases derivadas de ella
%descendientes&. 'omo puede deducirse f"cilmente, la (erencia establece lo que se
llama una jerarqua de clases del mismo aspecto que el "rbol genealgico de una
familia. Se entiende tambin que estos conceptos representan niveles de abstraccin
que permiten acercar la programacin a la realidad del mundo fsico tal como lo
concebimos. Por ejemplo, todas las guitarras, ya sean Elctricas, Electro,c#sticas o
normales, cumplen con caractersticas similares como n#mero de cuerdas %M&, mtodo
de afinacin, cambio de tono, cambio de postura y rasgueo entre otras. Si no se
siguiera con una metodologa de (erencia, por cada clase %Euitarra Electrica y
Electro,c#stica& se tendra que repetir la definicin de todos los atributos y mtodos
que pertenecen a la clase padre Euitarra, que corresponde a la abstraccin m"s amplia
del concepto :Euitarra:. 8ediante el uso de la (erencia, se puede definir una clase
:Euitarra: que cumpla con todas las caractersticas generales del concepto guitarra y
sus evoluciones, con el fin de acotar el n#mero de especificaciones de las clases
:EuitarraElectrica: y :Electro,c#stica:, y permitir la (erencia a stas #ltimas clases
con las caractersticas del objeto padre. %5igura J.K&.
.i#$ra 2! 8! ;erencia!
2!1!1!<! Recoleccin de ,as$ra!
.a 2ecoleccin de basura o Earbage 'ollection es la tcnica por la cual el
ambiente de Cbjetos se encarga de destruir autom"ticamente, y por tanto desasignar
de la memoria, los Cbjetos que (ayan quedado sin ninguna referencia a ellos. Esto
significa que el programador no debe preocuparse por la asignacin o liberacin de
memoria, ya que el entorno la asignar" al crear un nuevo Cbjeto y la liberar" cuando
nadie lo est usando. En la mayora de los lenguajes (bridos que se extendieron para
soportar el Paradigma de Programacin Crientada a Cbjetos como 'FF u Cbject
Pascal, esta caracterstica no existe y la memoria debe desasignarse manualmente.
2!1!2! Uso de los len#$a%es de POO
,ctualmente una de las "reas m"s candentes en la industria y en el "mbito
acadmico es la orientacin a objetos. .a orientacin a objetos promete mejoras de
amplio alcance en la forma de dise$o, desarrollo y mantenimiento del software
ofreciendo una solucin a largo pla!o a los problemas y preocupaciones que (an
existido desde el comien!o en el desarrollo de software) la falta de portabilidad del
cdigo y reusabilidad, cdigo que es difcil de modificar, ciclos de desarrollo largos y
tcnicas de codificacin no intuitivas.
.a introduccin de tecnologa de objetos como una (erramienta conceptual para
anali!ar, dise$ar e implementar aplicaciones permite obtener aplicaciones m"s
modificables, f"cilmente extensibles y a partir de componentes reusables. Esta
reusabilidad del cdigo disminuye el tiempo que se utili!a en el desarrollo y (ace que
el desarrollo del software sea m"s intuitivo porque se piensa naturalmente en
trminos de objetos m"s que en trminos de algoritmos de software.
.a Programacin Crientada a Cbjetos ofrece algunas de ventajas respecto a
otros paradigmas de la programacin)
5omenta la reutili!acin y extensin del cdigo.
5acilita el mantenimiento del software.
Permite crear sistemas m"s complejos.
,gili!a el desarrollo de software.
5acilita la creacin de programas visuales.
5acilita el trabajo en equipo relacionar el sistema al mundo real.
2!2! Introd$ccin a las Clases = O,%etos!
2!2!1! Conce"tos Clases = O,%etos
3n o,%eto se define como la unidad que en tiempo de ejecucin reali!a las
tareas de un programa. -ambin a un nivel m"s b"sico se define como la instancia de
una clase.
Estos objetos interact#an unos con otros, en contraposicin a la visin
tradicional en la cual un programa es una coleccin de subrutinas %funciones o
procedimientos&, o simplemente una lista de instrucciones para el computador. 'ada
objeto es capa! de recibir mensajes, procesar datos y enviar mensajes a otros objetos
de manera similar a un servicio. %5igura J.>&.
3n o,%eto es una abstraccin encapsulada que tiene un estado interno como
dado por una lista de atributos cuyos valores son #nicos al objeto. El objeto tambin
conoce la lista de mensajes al que puede responder y cmo responder" en cada uno.
3n objeto est" constituido por)
Atri,$tos) estos son los datos que caracteri!an al objeto. Son variables que
almacenan datos relacionados al estado de un objeto.
M0todos %usualmente llamados funciones miembro&) .os mtodos de un
objeto caracteri!an su comportamiento, es decir, son todas las acciones
%denominadas operaciones& que el objeto puede reali!ar por s mismo. Estas
operaciones (acen posible que el objeto responda a las solicitudes externas %o
que act#e sobre otros objetos&. ,dem"s, las operaciones est"n estrec(amente
ligadas a los atributos, ya que sus acciones pueden depender de, o modificar,
los valores de un atributo.
.i#$ra 2! 9! Constit$cin de o,%etos!
3na clase es la estructura de un objeto, es decir, la definicin de todos los
elementos de que est" (ec(o un objeto. 3n objeto es, por lo tanto, el :resultado: de
una clase. En realidad, un objeto es una instancia de una clase, por lo que se pueden
intercambiar los trminos o,%eto o instancia %o incluso evento&.
.os objetos son miembros o pertenecen a una clase. 3na clase es un tipo
definido por el usuario que determina las estructuras de datos y las operaciones
asociadas con ese tipo. .as clases son como plantillas o modelos que describen cmo
se construyen ciertos tipos de objetos. *ncluye en su descripcin un nombre para el
tipo de objeto, una lista de atributos %y sus tipos&, y una lista de mensajes con
mtodos correspondientes al que un objeto de la clase puede responder. 'ada ve! que
se construye un objeto de una clase, se crea una instancia de esa clase.
3na clase se compone de dos partes)
Atri,$tos %denominados, por lo general, datos miembros&) esto es, los datos
que se refieren al estado del objeto
M0todos %denominados, por lo general, funciones miembros&) son funciones
que pueden aplicarse a objetos
2!2!2! 6inta1is de la definicin de clases
3na clase define la estructura que tendr"n los objetos que se creen a partir de
esta, la cual contiene las caractersticas de los objetos o atributos y los mtodos o
funciones miembros necesarios para modificar y evaluar los atributos. Se describen
tambin el tipo de ocultamiento que posee cada atributo y mtodo.
Si tenemos una clase llamada auto, los objetos Peugeot y Renault ser"n
instancias de esa clase. -ambin puede (aber otros objetos Peugeot 4!,
diferenciados por su n#mero de modelo. ,simismo, dos instancias de una clase
pueden tener los mismos atributos, pero considerarse objetos distintos independientes.
En un contexto real) dos camisas pueden ser idnticas, pero no obstante, tambin ser
diferentes de alguna manera. Sin embargo, si las me!clamos es imposible distinguir
una de la otra.
.a sintaxis tpica de una clase es)
clase Nombre {
"" #ariables miembro $%abitualmente pri&adas'
miembro_1; ""lista de miembros
miembro_2;
miembro_3;
...
"" Funciones o m(todos $%abitualmente pblicas'
funcion_miembro_1( ); ""funciones miembro conocidas
funcion_miembro_2 ( ); "" funciones como m(todos
...
"" Propiedades $%abitualmente pblicas'
propiedad_1;
propiedad_2;
propiedad_3;
...
}
2!2!8! Mensa%es = &0todos
.os objetos, las clases y sus instancias se comunican a travs del paso de
mensajes. Esto elimina la duplicacin de datos y garanti!a que no se propaguen los
efectos de los cambios en las estructuras de datos encapsuladas dentro de objetos
sobre otras partes del sistema. , menudo los mensajes se reali!an como llamadas a
funciones.
El &ensa%e es la accin que reali!a un objeto sobre otro, la peticin de servicio.
Se considera al mensaje como una llamada, posiblemente comprendido en el
tiempo de ejecucin, al objeto o clase que pide un servicio o la notificacin de un
suceso especfico.
3n mensaje es representado por un identificador, o combinacin de
identificadores que implican una accin para ser tomada por un objeto. .os mensajes
pueden ser simples o pueden incluir par"metros que afectan como el objeto receptor
responde. .a manera en que un objeto responde al mensaje puede tambin ser
afectado por los valores de sus atributos.
El &0todo es la respuesta al mensaje, la forma de proporcionar el servicio. 3n
mtodo consiste en la implementacin en una clase de un protocolo de respuesta a los
mensajes dirigidos a los objetos de la misma. .a respuesta a tales mensajes puede
incluir el envo por el mtodo de mensajes al propio objeto y aun a otros, tambin
como el cambio del estado interno del objeto.%5igura J.@&.
.i#$ra 2! :! Co&$nicacin entre o,%etos!
2!2!9! M0todos constr$ctores = destr$ctores
3n mtodo constructor es una funcin miembro especial que lleva a cabo la
iniciali!acin autom"tica de cada objeto de la clase en el momento en que se declara.
3n constructor es una funcin miembro p#blica con el mismo nombre de la clase, sin
indicacin de tipo devuelto y se ejecuta autom"ticamente al crearse un objeto de la
clase.
'uando un objeto no va a ser utili!ado, el espacio de memoria de din"mica que
utili!a (a de ser liberado, as como los recursos que posea, permitiendo al programa
disponer de todos los recursos posibles. , esta accin se la da el nombre de
destruccin del objeto.
El sistema de recogida de basura se ejecuta peridicamente, buscando objetos
que ya no estn referenciados.
-odas las clases tienen uno y slo un destructor. Si no se indica lo contrario, el
compilador genera un destructor por defecto cuya #nica funcin es liberar el espacio
que ocupan los miembros est"ticos %no reservados din"micamente& del objeto que se
destruye. El destructor es una funcin miembro que reali!a la tarea de Qlimpie!aR. 3n
destructor es una funcin miembro p#blica con el mismo nombre de la clase pero
precedido por el smbolo %>&, sin indicacin de tipo devuelto, que se ejecuta
autom"ticamente cuando se destruye un objeto.
2!2!:! 'efinicin de datos &ie&,ro
3n dato miembro representan los datos internos del objeto, se define fuera de
cualquier mtodo pero dentro de la clase, es una buena costumbre definirlos
inmediatamente despus de la llave que abre la clase, es decir antes de la definicin
de cualquier mtodo.
Para definir un dato miembro)
Modificador_de_visibilidad tipo nombre;
El tipo de un dato miembro puede ser un tipo de datos primitivo o un objeto.
.os modificadores de visibilidad controlan el acceso al dato miembro de la clase.
Pueden ser aplicados tanto a mtodos como a datos miembro y son)
P#blico
Privado
Protegidos
Si un mtodo o dato tiene visibilidad p#blica entonces puede ser referenciado
directamente desde fuera del objeto y si tiene visibilidad privada no puede ser
referenciada externamente solo puede ser usada dentro de la clase, si la visibilidad es
protegida solo podr" ser referenciada a travs de mtodos dentro de la misma clase
#nicamente. En general, si un mtodo ofrece servicios de una clase, puede ser
declarado con visibilidad p#blica. .a encapsulacin evita que los valores sean
cambiados por cualquiera. Por defecto la visibilidad es privada. .os datos miembros
de una clase tienen que ser privados, no p#blicos ni protegidos. 6e esta manera
aseguramos la encapsulacin de la clase.
2!2!<! 'efinicin de f$nciones &ie&,ro!
Son funciones que pueden aplicarse a los objetos, son las acciones o
operaciones que puede reali!ar un objeto. .as funciones pueden ser) est"ticas, no
est"ticas, constructoras, etc. Para definir una funcin)
Modificador_Visibilidad modificador_tipoe!reso nombre $par)metros'
* ""cuerpo
+
El modificador de visibilidad puede ser p#blico o privado. El tipo de regreso
puede ser) un tipo primitivo, una clase o bien sin retorno. .os nombres de las
funciones miembro %mtodos& de una clase tiene que ser autoexplicativos de la
finalidad de dic(os mtodos. 'omo ocurra con las funciones.
.as funciones miembros de una clase que no modifiquen los datos miembros ni
llamen a funciones que modifiquen los datos miembros de la misma deberan
declararse como constantes. 6e otra forma los objetos creados como constantes no
tendran acceso a las funciones miembro de la clase.
2!8! Estr$ct$ra de $n Pro#ra&a Orientado a O,%etos!
.a programacin orientada a objetos %PCC& es una de las tcnicas m"s
modernas de desarrollo que trata de disminuir el coste del software, aumentando la
eficiencia y reduciendo el tiempo de espera para la puesta en escena de una nueva
aplicacin. Por eso, donde la PCC toma verdadera ventaja es en poder compartir y
reutili!ar el cdigo. Existen varios lenguajes que permiten escribir un programa
orientado a objetos y entre ellos se encuentra 'FF. Se trata de un lenguaje de
programacin basado en el lenguaje ', compilado, estandari!ado, ampliamente
difundido, y con una biblioteca est"ndar 'FF que lo (a convertido en un lenguaje
universal, de propsito general, y ampliamente utili!ado tanto en el "mbito
profesional como en el educativo.
El lenguaje 'FF es tomado como lenguaje de aprendi!aje en este material de
apoyo por todas las caractersticas que nos brinda
C++ es un lenguaje de programacin dise$ado a mediados de los a$os =?<; por
9jarne Stroustrup. .a intencin de su creacin fue el extender al exitoso lenguaje de
programacin ' con mecanismos que permitan la manipulacin de objetos. En ese
sentido, desde el punto de vista de los lenguajes orientados a objetos, el 'FF es un
lenguaje (brido. Posteriormente se a$adieron facilidades de programacin genrica,
que se sum a los otros dos paradigmas que ya estaban admitidos %programacin
estructurada y la programacin orientada a objetos&. Por esto se suele decir que el 'F
F es un lenguaje de programacin multiparadigma.
3na particularidad del 'FF es la posibilidad de redefinir los operadores
%sobrecarga de operadores&, y de poder crear nuevos tipos que se comporten como
tipos fundamentales.
.a meta de 'FF es mejorar la productividad. Dsta viene por muc(os caminos,
pero el lenguaje est" dise$ado para ayudarle todo lo posible, y al mismo tiempo
dificultarle lo menos posible con reglas arbitrarias o alg#n requisito que use un
conjunto particular de caractersticas. 'FF est" dise$ado para ser pr"ctico7 las
decisiones de dise$o del lenguaje 'FF estaban basadas en proveer los beneficios
m"ximos al programador.
2!8!1! Estr$ct$ra de $n "ro#ra&a en C ++!
El lenguaje de programacin 'FF nos expresa un conjunto le reglas sem"nticas,
sint"cticas, lxico, necesarias para que la computadora pueda entender lo que se pide
o quiere, de no ser adecuada una expresin introducida no podr" ser entendida.
Existen variedad de errores sint"cticos que la maquina es capa! de discernir y
denunciar, para mayor facilidad del usuario.
3n programa en el lenguaje 'FF estar" compuesto por)
Co&entarios7 8uestra informacin en cuanto a que reali!a el programa, la
utilidad de las funciones, variables y objetos, estos no ser"n procesados por el
compilador.
Enca,e3ados7 se reali!an las llamadas y accesos a arc(ivos de 9iblioteca de
funciones est"ndar y dise$adas por los usuarios.
'efiniciones de "rototi"os) se definen las estructuras de nuevos tipos de
datos como lo son las clases, estructuras, etc., se implementan las funciones
que cumplir"n un objetivo determinado.
'eclaraciones #lo,ales7 Se manifiestan el uso de variables, objetos,
constantes, etc., el "mbito de estas se extiende desde el punto en el que se
definen (asta el final del programa, proporcionan un mecanismo de
intercambio de informacin entre funciones sin necesidad de utili!ar
argumentos. ,dem"s se declaran las existencias de funciones si no (an sido
implementadas.
'eclaraciones locales7 Se manifiesta la existencia de variables, objetos,
constantes, etc., que ser"n utili!adas en una funcin determinada o cuerpo, la
cual no podr" extender su "mbito de existencia fuera de la funcin.
'eclaracin de la f$ncin "rinci"al &ain? @7 .a funcin &ain es
imprescindible en cualquier programa 'P'FF representa el punto de inicio de
su ejecucin. Es la funcin de control principal de un programa, reflej"ndose
como el cuerpo del mismo programa.
I&"le&entacin = c$er"o de f$nciones) Se define la forma o cuerpo de una
funcin para resolver determinada tarea.
Ejemplo)
"include #iostream.$% "" Encabe,ados permite inclusin de biblioteca
class &unto { "" -efinicin de prototipo
public' int () *;
public'
&unto(int () int *) {(+,; *+,;}
int e(traer_(( )
{ return (; }
int e(traer_*( )
{ return *; }
};
&unto au(; "".bjeto au/ declarado global
void main( ) ""Cuerpo de Programa
*
&unto punto; "" .bjeto punto declarado local
cout ## -.oordenada /'- ## punto.e(traer_(( ) ## endl;
cout ## -.oordenada 0'- ## punto.e(traer_*( )## endl;
+
'omo observamos en el ejemplo, un programa ser" una secuencia de lneas que
contendr"n instrucciones, expresiones, sentencias, directivas de compilacin,
comentarios, smbolos, etc.
2!8!1!1! O"eradores de l/nea
En el lenguaje se utili!aran conjuntos de smbolos denominados o"eradores de
l/nea que permiten dar orden y control en las lneas de cdigo. Entre estos tenemos)
operador de separacin, operador de fin de instruccin, operadores de comentarios,
operadores de agrupacin o bloque.
2.3.1.1.1. Operadores de comentarios ( //, /* */)
Estos smbolos nos permiten indicar la presencia de un comentario, el cual no
es m"s que la documentacin de alg#n propsito a cumplir en el programa, solo ser"
de car"cter informativo a los usuarios. Es decir, lo encontrado dentro de estos no ser"
procesado por el compilador, por lo tanto la maquina no notara la existencia del
contenido en la ejecucin del programa.
.os comentarios se introducir"n en el programa separados por PL y LP
%comentario de bloque& o comen!"ndolos con PP %comentario de lnea&. .os
comentarios entre PL y LP pueden tener la longitud que queramos, pero no se anidan,
es decir, si escribimos PL (ola PL amigo LP mo LP, el compilador interpretar" que el
comentario termina antes de mo, y dar" un error. .os comentarios que comien!an por
PP slo son v"lidos (asta el final de la lnea en la que aparecen. El uso de los
comentarios son opcionales ya que no intervienen directamente sobre el programa.
2.3.1.1.2. Operador de fin de instruccin ()
El punto y coma es uno de los operadores m"s usados en 'FF7 este se usa con
el fin de indicar el final de una lnea de instruccin. El punto y coma es de uso
obligatorio, toda instruccin deber" ser finali!ada por este operador sino se generara
un error, excepto en el uso de directivas y definicin de funciones.
-ambin es conocido como sentencia nula al ser controlada por una sentencia
cclica o al usarse innecesariamente de forma repetida.
instrucci1n1; "" el operador 0 indica el fin de la instruccin1
instruccion2;;; "" el primer operador 0 indica el fin de la instruccin2
"" los siguiente operadores 0 indica sentencias nulas
El punto y coma se usa tambin separador de contadores, condicionales e
incrementadores dentro de un sentencia for.
2.3.1.1.3. Operadores de a!rupacin o "lo#ue ($ %)
3n bloque es un grupo de instrucciones contenidas entre los smbolos de llave
i!quierda STS %inicio de bloque& y llave derec(a SUS %fin de bloque&. .as sentencias
compuestas se agrupan en bloques que pueden contener combinaciones de sentencias
elementales %denominadas sentencias de expresin& y otras sentencias compuestas.
,s las sentencias compuestas pueden estar anidadas, una dentro de otra. 'ada inicio
de bloque debe tener un fin de bloque.
Su uso es obligatorio en la definicin de funciones, prototipos, sentencias que
controles m"s de una instruccin y opcionalmente pueden aparecer en cualquier otra
parte del programa.
void main()
{ 2nstrucci1n_a;
{ 2nstrucci1n_b;
2nstrucci1n_c;
}
}
2.3.1.1.&. Operador separacin (,)
.a coma tiene una doble funcin, por una parte separa elementos de una lista de
argumentos de una funcin. Por otra, puede ser usado como separador en expresiones
:de coma:. ,mbas funciones pueden ser me!cladas, pero (ay que a$adir parntesis
para resolver las ambigVedades.
31) 32) ...) 3n ;
En una expresin :de coma:, cada operando es evaluado como una expresin,
pero los resultados obtenidos anteriormente se tienen en cuenta en las subsiguientes
evaluaciones. Por ejemplo)
func(i) (4 + 1) 4 5 6)) 7);
.lamar" a la funcin con tres argumentos) %i, @, I&. .a expresin de coma %j W =,
jF>&, se eval#a de i!quierda a derec(a, y el resultado se pasar" como argumento a la
funcin.
2!8!1!2! 'irecti)as
El preprocesador anali!a el fic(ero fuente antes de la fase de compilacin real,
y reali!a las sustituciones de macros y procesa las directivas de compilacin %'FF es
un lenguaje compilado&.
3na directiva de compilacin o preprocesador es una lnea cuyo primer car"cter
es un H. .as directivas ser"n instrucciones que le daremos al compilador para
indicarle que realice alguna operacin antes de compilar nuestro programa, como el
incluir funciones de alguna biblioteca como son los enca,e3ados!
,lgunas de las directivas tenemos)
AdefineB sirve para definir macros. .as macros suministran un sistema para la
sustitucin de palabras, con y sin par"metros.
"define identificador_de_macro #secuencia%
El preprocesador sustituir" cada ocurrencia del identificador3de3macro
en el fic(ero fuente, por la secuencia. 'ada sustitucin se conoce como una
expansin de la macro. .a secuencia es llamada a menudo cuerpo de la macro.
Aincl$deB permite insertar fic(eros externos dentro de nuestro fic(ero de
cdigo fuente. Estos fic(eros son conocidos como fic(eros incluidos, fic(eros
de cabecera o :(eaders:.
"include #nombre de fic$ero cabecera%
"include -nombre de fic$ero de cabecera-
"include identificador_de_macro
El preprocesador elimina la lnea Aincl$de y, conceptualmente, la
sustituye por el fic(ero especificado. El tercer caso (aya el nombre del fic(ero
como resultado de aplicar la macro.El cdigo fuente en si no cambia, pero el
compilador observa el fic(ero incluido.
.a diferencia entre escribir el nombre del fic(ero entre X Y o : :, est" en
el algoritmo usado para encontrar los fic(eros a incluir. En el primer caso el
preprocesador buscar" en los directorios :include: definidos en el compilador
%libreras est"ndar&. En el segundo, se buscar" primero en el directorio actual, es
decir, en el que se encuentre el fic(ero fuente, si no existe en ese directorio, se
trabajar" como el primer caso %libreras creadas por el usuario&.
2!8!1!8! Pala,ras reser)adas
El lenguaje 'FF est" compuesto por un conjunto de palabras reservadas que
tiene un significado determinado para el compilador, de manera tal que cuando las
encuentra en el programa sabe que (ay que llevar a cabo una determinada accin.
.as variables que se declaren a lo largo de todo el programa, as como las
funciones y dem"s no pueden llevar el nombre de estas palabras reservadas, ya que
son de uso por parte del compilador, ya que si se (ace esto, se produciran errores, por
lo que es importante tener una buena familiari!acin con las mismas, a fin de no
cometer errores.
,lgunas de las palabras reservadas del lenguaje se muestran en la tabla
siguiente %5igura J.M.&)
&alabras reservadas len!ua4e .55
asm auto bool brea7 case
catc$ c$ar class const continue
default delete do double else
enum e(plicit e(tern false float
for friend !oto if inline
int lon! mutable namespace ne8
operator private protected public re!ister
return s$ort si!ned si9eof static
struct s8itc$ template t$is t$ro8
true tr* t*pedef t*pename union
unsi!ned usin! virtual void volatile
8$ile
.i#$ra 2! <! Ta,la de "ala,ras reser)adas en C++!
as&! 8edio definido por la puesta en pr"ctica de utili!acin de lenguaje
de ensamblaje a lo largo de 'FF .
,reaC! .a declaracin de pausa o descanso manda pasar el argumento al
partidario de la declaracin, es utili!ada en las llamadas a do, w(ile, for o
switc(.
case! Se define dentro de una estructura switc(, case, y default.
const! Bariable contante cuyo valor no puede ser alterado.
contin$e! Envo de los pasos a seguir sin detenerse como es caso siguiente.
catcD! 8aneja una excepcin generado por un t(row.
class! 6efine una nueva clase. Pueden crearse objetos de esta clase.
delete! 6estruye un objeto de memoria creado con new.
ne! ,signa din"micamente un objeto de memoria libre. 6etermina
autom"ticamente el tama$o del objeto.
friend! 6eclara una funcin o una clase que sea un Qfriend %amigo&R de otra
clase. .os amigos pueden tener acceso a todos los miembros de datos y
a todas las funciones miembro de una clase.
o"erador! 6eclara un operador Q(omnimoR.
"ri)ate! 3n miembro de clase accesible a funciones miembro y a funciones
friend de la
clase de miembros private.
"rotected! 3na forma extendida de acceso private7 tambiZn se puede tener
acceso a los miembros protected por funciones miembros de clases derivadas
y amigos de clases derivadas.
"$,lic. 3n miembro de clase accesible a cualquier funcin.
te&"late! 6eclara como construir una clase o una funcin, usando una
variedad de tipos.
tDis! 3n apuntador declarado en forma implcita en toda funcin de miembro
no static de una clase. Se$ales al objeto al cual esta funcin miembro (a sido
invocada.
tDro! -ransfiere control a un manejador de excepcin o termina la ejecucin
del programa si no puede ser locali!ado un manejador apropiado.
)irt$al! 6eclara una funcin virtual.
2!8!1!9! Identificadores!
.os identificadores son palabras no reservadas correspondientes a nombres de
declaraciones de variables, constantes, prototipos, funciones, etc.
6ebemos seguir ciertas reglas al nombrar tipos de datos, variables, funciones,
etc. .os identificadores v"lidos del 'FF son los formados a partir de los caracteres
del alfabeto %el ingls, no podemos usar ni la $ ni palabras acentuadas&, los dgitos
%;...?& y el subrayado %[&, la #nica restriccin es que no podemos comen!ar un
identificador con un dgito %es as porque se podran confundir con literales
numricos&.
Aay que se$alar que el 'FF distingue entre may#sculas y min#sculas, por lo
que Aola y (ola representan dos cosas diferentes. Aay que evitar el uso de
identificadores que slo difieran en letras may#sculas y min#sculas, porque inducen a
error.
2!8!1!:! E%e&"lo de $n "ro#ra&a en C++!
3n programa simple puede ser el siguiente)
"4
Este es un programa simple en C++, escribe una frase
en la pantalla
4"
"include #iostream.$%
int main( )
{
cout ## -:ola mundo;n-; "" imprime en la pantalla la frase 5%ola mundo5
return ,;
}
,nali!ando el cdigo del ejemplo observamos)
.a primera parte separada entre PL y LP es un comentario. Es recomendable que
se comenten los programas, explicando que es lo que estamos (aciendo en cada caso,
para que cuando se lean sean m"s comprensibles.
.a lnea que empie!a por H es una directiva. En este caso indica que se incluya
el fic(ero :iostrea&!D:, que contiene las definiciones para entradaPsalida de datos en
'FF.
En la declaracin de &ain ? @ (emos incluido la palabra reservada int, que
indica que la funcin devuelve un entero al finali!ar su propsito.
.a llave i!quierda nos indica el inicio del cuerpo de la funcin &ain ? @!
.a sentencia separada entre llaves indica que se escriba la frase :Aola mundo:.
El operador XX escribe %inserta& el segundo argumento en el primero. En este caso la
cadena :Aola mundo\n: se escribe en la salida est"ndar %co$t&. El car"cter \ seguido
de otro car"cter indica un solo car"cter especial, en este caso un salto de lnea %\n&.
.a palabra reservada ret$rn nos indica retornar un valor de la mismo tipo que
el definido en la funcin. En este caso retornamos el valor numrico entero ;.
.a llave derec(a nos indica el fin del cuerpo de la funcin &ain ? @.
CAPITULO 8
TIPO6 'E 'ATO6
8!1! Ti"os de datos!
'FF no soporta un gran n#mero de tipos de datos predefinidos, pero tiene la
capacidad para crear sus propios tipos de datos. Posee un conjunto de tipos simples
correspondientes a las unidades de almacenamiento tpicas de un computador y a las
distintas maneras de utili!arlos. -odos los tipos de datos simples o b"sicos de 'P'FF
son, esencialmente, n#meros. .os tres tipos de datos b"sicos son)
Enteros7 int
N(&eros flotantes ?reales@7 float, double
Caracteres7 c(ar
.os tipos simples de datos admitidos se muestran en la siguiente tabla de rango
de valores. %5igura K.=&
-enominacin 6ipo de datos 6ama7o en bits Rango de &alores
c$ar .ar<cter = de , a 2>>
int N?mero entero 1@ de A32B@= a 32B@B
float
N?mero real de
precisi1n simple
32 de 3.6 ( 1,C3= a 3.6 ( 1,3=
double
N?mero real de
precisi1n doble
@6 de 1.B ( 1,C3,= a 1.B ( 1,3,=
void Dipo vacEo , sin valor
.i#$ra 8! 1! Ta,la de los ti"os de datos si&"les en C++!
.os tama$os en bits pueden variar dependiendo del compilador empleado. Por
ejemplo, gcc interpreta que el entero es de KJ bits, y para usar enteros de =M bits (ay
que indicarlo expresamente. Por tanto, no debe usted presuponer ning#n tama$o
concreto para los tipos si quiere escribir programas portables.
El tipo c%ar se usa normalmente para variables que guardan un #nico car"cter,
aunque lo que en realidad guardan es un cdigo ,S'**, es decir, un n#mero entero de
< bits sin signo %de ; a J@@&. .os caracteres se escriben siempre entre comillas
simples %]^_&. Por lo tanto, si suponemos que x es una variable de tipo c(ar, estas dos
asignaciones tienen exactamente el mismo efecto, ya que M@ es el cdigo ,S'** de la
letra ,)
x W S,S7
x W M@7
, diferencia de las comillas simples de los caracteres sueltos cadenas de
caracteres se escriben con comillas dobles %R^R&.
El tipo int se usa para n#meros enteros, mientras que los tipos float y double
sirven para n#meros reales. El segundo permite representar n#meros mayores, a costa
de consumir m"s espacio en memoria.
3n tipo especial del 'FF es el denominado void %vaco&. Este tipo tiene
caractersticas muy peculiares, ya que es sint"cticamente igual a los tipos elementales
pero slo se emplea junto a los derivados, es decir, no (ay objetos del tipo void. Se
emplea para especificar que una funcin no devuelve nada, para declarar funciones
sin argumentos7 o como base para punteros a objetos de tipo desconocido. Por
ejemplo)
void Fora&rantalla (void);
indica que la funcin 9orraPantalla no tiene par"metros y no retorna nada.
8!1!1! Modificadores de ti"o!
Existen, adem"s, unos modificadores de tipo que pueden preceder a los tipos de
datos. 6ic(os modificadores son)
si#ned) obliga a que los datos se almacenen con signo.
$nsi#ned' los datos se almacenan sin signo.
lon#' los datos ocupar"n el doble de espacio en bits del (abitual, y, por lo
tanto, aumentar" su rango de valores.
sDort' los datos ocupar"n la mitad del espacio (abitual, y, por lo tanto,
disminuir" su rango de valores..
6e este modo, nos podemos encontrar, por ejemplo, con estos tipos de datos)
$nsi#ned int) 4#mero entero de =M bits sin signo. 2ango) de ; a M@@K@.
si#ned int) 4#mero entero de =M bits con signo. 4o tiene sentido, porque el
tipo int ya es con signo por definicin, pero es sint"cticamente correcto.
si#ned cDar) 'ar"cter %< bits& con signo. 2ango) de `=J< a =JN
lon! int) 4#mero entero de KJ bits. 2ango) de `J=>N><KM>< a J=>N><KM>N
*ncluso podemos encontrar combinaciones de varios modificadores. Por
ejemplo)
$nsi#ned lon# int) 4#mero entero de KJ bits sin signo. 2ango) de ; a
>J?>?MNJ?@
8!1!2! Ti"os en$&erados!
3n tipo especial de tipos enteros son los tipos enumerados. Estos tipos sirven
para definir un tipo que slo puede tomar valores dentro de un conjunto limitado de
valores. Estos valores tienen nombre, luego se da una lista de constantes asociadas a
este tipo. .a sintaxis es)
enum booleano {GHIJ3) DK3}; "" definimos el tipo booleano
,qu (emos definido el tipo booleano que puede tomar los valores 5,.SE o
-23E. En realidad (emos asociado la constante 5,.SE con el n#mero ;, la
constante -23E con =, y si (ubiera m"s constantes seguiramos con J, K, etc.
Si por alguna ra!n nos interesa dar un n#mero concreto a cada valor podemos
(acerlo en la declaracin)
enum colores {ro4o + 6) a9ul) verde + 3) ne!ro + 1};
El a!ul tomar" el valor @ %>F=&, ya que no (emos puesto nada. -ambin se
pueden usar n#meros negativos o constantes ya definidas.
Si al definir un tipo enumerado no se le da nombre al tipo declaramos una serie
de constantes)
enum { .3L) KNL) MLJ };
Aemos definido las constantes 'E2C, 34C y 6CS con los valores ;, = y J.
8!1!8! Ti"os deri)ados
6e los tipos fundamentales podemos derivar otros mediante el uso de los
siguientes operadores de declaracin)
E P$ntero7 Para cualquier tipo -, el puntero a ese tipo es -L. 3na variable de
tipo -L contendr" la direccin de un valor de tipo -.
F Referencia7 3na referencia es un nombre alternativo a un objeto, se emplea
para el paso de argumentos y el retorno de funciones por referencia. -a significa
referencia a tipo -.
GH Arre#los7 Para un tipo -, -bnc indica un tipo arreglo con n elementos. .os
ndices del arreglo empie!an en ;, luego llegan (asta n+=. Podemos definir arreglos
multidimensionales como arreglos de arreglos.
?@ .$ncin7 .a declaracin de una funcin nos da el nombre de la funcin, el
tipo del valor que retorna y el n#mero y tipo de par"metros que deben pas"rsele.
Ejemplos)
int 4n0 "" puntero a un entero
int &8290 "" arreglo de 2 enteros
int 4c8290 "" arreglo de 2 punteros a entero
&oid f$int j'0 "" funcin con un par)metro entero
8!1!9! Ti"os co&"$estos
.os tipos de datos compuestos en 'FF son)
Estr$ct$ras! .as estructuras son el tipo equivalente a los registros de otros
lenguajes, se definen poniendo la palabra str$ct delante del nombre del tipo y
colocando entre llaves los tipos y nombres de sus campos. Si despus de
cerrar la llave ponemos una lista de variables las declaramos a la ve! que
definimos la estructura.
Uniones! .as uniones son idnticas a las estructuras en su declaracin, con la
particularidad de que todos sus campos comparten la misma memoria %el
tama$o de la unin ser" el del campo con un tipo mayor&.
Clases! .as clases son estructuras con una serie de caractersticas especiales.
8!1!:! 'atos est*ticos = datos din*&icos
Ctra forma de clasificar los tipos de datos)
'atos est*ticos7 su tama$o y forma es constante durante la ejecucin de un
programa y, por tanto, se determinan en tiempo de compilacin. El ejemplo
tpico son los arreglos. -ienen el problema de que (ay que dimensionar la
estructura de antemano, lo que puede conllevar desperdicio o falta de
memoria.
'atos din*&icos7 su tama$o y forma es variable %o puede serlo& a lo largo de
un programa, por lo que se crean y destruyen en tiempo de ejecucin. Esto
permite dimensionar la estructura de datos de una forma precisa) se va
asignando memoria en tiempo de ejecucin seg#n se va necesitando.
8!2! Iaria,les = constantes!
8!2!1! Iaria,le!
En 'P'FF una )aria,le es una posicin con nombre en memoria donde se
almacena un valor de un cierto tipo de dato y puede ser modificado. .as variables
pueden almacenar todo tipo de datos) 'aracteres, n#meros, estructuras.
.as variables est"n compuestas por dos partes importantes que son)
El contenidoB que es el valor que se almacena o est" almacenado en la
variable y est" directamente relacionada al mismo nombre de la variable.
La direccin de &e&oria, que nos indica la posicin o direccin donde se
almacena el contenido de la variable en la memoria de ejecucin. Esta se
representa mediante el operador de direccin a acompa$ada del nombre de la
variable.
Sea una variable con el nombre ,. Se representa de esta) su contenido es ,, y su
direccin es a,. %5igura K.J&
.i#$ra 8! 2! Iaria,le!
8!2!1!1! 'eclaracin de las )aria,les
3na variable tpicamente tiene un nombre %un identificador& que describe su
propsito. -oda variable utili!ada en un programa debe ser declarada previamente. .a
definicin utili!ada en un programa en cualquier parte del programa. 3na definicin
reserva un espacio de almacenamiento en memoria. El procedimiento para definir
%crear& una variable es escribir el tipo de dato, el identificador o nombre de la variable
y, en ocasiones, el valor inicial que tomar".
.a declaracin de variables puede considerarse como una sentencia. 6esde este
punto de vista, la declaracin terminar" con un :7:.
Sintaxis de declaracin de una variable)
tipodato nombrevariable;
Ejemplos)
int a;
float d;
c$ar e;
Sintaxis de declaracin de n variables)
tipodato nomvar1) nomvar2) nomvar3)N) nomvarn;
Ejemplo)
int a) b) c;
'uando declaramos m"s de una variable usando el separador %,&, estas reservan
posiciones de memorias consecutivas del tama$o indicado por el tipo de dato.
Cbservando el ejemplo anterior se notara que las variables a, b y c reservan
posiciones de memoria del tama$o del tipo de dato int que es de J bytes. Es decir que
si la direccin de la variable a %:a& es ;x=;;;, entonces la direccin de la variable b
%:b& ser" la igual a la siguiente posicin de memoria del tama$o del tipo int, ;x=;;J
%las posiciones de memoria del computador se representan en notacin (exadecimal y
su tama$o ser" de = byte&. %5igura K.K&
.i#$ra 8! 8! 'eclaracin de )aria,les consec$ti)as!
-ambin es posible iniciali!ar las variables dentro de la misma declaracin.
Sintaxis de declaracin e iniciali!acin de variables)
tipodato nombrevariable + iniciali,acin;
1
tipodato nomvar1+inicial1) nomvar2+inicial2) N ) nomvarn+ inicialn;
Ejemplos)
int a + >;
int a + 2) b + 6) c + @;
.as variables no iniciali!adas tienen un valor, este valor lo conocemos como
:basura:, ya que el valor es desconocido que puede interferir en un programa.
.as variables no pueden tener el mismo nombre que una Qpalabra reservadaR
del lenguaje. 4o se les pueden colocar espacios en blanco. .os nombres de variables
solo pueden tener letras, dgitos numricos y el guin bajo subguin %[&.
.os nombres de variables no pueden llevar caracteres especiales, ejemplo)
caracteres acentuados, $, L, P, +, etc.
6eben comen!ar por un car"cter %letra no numero& o tambin pueden comen!ar
con un guin bajo %[&, ejemplo) [costo.
8!2!1!2! J&,ito de las )aria,les
6ependiendo de dnde se declaren las variables, podr"n o no ser accesibles
desde distintas partes del programa. .as variables declaradas dentro de un bucle,
ser"n accesibles slo desde el propio bucle, ser"n de "mbito local del bucle.
.as variables declaradas dentro de una funcin, slo ser"n accesibles desde esa
funcin. Esas variables son variables locales o de "mbito local de esa funcin.
.as variables declaradas fuera de las funciones, normalmente antes de definir
las funciones, en la !ona donde se declaran los prototipos, ser"n accesibles desde
todas las funciones. Estas variables ser"n globales o de "mbito global.
3.2.1.2.1. 'aria"les (ocales
.as variables locales son aquellas definidas en el interior de una funcin y son
visibles slo en esta funcin especfica. .as reglas por las que se rigen las variables
locales son)
En el interior de una funcin, una variable local no puede ser modificada por
ninguna sentencia externa a la funcin.
.os nombres de las variables locales no (an de ser #nicos. 6os, tres o m"s
funciones + por ejemplo) pueden definir variables de nombre *nterruptor. 'ada
variable es distinta y pertenece a la funcin en que est" declarada.
.as variables locales de las funciones no existen en memoria (asta que se
ejecuta la funcin. Esta propiedad permite a(orrar memoria, ya que permite
que varias funciones compartan la misma memoria para sus variables locales
%pero no a la ve!&.
Ejemplo)
"include #iostream.$%
"include #conio.$%
void main()
{ ""declaracin de &ariables locales de la funcin main$'
int () *) a; ""&ariables locales /, ;, a
N
}
void suma()
{ ""declaracin de &ariables locales de la funcin suma$'
int a) b; ""&ariable locales a, b
N
}
3.2.1.2.2. 'aria"les )lo"ales
.as Bariables Elobales son variables que se declaran fuera de la funcin y por
defecto %omisin& son visibles a cualquier funcin incluyendo main %&.
Ejemplo)
"include #iostream.$%
"include #conio.$%
int a) c) b) (; ""declaracin de &ariables globales
main()
{
""declaracin de &ariables locales
}
8!2!1!8! Ti"os de Al&acena&ientos
.as variables por su parte pueden tener distinto tipo de almacenamiento,
dependiendo ste de las partes del cdigo en el que van a ser utili!adas.
6tatic
3na variable est"tica existe desde que el programa comien!a su ejecucin y
dura (asta que el programa termina. Esta caracterstica permite retener el
valor de una variable incluso aunque la ejecucin del programa salga fuera del
"mbito en el que (a sido declarada. Se declara anteponiendo la palabra
reservada static a la declaracin de la variable. 'onsidere el siguiente
fragmento de cdigo)
e4emplo( )
{
static int (+,;
(55;
...
}
En este caso, static modifica la declaracin de la variable x, que por defecto
es local a la funcin, de manera que si bien el "mbito de x sigue siendo la
funcin %no se puede utili!ar fuera de ella&, sta no se destruye una ve!
ejecutada la funcin, sino que sigue en memoria conservando su valor, y si
la funcin es llamada por segunda ve!, el valor de la variable x ya no ser" ;
sino =. .as variables globales que se declaran en cada arc(ivo son por
defecto static.
E1tern
.a palabra reservada extern sirve para declarar un nombre de funcin o
variable como externa, y permite referencia una declaracin que se encuentra
en otro arc(ivo. Esta caracterstica fue dise$ada originalmente para facilitar la
compilacin separada de arc(ivos, en este curso, no la utili!aremos de
momento.
A$to
Es la declaracin de una variable local. Se usa para definir el "mbito temporal
de una variable local, es utili!ada por defecto en las funciones.
*e#ister
'uando a la declaracin de una variable le antecede la palabra reservada
re#ister se indica al compilador que la variable se almacenar" en uno de los
registros del (ardware del microprocesador. .a palabra clave register, en una
sugerencia, no un mandato, al compilador. 3na variable register debe ser local
a una funcin. .a ra!n de utili!ar variables register reside en que las
operaciones sobre los valores situadas en los registros son normalmente m"s
r"pidas que las reali!adas sobre valores situados en memoria, por lo que se
aumente la eficacia y velocidad del programa.
3na aplicacin tpica es el uso de una variable register como variable de
control de un bucle7 de este modo se reduce el tiempo en el la 'P3 requiere
para buscar el valor de la variable en memoria. Por ejemplo)
re!ister int i;
for (i+1; i#1,,,,; i55)
{
...
}
8!2!1!9! Con)ersin e1"l/cita de ti"os de datos
En 'FF est" permitida una conversin explcita del tipo de una expresin
mediante una construccin que tiene la forma no&,reKdelKti"o ?e1"resin@! .a
expresin es convertida al tipo especificado. Por ejemplo la funcin ra! cuadrada
%sqrt& devuelve un resultado de tipo double. Para poder asignar este resultado a una
variable de otro tipo, por ejemplo de tipo int, tendremos que escribir)
int a;
a + int (sOrt ( 2 ));
3na variable de un determinado tipo no siempre puede ser convertida
explcitamente a otro tipo.
8!2!2! Constantes
.as constantes son tipos de datos %con valores numricos o de cadena& que
permanecen invariables, sin posibilidad de cambiar el valor que tienen durante el
curso del programa. 3na constante corresponde a una longitud fija de un "rea
reservada en la memoria principal del ordenador, donde el programa almacena
valores fijos. 3na constante tambin puede ser definida, como una variable cuyo
valor o contenido no puede ser modificado.
Por ejemplo) El valor de pi W K.=>=@?J
3.2.2.1. Constantes definidas!
.as constantes pueden recibir nombres simblicos mediante la directiva
Hdefine, esto significa que esa constante tendr" el mismo valor a lo largo de todo el
programa. El identificador de una constante as definida ser" una cadena de caracteres
que deber" cumplir los mismos requisitos que el de una variable %sin espacios en
blanco, no empe!ar por un dgito numrico, etc.&.
Ejemplo)
"include #stdio.$%
"define &2 3.161>P2@ "" constante definida P<
int main()
{
printf(-&i vale Qf-) &2);
return ,;
}
.o cual mostrar" por pantalla)
Pi )ale 8!191:L2<
Es decir, PI es una constante a la que le (emos asignado el valor 8!191:L2<
mediante la directiva Adefine. .a directiva Hdefine tambin se puede utili!ar para
definir expresiones m"s elaboradas con operadores %suma, resta, multiplicacin, etc.&
y otras constantes que (ayan sido definidas previamente, por ejemplo)
"define / 2.6
"define 0 P.2
"define R / 5 0
Ctro ejemplo del uso de las constantes definidas)
"include #stdio.$%
"define escribe printf
main()
{
int r;
escribe(-2n!rese un numero' -);
scanf(-Qd-)Sr);
escribe(-3l cuadrado del numero es' Qd-)rTr);
}
3.2.2.2. Constantes de en$&eracin!
Se caracteri!an por poder adoptar valores entre una seleccin de constantes
enteras denominadas en$&eradores7 estos valores son establecidos en el momento
de la declaracin del nuevo tipo. 'omo se (a se$alado, son enteros y %una ve!
establecidos& de valor constante.
Ejemplo)
enum { MHIL) FK3NL) 3UKIH };
Aemos definido las constantes 8,.C, 93E4C y 2EE3.,2 con los valores
;, = y J.
enum { &2M3L+1) J3UKNML) D3.3L+ > };
Aemos definido las constantes P2*8E2C, SEE346C y -E2'E2C con los
valores =, J %si no se establece asume el siguiente valor numrico& y @.
3.2.2.3. Constantes declaradas
El especificador constante %const&, permite crear o declarar entidades cuyo
valor no se puede modificar. 3na ve! que una constante se declara no se puede
modificar dentro del programa. .as constantes deben ser iniciali!adas cuando se
declaran.
.a palabra clave const se utili!a para (acer que un objeto+dato, se$alado por un
identificador, no pueda ser modificado a lo largo del programa %sea constante&. El
especificador const se puede aplicar a cualquier objeto de cualquier tipo, dando lugar
a un nuevo tipo con idnticas propiedades que el original pero que no puede ser
cambiado despus de su iniciali!acin %se trata pues de un verdadero especificador de
tipo&.
'uando se utili!a en la definicin de par"metros de funciones o con miembros
de clases, tiene significados adicionales especiales.
Sintaxis)
const V#tipoCdeCvariable%W #nombreCdeCvariable% V + #valor% W;
Ejemplo)
const int lon!itud + 2,;
c$ar arra*Vlon!itudW;
.a palabra clave const declara que un valor no es modificable por el programa.
Puesto que no puede (acerse ninguna asignacin posterior a un identificador
especificado como const, esta debe (acerse inevitablemente en el momento de la
declaracin, a menos que se trate de una declaracin e1tern.
.as constantes se pueden utili!ar para sustituir a Adefine.
Ejemplo)
const &2 + 3.161>P2 XX sustitu*e a "define &2 3.161>P2
const lon! + 12= XX sustitu*e a "define lon! 12=
8!8! O"eradores = o"eraciones!
8!8!1! O"eradores
3n operador es un car"cter o grupo de caracteres que act#a sobre una, dos o
m"s variables u operandos o expresiones que se encuentran en una operacin para
obtener un resultado.
Ejemplo tpicos de operadores son la suma %F&, la diferencia %+&, el producto
%L&, etc. .os operadores pueden ser unarios, binarios y terciarios, seg#n act#en sobre
uno, dos o tres operandos, respectivamente. Aay varios tipos de operadores,
clasificados seg#n el tipo de objetos sobre los que act#an.
8!8!1!1! O"eradores arit&0ticos
Son usados para crear expresiones matem"ticas. Existen dos operadores
aritmticos unitarios, SFS y S+S que tienen la siguiente sintaxis)
5 #e(presi1n%
C #e(presi1n%
,signan valores positivos o negativos a la expresin a la que se aplican.
En cuanto a los operadores binarios existen varios. SFS, S+S, SLS y SPS, tienen un
comportamiento an"logo, en cuanto a los operandos, ya que admiten enteros y de
coma flotante. Se trata de las conocidsimas operaciones aritmticas de suma, resta,
multiplicacin y divisin.
Sintaxis)
#e(presi1n% 5 #e(presi1n%
#e(presi1n% C #e(presi1n%
#e(presi1n% T #e(presi1n%
#e(presi1n% X #e(presi1n%
#e(presi1n% Q #e(presi1n%
El operador de mdulo SdS, devuelve el resto de la divisin entera del primer
operando entre el segundo. Por esta ra!n no puede ser aplicado a operandos en coma
flotante.
'uando las expresiones que intervienen en una de estas operaciones sean
enteras, el resultado tambin ser" entero. Por otro lado si las expresiones son en punto
flotantes, con decimales, el resultado ser" en punto flotante.
8!8!1!2! O"eradores incre&entales
Son dos operadores unitarios, se trata de operadores un tanto especiales, ya que
slo pueden trabajar sobre variables, pues implican una asignacin. Se trata de los
operadores SFFS y S++S. El primero incrementa el valor del operando y el segundo lo
decrementa, ambos en una unidad. Existen dos modalidades, dependiendo de que se
use el operador en la forma de prefijo o de sufijo.
Sintaxis)
#variable% 55 "" $post=incremento'
55 #variable% "" $pre=incremento'
#variable%CC "" $post=decremento'
CC #variable% "" $pre=decremento'
En su forma de prefijo, el operador es aplicado antes de que se eval#e el resto
de la expresin7 en la forma de sufijo, se aplica despus de que se eval#e el resto de la
expresin. Beamos un ejemplo, en las siguientes expresiones :a: vale =;; y :b: vale
=;)
c + a 5 55b;
En este primer ejemplo primero se aplica el pre+incremento, y b valdr" == a
continuacin se eval#a la expresin :aFb:, que dar" como resultado ===, y por #ltimo
se asignar" este valor a c, que valdr" ===.
c + a 5 b55;
En este segundo ejemplo primero se aval#a la expresin :aFb:, que dar" como
resultado ==;, y se asignar" este valor a c, que valdr" ==;. 5inalmente se aplica en
post+incremento, y b valdr" ==.
.os operadores unitarios sufijos %post+incremento y post+decremento& se
eval#an despus de que se (an evaluado el resto de las expresiones. En el primer
ejemplo primero se eval#a FFb, despus aFb y finalmente c WXresultadoY. En el
segundo ejemplo, primero se eval#a aFb, despus c W XresultadoY y finalmente bFF.
8!8!1!8! O"eradores de asi#nacin
.os operadores de asignacin atribuyen a una variable, es decir, depositan en la
!ona de memoria correspondiente a dic(a variable, el resultado de una expresin o
valor de otra variable.
Existen varios operadores de asignacin, el m"s evidente y el m"s usado es el
:W:, pero no es el #nico.
Entre los operadores de asignacin tenemos) :W:, :LW:, :PW:, :dW:, :FW:, :+W:.
O la sintaxis es)
#variable% #operador de asi!naci1n% #e(presi1n%
En general, para todos los operadores mixtos la expresin)
3(presion1 op+ 3(presion2
-iene el mismo efecto que la expresin)
3(presion1 + 3(presion1 op 3(presion2
El funcionamiento es siempre el mismo, primero se eval#a la expresin de la
derec(a, se aplica el operador mixto, si existe y se asigna el valor obtenido a la
variable de la i!quierda. En la siguiente tabla se muestra estas operaciones y sus
equivalencias. %5igura K.>&.
O"erador Jentencia Hbreviada Jentencia no Hbreviada
+ > m > + n m > m + n0
= > m = > n m > m = n0
4 > m 4 > n m > m 4 n0
" > m " > n m > m " n0
? > m > ? n m > m ? n
.i#$ra 8! 9! Ta,la de E+$i)alencia de O"eradores de Asi#nacin
8!8!1!9! O"eradores relacionales
.os operadores relacionales comprueban la igualdad o desigualdad entre dos
valores o expresiones.
Sintaxis)
#e(presi1n1% % #e(presi1n2%
#e(presi1n1% # #e(presi1n2%
#e(presi1n1% #+ #e(presi1n2%
#e(presi1n1% %+ #e(presi1n2%
#e(presi1n1% ++ #e(presi1n2%
#e(presi1n1% Y+ #e(presi1n2%
El resultado de cualquier evaluacin de este tipo, es un valor verdadero %true& o
falso %false&. Siendo verdadero cualquier valor distinto de ;, aunque por lo general se
usa el valor = y falso representado por el valor ;.
El significado de cada operador es evidente)
Y mayor que
X menor que
YW mayor o igual que
XW menor o igual que
WW igual a
eW distinto a
-odos los operadores relacionales son operadores binarios %tienen J operandos&,
y su forma general es)
3(presi1n1 op 3(presi1n2
8!8!1!:! O"eradores l#icos
.os operadores :aa:, :ff: y :e: relacionan expresiones lgicas, formando a su
ve! nuevas expresiones lgicas.
Sintaxis)
#e(presi1n1% SS #e(presi1n2%
#e(presi1n1% ZZ #e(presi1n2%
Y#e(presi1n%
El operador :aa: equivale al :,46: o :O:7 devuelve :true: slo si las dos
expresiones evaluadas son :true: o distintas de cero, en caso contrario devuelve
:false: o cero. Si la primera expresin evaluada es :false:, la segunda no se eval#a.
Eenerali!ando, con expresiones ,46 con m"s de dos expresiones, la primera
expresin falsa interrumpe el proceso e impide que se contin#e la evaluacin del resto
de las expresiones. Esto es lo que se conoce como :cortocircuito:, y es muy
importante. , continuacin se muestra la tabla de verdad del operador aa %5igura
K.@&)
3(presi1n1 3(presi1n2 3(presi1n1 SS 3(presi1n2
false ignorada false
true false false
true true true
.i#$ra 8! :! Ta,la de )erdad del o"erador MFFM7
El operador :ff: equivale al :C2: u :C inclusivo:7 devuelve :true: si cualquiera
de las expresiones evaluadas es :true: o distinta de cero, en caso contrario devuelve
:false: o cero. Si la primera expresin evaluada es :true:, la segunda no se eval#a. ,
continuacin se muestra la tabla de verdad del operador :ff:. %5igura K.M&)
3(presi1n1 3(presi1n2 3(presi1n1 ZZ 3(presi1n2
false false false
false true true
true ignorada true
.i#$ra 8! <! Ta,la de )erdad del o"erador MNNM !
El operador :e: es equivalente al :4C-:, o :4C:, y devuelve :true: slo si la
expresin evaluada es :false: o cero, en caso contrario devuelve :false:.
.a expresin :eE: es equivalente a %; WW E&. , continuacin se muestra la tabla
de verdad del operador :e: %5igura K.N&)
3(presi1n Y3(presi1n
false true
true false
.i#$ra 8! O! Ta,la de )erdad del o"erador MPM!
8!8!1!<! O"erador Msi3eofM
Este operador tiene dos usos diferentes.
Sintaxis)
si9eof (#e(presi1n%)
si9eof (nombre_de_tipo)
En ambos casos el resultado es una constante entera que da el tama$o en bytes
del espacio de memoria usada por el operando, que es determinado por su tipo. El
espacio reservado por cada tipo depende de la plataforma.
En el primer caso, el tipo del operando es determinado sin evaluar la expresin,
y por lo tanto sin efectos secundarios. Si el operando es de tipo :c(ar:, el resultado es
=. , pesar de su apariencia, si!eof%& 4C es una funcin, sino un CPE2,6C2.
8!8!1!O! O"eradores a ni)el de ,it enteros
.os operadores a nivel de bit operan independientemente sobre cada uno de los
bits de un valor.
+O,: El operador 4C- unario, >, invierte todos los bits de su operando. Por
ejemplo, en n#mero >J, que tiene el siguiente patrn de bits ;;=;=;=; se convierte en
==;=;=;= despus de aplicar el operador 4C-.
A+-7 El operador ,46, F, combina los bits de manera que se obtiene un = si
ambos operandos son =, obteniendo ; en cualquier otro caso.
;;=;=;=; %representacin en byte del numero >J&
a
;;;;==== %representacin en byte del numero =@&
W ;;;;=;=; %representacin en byte del numero =;&
O*) El operador C2, N, combina los bits de manera que se obtiene un = si
cualquiera de los operandos es un =.
;;=;=;=; %representacin en byte del numero >J&
f
;;;;==== %representacin en byte del numero =@&
W ;;=;==== %representacin en byte del numero >N&
.O*/ El operador 1C2, Q, combina los bits de manera que se obtiene un = si
cualquiera de los operandos es un =, pero no ambos, y cero en caso contrario.
;;=;=;=; %representacin en byte del numero >J&
g
;;;;==== %representacin en byte del numero =@&
W ;;=;;=;= %representacin en byte del numero KN&
.a tabla siguiente muestra cmo act#a cada operador a nivel de bit sobre cada
combinacin de bits de operando %5igura K.<&)
H F L HNM /L NLD
1
1 1 1 1
1 1 1 1
1 1 1 1
.i#$ra 8! R! Ta,la de los o"eradores a ni)el de ,it!
-espla0amiento a la i0#uierda/ El operador despla!amiento a la i!quierda,
XX, mueve (acia la i!quierda todos los bits del operando de la i!quierda un n#mero de
posiciones de bit especificado en el operando de la derec(a. ,l reali!arse el
despla!amiento se pierden por el extremo i!quierdo del operando el n#mero de bits
despla!ados y se rellena el operando con ceros por la derec(a el mismo n#mero de
bits.
-espla0amiento a la derec1a7 El operador despla!amiento a la derec(a, YY,
mueve (acia la derec(a todos los bits del operando de la i!quierda un n#mero de
posiciones de bit especificado por el operando de la derec(a.
Ejemplo) Si se despla!a el valor K@ a la derec(a dos posiciones de bit, se
obtiene como resultado que el valor <.
a + a %% 2;
int a + 3>;
'uando un valor tiene bits que se despla!an fuera por la parte i!quierda o
derec(a de una palabra, esos bits se pierden. Si se estudian en binario estas
operaciones se observa con mayor claridad.
;;=;;;== %representacin en byte del numero K@&
YY J
W ;;;;=;;; %representacin en byte del numero <&
8!8!1!R! O"erador condicional ternario S7
El operador condicional %h7& el cual es conocido por su estructura como
ternario. Este operador permite controlar el flujo de ejecucin del programa. Permite
evaluar situaciones tales como) Si se cumple tal condicin entonces (a! esto, de lo
contrario (a! esto otro.
Sintaxis)
( (condici1n) [ proceso1 ' proceso2 )
En donde, condicin es la expresin que se eval#a, "roceso1 es la tarea a
reali!ar en el caso de que la evaluacin resulte verdadera, y "roceso2 es la tarea a
reali!ar en el caso de que la evaluacin resulte falsa.
Ejemplo)
int edad;
cout ## -.ual es tu edad' -;
cin %% edad;
cout ## ( (edad # 1=) [ -3res 4oven aun- ' -0a tienes la ma*orEa de edad- );
8!9! E1"resiones!
3na expresin es una combinacin de operadores y operandos de cuya
evaluacin se obtiene un valor. .os operandos pueden ser nombres que denoten
objetos variables o constantes, funciones, literales de cualquier tipo adecuado de
acuerdo con los operadores u otras expresiones m"s simples. .a evaluacin de una
expresin da lugar a un valor de alg#n tipo, una expresin se dice que es del tipo de
su resultado.
Ejemplos de expresiones)
a 5 >Tb
(a %+ ,) SS ((b5>) % 1,)
a
Ca T 2 5 b
CCb 5 (C 6TaTc)
.as expresiones se eval#an de acuerdo con la precedencia de los operadores.
,nte una secuencia de operadores de igual precedencia, la evaluacin se reali!a seg#n
el orden de escritura, de i!quierda a derec(a. El orden de evaluacin puede
modificarse usando operadores que denoten precedencia como los parntesis.
8!9!1! Re#las de "recedencias
El resultado de una expresin depende del orden en que se ejecutan las
operaciones. Por ejemplo considere la siguiente expresin) K F > L J. Si se resuelve
primero la suma y luego la multiplicacin el resultado ser" =>. Pero si se reali!a
primero la multiplicacin y luego la suma el resultado es ==. 'on el objeto de que el
resultado de una expresin sea claro e inequvoco, es necesario crear reglas que
definan el orden de ejecucin.
.a interpretacin de cualquier expresin en 'FF est" determinada por la
precedencia y asociatividad de los operadores en dic(a expresin. 'ada operador
tiene una precedencia, y los operadores en una expresin se eval#an en orden de
mayor a menor precedencia. .a evaluacin de operadores con la misma precedencia
viene determinada por su asociatividad. .os parntesis anulan las reglas de
precedencia.
En la siguiente tabla se listan los operadores en 'FF, su precedencia y su
asociatividad. .os operadores se listan en orden de prioridad decreciente %los situados
m"s arriba tienen mayor prioridad&. .os operadores en la misma lnea (ori!ontal
tienen la misma precedencia.
8!9!2! Ta,la de "recedencia de los o"eradores en C++!
En la siguiente tabla se muestran las prioridades de los operadores en el
lenguaje 'FF. %5igura K.?&)
O"erador Pro"sito Asociati)idad
( ) -enota precedencia en una
e/presin
-e i,@uierda a derec%a
si9eof 6ama7o de un objeto -e derec%a a i,@uierda
55 CC <ncremento ; decremento prefijo -e derec%a a i,@uierda
Y \ 5 C .peradores Anario -e derec%a a i,@uierda
T X Q .peraciones aritm(ticas
multiplicacin, di&isin ; modulo
-e i,@uierda a derec%a
5 C .peraciones aritm(ticas adiccin
; sustraccin
-e i,@uierda a derec%a
## %% -espla,amiento binario -e i,@uierda a derec%a
# % #+ %+ .peradores de relacin -e i,@uierda a derec%a
++ Y+ .peradores de igualdad -e i,@uierda a derec%a
S B binario -e i,@uierda a derec%a
] . e/clusi&o binario -e i,@uierda a derec%a
Z . inclusi&o binario -e i,@uierda a derec%a
SS B lgico -e i,@uierda a derec%a
ZZ . lgico -e i,@uierda a derec%a
[' .perador condicional -e i,@uierda a derec%a
+ T+ X+ 5+
C+ S+ ]+ Z+
Q+ ##+
.peradores de asignacin -e derec%a a i,@uierda
55 CC <ncremento ; decremento sufijo -e derec%a a i,@uierda
) Ceparador coma -e i,@uierda a derec%a
.i#$ra 8! L! Ta,la de "rioridades de los o"eradores!
8!9!8! E%e&"lo de e1"resiones!
E%e&"lo 17
Se tiene la siguiente expresin yWJL@L@FKL@FN, se desea evaluarla y encontrar
el resultado.
6ol$cin7
Se resuelve tomando encuentra la precedencia de los operadores y su
asociatividad.
y W J L @ L @ F K L @ F N7
J L @ W =; %multiplicacin m"s a la i!quierda primero&
y W =; L @ F K L @ F N7
=; L @ W @; %8ultiplicacin m"s a la i!quierda&
y W @; F K L @ F N7
K L @ W =@ %8ultiplicacin antes de la suma&
y W @; F =@ F N7
@; F =@ W M@ %Suma m"s a la i!quierda&
y W M@ F N7
M@ F N W NJ %Se resuelve la #ltima operacin aritmtica&
y W NJ %por #ltimo se reali!a la asignacin a la variable y&
E%e&"lo 27
6ados aW=, bWJ y cWK efect#e la siguiente expresin)
d W =; L a Y c L =; F b
6ol$cin7
Se resuelve tomando encuentra la precedencia de los operadores y su
asociatividad.
d W =; L = Y K L =; F J
%Se reali!a primero la operacin aritmtica de mayor precedencia m"s a la
i!quierda =;L= y luego KL=;&
d W =; Y K; F J
%Se reali!a primero la operacin aritmtica K; F J&
d W =; Y KJ
%Se resuelve la operacin relacional =;YKJ dando como resultado un valor
falso. -odo valor falso es igual a ;&
d W ; %por #ltimo se reali!a la asignacin a la variable d&
E%e&"lo 87
Efect#e la siguiente expresin) d W =; Y @ aa K L =;
6ol$cin7
Se resuelve tomando encuentra la precedencia de los operadores y su
asociatividad. , pesar de que el operador lgico aa tiene menor prioridad obliga a
resolver la expresin m"s a la i!quierda =; Y @, aunque el operador aritmtico L tenga
mayor prioridad.
d W =; Y @ aa K L =;
%Se separa la expresin debido a la presencia del operador lgico y se
resuelve la primera expresin =; Y @, siendo su resultado verdadero, todo valor
verdadero ser" representado por el valor =&
d W = aa K L =;
%6ado un resultado verdadero en la primera expresin se resuelve la
siguiente K L =;, de (aber resultado falsa toda la expresin seria falsa y no
reali!ara dic(a operacin. ,l resolver la operacin K L =; el resultado es K;,
donde todo valor diferente a cero es un valor verdadero.&
d W = aa =
%El resultado final de la expresin ser" un valor verdadero&
d W = %por #ltimo se reali!a la asignacin a la variable d&
E%e&"lo 97
6ado a W =, b W J efect#e la siguiente expresin)
d W aFF Y @ P J ff K L ++b X % K F a&
6ol$cin7
Se resuelve tomando encuentra la precedencia de los operadores y su
asociatividad. , pesar de que el operador lgico ff tiene menor prioridad obliga a
resolver la expresin mas a la i!quierda aFF Y @ P J, aunque el las operacin
decremento prefijo tenga mayor prioridad.
d W aFF Y @ P J ff K L ++b X %K F a&
%2esolvemos la expresin aFF Y @ P J&
aFF Y @ P J
%.a operacin incremento sufijo por tener menor prioridad se resuelve
despus de todas las operaciones siendo resuelta despus de finali!ar toda la
expresin aFF Y @ P J, se asigna el valor de la variable a&
= Y @ P J
%se resulte la operacin aritmtica de mayor precedencia @ P J y luego la
operacin relacional = Y J, siendo falsa&
d W ; ff K L ++b X %K F a&
%,ntes de resolver la prxima expresin primero se reali!a el incremento
de sufijo, dando como resultado el valor a en J&
%2esolvemos la expresin aFF Y @ P J&
K L ++b X %K F a&
%El parntesis denota prioridad en la expresin por lo cual se deber"
resolver la operacin K F a antes, sustituyendo la variable por su valor J el
resultado es @&
K L ++b X @
%Se resuelve la operacin de mayor prioridad `b el cual decrementar" en
memoria inmediatamente el valor de la variable b&
K L = X @
%2esolvemos la operacin aritmtica y luego la operacin relacional
dando como resultado un valor verdadero&
d W ; ff =
%El resultado final de la expresin ser" un valor verdadero&
d W = %por #ltimo se reali!a la asignacin a la variable d&
8!:! 6entencias
.as sentencias son unidades completas, ejecutables en si mismas. Existen
muc(os tipos de sentencias que incorporan expresiones aritmticas, lgicas o
generales como componentes de dic(as sentencias.
.as sentencias simples se separan por punto y coma y las compuestas se
agrupan en bloques mediante llaves.
8!:!1! 6entencias 6i&"le
3na sentencia simple es una expresin de alg#n tipo terminada por un car"cter
%7&. Por ejemplo las declaraciones o las sentencias aritmticas.
flota real; "" declaracin de &ariable
area + base T altura; "" e/presin aritm(tica
8!:!2! 6entencia )ac/a o n$la
En algunas ocasiones es necesario introducir en el programa una sentencia que
ocupe un lugar, pero que no realice ninguna tarea. , esta sentencia se le denomina
sentencia vacia y consta de un simple car"cter %7&. Por ejemplo)
;
8!:!8! 6entencia co&"$esta
Es un conjunto de declaraciones y de sentencias agrupadas dentro de llaves
T^U. -ambin conocido como bloques. 3na sentencia compuesta puede incluir otras
sentencias, simples y compuestas. Ejemplo)
{ int i + 1) 4 + 2;
double peso;
peso + >.>;
4 + i 5 4;
}
8!<! O"eraciones de entrada = salida est*ndar!
'uando nos referimos a entradaPsalida est"ndar %EPS est"ndar& queremos decir
que los datos o bien se est"n leyendo del teclado, bien se est"n escribiendo en el
monitor de video. 'omo se utili!an muy frecuentemente se consideran como los
dispositivos de EPS por defecto y no necesitan ser nombrados en las instrucciones de
EPS.
.as operaciones de entrada y salida no forman parte del conjunto de sentencias
de 'FF, sino que pertenecen al conjunto de funciones y clases de la biblioteca
est"ndar de 'FF. Ellas se incluyen en los arc(ivos de cabecera mediante la directiva
Aincl$de por lo que siempre que queramos utili!arlas deberemos introducir la lnea
de cdigo)
"include #nombrelibreria%
En el lenguaje 'FF tenemos varias alternativas para ingresar yPo mostrar datos,
dependiendo de la librera que vamos a utili!ar para desarrollar el programa, entre
estas est"n) iostream.(, stdio.(, conio.(.
T6T'IO!;U
Esta librera incorpora las sentencias de entrada y salida b"sicas entre ellas
tenemos la sentencia scanf y la sentencia "rintf, denominadas sentencias de entrada y
salida con formato, ya que se les indica el tipo de conversin de tipo a reali!ar.
T IO6TREAM!;U
Esta biblioteca es una implementacin orientada a objetos y est" basada en el
concepto de flujos. , nivel abstracto un flujo es un medio de describir la secuencia de
datos de una fuente a un destino o sumidero. ,s, por ejemplo, cuando se introducen
caracteres desde el teclado, se puede pensar en caracteres que fluyen o se trasladan
desde el teclado a las estructuras de datos del programa.
Entre los objetos de flujo que vienen predefinidos tenemos)
cinB que toma caracteres de la entrada est"ndar %teclado&7
co$t, pone caracteres en la salida est"ndar %pantalla&7
cerr = clo#, ponen mensajes de error en la salida est"ndar.
Estos objetos se utili!an mediante los operadores TT y UU!
TCONIO!;U
Esta librera incorpora las sentencias de entrada y salida simples de car"cter o
cadenas como lo son) getc(, getc(e, getc(ar, gets, putc(ar, puts.
8!<!1! 6entencias de 6alida Est*ndar!
El dispositivo de salida est"ndar como podemos suponer es el monitor o
pantalla de nuestro ordenador. .as sentencias de salida envan datos al puerto de
video para ser visuali!ados. Entre estas sentencias tenemos)
8!<!1!1! 6entencia de 6alida co$t
.a salida est"ndar en 'FF es la pantalla de nuestro ordenador. El objeto
asociado con dic(a salida est"ndar es cout.
El objeto cout emplea al operador de insercin :XX: y apunta al objeto donde
tiene que enviar la informacin. Por lo tanto la sintaxis de cout ser")
cout##variable1##variable2##...##variablen;
.as cadenas de texto son variables y se ponen entre : : %comillas dobles&.
cout ## -:ola-;
cout ## 6=P;
cout ## 13.@P;
cout ## (;
cout ## -3l valor de pi es + - ## 3.161@;
Si queremos incluir saltos de lnea podemos emplear el cdigo de escape S\nS o
bien el manipulador :endl:.
cout ## -Kna linea.;n -;
cout ## -se!unda linea.;n-;
cout ## -tercera linea.- ## endl;
cout ## -cuarta linea.- ## endl;
8!<!1!2! 6entencia de 6alida "rintf
.a rutina printf permite la aparicin de valores numricos, caracteres y cadenas
de texto por pantalla. El prototipo de la sentencia printf es el siguiente)
printf (control) ar!1)ar!2...);
En la cadena de control indicamos la forma en que se mostraran los argumentos
posteriores, tambin podemos introducir una cadena de texto %sin necesidad de
argumentos& o combinar ambas posibilidades, as como secuencia de escape. En el
caso de que utilicemos argumentos deberemos indicar en la cadena de control tanto
modificadores como argumentos se vayan indicar. El modificador esta compuesto por
el car"cter d seguido por un car"cter de conversin indica de que tipo de dato se
trata.
Ejemplo)
printf(-.olor Qs) num1 Qd) num2 Q>d) real Q>.2f.;n-) -ro4o-) 12) =) 3.6);
*mprimir" la siguiente lnea en la pantalla %incluyendo el car"cter de nueva lnea
\n&)
.olor ro4o) num1 123) num2 ,,,=P) real 3.16.

8!<!1!8! Ta,la de caracteres de for&ato salida
.as letras de control de formato m"s usadas son %5igura K.=;&)
.ar<cter Mescripci1n
^c_
Esto imprime un nmero como un car)cter DCC<<E Por lo @ue, Fprintf
5?c5, !GH imprimirIa la letra JDKE La salida para un &alor cadena es el
primer car)cter de la cadenaE
^d_ Esto imprime un entero decimalE
^i_ Esto tambi(n imprime un entero decimalE
^e_
Esto imprime un nmero en notacin cientIfica $e/ponencial'E Por
ejemplo, printf 5?4EMe5, 1NG imprime J1ENGe+MK, con un total de 4
cifras significati&as de las cuales M siguen al punto decimalE Los
modificadores J4EMK son descritos m)s abajoE
^f_ Esto imprime un nmero en notacin punto flotanteE
^!_
Esto imprime en notacin cientIfica o en notacin punto flotante, la @ue
@uiera @ue sea m)s cortaE
^o_ Esto imprime un entero octal sin signoE
^s_ Esto imprime una cadenaE
^(_ Esto imprime un entero %e/adecimal sin signoE
^/_
Esto imprime un entero %e/adecimal sin signoE Cin embargo, para los
&alores entre 1 ; 1G, utili,a las letras desde la JDK a la JFK en lugar de
esas mismas letras pero en minsculasE
^Q_
Esta no es realmente una letra de control de formatoE Pero tiene un
significado especial cuando se usa despu(s de un J?KO la secuencia J??K
imprime el car)cter J?KE Po consume ni necesita ningn item o argumento
correspondienteE
.i#$ra 8! 1V! Ta,la de caracteres de for&ato salida
El formato completo de los modificadores es el siguiente)
Q Vsi!noWVlon!itudWV.WVprecisi1nW car<cter de conversi1n.
6i#no7 indicamos si el valor se ajustara a la i!quierda, en cuyo caso
utili!aremos el signo menos, o a la derec(a %por defecto&.
Lon#it$d7 Especifica la longitud m"xima del valor que aparece en por pantalla.
Si la longitud m"xima del valor que aparece por pantalla. Si la longitud es menos que
el n#mero de dgitos del valor, este aparecer"n ajustado a la i!quierda.
Precisin7 *ndicamos el numero m"ximo de decimales que tendr" el valor.
.a sentencia printf puede incluir caracteres especiales o secuencias de escape
que permitan modificar la impresin de los datos.
'aracteres especiales m"s utili!ados)
Wn PP salto de lnea
Wt PP tabulador (ori!ontal
W) PP tabulador vertical
W, PP retroceso
Wr PP retorno de carro
Wf PP salto de p"gina
Wa PP alerta %campana&
WW PP car"cter \
WS PP interrogante
WX PP comilla simple
WM PP comilla doble
Wooo PP car"cter ,S'** dado por tres dgitos octales %ooo ser"n dgitos&
W1DD PP car"cter ,S'** dado por dos dgitos (exadecimales %(( ser"n dgitos&
WV PP car"cter nulo
.os argumentos de la sentencia de entrada pueden estar representados por
operaciones o sentencias. .a sentencia printf resulte estas operaciones antes de
ejecutar la etapa de control. Se resolver"n los argumentos de derec(a a i!quierda unas
ve! finali!ados se resuelve la etapa de control de i!quierda a derec(a.
Ejemplo)
int edad + >;
printf(-edad2' Qd) edad1' Qd) edad inicial' Qd-) edad) 55edad) edad5
5);
8uestra por salida)
edad2' B) edad1' B) edad inicial' >
8!<!1!9! 6entencia de 6alida "$ts
Esta sentencia muestra por la salida est"ndar una cadena de caracteres o
literales y salta a la prxima lnea, su sintaxis)
puts(direccion_cadena_caracteres);
1
puts(`literalesa);
Ejemplo)
c$ar cadenaV2>W+a.asaa;
"" se declara una cadena de caracteres *JCK,KaK,KsK,KaK,KQK+
puts(cadena);
"" Ruestra los caracteres de cadena %asta encontrar el fin de cadena
puts(1,,);
"" Ruestra los caracteres desde la posicin de memoria 1 %asta
"" encontrar el car)cter de fin de cadena
puts(`cadenaa);
"" Ruestra la palabraO cadena por pantalla
8!<!1!:! 6entencia de 6alida "$tcDar
Esta sentencia muestra por la salida est"ndar un car"cter, su sintaxis)
putc$ar (variable_caracter);
1
putc$ar (valor_caracter);
1
putc$ar (^simbolo_caracter_);
Ejemplo)
c$ar car + ^@>_0
putc$ar (car); "" Ruestra por pantalla el car)cter JDK
putc$ar (@>); "" Ruestra por pantalla el car)cter JDK
putc$ar (^H_); "" Ruestra por pantalla el car)cter JDK
8!<!2! 6entencias de Entradas Estandar
El dispositivo de entrada est"ndar como podemos suponer es el teclado de
nuestro ordenador. .as sentencias de entrada escanean este puerto para atrapar datos
y ser utili!ados. Entre estas sentencias tenemos)
8!<!2!1! 6entencia de Entrada cin
Para extraer datos desde el teclado empleamos el objeto :cin:, que se utili!a en
conjuncin con el operador de extraccin representado como :YY:, lee informacin
del flujo cin %a la i!quierda del operador& y las almacena en las variables indicadas a
la derec(a&. .a sintaxis sera la siguiente)
cin%%variable1%%...%%variablen;
3n ejemplo de cdigo utili!ando ambos objetos podra ser el siguiente)
"include #iostream.$%
void main ()
{
int i;
cout##-2ntroduce un n?mero-;
cin%%i; "" atrapa un &alor entero ingresado por teclado
}
8uestra por pantalla la frase :*ntroduce un n#mero: y posteriormente
almacenara el valor introducido por teclado en la variable i.
8!<!2!2! 6entencia de Entrada scanf
.a rutina scanf permite entrar datos en la memoria del ordenador a travs del
teclado. El prototipo de la sentencia scanf es el siguiente)
scanf(control) ar!1) ar!2) ...);
En la cadena de control indicaremos por regla general, los modificadores que
(ar"n referencia al tipo de dato de los argumentos. ,l igual que en la sentencia printf
los modificadores, estar"n formado por el car"cter Y seguido de un car"cter de
conversin. .os argumentos indicados ser"n, nuevamente las variables. .a principal
caracterstica de la sentencia scanf es que necesita saber la posicin de la memoria del
ordenador en que se encuentra la variable para poder almacenar la informacin
obtenida, para indicarle est" posicin utili!amos el smbolo ampersand %a&, aunque
colocaremos delante del nombre de cada variable %esto no es necesario en las cadenas
de caracteres o punteros&.
Ejemplo)
include#stdio.$%
void main( ) "4solicita dos datos4"
{
c$ar nombreV1,W;
int edad;
printf (-introduce tu edad'-);
scanf(-Qd-) Sedad);
printf (-introduce tu nombre'-);
scanf(-Qs-) nombre); "" nombre no lle&a : por ser una referencia
}
8!<!2!8! 6entencia de Entrada #ets
Esta sentencia lee y guarda una cadena introducida por la entrada est"ndar, su
sintaxis)
c$ar cadenaV2>W;
puts(`2n!rese un nombre'a);
!ets(cadena);
"" En&Ia los caracteres a partir de la posicin de memoria de la cadena
"" ; transforma el car)cter intro $enter' en un car)cter fin de cadena
puts(cadena);
"" Ruestra lo @ue se ingreso por la entrada en pantalla
8!<!2!9! 6entencia de Entrada #etcDar
Esta sentencia lee y retorna cuando se presione la tecla intro, un #nico
car"cter introducido mediante el teclado y salta a la prxima lnea. 8uestra el
car"cter por la pantalla. Su sintaxis)
c$ar letra;
letra+!etc$ar( );
"" atrapa un car)cter ; lo retorna despu(s del car)cter introE
8!<!2!:! 6entencia de Entrada #etcD
.ee y retorna un #nico car"cter al presionar una tecla. 4o muestra el
car"cter por pantalla. Su sintaxis)
c$ar letra;
letra+!etc$( );
"" atrapa un car)cter al momento de presionarlo ; no lo muestra
8!<!2!<! 6entencia de Entrada #etcDe
Esta sentencia lee y retorna un #nico car"cter introducido mediante el
teclado por el usuario al igual que la sentencia getc( pero a diferencia esta si
muestra el car"cter por pantalla. Su sintaxis)
c$ar letra;
letra+!etc$e( );
"" atrapa un car)cter al momento de presionarlo ; lo muestra
CAPITULO 9
E6TRUCTURA6 'E CONTROL
9!1! Conce"to!
Para existir un control de un proceso o situacin, se deben dar condiciones
necesarias para ello, es decir que las condiciones son el punto de partida principal de
una sentencia de control.
Podemos definir las estructuras de control como sentencias condicionales
compuesta, que al cumplirse la condicin necesaria, se realicen las sentencias simples
contenidas en esta.
9!2! Ti"os de estr$ct$ras de control
El 'FF, como todo lenguaje de programacin basado en la algortmica, posee
una serie de estructuras de control para gobernar el flujo de los programas.
6ebemos recordar que la evaluacin de una condicin producir" como
resultado un cero si es falsa y un n#mero cualquiera distinto de cero si es cierta, este
(ec(o es importante a la (ora de leer los programas, ya que una operacin
matem"tica, por ejemplo, es una condicin v"lida en una estructura de control.
.as estructuras de control b"sicas las podemos dividir en) sentencias de control
selectivas y las sentencias de control iterativo o ciclos.
9!2!1! Estr$ct$ras de control selecti)as!
.as sentencias de control selectivas son estructuras de control que funciona de
esta manera) .as instrucciones comien!an a ejecutarse de forma secuencial %en orden&
y cuando se llega a una estructura condicional, la cual est" asociada a una condicin,
se decide que camino tomar dependiendo siempre del resultado de la condicin
siendo esta falsa o verdadera. 'uando se termina de ejecutar este bloque de
instrucciones se reanuda la ejecucin en la instruccin siguiente a la de la
condicional.
6entro de las estructuras de seleccin encontramos en el 'FF, las de
condicin simple %sentencia if&, bicondicionales %sentencia if+else& y las de condicin
m#ltiple %switc(&.
9!2!1!1! La sentencia if o condicional si&"le
Es una sentencia condicional simple cuya traduccin es) si la expresin a
evaluar es verdadera reali!a las instrucciones que controle dic(a sentenciaE Si el
resultado de la expresin es falso el flujo del programa continuar" con las sentencias
debajo del final del if. Su sintaxis es)
if (e(presi1n)
{
""sentencias
}

Si solo controla una sentencia no es necesario usar los operadores de bloque.
if (e(presi1n)
sentencia_unica;
Podemos representar esta sentencia con el siguiente diagrama %5igura >.=&,
.i$#ra 9! 1! 'ia#ra&a de fl$%o sentencia if!
donde se muestra que solo se reali!ara la sentencia 1 si el resultado lgico de la
expresin es verdadera de no serlo contin#a el flujo del programa.
Ejemplo)
int (+@;
if((%>)
755;
'omo se ve x tiene un valor y el if eval#a su estatus, como el resultado es
verdadero I incrementara su valor una sola ve! y el flujo de programa continuar".
Ejemplo =) 6etermine si un n#mero es igual mayor o menor que cero.
"include #iostream.$%
void main()
{ int numero;
cout##-2n!rese un numero'-;
cin%%numero;
if(numero ++ ,) ""La condicin indica @ue tiene @ue ser igual a Cero
{
cout##-3l Numero 2n!resado es 2!ual a .ero-;
}
if(numero % ,) "" la condicin indica @ue tiene @ue ser ma;or a Cero
{
cout##-3l Numero 2n!resado es Ma*or a .ero-;
}
if(numero # ,) "" la condicion indica @ue tiene @ue ser menor a Cero
{
cout##-3l Numero 2n!resado es Menor a .ero-;
}
}
Ejemplo J) 6etermine si un n#mero entero es par o impar.
"include #iostream.$%
void main()
{ int num;
cout##-2n!rese un numero'-;
cin%%num;
""An numero ser) par sI es di&isible por 2
if(num Q2++,) ""La condicin indica @ue se cumpla si es di&isible
cout##-3l numero in!resado es par-;
""An numero ser) impar sI no es di&isible por 2
if(num Q2Y+,) ""La condicin indica @ue se cumpla si no es di&isible
cout##-3l numero in!resado es impar-;
}
Ejemplo K) 'onvertir un car"cter atrapado en un n#mero entre b;,?c.
"include #iostream.$%
"include #stdio.$%
"include #conio.$%
void main()
{ int num+C1;
c$ar car;
cout##-2n!rese un car<cter'-;
car+!etc$e(); ""atrapa un sImbolo
""La condicin se cumple se asignara el nmero correspondiente
if(car++_,_) num+,;
if(car++_1_) num+1;
if(car++_2_) num+2;
if(car++_3_) num+3;
if(car++_6_) num+6;
if(car++_>_) num+>;
if(car++_@_) num+@;
if(car++_B_) num+B;
if(car++_=_) num+=;
if(car++_P_) num+P;
if(numY+C1)
cout##-3l Numero es +-##num;
if(num++C1)
cout##-.ar<cter no es un sEmbolo numbrico-;
}
9!2!1!2! .a sentencia if+else o bicondicional
Esta estructura cumple las mismas caractersticas de la sentencia if, cuando la
condicin es verdadera reali!ara una sentencia o conjunto de sentencias verdaderas,
pero si esta es falsa reali!ara una sentencia o conjunto de sentencias falsas.
if (e(presi1n)
{
XXsentencias condici1n verdadera
}
else
{
XX sentencias condici1n falsa
}
Si solo controla una sentencia no es necesario usar los operadores de bloque.
if(e(presi1n)
sentencia_unica1;
else
sentencia_unica2;
Podemos representar esta sentencia con el siguiente diagrama %5igura >.J&,
.i$#ra 9! 2! 'ia#ra&a de fl$%o sentencia ifZelse!
donde se muestra que solo se reali!ara la sentencia 1 si el resultado lgico de la
expresin es verdadera, pero si esta no se cumple reali!a la sentencia 2, una ve!
realice alguna de las sentencias dado el resultado de la expresin contin#a el flujo del
progama.
6e esta manera podemos mostrar el siguiente ejemplo)
(+,;
if( ( ++>)
{ 755;
}
else
{ 7CC;
}
'omo la evaluacin de x es falsa, I decrementar" en uno su valor y continuar"
con el flujo del programa.
Ejemplo =) 6etermine si un numero entero es positivo o negativo.
"include #iostream.$%
void main()
{ int num;
cout##-2n!rese un numero'-;
cin%%num;
if(num%+ ,) ""La condicin indica @ue tiene ma;or o igual a cero
{
cout##-3l numero in!resado es positivo-;
}
else "" de no cumplirse, entonces debe ser menor @ue cero
{
cout##-3l numero in!resado es ne!ativo-;
}
}
Ejemplo J) 6etermine si un n#mero entero es par o impar.
"include #iostream.$%
void main()
{ int num;
cout##-2n!rese un numero'-;
cin%%num;
if(num Q2++,) ""La condicin indica @ue se cumpla si es di&isible
cout##-3l numero in!resado es par-;
else ""si la condicin no se cumple entonces no es di&isible
cout##-3l numero in!resado es impar-;
}
.as sentencias pueden controlar otras sentencias de control secuencial
permitiendo evaluar los procesos solo cuando sean necesarios conocidas como
sentencias sec$enciales anidadas. Por ejemplo si queremos determinar si un n#mero
es igual mayor o menor que cero, usando sentencias anidadas if+else resulta)
"include #iostream.$%
void main()
{
int numero;
cout##-2n!rese un numero'-;
cin%%numero;
if(numero ++ ,)
{ cout##-3l Numero 2n!resado es 2!ual a .ero-;
}
else if(numero % ,)
{ cout##-3l Numero 2n!resado es Ma*or a .ero-;
}
else {
cout##-3l Numero 2n!resado es Menor a .ero-;
}
}
9!2!1!8! .a sentencia switc(.
Sirve para seleccionar una de entre m#ltiples alternativas de acuerdo al valor de
una expresin. .a sentencia switc( es especficamente #til cuando la seleccin se
basa en el valor de una variable simple o de una expresin simple denominada
e1"resin de control &(lti"le o selector.
Su sintaxis)
s8itc$ (e(presi1n)
{
case valor_e(presion_1'
XXsentencias 1
brea7;
case valor_e(presion_2'
XXsentencias 2
brea7;
....
case valor_e(presion_n'
XXsentencias n
brea7;
default'
XXsentencias (
}
Podemos representar esta sentencia mediante el diagrama siguiente %5igura
>.K&,
.i$#ra 9! 8! 'ia#ra&a de fl$%o sentencia sitcD!
donde dado el valor de la expresin reali!ara las operaciones y continuara con
el flujo del programa.
Esta sentencia la podemos representar usando sentencias anidadas if^else, si la
sentencia breaI no fuese utili!ada entonces se representara por un conjunto de
sentencias if una tras otra.
'omo ver"n dependiendo de valor se selecciona el caso por ejemplo)
(+3;
s8itc$ (()
{
case 1' 7+ 2,T2;
brea7;
case 2' 7+2,X2;
brea7;
case 3' 7+2,52;
""no es necesario usar break
}
'omo x es igual a K el case efectuar" la operacin IWJ;FJ, el uso de default es
opcional.
Ejemplo) Escribir un programa que lea por teclado las notas desde la ,+A, y
muestre por pantalla el rendimiento acadmico del alumno.
"include #conio.$%
"include #iostream.$%
main()
{ c$ar letra;
cout##-2n!rese la .alificaci1n * presione 3nter' -;
cin%%letra;
s8itc$ (letra)
{
case cHc' cout##-3(celente-;
brea7;
case cFc' cout##-Notable-;
brea7;
case c.c' cout##-Hprobado-;
brea7;
case cMc'
case c3c'
case cGc' cout##-Mesaprobado-;
brea7;
default' cout##-No esposible esta nota-;
}
}
.a sentencia ,reaC es opcional. 'uando se encuentra, provoca la salida de
sitcD. En caso contrario continua la siguiente secuencia case o defa$lt aunque no se
cumpla la condicin. Para aclarar esto, tomemos el siguiente ejemplo)
int c;
...
scanf (-Qd-) Sc);
s8itc$ (c) { case 1'
case 2' Guncion2 ();
case 3' Guncion3 ();
brea7;
case 6' Guncion6_1 ();
Guncion6_2 ();
brea7;
case >' Guncion_> ();
default' Guncion/ ();
}
.a siguiente tabla indica qu funcin se ejecuta dependiendo del valor de c
%5igura >.>&.
Ji se pulsa Je e4ecuta las funciones
1 Funcion2$' ; FuncionM$'
2 Funcion2$' ; FuncionM$'
M FuncionM$'
4 Funcion431$' ; Funcion432$'
G FuncionG$' ; FuncionS$'
.tra cosa FuncionS$'
.i$#ra 9! 9! Ta,la de e%ec$cin de f$nciones!
9!2!2! Estr$ct$ras de control iterati)as!
.as Sentencias de Iteracin o Ciclos son estructuras de control que repiten la
ejecucin de un grupo de instrucciones. 9"sicamente, una sentencia de iteracin es
una estructura de control condicional, ya que dentro de la misma se repite la
ejecucin de una o m"s instrucciones &ientras o Dasta que una a condicin
especfica se cumpla. 8uc(as veces tenemos que repetir un n#mero definido o
indefinido de veces un grupo de instrucciones por lo que en estos casos utili!amos
este tipo de sentencias. En 'FF los ciclos o bucles se construyen por medio de las
sentencias for, Dile y do Z Dile. .a sentencia for es #til para los casos en donde se
conoce de antemano el n#mero de veces que una o m"s sentencias (an de repetirse.
Por otro lado, la sentencia Dile es #til en aquellos casos en donde no se conoce de
antemano el n#mero de veces que una o m"s sentencias se tienen que repetir.
9!2!2!1! 6entencia for
Es un bucle o sentencia repetitiva que, permite reali!ar un proceso de manera
cclica, desde un punto partida inicial, (asta un punto final, atreves de un incremento
o contador de actividad. .a sentencia for)
1! Ejecuta la sentencia de iniciali!aciones.
2! Berifica la expresin booleana de condicin de trmino)
a. si es cierta, ejecuta la sentencia entre llaves y la sentencia de iteracin para
volver a verificar la expresin booleana de condicin de trmino.
b. si es falsa, sale del bucle.
Podemos representar el flujo de la sentencia en el siguiente diagrama %5igura
>.@&)
.i$#ra 9! :! 'ia#ra&a de fl$%o sentencia for!
Sintaxis)
for (inicio; condici1n; iteraci1n)
sentencia;
o si se desean repetir varias sentencias)
for (inicio; condici1n; iteraci1n)
{
sentencia_1;
sentencia_2;
sentencia_n;
}
Bemos que la sentencia for tiene tres secciones) inicioB en dnde se da un valor
inicial a una variable o variables de control del bucle7 condicinB que es una
expresin que devuelve un valor verdadero o falso, y (ace que el bucle se repita
mientras sea cierta y salga de este solo cuando la condicin sea falsa7 e iteracin, en
dnde se determina el cantidad del incremento o decremento de la variable o
variables de control. .as tres secciones est"n separadas por punto y coma. El cuerpo
del bucle puede estar formado por una o por varias sentencias. En este #ltimo caso
deben encerrarse entre llaves TU. .as llaves slo son necesarias si se quieren repetir
varias sentencias, aunque se recomienda su uso porque facilita la lectura del cdigo
fuente y ayuda a evitar errores al modificarlo.
Aabitualmente, en la expresin lgica de condicin de trmino se verifica que
la variable de control alcance un determinado valor. Por ejemplo)
for (i + valor_inicial; i #+ valor_final; i55)
{ sentencia;
}
,lgunos ejemplos de la sentencia for)
En la siguiente secuencia se muestran en pantalla los n#meros del = al =; y sus
cuadrados.
int i;
for (i + 1; i #+ 1,; i55)
{
printf (-;nValor de i' Qd-) i);
printf (-ZtValor de i2' QdZn-) i T i);
}
Esta secuencia, se muestran en pantalla las letras may#sculas de la , a la i.
c$ar letra;
for (letra + cHc; letra #+ cRc; letra55)
cout## letra##endl;
El valor de incrementoPdecremento de las variables de control puede ser
diferente de =. El siguiente ejemplo muestra en pantalla los n#meros pares
comprendidos entre = y =;;, descendentemente)
int i;
for (i + 1,,; i %+ 1; i + i C 2)
cout ## i ##-;t -;
Es posible tener m"s de una variable de control del bucle. En el bucle for las
secciones de iniciali!acin e incremento pueden tener, a su ve!, subsecciones, en
cuyo caso van separadas por el operador secuencial %B&. 3n ejemplo es)
int i) 4;
for (i + ,) 4 + 1; i 5 4 # N; i55) 455)
cout## i 5 4##endl;
que visuali!a los 4 primeros n#meros impares.
4o debe confundirse esta sentencia con un anidamiento de bucles for. 3n
anidamiento tiene el siguiente aspecto)
int i) 4;
for (i + ,; i #+ 1,,; i55)
{ ""cuerpo3del3bucle3e/terno0
for (4 + ,; 4 #+ 1,,; 455)
{ ""cuerpo3del3bucle3interno0
}
}
.a condicin de salida del bucle no tiene por qu referirse a la variable de
control. Esto queda ilustrado en el siguiente ejemplo)
c$ar a;
int i;
for (i + 1; a Y+ csc; i55)
{ printf (-;nQd-) i);
a + !etc$ ();
}
En este ejemplo se van mostrando en pantalla los n#meros =, J,...mientras
presionemos cualquier car"cter (asta que se teclee el car"cter ]s[.
El bucle for puede no tener cuerpo. Esta caracterstica permite crear retardos en
un programa.
int i;
for (i + ,; i # 1,,; i55);
El bucle provoca un retardo de =;; ciclos, saldr" del bucle cuando la variable
sea mayor o igual a=;;.
El bucle for puede tener vaca cualquier seccin. En un bucle for puede faltar
una, dos o las tres secciones. Por ejemplo, es correcto escribir
re!ister int i;
for (i + ,; i Y+ 1,; ) "4 Falta la MT seccin $incremento' 4"
{
scanf (-Qd-) Si);
printf (-;nQd-) i);
}
que va mostrando en pantalla los valores que se ingresen, finali!ando al
ingresar el n#mero =; %que tambin se visuali!a&.
-ambin podemos escribir un bucle como)
for ( ; ; )
{
cuerpo_del_bucle;
}
que es un bucle sin fin, debe (aber en el cuerpo del bucle una sentencia que
rompa el ciclo del programa como lo es una sentencia breaI. Ejemplo)
void main ()
{ int n;
for ( ; ; )
{ printf (-;nDeclee un n?mero' -);
scanf (-Qd-) Sn);
if (Yn) brea7;
printf (-;n3l cuadrado es Qd-) n T n);
}
}
9!2!2!2! 6entencia Dile
.a sentencia Dile tiene una condicin del bucle %una expresin lgica& que
controla la secuencia de repeticin. .a sentencia eval#a la condicin antes de que se
ejecute el cuerpo del bucle si se cumple la condicin, reali!a los procesos que
controla la sentencia, sino sale de esta y contin#a con el flujo del programa. 'omo
podemos observar en la figura >.M)
.i$#ra 9! <! 'ia#ra&a de fl$%o sentencia Dile!
El cuerpo del bucle no se ejecutar" nunca si la primera ve! no se cumple la
condicin. El bucle puede ser infinito si no se modifican adecuadamente las variables
de la condicin dentro del bucle.
Sintaxis)
8$ile ( condici1n )
{
sentencias .......... ;
}
Beamos algunos ejemplos.
En esta sentencia se solicita un car"cter del teclado mientras no se teclee el
car"cter \n[ ni el car"cter \s[. 'uando se teclea alguno de estos caracteres, se
almacena en c y se abandona el bucle.
c$ar c;
8$ile (c Y+ csc SS c Y+ cnc)
c + !etc$e ();
El siguiente ejemplo es un caso de bucle w(ile sin cuerpo. Se mantendr" en el
ciclo (asta que se teclea el car"cter ]s_.
8$ile (!etc$ () Y+_s_);
El siguiente programa utili!a un bucle w(ile para solicitar del usuario que
adivine un n#mero. 2eali!ar un programa que muestre los n#mero del = al =;;.
"include #conio.$%
"include #iostream.$%
main()
{ int contador+,;
8$ile ( contador # 1,, )
{ contador55;
cout##-;t -##contador;
}
cout##-&resione 3nter para salir-;
}
9!2!2!8! E+$i)alencias ente las sentencias for = Dile!
.as sentencias for y w(ile son equivalentes entre si ya que se pueden emular
entre s, aunque podramos usar ambas sin problemas, se recomienda el uso de
sentencias for para recorridos y la sentencia w(ile cuando dependa del resultado de
un proceso)
Emulando un w(ile mediante una sentencia for)
for ( ; condici1n ; ) "" U%ile carece de inicio ; de iteraciones
{
sentencias;
}
Emulando un for mediante una sentencia w(ile)
inicio; "" la sentencia for posee &alores de inicio
8$ile ( condici1n )
{
sentencias;
iteraciones; XX la sentencia for posee &alores de iteraciones
}
Ejemplo =) 6etermine si un numero es capic#o %se lee igual en ambos sentidos&.
Ksando la sentencia 8$ile Ksando la sentencia for
"include #conio.$%
"include #iostream.$%
void main()
{ int a) inv) au(;
cout##a2n!rese un numero'a;
cin%%a;
au( + a;
inv + ,;
8$ile ( au( % , )
{ "" separar dIgitos e in&ertir
inv + inv T 1, 5 au( Q 1,;
au( + au( X 1,;
}
if(a ++ inv)
cout##-3l numero es capic?oa;
else
cout##-3l numero no es capic?oa;
}
"include #conio.$%
"include #iostream.$%
void main()
{ int a) inv) au(;
cout##a2n!rese un numero'a;
cin%%a;
for(au(+a) inv+,; au(%,; au(X+1,)
* "" separar dIgitos e in&ertir
inv + inv T 1, 5 au( Q 1,;
}
if(a ++ inv)
cout##-3l numero es capic?oa;
else
cout##-3l numero no es capic?oa;
}
Ejemplo J) 8uestre un cuadro usando el car"cter _x_ y una dimensin n. Sera
necesario usar sentencia anidadas para despla!ar el cursor de manera (ori!ontal y
vertical.
Ksando la sentencia 8$ile Ksando la sentencia for
"include #conio.$%
"include #iostream.$%
void main()
{ int i) 4) n;
cout##a2n!rese la dimensi1n'a;
cin%%num;
"include #conio.$%
"include #iostream.$%
void main()
{ int i) 4) n;
cout##a2n!rese la dimensi1n'a;
cin%%num;
i + ,;
8$ile(i # n )
{ 4+,;
8$ile( 4 # n)
{
if(i++,ZZi++nC1ZZ4++,ZZ4++nC1)
cout##-(a;
else cout##a a;
455;
}
cout##endl;
i55;
}
}
for(i + ,; i # n ; i55)
{
for(4 + ,; 4 # n; 455)
if(i++, ZZ i++nC1ZZ 4++,ZZ 4++nC1)
cout##-(a;
else cout##a a;

cout##endl;
}
}
Ejemplo J) 8uestre una 1 usando el car"cter _x_ y una dimensin n.
Ksando la sentencia 8$ile Ksando la sentencia for
"include #conio.$%
"include #iostream.$%
void main()
{ int i) 4) n;
cout##a2n!rese la dimensi1n'a;
cin%%num;
i + ,;
8$ile(i # n )
{ 4+,;
8$ile( 4 # n)
{
if(i++4 ZZ i54++nC1)
cout##-(a;
else cout##a a;
455;
}
cout##endl;
i55;
}
}
"include #conio.$%
"include #iostream.$%
void main()
{ int i) 4) n;
cout##a2n!rese la dimensi1n'a;
cin%%num;
for(i + ,; i # n ; i55)
{
for(4 + ,; 4 # n; 455)
if(i++4 ZZ i54++nC1)
cout##-(a;
else cout##a a;

cout##endl;
}
}
9!2!2!9! 6entencia doZDile
.a sentencia do + w(ile se utili!a para especificar un bucle condicional que se
ejecuta al menos una ve!. Esta situacin se suele dar en algunas circunstancias en las
que se (a de tener la seguridad de que una determina accin se ejecutara una o varias
veces, pero al menos un ve!. El flujo de ejecucin podemos obsrvala en la siguiente
figura >.N)
.i$#ra 9! O! 'ia#ra&a de fl$%o sentencia doZDile!
En esta sentencia a diferencia de la sentencia for y w(ile, primero reali!ara las
sentencias que controle una ve! reali!ada evaluara la condicin, si esta es verdadera,
volver" a reali!ar las sentencias (asta que la condicin en alg#n momento sea falsa.
.as sentencias se ejecuta al menos una ve!, incluso aunque la expresin se
eval#e como falsa, puesto que la evaluacin se (ace al final, a diferencia de la
sentencia w(ile y for, en el que la evaluacin de la condicin se (ace al principio.
Sintaxis)
do{
sentencias;
}8$ile(condici1n);
Esta sentencia por su conformacin la (acen preferibles en problemas que se
espere un valor antes de poder ejecutar procesos, como por ejemplo) validaciones,
men#s de espera, ingreso de datos con clave #nica, etc.
Ejemplo) 2eali!ar un programa que convalide el ingreso de dos notas con rango
b; ` J;c y (alle el promedio de ambas notas.
"include #conio.$%
"include #iostream.$%
void main()
{ int nota1) nota2;
do{ XXtermina del ciclo solo si el &alor nota1 est) en el rango
cout ## -2n!rese la primera nota' -;
cin%%nota1;
if(nota1#, ZZ nota1%2,)
cout ## -Nota fuera de los ran!osV,C2,W-##endl;
}8$ile(nota1#, ZZ nota1%2,));
do{ ""termina del ciclo solo si el &alor nota2 est) en el rango
cout ## -2n!rese la se!unda nota' -;
cin%%nota2;
if(nota2#, ZZ nota2%2,)
cout ## -Nota fuera de los ran!osV,C2,W-##endl;
}8$ile(nota2#, ZZ nota2%2,));
cout##-3l promedio de las nontas es'-##(nota15nota2)X2;
}
En el siguiente ejemplo se solicita un car"cter del teclado (asta que se pulse
cualquiera de los caracteres SSS o S4S.
"include #iostream.$%
void main ()
{
c$ar tecla;
do {
cout##a&ulse J o N' -##endl;
tecla + !etc$ ();
} 8$ile (tecla Y+ cJc SS tecla Y+ cNc);
}
9!2!2!:! La sentencia ,reaC
Es una sentencia de ruptura de secuencia, permite cortar ciclos de programas.
.a sentencia ,reaC se puede colocar dentro de un bucle o bucles anidados. 'uando se
ejecuta la sentencia ,reaC se abandona el bucle m"s interno. , todos los efectos la
sentencia ,reaI act#a como un salto a la instruccin siguiente al bucle en el que se
ejecuta.
9!2!2!<! La sentencia contin$e
.a sentencia contin$e, no abandona el bucle si no (ace que se ejecute la
siguiente iteracin. En el bucle w(ile la ejecucin del contin$e (ace que el flujo del
programa salte a la condicin. En el bucle for la ejecucin del contin$e (ace que la
expresin de incremento, para despus continuar normalmente con la condicin. Es
decir, la ejecucin del contin$e evita que se ejecute el resto del cuerpo del bucle.
Esta sentencia se utili!a en los bucles for, w(ile y doPw(ile. 'uando se ejecuta
fuer!a un nuevo ciclo del bucle, salt"ndose cualquier sentencia posterior. Por
ejemplo,
int i) n;
for (i + 1; i #+ 1,,; i55)
{
n + i X 2;
if (i ++ 2 T n)
continue;
printf (-;nQd-) i);
}
el bucle )muestra en pantalla slo los n#meros impares, puesto que para los
n#meros pares la expresin i -- 2 E n se eval#a como cierta, ejecut"ndose la
sentencia contin$e que fuer!a de inmediato un nuevo ciclo del bucle.
CAPITULO :
ARREGLO6
:!1! 'efinicin
.os arreglos son usados extensamente por los programadores para contener
listas de datos en la memoria, por ejemplo, los datos almacenados en un disco suelen
leerse y ponerse dentro de un arreglo con el objetivo de facilitar la manipulacin de
dic(os datos, ya que los datos en memoria pueden ser modificados, clasificados,
marcados para su eliminacin, etc. para luego ser reescritos al disco.
3n arre#lo ?arra=@ es una coleccin de datos del mismo tipo, que se almacenan
en posiciones consecutivas de memoria y reciben un nombre com#n. Para diferenciar
cada elemento de un arreglo se utili!a un ndice, que especifique su posicin relativa
en el arreglo.
.os ndices son n#meros que se utili!an para identificar a cada uno de los
componentes de un arreglo. Por ejemplo podemos pensar en los casilleros, as que si
deseamos guardar o retirar un paquete nos dirigimos al casillero el cual sera el
arreglo7 y dado el n#mero especfico el cual representa el ndice para identificar el
lugar del casillero en donde qued guardado el paquete.
3n arreglo es una coleccin finita, (omognea y ordenada de elementos.
5inita) -odo arreglo tiene un lmite7 es decir, debe determinarse cu"l ser" el
n#mero m"ximo de elementos que podr"n formar parte del arreglo.
Aomognea) -odos los elementos del arreglo deben ser del mismo tipo.
Crdenada) Se puede determinar cu"l es el primer elemento, el segundo, el
tercero,.... y el n+simo elmento.
:!2! 'eclaracin de arre#los
Para declarar un arreglo se emplea la sintaxis)
tipo identificadorV VtamadoW W V + { lista de iniciali9aci1n } W ;
donde,
ti"o se refiere al tipo de datos que contendr" el arreglo. El tipo puede ser
cualquiera de los tipos est"ndar %c(ar, int, float, etc.& o un tipo definido por
el usuario. Es m"s, el tipo del arreglo puede ser de una estructura creada
con) struct, class.
identificador se refiere al nombre que le daremos al arreglo.
ta&a]o es opcional e indica el n#mero de elementos que contendr" el
arreglo. Si un arreglo se declara sin tama$o, el mismo no podr" contener
elemento alguno a menos que en la declaracin se emplee una lista de
iniciali!acin.
lista de iniciali3acin es opcional y se usa para establecer valores para
cada uno de los componentes del arreglo. Si el arreglo es declarado con un
tama$o especifico el n#mero de valores iniciali!ados no podr" ser mayor a
dic(o tama$o.
Ejemplos)
int int_HV>W;
lon! lon!_HV>W + { 1) 2) 3) 6) > };
c$ar c$ar_HVW + { cac) cbc) ccc );
int bidim_HV6WV6W+{{1)1}){2)3}};
:!8! Clasificacin de los arre#los
.os arreglos los podemos clasificar de acuerdo con el n#mero de dimensiones
que tienen. ,s se tienen los)
Unidi&ensionales ?)ectores@) representados por una coleccin de elementos
con un mismo nombre y diferenciados por un ndice.
M$ltidi&ensionales) 5idi&ensionales %tablas o matrices& =
Tridi&ensionales. 2epresentados por colecciones de arreglos
unidimensionales %matrices& o m#ltiples matrices.
:!8!1! Arre#los $nidi&ensionales!
.os arreglos unidimensionales pueden ser apreciados en la vida cotidiana como
por ejemplo un armario el cual est" dividido por gavetas, una cola de personas que
reali!an un mismo proceso como la compra de un mismo artculo, etc.
Podemos definir los arreglos unidimensionales como una coleccin de variables
del mismo tipo, con un mismo nombre y diferenciadas a travs de un ndice. -ambin
podramos representarlo como un conjunto compuesto por elementos internos con un
universo limitado. %5igura @.=&
.i#$ra :! 1!Re"resentacin de $n arre#lo $nidi&ensional!
El formato para declarar un arreglo unidimensional es)
tipo nomb_arrVtamadoW + { lista de iniciali9aci1n } ; ""La lista es opcional
donde, el ta&a]o representa la dimensin o cantidad de elementos o variables
del mismo tipo que componen al arreglo.
El nombre de arreglo representa la direccin de todos los elementos declarado
en el. 6onde cada variable declarada en el arreglo est" compuesta por una direccin y
contenido.
Por ejemplo, para declarar un arreglo de enteros llamado listan$& con die!
elementos se (ace de la siguiente forma)
int listanumV1,W;
El ejemplo declara un arreglo de enteros con die! elementos o variables enteras
desde listan$&GVH (asta listan$&GLH.
'ada una de las variables declaradas puede ser utili!ada referenciando su
ndice. .a forma como pueden ser accesados los elementos de un arreglo, es de la
siguiente forma)
listanumV2W + 1>; "4 Dsigna 1G al Mer elemento del arreglo 4"
num + listanumV2W;
"" Dsigna el contenido del Mer elemento a la &ariable num
Para evaluar, leer, modificar un arreglo de elementos es necesario reali!ar
recorridos a travs de este, es decir si se quiere reali!ar alguna operacin sobre el
arreglo es necesario utili!ar sentencias iterativas que permitan recorrer el arreglo
desde una posicin a otra.
Sea la declaracin de los arreglos , y 9)
int HV1,W) FV1,W;
Si se desea leer o asignar a los =; elementos del arreglo, es necesario
despla!arnos por cada una de las variables desde la posicin ; (asta la posicin ?.
Si se desea leer los =; elementos del arreglo ,.
int i;
for (i + ,; i # 1,; i55)
{
cout##a2n!rese el elemento HVa##i##aW'a;
cin%%HViW;
}
Para asignar a los =; elementos del arreglo 9 el mismo valor del arreglo ,.
int i;
for (i + ,; i # 1,; i55)
{
FViW + HViW;
}
Si se desea buscar un elemento en el arreglo ,, es necesario comparar el valor
buscado con cada elemento del arreglo.
int i) encontrado;
for (encontrado+,) i + ,; encontrado++, SS i # 1,; i55)
{
if ( buscado ++ HViW)
encontrado + 1;
}
if ( encontrado++1) cout##a3l elemento buscado fue encontradoa;
else cout##a3l elemento no fue locali9adoa;
Si se desea ordenar los elementos del arreglo ,, es necesario comparar cada
valor del arreglo y ubicarlo en la posicin correspondiente, en la siguiente sentencia
se utili!ara el mtodo de la burbuja el cual consiste en comparar un elemento con el
siguiente y dependiendo del criterio de comparacin y valor de peso este ser"
cambiado o no.
int i) cambio) au() n+1,;
do{ "" nos indica la cantidad de &eces necesarias para ordenar
cambio + ,; ""si su &alor se mantiene en cero el arreglo estar)
ordenado
for (i + ,; i # nC1; i55) "" el ltimo elemento no ser) comparado
if ( HViW #criterio% HVi51W) "" criterio $V' ordena de menor a ma;or
{ cambio + 1; "" criterio $W' ordena de ma;or a menor
au( + HViW; "" intercambia los &alores D8i9 con D8i+19
HViW + HVi51W;
HVi51W + au(;
}
}
}8$ile( cambioY+,);
El ejemplo anterior usando el mtodo de ordenamiento por seleccin seria)
int i) 4) au() n+1,;
for (i + ,; i # nC1; i55) XX selecciona la posicin del elemento a ordenar
for (4 + i51; i # n; 455) "" busca si %a; un elemento @ue cumpla criterio
if ( HViW #criterio% HV4W) "" criterio $V' ordena de menor a ma;or
{ "" intercambia los &alores D8i9 con D8j9
au( + HViW;
HViW + HV4W;
HV4W + au(;
}
Si desea mostrar los elementos del arreglo ,)
int i;
cout##aIos elementos del arre!lo'a##endl;
for ( i + ,; i # 1,; i55)
{
cout##HViW##a;ta;
}
Ejemplo) Programa para determinar el mayor y menor de n n#meros enteros.
"include #conio.$%
"include #iostream.$%
"define ma( 1,,
void main()
{ int numVma(W;
int i) n) ma*or) menor;
do { cout##a2n!rese la cantidad de numeros a in!resar'a;
cin%%n;
}8$ile( n#1 ZZ n%1,,);
for(i + ,; i # n ; i55) "" ingresa los n nmeros
{ cout##a2n!rese el numeroVa##i51##aW'a;
cin%%numViW;
}
for(i + 1) ma*or+ numV,W) menor+numV,W; i # n; i55)
{ "" compara los nmeros ; los guarda sea el resultado
if(ma*or # numViW) ma*or + numViW;
if(menor % numViW) menor + numViW;
}
cout##-3l ma*or' a##ma*or##a * el menor' a##menor##endl;
}
:!8!2! Arre#los &$ltidi&ensionales!
Se podr"n declarar arreglos de mayor dimensin, ya sean arreglos
bidimensionales y tridimensionales como sigue)
"" Bidimensional
tipo_de_dato identificadorVtamado1WVtamado2W;
"" 6ridimensional
tipo_de_dato identificadorVtamado1WVtamado2WVtamado3W;
dnde)
ti"oKdeKdato) Es el tipo de datos que contendr" la matri!. Aasta a(ora slo
conocemos los tipos b"sicos de datos7 int, float, double, c(ar. Posteriormente
veremos cmo definir nuestros propios tipos de datos.
identificador) Es el nombre que le damos a la variable matri! y por el cual la
referenciaremos en un programa.
bta&a]oc) *ndica la dimensin o el n#mero de elementos de tipo
tipo[de[datos contendr" la matri! identificada. Si se definen J dimensiones
%arreglo bidimensional&, la cantidad total ser" igual al producto de ambas
dimensiones o tama$os.
:!8!2!1! Arre#lo ,idi&ensional!
3n arreglo bidimensional es aquel en donde los componentes son accesados por
medio de una pareja de ndices que apunten a la fila y columna del componente
requerido. .os arreglos de este tipo son conocidos tambin con el nombre de
&atrices o ta,las. 'onceptualmente, podemos pensar en un arreglo bidimensional
como en una lista compuesta de filas y columnas, en donde para referirnos a una de
ellas emplearemos un n#mero para indicar la posicin de fila y otro n#mero para
indicar la posicin de la columna del componente deseado.%5igura @.J&
.i#$ra :! 2! Re"resentacin de $n arre#lo ,idi&ensional!
.a primera dimensin establece la cantidad de filas. .a segunda dimensin
establece la cantidad de columnas. ,l igual que en los arreglos de una dimensin,
todos los datos ser"n del mismo tipo y nombre y diferenciada por dos ndices.
-ambin podemos decir que representa un conjunto compuesto por
subconjuntos interno, donde la primera dimensin representa la cantidad de estos
conjuntos los cuales tienen la misma cantidades de elementos todos del tipo declarado
representado por la segunda dimensin. Es decir lo representamos como un arreglo de
arreglos unidimensionales.
:!8!2!2! Arre#lo Tridi&ensional
.os arreglos tridimensionales est"n compuestos por tres dimensiones donde la
primera dimensin representa la cantidad de arreglos bidimensionales, la segunda
dimensin representa la cantidad de arreglos unidimensionales y la tercera dimensin
representa la cantidad de elementos que contiene cada arreglo unidimensional.
Permite reali!ar representaciones en tres planos. %5igura @.K&
.i#$ra :! 8! Re"resentacin de $n arre#lo tridi&ensional!
:!8!2!8! 'eclaracin de los arre#los ,idi&ensionales = tridi&ensionales
Para declarar un arreglo bidimensional, matri! o tabla)
tipo_de_dato nomb_matri9VfilaWVcolumnasW;
Para declarar un arreglo tridimensional)
tipo_de_dato nomb_arre!loVfilaWVcolumnasWVelementosW;
,lgunas declaraciones de matrices y arreglos tridimensionales.
8atri! de n#meros reales de =;x=;)
float matri9V1,WV1,W;
8atri! tridimensional de n#meros enteros J;xJ;x=;)
int DridimensionalV2,WV2,WV1,W;
'omo ya se supondr" el acceso a cada elemento de la matri! se reali!a
especificando su posicin, pero sta comien!a a contarse desde el valor ;, es decir,
la matri! que (emos declarado %matri9& tendr" elementos desde el b;cb;c al b?cb?c.
Esto puede causar algunos mal entendidos cuando se trabaja con matrices
est"ticas. Por ejemplo)
a + matri9 V2WV1W;
,l tomar el valor del elemento %J,=& comen!ando a contar desde ;, es decir
que el elemento se ubica en la tercera fila %fila J& de la segunda columna %columna =&.
tridimensional V>WV1@WV1W + @B;
*ntroduce el valor MN en la entrada de la matri! especificada
.as variables de tipo matri! como el resto de las declaraciones, se
pueden iniciali!ar en el momento de su declaracin, ayud"ndose de las llaves
%TU& para la inclusin de iniciali!aciones m#ltiples.
int matri9V2WV3W + {
{ 1)2)3 })
{ 6)>)@ }
};
Estas lneas nos declararan una matri! llamada -matri9- de JxK elementos
iniciali!ada con los valores indicados. .as matrices son extremadamente #tiles para
trabajar con multitud de problemas matem"ticos que se formulan de esta forma o
para mantener tablas de datos a los que se accede con frecuencia y por tanto su
referencia tiene que ser muy r"pida.
Se permite la iniciali!acin de arreglos, debiendo seguir el siguiente formato)
tipo nombre_arrV nW + {listaC nvalores};
tipo nombre_arrV n WV m W + {{listaC,})N) {listaCnC1}};
tipo nombre_arrV nWVmWVlW + {{{lista,C,})N){lista,CmC1}})
N
{{listanC1C,})N){listanC1CmC1}};
};
Por ejemplo)
int iV1,W + {1)2)3)6)>)@)B)=)P)1,};
int numV3WV6W+ { {,)1)2)3}) {6)>)@)B}) {=)P)1,)11} };
int numV2WV2WV2W+{{{,)1}) {2)3}})
{{6)>}) {@)B}}};
, igual que los arreglos unidimensionales, los arreglos multidimensionales
utili!aran sentencias interactivas anidadas para cada una de las dimensiones.
:!8!2!9! E%e&"lo de arre#los &$ltidi&ensionales
Ejemplo =) 2ealice un programa que lea una matri! de n L n elementos enteros
y muestre cu"ntos de estos elementos son primos.
"include #conio.$%
"include #iostream.$%
"define ma( 1,,
void main()
{ int numVma(WVma(W;
int i) 4) n) div) contprimos;
do { cout##a2n!rese la cantidad de n?meros a in!resar'a;
cin%%n;
}8$ile( n#1 ZZ n%1,,);
for(i + ,; i # n ; i55) "" recorre las filas
for(4 + ,; 4 # n ; 455) "" recorre las columnas
{ cout##a2n!rese el numeroVa##i51##aWVa##451##aW'a;
cin%%numViWV4W;
}
for(contprimos+,) i + ,; i # n ; i55) "" recorre las filas
for(4 + ,; 4 # n ; 455) "" recorre las columnas
{
for(div+2;div#numViWV4W SS numViWV4WQdivY+,; div55);
if(div++numViWV4W) contprimos55;
}
cout##-3(isten ' a##contprimos##a numeros primosa##endl;
}

Ejemplo J) calcular el determinante de una matri! de n L n elementos enteros.
"include#iostream.$%
void main()
{
int i)4)7)l)m)n ;
float aV>,WV>,W;
float det;
cout ## -2ntroducir el LM3N M3 IH MHD2R ' N + - ## endl;
cin %% n;
m+nC1;
cout ## -2ntroducir los elementos- ## endl;
cout ## -CCCCCCCCCCCCCCCCCCCCCCCC- ## endl;;
for(i+,; i#n; i55)
for(4+,; 4#+n; 455)
cin %% aViWV4W;
det+aV,WV,W;
for(7+,;7+m;755)
{ l+751;
for(i+l;i#n;i55)
{ for(4+l;4#n;455)
aViWV4W + ( aV7WV7WTaViWV4WCaV7WV4WTaViWV7W )XaV7WV7W;
}
det+detTaV751WV751W;
}
cout ## endl;
cout ## -M3D3M2NHND3 + - ## det ## endl;
cout ## -CCCCCCCCCCCCCCCCCCCCCCCC- ## endl;
}
Ejemplo K) 2ealice un programa que lea una matri! de n L n elementos enteros
y muestre el arreglo solo ordenando los n#meros pares.
"include #conio.$%
"include #iostream.$%
"define ma( 2,
void main()
{ int numVma(WVma(W;
int i) 4) 7) n) au() au(HVma(Tma(W;
do { cout##a2n!rese la cantidad de n?meros a in!resar'a;
cin%%n;
}8$ile( n#1 ZZ n%1,,);
for(i + ,; i # n ; i55)
for(4 + ,; 4 # n ; 455)
{ cout##a2n!rese el numeroVa##i51##aWVa##451##aW'a;
cin%%numViWV4W;
}
for(i + ,)7+,; i # n ; i55)
for(4 + ,; 4 # n ; 455)
au(HV755W+numViWV4W;
for(i + ,; i # 7C1 ; i55)
if(au(HViWQ2++,)
for(4 + i51; 4 # 7 ; 455)
if(au(HV4WQ2++, SS au(HViW %au(HV4W)
{ au(+au(HViW;
au(HViW+au(HV4W;
au(HV4W+au(;
}
cout##-Ia matri9 ordenado solo sus valores pares es'a##endl;
for(i + ,)7+,; i # n ; i55)
{ for(4 + ,; 4 # n ; 455)
{ numViWV4W+ au(HV755W;
cout##numViWV4W##a a;
}
cout##endl;
}
}

Ejemplo >) 2ealice un programa que lea una matri! de n L n elementos enteros
y muestre si la diagonal principal es igual a la secundaria. ,dem"s muestre cuales
filas son iguales a su columna.
"include #conio.$%
"include #iostream.$%
"define ma( 2,
void main()
{ int numVma(WVma(W;
int i) 4) 7) n) v;
do { cout##a2n!rese la cantidad de n?meros a in!resar'a;
cin%%n;
}8$ile( n#1 ZZ n%1,,);
for(i + ,; i # n ; i55)
for(4 + ,; 4 # n ; 455)
{ cout##a2n!rese el numeroVa##i51##aWVa##451##aW'a;
cin%%numViWV4W;
}
for(i + ,; i # n ; i55)
if(numViWiW Y+ numViWVnC1CiW)
brea7;
if(i++n)
cout##ala dia!onal principal es i!ual a la secundariaa##endl;
else
cout##alas dia!onal principal * secundaria son distintasa##endl;
for(i + ,; i # n ; i55)
for(7+,; 7#n; 755)
{ for(4 + ,; 4# n ; 455)
if(numViW4W Y+ numV7WV4W)
brea7;
if(4++n)
cout##ala Gila'a##i51##a es i!ual a la .olumna'a##751##endl;
}
}
,dem"s de clasificar los arreglos seg#n su dimensin, tambin los podemos
declarar seg#n sea su tipo de datos) En arreglos numricos y arreglos alfanumricos o
de caracteres. -omando como diferencia primordial el contenido que puede
almacenar sus variables, notaremos que en los numricos puede existir diversidad de
smbolos %como se (a reflejado en los apartados anteriores& y en los de car"cter un
#nico smbolo, por lo que son llamadas cadenas de caracteres.

:!8!8! Cadenas de caracteres!
3na cadena es un conjunto de caracteres, o valores de tipo :c(ar:, terminados
con el car"cter nulo, es decir el valor numrico ;. *nternamente se almacenan en
posiciones consecutivas de memoria. Este tipo de estructuras recibe un tratamiento
especial, y es de gran utilidad y de uso continuo.
.o que distingue a una cadena de caracteres, con respecto a un arreglo
numrico, es que la cadena de caracteres tiene como #ltimo car"cter al car"cter nulo
]\;_. Esto permite conocer (asta donde evaluaremos la secuencia de caracteres.
.a manera de definir una cadena es la siguiente)
c$ar nombre_identificador V#lon!itud m<(ima%W;
Por ejemplo, si se declara el arreglo)

c$ar cadenaV=W;
Se podr" asignar los siguientes valores a cada uno de sus elementos)
cadenaV,W + cHc ;
cadenaV1W + cc ;
cadenaV2W + cc ;
cadenaV3W + c3c ;
cadenaV6W + cUc ;
cadenaV>W + cIc ;
cadenaV@W + cLc ;
cadenaVBW + c;,c;
,l contener el car"cter nulo, el arreglo cadena ser" reconocido por las funciones
y objetos dise$ados para manipular cadenas de caracteres. Entre estas las sentencias
de salida cout, printf, puts, etc.
Para manejar y reali!ar operaciones con las cadenas de caracteres es necesario
reali!ar sentencias de recorrido (asta encontrar el car"cter fin de cadena. .o que lo
diferencia de los arreglos numricos que es necesario conocer la cantidad de
elementos a evaluar.
3n arreglo es necesario leer y mostrar cada elemento uno a uno en el caso de
las cadenas solo es necesario usar una funcin que atrape cadenas de caracteres o las
muestre, ejemplo)
c$ar cadenaV1,W;
!et ( cadena); "" Lee una cadena de caracteres
cin%%cadena; "" Lee la cadena ; transforma el car)cter intro enKQK
scanf(aQsa) cadena); "" Lee la cadena ; transforma el car)cter intro
enKQK
cout##cadena0 "" muestra todos los caracteres %asta el car)cter
final
Para evaluar una cadena siempre sera necesario al menos una sentencia de
recorrido.
Ejemplo) realice un programa que lea una frase y cambie un car"cter de la frase
por un nuevo car"cter.
"include #conio.$%
"include #iostream.$%
"define ma( 1,,
void main()
{ c$ar fraseVma(W;
c$ar carV) carN;
cout##a2n!rese una frase'a
!ets(frase);
cout##a2n!rese el car<cter a modificar'a
carV + !etc$();
cout##a2n!rese el nuevo nuevo car<cter'a
carN + !etc$();
for(i + ,; fraseViW Y+_;,_ ; i55)
if( fraseViW ++carV)
fraseViW + carN ;
cout##-Ia nueva frase es ' a##frase##endl;
}
Para manejar un arreglo de cadenas de caracteres se debe declarar como un
arreglo bidimensional de elementos de tipo c(ar, como por ejemplo) .eer =; nombres
y una calificacin.
"include #iostream.$%
"include #conio.$%
void main()
{
unsi!ned s$ort int califV1,W;
c$ar nombreV1,WV2,W; "" Ce declara un arreglo bidimensional
"" para 1 nombres de 2 caracteres por
"" nombre m)s un car)cter para el nuloE
for( int (+, ; ( # 1, ; (55)
{
cout ## -NLMF3 V- ## ( 51## -W + - ;
cin %% nombreV(W;
cout ## -.HI2G2.H.2LN V- ## (51 ## -W + - ;
cin %% califV(W;
}
}

'uando se tiene un arreglo de cadenas de caracteres, se puede utili!ar para
asignar valores en las declaraciones de cadena.
Por Ejemplo)
c$ar nombresVWV>W + { -:KUL-) -&H.L-) -IK2J- } ;
Es equivalente a)
c$ar nombresV3WV>W;
nombresV,W + -:KUL- ; "" no aplicable
nombresV1W + -&H.L- ; "" no aplicable
nombresV2W + -IK2J- ; "" no aplicable
Esto tambin puede manejarse a nivel de caracteres, as)
c$ar nombresVWV>W + { c:c)cKc)cUc)cLc)c;,c)
c&c)cHc)c.c)cLc)c;,c)
cIc)cKc)c2c)cJc)c;,c };
o as)
c$ar nombresV3WV>W;
nombresV,WV,W + c:c ;
nombresV,WV1W + cKc ;
nombresV,WV2W + cUc ;
nombresV,WV3W + cLc ;
nombresV,WV6W + c;,c ;
nombresV1WV,W + c&c ;
nombresV1WV1W + cHc ;
nombresV1WV2W + c.c ;
nombresV1WV3W + cLc ;
nombresV1WV6W + c;,c ;
nombresV2WV,W + cIc ;
nombresV2WV1W + cKc ;
nombresV2WV2W + c2c ;
nombresV2WV3W + cJc ;
nombresV2WV6W + c;,c ;

,l manejar arreglos bidimensionales de cadenas, no es necesario escribir el
valor de la primera dimensin de los arreglos cuando, en su declaracin, se asignan
valores constantes a los elementos. .a ventaja que tiene es que, al no especificar una
de las dimensiones, la cantidad de cadenas a manejar puede variarse con slo
agregarlas a la lista o eliminarlas de ella.
,dem"s de las funciones gets%& y puts%&, existe otro grupo de funciones para el manejo
de cadenas de caracteres, como strlen%& y strupr%&! .os prototipos de estas funciones se
encuentran declarados en la libreria S-2*4E. En la tabla %5igura @.>& siguiente se describen
brevemente algunas de las funciones para el manejo de cadenas de caracteres, cuyos
prototipos se encuentran declarados en S-2*4E.A.
GKN.2LN M3J.2&.2LN
stpcp* Copia una cadena de caracteres en otraE
strcat D7ade una cadena de caracteres a otraE
strc$r Busca, en una cadena, un car)cter dadoE
strcmp Compara dos cadenasE
strcmpi Racro @ue compara dos cadenas sin distinguir entre ma;sculas ; minsculasE
strcp* Copia una cadenaE
strdup Copia una cadena a una nue&a localidadE
_strerror Xenera un mensaje de error definido por el programadorE
strerror Retorna el apuntador al mensaje asociado con el &alor del errorE
stricmp Compara dos cadenas sin diferenciar entre ma;sculas ; minsculas
strlen -etermina la longitud de una cadenaE
strl8r Con&ierte las ma;sculas de una cadena en minsculasE
strncat D7ade el contenido de una cadena al final de otraE
strncmp Compara parte de una cadena con parte de otraE
strncmpi
Compara parte de una cadena con parte de otra, sin distinguir entre ma;sculas
; minsculasE
strncp* Copia un nmero de b;tes dados, desde una cadena %acia otraE
strnset Yace @ue un grupo de elementos de una cadena tengan un &alor dadoE
strpbr7
Busca la primera aparicin, en una cadena, de cual@uier car)cter de un
conjunto dadoE
strrc$r Busca la ltima aparicin de un car)cter en una cadenaE
strrev <n&ierte el orden de los caracteres de una cadenaE
strset Yace @ue los elementos de una cadena tengan un &alor dadoE
strspn
Busca en una cadena el primer segmento @ue es un subconjunto de un conjunto
de caracteres dadoE
strstr Busca en una cadena la aparicin de una subcadena dadaE
_strtime Con&ierte la %ora actual a una cadenaE
strtod Con&ierte una cadena a un &alor double long doubleE
strtol Con&ierte una cadena a un &alor longE
strtoul Con&ierte una cadena a un &alor unsigned longE
strupr Con&ierte las minsculas de una cadena a ma;sculasE
.i#$ra :! 9! Ta,la de f$nciones "ara el &ane%o de cadenas de caracteres!
:!8!8!1! E%e&"lo de cadenas de caracteres
Ejemplo=) 2ealice un programa que lea una frase y muestre si es palindrome.
"include #conio.$%
"include #iostream.$%
"define ma( 1,,
void main()
{ c$ar fraseVma(W;
int i) 4;
cout##a2n!rese una frase'a
!ets(frase);
for(i + ,; fraseViW Y+_;,_ ; i55);
for(i+iC1) 4 + ,; fraseViW ++ fraseV4W SS i % 4 ; 455);
if( i#+4)
cout##-Ia frase ' a##frase## ` es palindromea##endl;
else
cout##-Ia frase ' a##frase## ` no es palindromea##endl;
}
EjemploJ) 2ealice un programa que lea n nombres, convierta los caracteres a
may#scula y los muestre ordenados alfabticamente.
"include #conio.$%
"include #iostream.$%
"define ma( 2>
"define ma(2 1,,
void main()
{ c$ar nomVma(2WVma(W) au(Vma(W;
int i) 4) 7) v) n) cambio;
cout##a2n!rese cantidad de nombres'a
cin%%n;
cout##a2n!rese los nombres'a##endl;
for( i+, ; i # n ; i55)
{ cout ## -ZtNombre' V- ## i 51## -W + - ;
cin %% nomViW;
}
"" transforma los n nombres a ma;scula
for(i + ,; i#n ; i55)
for(4 + ,; nomViWV4W Y+_;,_ ; 455)
if(nomViWV4W%+_a_ SS nomViWV4W#+_9_)
nomViWV4W+nomViWV4W A 32;
"" ordena los n nombres m(todo burbuja
do{ cambio+,;
for(i + ,; i#nC1 ; i55)
{ v+,;
for (4+,; v++, SS nomViWV4WY+_;,_SS nomVi51WV4WY+_;,_; 455)
if(nomViWV4W % nomVi51WV4W) v+1;
else if(nomViWV4W # nomVi51WV4W) v+2;
if(v++,){ if(nomViWV4WY+_;,_) v+1;
if(nomVi51WV4WY+_;,_) v+2;
}
if( v++1){ cambio+1;
for(4 + ,; nomViWV4W Y+_;,_ ; 455)
au(V4W+nomViWV4W;
au(V4W+nomViWV4W;
for(4 + ,; nomVi51WV4W Y+_;,_ ; 455)
nomViWV4W+nomVi51WV4W;
nomViWV4W+nomVi51WV4W;
for(4 + ,; au(V4W Y+_;,_ ; 455)
nomVi51WV4W+au(V4W;
nomVi51WV4W+au(V4W;
}
}
}8$ile(cambio++1);

cout##-Ios nombres ordenados alfabbticamente'a##endl;
for(i + ,; i#n ; i55)
cout## nomViW## endl;
}
Ejemplo K) 2ealice un programa que lea n nombres, convierta a may#scula y
elimine los nombres repetidos.
"include #conio.$%
"include #iostream.$%
"define ma( 2>
"define ma(2 1,,
void main()
{ c$ar nomVma(2WVma(W) au(Vma(W;
int i) 4) 7) l) v) n;
cout##a2n!rese cantidad de nombres'a
cin%%n;
cout##a2n!rese los nombres'a##endl;
for( i+, ; i # n ; i55)
{ cout ## -ZtNombre' V- ## i 51## -W + - ;
cin %% nomViW;
}
"" transforma los n nombres a ma;scula
for(i + ,; i#n ; i55)
for(4 + ,; nomViWV4W Y+_;,_ ; 455)
if(nomViWV4W%+_a_ SS nomViWV4W#+_9_)
nomViWV4W+nomViWV4W A 32;
"" busca las frases repetidas ; las elimina
for(7+,;7#nC1; 755)
for(i + 7; i#n ; i55)
{ v+,;
for (4+,; v++, SS nomViWV4WY+_;,_SS nomVi51WV4WY+_;,_; 455)
if(nomViWV4W % nomVi51WV4W) v+1;
else if(nomViWV4W # nomVi51WV4W) v+2;
if(v++,) { if(nomViWV4WY+_;,_) v+1;
if(nomVi51WV4WY+_;,_) v+2;
}
if( v++,){
for(l + i; l#n ; l55)
{ for(4 + ,; nomVl51WV4W Y+_;,_ ; 455)
nomVlWV4W+nomVl51WV4W;
nomVlWV4W+nomVl51WV4W;
}
iCC;
nCC;
}
}

cout##-Ios nombres sin repetir son'a##endl;
for(i + ,; i#n ; i55)
cout## nomViW## endl;
}
CAPITULO <
APUNTA'ORE6
<!1! Referencias de &e&oria!
.as referencias son novedades absolutas del 'FF %no se encuentran disponibles
en '&. 3na referencia es un nuevo tipo de datos que nos va a permitir utili!ar las
caractersticas de los punteros pero trat"ndolos como variables ordinarias. Podis
imaginaros una referencia como un :alias: de una variable o, mejor dic(o, como la
&is&a )aria,le dis"oni,le "ero con $n no&,re distinto.
.a iniciali!acin de una referencia es simple, slo tendremos que asociar una
referencia a una variable que ya est creada. 3na ve! reali!ado la iniciali!acin, la
referencia va a estar continuamente asociada con la variable correspondiente. Si
quisiramos (acer que la referencia fuese el :alias: de otra variable o referenciar a
otra variable no podramos, ocurre un error de compilacin, solo podr" reali!arse en
el momento de su declaracin.
.a declaracin de una referencia)
Dipo_dato Snombre_referencia + variable_declarada;
Ejemplo)
"" dato es una &ariable definida ; es de tipo enteroE
int dato;
"" referencia-ato es la referencia creada de datoE
int SreferenciaMato + dato;
'omo se observa para crear una referencia no necesitamos m"s que la variable
a la que queremos referenciar, que en el ejemplo es dato, junto la referencia en s, que
se va a definir con el smbolo a. 6e este modo, referencia-ato es la referencia o
alias de la variable dato.
3na ve! reali!ada, cualquier cambio que (agamos sobre dato se ver" reflejado
en referencia-ato y viceversa, es decir, si reali!amos una modificacin en
referencia-ato, esta tambin se va a ver reflejada en la variable dato.
Ejemplo)
"include #iostream.$%
void main()
{
int dato + >,;
intS refMato + dato;
cout ## -Ia variable dato vale - ## dato ## _;n_;
cout ## -Ia variable refMato vale - ## refMato ## _;n_;
"" multiplicamos la &ariable dato por 2, a%ora dato > 1
dato T+ 2;
cout ## -Ia variable dato vale - ## dato ## _Xn_;
cout ## -Ia variable refMato vale - ## refMato ## _;n_;
"" incrementamos el &alor de ref-ato > 110
refMato 55;
cout ## -Ia variable dato vale - ## dato ## _;n_;
cout ## -Ia variable refMato vale - ## refMato;
}
Si se observa los resultados en la salida, tenemos que)
La &ariable dato &ale G
La &ariable ref-ato &ale G
La &ariable dato &ale 1
La &ariable ref-ato &ale 1
La &ariable dato &ale 11
La &ariable ref-ato &ale 11
.os cambios efectuados en dato y ref-ato se ven involucrados. 6ebido a que
dato y refMato comparten la misma direccin de memoria y por eso, cualquier
cambio que efectuemos sobre dato afectar" a ref-ato y viceversa. %5igura M.=&
.i#$ra <! 1! Referencia de &e&oria!
Para comprobar que las direcciones de dato y ref-ato son las misma,
reali!amos)
void main()
{
int dato + >,;
intS refMato + dato;
cout ## -Ia direcci1n de la variable dato es - ## Sdato ## endl;
cout ## -Ia direcci1n de la referencia refMato es - ## SrefMato;
}
<!2! A"$ntadores!
<!2!1! Conce"to!
.os apuntadores o punteros se definen como una variable que contiene la
direccin de memoria de un dato o de otra variable que contiene al dato. El puntero
apunta al espacio fsico donde est" el dato o la variable. Pueden apuntar a un objeto
de cualquier tipo, como una estructura o una funcin. Se utili!an para referenciar y
manipular estructuras de datos, bloques de memoria, paso de argumentos.
.os punteros o apuntadores podemos conceptuali!arlos como referencias de
memoria variables, las cuales permiten reali!ar operaciones con las posiciones de
memorias, permitiendo el despla!amiento entre las variables y adem"s con la
posibilidad de modificar el contenido de estas.
Es una (erramienta cmoda, poderosa y directa para el manejo de variables
complejas, argumentos, par"metros, etc.
<!2!2! 'eclaracin de $n a"$ntador!
Para declarar un puntero, este deber" tener un tama$o de memoria a la cual se
pueda ubicar y un nombre el cual se identifica su forma de referenciar y el operar ]L_
el cual nos indica la presencia del puntero)
tipo_de_variable_apuntada Tnombre_del_puntero ;

Ejemplo)
int Tpint ;
double Tpfloat ;
c$ar Tletra ) Tcodi!o ) Tcaracter ;
En estas declaraciones indicamos al compilador que reserve una posicin de
memoria para albergar la direccin de una variable, del tipo indicado, la cual ser"
referenciada con el nombre que (ayamos dado al puntero. El tipo de dato del puntero
indica la capacidad del puntero de ubicarse en una variable o estructura de dato, la
cual deber" ser del mismo tama$o.
'uando declaramos un puntero como)
int Ta;
*ndicamos que)
a representa la direccin de memoria que apunta.
y
La representa el contenido de la direccin de memoria apuntada.
Cbviamente, un puntero debe ser iniciali!ado antes de usarse, y una de las eventuales
formas de (acerlo es la siguiente)
int var1 ; "" declaro $ ; creo en memoria ' una &ariable entera '
int Tpint ; "" un puntero @ue contendr) la direccin de una &ariable entera
pint + Svar1 ; ""escribo en la direccin del puntero la de la &ariable
:anombre[de[una[variable : implica la direccin de la misma.
Esquem"ticamente, lo que (emos (ec(o se puede simboli!ar como se muestra
en la 5igura M.J)
.i#$ra <! 2! Re"resentacin de $n "$ntero!
.a variable &ar1 reserva una direccin de memoria de J bytes solo para ella, el
puntero apunta a esta posicin permitiendo utili!ar el contenido de esta.
En la declaracin del puntero, est" implcita otra informacin) el tama$o %en
bytes& de la variable apuntada.
El smbolo a, direccin, puede aplicarse a variables, funciones, etc., pero no
a constantes expresiones, ya que stas no tienen una posicin de memoria asignada.
.a operacin inversa a la asignacin de un puntero, de referenciacin del
mismo, se puede utili!ar para (allar el valor contenido por la variable apuntada. ,s
por ejemplo ser"n expresiones equivalentes)
* + var1 ;
* + Tpint ;
printf(-Qd- ) var1 ) ;
printf(-Qd- ) Tpint) ;
En estos casos, la expresin : Lnombre[del[puntero :, implica : contenido de la
variable apuntada por el mismoR. Ejemplo de esto)
"include #stdio.$%
void main()
{
c$ar var1 ; ""una &ariable del tipo car)cter
c$ar Tpc$ar; "" un puntero a una &ariable del tipo car)cter
pc$ar + Svar1 ; ""4asignamos al puntero la direccin de la &ariable
for (var1 + cac; var1 #+ c9c; var155)
printf(-Qc-) Tpc$ar) ; "" imprimimos el &alor de la &ariable apuntada
}

Bemos ac", que en el for se incrementa el valor de la variable, y luego para
imprimirla usamos la de referenciacin de su puntero.
El programa imprimir" las letras del abecedario de la misma manera que lo
(abra (ec(o si la sentencia del printf (ubiera sido, printf$5?c5 , &ar1 '. Aay un
error, que se comete con bastante frecuencia, y es cargar en la direccin apuntada por
un puntero a un tipo dado de variable, el contenido de otro tipo de las mismas, por
ejemplo)
double d + 1,., ;
int i + B ) Tpint ;
pint + Si ;
Tpint + 1, ; "" correcto, e@ui&ale a asignar a i el &alor 1
Tpint + d ; "" ERR.R se pretende cargar en una &ariable entera un
&alor double
pint + Sd 0 "" <PC.RREC6. se pretende apuntar a una &ariable
double con un puntero declarado como apuntador a int
pint + 63>= ; "" ZZZZZZ
El primer error, la asignacin de un double, produce la prdida de informacin
dada por la conversin autom"tica de tipo de variable, el segundo produce un llamado
de atencin rotulado como : asignacin sospec(osa de un pointerR. 2esumiendo, las
variables constantes cargadas por de referenciacin de un puntero, deben coincidir
en tipo con la declaracin de aquel.
.a asignacin de una constante a un pointer, y no a la variable apuntada por l,
es un serio error, ya que debe ser el compilador, el encargado de poner en l el valor
de la direccin, aquel as lo declara dando un mensaje de :conversin de puntero no
transportable: . Si bien lo compila, ejecutar un programa que (a tenido esta
advertencia es similar a jugar a la ruleta rusa, puede :colgarse: la m"quina lo que es
peor destruirse involuntariamente informacin contenida en un disco, etc.
Aay un slo caso en el que esta asignacin de una constante a un puntero es
permitida, muc(as funciones para indicar que no pueden reali!ar una accin que se
(a producido un error de alg#n tipo, devuelven un puntero llamado :4ull Pointer:, lo
que significa que no apunta a ning#n lado v"lido, dic(o puntero (a sido cargado con
la direccin 43.. %por lo general en valor ;&, as la asignacin) pint > PALL7 es
v"lida y permite luego operaciones relacionales del tipo if$ pint ' ..... if$ pint [>
PALL ' para convalidar la valide! del resultado devuelto por una funcin.
3na advertencia seria que se debe tener en cuenta que los punteros no son
enteros, como parecera a primera vista, ya que el n#mero que representa a una
posicin de memoria, s lo es. 6ebido al corto alcance de este tipo de variable,
algunos compiladores pueden, para apuntar a una variable muy lejana, usar cualquier
otro tipo, con mayor alcance que el antedic(o.
<!2!8! A"$ntadores = arre#los
Aay una relacin muy cercana entre los punteros y los arreglos. El nombre de
un arreglo es equivalente a la direccin del elementob;c del mismo.
int aV1,W;
"" La direccin del primer elementoO :a89
"" La direccin del arreglo se refleja como su mismo nombreO a
"" entonces a >> :a89, ambas direcciones son e@ui&alentes
El nombre de un arreglo, para el compilador, es un apuntador iniciali!ado con la
direccin del primer elemento del arreglo. Sin embargo (ay diferencias entre ambos.
<!2!9! Asi#nacin de los a"$ntadores!
Cbservemos las lneas siguientes)
float var1 ) con4untoVW + { P., ) =., ) B., ) @., ) >., };
float Tpunt ;
punt + con4unto ; "" e@ui&alente a %acer O punt > :conjunto89
var1 + Tpunt ;
Tpunt + 2>.1 ;

Es v"lido asignar a un puntero el valor de otro, el resultado de sta operacin es
cargar en el puntero punt la direccin del elementob;c del arreglo, y posteriormente
en la variable var= el valor del mismo %?.;& y para luego cambiar el valor de dic(o
primer elemento a J@.=.
.a diferencia entre un puntero y el denominador de un arreglo, el primero es
variable, es decir que puedo asignarlo, incrementarlo, etc, en cambio el arreglo es una
constante, que apunta siempre al primer elemento del arreglo con que fue declarado,
por lo que su contenido no puede ser variado. Si lo piensa un poco, es lgico, ya que
un :conjunto: implica la direccin del elemento conjuntob;c, por lo que, si yo
cambiara su valor, apuntara a otro lado dejando de ser un :conjuntoR.
El siguiente ejemplo nos muestra un tipo de error frecuente)
int con4untoV>W ) listaVW + { > ) @ ) B ) = ) , ) ;
int Tapuntador ;
apuntador + lista 0 "" correcto
con4unto + apuntador0 "" ERR.R $conjunto es una direccin constante'
lista + con4unto ; "" ERR.R $ son direcciones constantes '
apuntador + Scon4unto;
""ERR.R no se puede aplicar el operador : a una constante
<!2!:! Incre&ento = decre&ento de $n a"$ntador!
6ado las siguientes instrucciones podemos anali!ar)
int Tpint ) arre!lo_intV>W ;
double Tpdou ) arre!lo_douV@W ;
pint + arre!lo_int ; "" pint apunta a arreglo3int89
pdou + arre!lo_dou ; "" pdou apunta a arreglo3dou89
pint 5+ 1 ; "" pint apunta a arreglo3int819
pdou 5+ 1 ; "" pdou apunta a arreglo3dou819
pint55 ; "" pint apunta a arreglo3int829
pdou55 ; "" pdou apunta a arreglo3dou829
Aemos declarado y asignado dos punteros, uno a int y otro a doubl(, con las
direcciones de dos arreglos. ,mbos estar"n a(ora apuntando a los elementosb;c de los
arreglos. En las dos instrucciones siguientes incrementamos en uno dic(os punteros.
En el compilador, estas sentencias se leen como) incremente el contenido del
puntero %direccin del primer elemento del arreglo& en un n#mero igual a la cantidad
de bytes que tiene la variable con que fue declarado. Es decir que el contenido de pint
es incrementado en dos bytes %un int tiene J bytes& mientras que pdou es
incrementado < bytes %por ser un puntero a double&, el resultado entonces es el mismo
para ambos, ya que luego de la operacin quedan apuntando al elemento siguiente del
arreglo, arreglo3int819 y arreglo3dou819E
Bemos que de sta manera ser" f"cil recorrer un arreglo, independientemente del
tama$o de variables que lo compongan, permitiendo por otro lado que el programa
sea transportable a distintos (ardwares sin preocuparnos de la diferente cantidad de
bytes que pueden asignar los mismos, a un dado tipo de variable.
<!2!<! Arit&0tica de referencia
6ebido a que los operadores L y FF ++ tienen la misma precedencia y se
eval#an de derec(a a i!quierda, y los parntesis tienen mayor precedencia que ambos,
muc(as operaciones que los utili!an en conjunto a todos estos operadores, pueden
parecer poco claras y dar origen a un sin n#mero de errores, analicmoslas
detalladamente, partiendo de)
int Tp ) aVW + { , ) 1, ) 2, ) 3, ) 6, ) >, ) @, ) B, ) =, ) P, } ;
int var ;
p + a ;
El puntero est" apuntando a a89. Si)
Tp + 2B ;
Se asignamos al elemento apuntado por p %que seria a89& un valor constante.
6e forma inversa)
var + Tp ;
var sera asignada al valor contenido de a89, y p seguira apuntando al mismo
elemento. Si fuese de la forma)
var + T( p 5 1 ) ;
'arga a var con el contenido del elemento siguiente al apuntado por p %el cual
seria a819&. El puntero p, no vara sigue apuntando a a89. 6e la misma forma) var +
T( p 5 3 ) asignar" K; a var, sin modificar el contenido de p.
En cambio la expresin)
var + T( p55 ) ;
Se asigne a &ar el valor de lo apuntado por p e incremente luego ste para
que apunte al prximo elemento. ,s en &ar quedara con el valor de ab;c y p
apuntara a a819. Si en ve! de esto (ubiramos preincrementado a p tendramos)
var + T( 55p ) ;
,punte con p al prximo elemento y asigne a var con el valor de ste. En este
caso &ar sera igualada al valor de a819 y p quedara apuntando al mismo .
En las dos operaciones anteriores los parntesis son superfluos ya que al anali!arse
los operadores de derec(a a i!quierda, dara lo mismo escribir)
var + Tp55 ; "" sint)cticamente igual a &ar > 4$p++'
var + T55p ; "" 5 5 5 &ar > 4$++p'
<!2!O! Arit&0tica de "$nteros
.a aritmtica m"s frecuentemente usada con punteros son las sencillas
operaciones de asignacin, incremento decremento y de referenciacin. -odo otro
tipo de aritmtica con ellos est" pro(ibida es de uso peligroso poco transportable.
Por ejemplo no est" permitido, sumar, restar, dividir, multiplicar, etc., dos
apuntadores entre s. Por ejemplo.
int Tp) TO;
p + p 5 O; "" no tendrIa caso reali,ar
"" le asignamos a p una direccin @ue no conocemos
Ctras operaciones est"n permitidas, como la comparacin de dos punteros, por
ejemplo %punt1 >> punt2& %punt1 W punt2&, sin embargo este tipo de operaciones
son potencialmente peligrosas, ya que con algunos modelos de pointers pueden
funcionar correctamente y con otros no.
<!2!R! Los a"$ntadores = las cadenas de caracteres
4o (ay gran diferencia entre el trato de punteros a arreglos, y a cadenas de
caracteres, ya que estos dos #ltimos son entidades de la misma clase. Sin embargo
analicemos algunas particularidades.
.os punteros prestan un mejor beneficio a la (ora de
,s como iniciali!amos una cadena con un grupo de caracteres terminados en
S\;S, podemos asignar al mismo un puntero)
p + -3sto es una cadena constante -;
Esta operacin no implica (aber copiado el texto, sino slo que a p se le (a
asignado la direccin de memoria donde reside la :E: del texto. , partir de ello
podemos manejar a p como lo (emos (ec(o (asta a(ora. Beamos un ejemplo)
"include #iostream.$%
"define D3/DL1 -e :ola ) como -
"define D3/DL2 -le va a Kd. [ -
void main()
{ c$ar palabraV2,W ) Tp ;
int i ;
p + D3/DL1 ;
for( i + , ; ( palabraViW + Tp55 ) Y+ c;,c ; i55 ) ;
p + D3/DL2 ;
cout## palabra ;
cout## p;
}
6efinimos primero dos cadenas constantes 6ES6.1 y 6ES6.2, luego
asignamos al puntero p la direccin del primero, y seguidamente en el for copiamos el
contenido de ste en el arreglo palabra, observe que dic(a operacin termina cuando
el contenido de lo apuntado por p es el terminador de la cadena, luego asignamos a p
la direccin de -ES6.2 y finalmente se muestra ambas cadenas, obteniendo una
salida del tipo) 5 \ Yola , como le &a a A-E Z 5E
2econo!camos que esto se podra (aber escrito m"s compacto, ya que palabra
tambin es un puntero y 43.. es cero, cambiamos el for)
8$ile( Tpalabra55 + Tp55 ) ;
3n programa ejemplo del uso de puntero en cadena podra ser el modificar una
frase dada a may#scula como se muestra a continuacin)

"include #iostream.$%
"include #stdio.$%
"include #conio.$%
"define ma( 1,,
void main()
{ c$ar frase Vma(W;
c$ar Tp;
p+frase;
cout##a2n!rese una frase'a;
!ets(p);
for( ; TpY+_Z,_ ; Tp55)
if(Tp%+_a_ SS Tp#+_9_)
Tp+TpC32; "" como los caracteres difieren en M2
""de ma;scula a minscula
cout##aIa frase in!resada en ma*?scula'a##frase##endl;
}
<!2!L! Arre#los de a"$ntadores
Es una pr"ctica muy (abitual, sobre todo cuando se tiene que tratar con cadenas
de distinta longitud, generar arreglos cuyos elementos son punteros, que albergar"n
las direcciones de dic(as cadenas. Si imaginamos a un puntero como una flec(a, un
arreglo de ellos equivaldra a un conjunto de flec(as.
,s como)
c$ar Tflec$a;
Se declara un puntero a un car"cter. Entonces la declaracin)
c$ar Tflec$aV>W;
implica un arreglo de @ punteros a caracteres.
.os arreglos de punteros pueden ser iniciali!ados de la misma forma que un
arreglo com#n, es decir dando los valores de sus elementos, durante su declaracin,
por ejemplo si quisiramos tener un arreglo donde el subndice de los elementos
coincidiera con el nombre de los das de la semana, podramos escribir)
c$ar TdiasVW + { -n?mero de dEa no v<lido- )
-lunes- )
-martes- )
-miercoles- )
-4ueves- )
-viernes- )
-sabado- )
-domin!o-
};
*gual que antes, no es necesario en este caso indicar la cantidad de elementos,
ya que el compilador los calcula por la cantidad de trminos dados en la
iniciali!acin. ,s el elemento dias89 ser" un puntero con la direccin de la primera
cadena, dias819, la del segundo, etc.
Sea , una matri! de enteros %arreglo de J dimensiones& y P un arreglo de
punteros enteros)
int HV>WV>90 "" Ratri, de dos dimensiones
int T&V>W; ""arreglo de punteros
.as declaraciones anteriores nos indican la declaracin de J@ elementos de tipo
entero para la matri! D y de @ elementos declarados como punteros de tipo int para P
'omo se muestra la 5igura M.K.
.i#$ra <! 8! Re"resentacin de $na &atri3 entera = $n arre#lo de "$nteros
Si queremos que cada puntero en el arreglo de punteros, apunte a cada arreglo
de la matri!, entonces asignaremos a cada puntero con las filas de la matri! ,)
int i;
int HV>WV>90 "" Ratri, o arreglo de dos dimensiones
int T&V>W; "" arreglo de punteros
for (i+,; i#>; i55)
&ViW+HViW;
'omo ese muestra en la 5igura M.>.
.i#$ra <! 9! Arre#lo de "$nteros a"$nta a cada fila de la &atri3!
,unque podramos pensar que el bucle que asigna a los elementos del arreglo
de punteros P las filas de D %P8i9>D8i9&, puede sustituirse por PW,, no se puede ya
que los niveles de direccin son diferentes. Expresados de otra forma, los tipos de P y
, no son iguales ni admiten una conversin entre ellos)
El tipo de P int 48G9 % arreglo de @ elementos tipo puntero a int&
El tipo de P8i9 int 4 %puntero a int&
El tipo de D int $4'8G9 % puntero a una arreglo de @ elementos tipo int&
El tipo de D8i9 int 4 %puntero a int&
<!2!1V! A"$ntador a a"$ntador!
Para especificar que una variable es un puntero a un puntero, la sintaxis
utili!ada es la siguiente)
tipo_de_variable_apuntada TTnomb_var_puntero_a_puntero ;
donde tipo_de_variable_apuntada especifica el tipo del apuntador la doble
direccin LL indica un puntero que apunta a un puntero y
nomb_var_puntero_a_puntero es el identificador de la variable puntero a puntero.
Por ejemplo)
int H) T&) TT&&;
H + 1,; "" dato
& + SH; ""puntero @ue apunta al dato
&& + S&; "" puntero @ue apunta al puntero @ue apunta al dato
Er"ficamente en memoria esto sera como se muestra en la figura M.@.
.i#$ra <! :! A"$ntador a a"$ntador!
3n ejemplo utili!ando un puntero a puntero seria el cdigo siguiente)
void main()
{ int i) 4;
int HV>WV>W+{{1)2)3)6)>})
{>)6)3)2)1}){,)1)2)3)6}){6)3)2)1),}){,)1),)1),}};
int TpV>W ; "" arreglo de punteros
int TTO ; ""puntero a puntero entero
for(i+,; i#>; i55)
pViW +HViW;
O + p;
for(i+,; i#>; i55)
{ for(4+,; 4#>; 455)
cout##OViWV4W;
cout##endl;
}
}
'omo podemos observar con @8i98j9 podemos recorrer elementos del arreglo
podemos notar, @8i9 es misma direccin que D8i9, si q siendo la direccin de D que es
la misma direccin de D89, entonces @+1 es la posicin de D819 y @+i es la direccin
@+i. 6e esta observacin concluimos que las representaciones siguientes son iguales)
@8i98j9, 4$@8i9+j', 4$4$@+i'+j'
Seg#n lo expuesto, las direcciones @+1 y 4$@+1' tienen significados diferentes,
por ejemplo)
@+1+2 es la direccin del elemento @8M9 de la matri, de punterosE
4$@+1'+2 es la direccin del elemento @819829E
4$4$@+1'+2' es el &alor del elemento @819829E
<!8! Asi#nacin de &e&oria din*&ica!
'uando se (abla de asignacin din"mica de memoria se (ace referencia al
(ec(o de crear variables que reserven espacio en memoria en tiempo de ejecucin
del programa, as como liberar el espacio reservado para dic(as variables, cuando ya
no son necesarias, tambin durante el tiempo de ejecucin.
Supongamos que debemos recibir una serie de datos de entrada, digamos del
tipo double, y debemos procesar seg#n un determinado algoritmo a aquellos que
aparecen una m"s veces con el mismo valor.
Si no estamos seguros de cuantos datos van a ingresar a nuestro programa,
pondremos alguna limitacin, suficientemente grande a los efectos de la precisin
requerida por el problema, digamos =;;;; valores como m"ximo, debemos definir
entonces un arreglo de tipo double capa! de albergar a die! mil de ellos, por lo que el
mismo ocupar" del orden de los <;jb de memoria.
Si definimos este en main%&, ese espacio de memoria permanecer" ocupado
(asta el fin del programa, aunque luego de aplicarle el algoritmo de c"lculo ya no lo
necesitemos m"s, comprometiendo seriamente nuestra disponibilidad de memoria
para albergar a otras variables. 3na solucin posible sera definirlo en una funcin
llamada en main %&, que se ocupara de llenar el arreglo con los datos, procesarlos y
finalmente devolviera alg#n tipo de resultado, borrando con su retorno a la masiva
variable de la memoria.
.os programas ejecutables creados dividen la memoria disponible en varios
segmentos, uno para el cdigo %en lenguaje m"quina&, otro para albergar las variables
globales, otro para el stacI %a travs del cual se pasan argumentos y donde residen las
variables locales& y finalmente un #ltimo segmento llamado memoria de apilamiento
amontonamiento.%5igura M.M&.
.i#$ra <! <! Es+$e&a de asi#nacin de &e&oria!
.a memoria de apilamiento es la !ona destinada a albergar a las variables
din"micas, es decir aquellas que crecen %en el sentido de ocupacin de memoria& y
decrecen a lo largo del programa, pudindose crear y desaparecer %desalojando la
memoria que ocupaban& en cualquier momento de la ejecucin.
Supongamos que queremos ubicar un #nico dato, declaramos un puntero al tipo
de la variable, ejemplo)
double Tp ;
notemos que sta declaracin no crea lugar para la variable, sino que asigna un
lugar en la memoria para que posteriormente se guarde a( la direccin de aquella.
Para reservar una cantidad dada de byte, se efect#a una llamada a alguna de las
funciones dedicadas al manejo del mismo. .a m"s tradicional es malloc%& %su nombre
deriva de memory allocation&, a esta funcin se le da como argumento la cantidad de
bytes que se quiere reservar, y nos devuelve un pointer apuntando a la primer
posicin de la :pila: reservada. En caso que la funcin falle en su cometido %la
memoria est" llena& devolver" un puntero iniciali!ado con 43...
p + malloc(=) ;
(emos pedido < bytes %los necesarios para albergar un double& y (emos
asignado a p el retorno de la funcin, es decir la direccin de la memoria reservada.
'omo es algo engorroso recordar el tama$o de cada tipo variable, agravado por
el (ec(o de que, si reservamos memoria de esta forma, el programa no se ejecutar"
correctamente, si es compilado con otro compilador que asigne una cantidad distinta
de bytes a dic(a variable, es m"s usual utili!ar si!eof, para indicar la cantidad de
bytes requerida)
p + malloc( si9eof(double) ) ;
Se comprueba si se reservo con xito mediante)
if( p ++ NKII )
rutina_de_error() ;
si no lo fue, estas sentencias me derivan a la ejecucin de una rutina de error
que tomar" cuenta de este caso. Por supuesto podra combinar ambas operaciones en
una sola, como)
if( ( p + malloc( si9eof(double) ) ) ++ NKII )
{ cout##-no $a* mas lu!ar en memoriaY-) ;
e(it(1) ;
}
se (a reempla!ado aqu la rutina de error, por un mensaje y la terminacin del
programa, por medio de exit%& retornando un cdigo de error .
<!8!1! La f$ncin malloc
Es la funcin genrica para asignar memoria din"mica a apuntadores. Su
prototipo es)
void T malloc (si9e_t nb*tes);
donde nb;tes es el n#mero de bytes que queremos que sean asignados al
apuntador. .a funcin retorna un apuntador de tipo voidT, por lo que tenemos que
(acer t;pe cast al valor al tipo del apuntador destino, por ejemplo)
c$ar T r;
r + (c$ar T) malloc (1,);
Esto asigna a r un apuntador a un bloque de =; bytes. 'uando queremos asignar
un bloque de data a un tipo diferente a cDar %diferente a = byte& debemos multiplicar
el n#mero de elementos deseados por el tama$o de cada elemento. -enemos a
disposicin el operador si9eof, que retorna el tama$o del tipo de un dato en concreto.
int T b;
b + (int T) malloc (> T si9eof(int));
Este cdigo asigna a b un apuntador a un bloque de @ enteros de tipo int, este
tama$o puede ser igual a J, > o m"s bytes de acuerdo al sistema donde el programa es
compilado.
<!8!2! La f$ncin calloc!
calloc es muy similar a malloc en su funcionamiento, su principal diferencia es
en su prototipo)
void T calloc (si9e_t nelements) si9e_t si9e);
ya que admite J par"metros en ve! de =. Estos dos par"metros se multiplican
para obtener el tama$o total del bloque de memoria a ser asignado. 3sualmente el
primer par"metros %nelements& es el n#mero de elementos y el segundo %si,e& sirve
para especificar el tama$o de cada elemento. Por ejemplo, podramos definir a b con
calloc as)
int Tb;
b + (int T) calloc (>) si9eof(int));
Ctra diferencia entre malloc y calloc es que calloc iniciali!a todos sus
elementos a 0.
<!8!8! La f$ncin realloc
'ambia el tama$o de un bloque de memoria ya asignado a un apuntador.
void T realloc (void T pointer) si9e_t si9e);
El par"metro pointer recibe un apuntador a un bloque de memoria ya asignado
o un apuntador nulo, y si,e especifica el nuevo tama$o que el bloque de memoria
deber" tener. .a funcin asigna si,e bytes de memoria al apuntador. .a funcin podra
necesitar cambiar la localidad del bloque de memoria para que el nuevo tama$o
pueda encajar, en ese caso el contenido actual del bloque es copiado al nuevo para
garanti!ar que la data existente no se pierda. .a funcin retorna el nuevo apuntador.
Si no (a sido posible asignar el bloque de memoria con el nuevo tama$o retorna un
apuntador nulo, pero el pointer especificado como par"metro y su contenido
permanecen sin cambios.
<!8!9! La f$ncin free
.ibera un bloque de memoria din"mica previamente asignado usando malloc,
calloc o realloc.
void free (void T pointer);
Esta funcin debe ser usada solamente para liberar memoria asignada con las
funciones malloc, calloc y realloc.
<!8!:! O"eradores ne
Este operador permite solicitar memoria din"mica. ne8 es seguido por un tipo
de dato y opcionalmente el n#mero de elementos requeridos entre corc(etes bc.
2etorna un apuntador al comien!o del nuevo bloque de memoria asignada. Su forma
es)
pointer + ne8 t*pe
1
pointer + ne8 t*pe VelementosW
.a primera expresin es usada para asignar memoria para contener un solo
elemento de tipo type. .a segunda se usa para asignar un bloque %un arreglo& de
elementos de tipo type. Por ejemplo)
int Tb;
b + ne8 int V>W;
En este caso, se (a asignado espacio para @ elementos de tipo int en un (eap y
(a retornado un apuntador a su comien!o que (a sido asignado a b. Por lo tanto,
a(ora, b apunta a un bloque de memoria v"lido con espacio para @ elementos int.
Podra preguntarse cu"l es la diferencia entre declarar un arreglo normal y
asignar memoria a un apuntador como (emos (ec(o. .a m"s importante es que el
tama$o de un arreglo debe ser un valor constante, el cual limita su tama$o a lo que
decidamos al momento de designar el programa antes de su ejecucin, mientras que
la asignacin din"mica de memoria permite asignar memoria durante la ejecucin del
programa usando cualquier variable, constante o combinacin de ambas como
tama$o.
.a memoria din"mica es generalmente administrada por el sistema operativo, y
en interfaces multitarea puede ser compartida entre varias aplicaciones, por lo que
existe la posibilidad de que la memoria se acabe. Si esto ocurre y el sistema operativo
no puede asignar la memoria que solicitamos con el operador neU, se retorna un
apuntador nulo. Por esta ra!n se recomienda siempre c(equear si el apuntador
retornado es nulo, luego de una llamada a neU.
int 4b0
b > neU int 8G90
if $bobb; >> PALL'
*
"" error asignando memoriaE
+0
<!8!<! O"erador delete
Oa que la necesidad de memoria din"mica est" limitada a momentos concretos
dentro de un programa, una ve! que no se necesita m"s debera ser liberada para que
se convierta en disponible para futuras solicitudes de memoria din"mica. Para este
propsito existe el operador delete, cuya forma es)
delete pointer;
1
delete VW pointer;
.a primera expresin debera ser utili!ada para borrar memoria asignada para
un #nico elemento, y la segunda para memoria asignada para m#ltiples elementos
%arreglos&. En la mayora de los compiladores ambas expresiones son equivalentes y
pueden ser utili!adas sin distincin, aunque en realidad son dos operadores diferentes
y as deben ser considerados para sobrecarga de operadores.
<!8!O! E%e&"los de asi#nacin de &e&oria din*&ica
E%e&"lo17 2eserva de memoria de varios datos simples.
"include#stdlib.$%
"include#iostream.$%
void main()
{
int Tdato_simple;
dato_simple + (int T) malloc (3Tsi9eof(int));
}
E%e&"lo27 2ealice un programa que lea n enteros y los muestre.
"include#stdlib.$%
"include#iostream.$%
void main()
{ int n) i;
int Tdatos;
cout##a2n!rese la cantidad de datos'a;
cin%%n;
datos + (int T) malloc (nTsi9eof(int));
for(i+,; i#n; i55)
{ cout##a2n!rese el numero"a##i51##a'a;
cin%%datosViW;
}
cout##aIos n?meros in!resados'a;
for(i+,; i#n; i55)
cout##datosViW##endl;
}
CAPITULO O
.UNCIONE6
O!1! Conce"to!
.as funciones son un conjunto de instrucciones que reali!an una tarea
especfica. En general toman ciertos valores de entrada, llamados par"metros y
proporcionan un valor de salida o valor de retorno7 aunque en 'FF, tanto unos como
el otro son opcionales, y pueden no estar presentes.
6esde un punto de vista pr"ctico, podemos decir que una funcin es una parte
de un programa %subrutina& con un nombre, que puede ser invocada %llamada a
ejecucin& desde otras partes tantas veces como se desee. 3na funcin en un mtodo
de organi!acin, creando una visin clara del cdigo de un programa, adem"s que
permite su reutili!acin.
Si observamos detalladamente notaremos que el cuerpo principal de un
programa es una funcin, lo que cabe destacar que las funciones son la base del
lenguaje.
O!2! Prototi"os de f$nciones
3n prototipo es una declaracin de una funcin. 'onsiste en una presentacin
de la funcin, exactamente con la misma estructura que la definicin, pero sin cuerpo
y terminada con un :7:. En 'FF es necesario en muc(os casos el uso de los
prototipos. Esto permite identificar o reconocer la existencia de la funcin en el
programa.
.a estructura de un prototipo es)
Ve(ternZstaticW#tipovalor_retorno% #identificador%(#lista_par<metros%);
En general, el prototipo de una funcin se compone de las siguientes secciones)
Cpcionalmente, una palabra que especifique el tipo de almacenamiento, puede
ser e1tern o static. Si no se especifica ninguna, por defecto ser" e1tern.
El tipo del valor de retorno, que puede ser )oid, si no necesitamos valor de
retorno. En ', si no se establece, ser" int por defecto, aunque en general se
considera una mala tcnica de programacin omitir el tipo de valor de retorno
de una funcin. En 'FF es obligatorio indicar el tipo del valor de retorno.
El identificador de la funcin. Es costumbre, muy #til y muy recomendable,
poner nombres que indiquen, lo m"s claramente posible, qu es lo que (ace la
funcin, y que permitan interpretar qu (ace el programa con slo leerlos.
'uando se precisen varias palabras para conseguir este efecto se puede usar
alguna de las reglas m"s usuales. 3na consiste en separar cada palabra con un
:[:. Por ejemplo, si (acemos una funcin que busque el n#mero de telfono
de una persona en una base de datos, podramos llamarla :busca[telefono: o
:9usca-elefono:.
3na lista de declaraciones de par"metros entre parntesis. .os par"metros de
una funcin son los valores de entrada %y en ocasiones tambin de salida&.
Para la funcin se comportan exactamente igual que variables, y de (ec(o
cada par"metro se declara igual que una variable. 3na lista de par"metros es
un conjunto de declaraciones de par"metros separados con comas. Puede
tratarse de una lista vaca. En ' es preferible usar la forma :func%void&: para
listas de par"metros vacas. En 'FF este procedimiento se considera obsoleto,
se usa simplemente :func%&:.
Por ejemplo)
int Ma*or(int a) int b);
3n prototipo sirve para indicar al compilador los tipos de retorno y los de los
par"metros de una funcin, de modo que compruebe si son del tipo correcto cada ve!
que se use esta funcin dentro del programa, o para (acer las conversiones de tipo
cuando sea necesario.
En el prototipo, los nombres de los par"metros son opcionales, y si se incluyen
suele ser como documentacin y ayuda en la interpretacin y comprensin del
programa. El ejemplo de prototipo anterior sera igualmente v"lido si se escribiera
como)
int Ma*or(int) int);
Esto slo indica que en alg#n lugar del programa se definir" una funcin
MMa=orM que admite dos par"metros de tipo int y que devolver" un valor de tipo intE
4o es necesario escribir nombres para los par"metros, ya que el prototipo no los usa.
En otro lugar del programa (abr" una definicin completa de la funcin.
4ormalmente, los prototipos de las funciones se declaran dentro del fic(ero del
programa, o bien se incluyen desde un fic(ero externo, llamado fic(ero de cabecera.
.as funciones son e1tern por defecto. Esto quiere decir que son accesibles
desde cualquier punto del programa, aunque se encuentren en otros fic(eros fuente
del mismo programa.
En contraposicin las funciones declaradas static slo son accesibles dentro del
fic(ero fuente donde se definen.
O!8! 'efinicin de f$nciones
,l igual que (emos visto con las variables, las funciones deben declararse, para
lo que usaremos los prototipos, pero tambin deben definirse.
3na definicin contiene adem"s las instrucciones con las que la funcin
reali!ar" su trabajo, es decir, su cuerpo o cdigo.
.a sintaxis de una definicin de funcin es)
Ve(ternZstaticW #tipo_valor_retorno% #identificador%(#lista_par<metros%)
{
VsentenciasW ""cuerpo de la funcin
return valor; ""debe ser del mismo &alor @ue tipo3&alor3retorno
}
'omo vemos, la sintaxis es idntica a la del prototipo, salvo que se elimina el
punto y coma final, y se a$ade el cuerpo de funcin que representa el cdigo que ser"
ejecutado cuando se llame a la funcin. El cuerpo de la funcin se encierra entre
llaves :TU:.
.a definicin de la funcin se (ace m"s adelante o m"s abajo, seg#n se mire, es
decir, se (ace despus que el prototipo y cuerpo principal main%&. .o correcto es
(acerlo despus de la funcin main%& si existe el prototipo, de lo contrario solo se
define por encima del cuerpo principal ya que la misma funcin sirve como prototipo
en su definicin.
3na funcin muy especial es la funcin main%&. Se trata de la funcin de
entrada, y debe existir siempre, ya ser" la que tome el control cuando se ejecute el
programa.
El valor de retorno es el valor de respuesta que da la funcin una ve! culminada
mediante el uso de la palabra reservada return, este deber" ser del mismo tipo que la
funcin definida, cualquier otro valor de retorno ser" errneo. Si la funcin est"
definida con la palabra void, se indica que no deber" retornar valor de respuesta, es
decir que en el cuerpo de la funcin esta la respuesta de esta de forma implcita.
O!9! *nvocacin a funciones
3na invocacin llamada a una funcin implica pasarle el control de la
ejecucin del programa, as como los argumentos par"metros que requiere para
reali!ar su tarea.
Por ejemplo se tienen las lneas)
saludo(); ""in&ocacin a la funcin saludo$'
precio + calcula(costo); ""in&ocacin a la funcin calcula$'
En la primera, se invoca a la funcin saludo%& y no se le pasa ning#n argumento.
En la segunda, se invoca a la funcin calcula%&, pas"ndosele como argumento una
copia del valor que tiene la variable costo. El valor retornado por calcula%& se asigna a
la variable precio.
El programa seriaO
"include #iostream.$%
"include #conio.$%
"" -eclaracin de funciones
void saludo();
float calcula(float);
"" Funcin principal
void main()
{ float costo) precio;
clrscr();
cout ## -.LJDL ' f -;
cin%% costo;
saludo(); "" in&ocacin a la funcin saludo$'
precio + calcula(costo); "" in&ocacin a la funcin calcula$'
cout ## -&3.2L ' f - ## precio;
!etc$();
}
"" -efinicin de la funcin saludo$'
void saludo()
{ cout ## -YY F23NV3N2ML H IH V3NDH 3J&3.2HI YY-;
}
"" -efinicin de la funcin calcula$'
float calcula(float ()
{ return( ( T 1.@);
}
O!:! Par*&etros = Ar#$&entos
Son el medio a partir del cual podemos expandir el "mbito de variables locales
de funciones, (acia otras funciones y adem"s quienes nos permiten establecer
comunicaciones entre funciones. Si nos vemos ante la necesidad de visuali!ar o
modificar el valor de una variable local en otra funcin que llamaremos, debemos
invocar a dic(a funcin (aciendo referencia de su nombre, seguido de los par"metros
o nombres de variables para las cuales, ampliaramos su "mbito.
void funcion_llamada(int () "" funcin @ue recibe un argumento
{ N
}
void una_funcion(void) "" &ariables de )mbito local
{ int a)b;
N
funcion_llamada(a); "" llamada de la funcin con un par)metro
N
}
6esde luego que, sobre la base de la comunicacin entre funciones y la teora
del paradigma procedimental donde aplicamos la disgregacin de procesos, nos
podemos encontrar con las siguientes variantes)
.lamado de funciones sin pasar par"metros.
.lamado de funciones pasando par"metros.
Est" claro que dic(as funciones pueden o no devolvernos valores (acia el
origen de su llamado.
O!:!1! Paso de par"metros
'uando se invoca a una funcin, en ocasiones es necesario enviarle algunos
elementos indispensables para reali!ar su tarea. Estos elementos, enviados en la
invocacin, se llaman par"metros actuales. 6adas las dos necesidades b"sicas en una
funcin, de poder obtener el contenido de una variable o el de modificar el contenido
de una variable, clasificaremos el paso de ellos en)
O!:!1!1! Paso de par"metros por valor o contenido
'uando surge la necesidad de obtener el valor o contenido de una variable
original o local a una funcin, en otra funcin, se utili!a paso de par"metros por valor
cuando se enva una copia de los valores de los par"metros actuales. En este caso, la
funcin invocada no podr" modificar los valores de las variables utili!adas como
par"metros actuales, sino que trabajar" con las copias que se le envan. Estas copias
son recibidas en los par"metros formales, los cuales se comportan como variables
locales pertenecientes a la funcin invocada.
,l igual que las variables locales, una ve! que termina la ejecucin de la
funcin invocada, las variables pertenecientes a los par"metros formales se destruyen7
y por lo tanto, se pierden los valores que envi el mdulo invocador.
El siguiente programa se muestra el paso de par"metros por valor)
"include #iostream.$%
void precio(double);
void main(void)
{
double costo;
cout ## -.LJDL ' -;
cin%% costo;
precio(costo); "" Ce in&oco a precio$' ; se le en&Ia una
"" copia del &alor de costo
cout ## -;n-
cout ## costo; "" El &alor de costo se conser&a despues
"" de la in&ocacin de precio$'
}
void precio(double recibido)
{
recibido+recibido T 1.>; "" Ce modifica el &alor de la copia
"" guardada en recibido
cout ## -;n-
cout ## recibido;
}
Supongamos que se desea intercambiar los valores enteros de a y b mediante
una funcin intercambio con paso por valor)
"include #iostream.$%
void intercambiar(int) int);
void main(void)
{
int a + >) b + B;
cout ## -a+ -## a## - ) b+ -## b##endl;
intercambiar (a) b); "" se en&Ia el contenido de a ; b
cout ## -a+ -## a## - ) b+ -## b##endl;
}
void intercambiar(int a) int b) ""asigna los contenidos a las &ariables a ; b
{ int au(;
au( + a;
a + b;
b + au(;
}
,unque podemos pensar que en el programa anterior intercambia los valores de
a y b, en la funcin nunca modifica a los valores y que recibe una copia de sus
contenidos. .as variables a y b locales de la funcin main$' son diferentes a las
variables locales de a y b en la funcin intercambiar$'.
O!:!1!2! Paso de "ar*&etros "or referencia
.a referencia indica trabajar sobre la direccin de memoria que ocupa el
par"metro o variable original.
, diferencia del paso por valor, el paso por referencia permite que la funcin
invocada modifique el valor original de las variables usadas como argumentos.
En 'FF, el paso de par"metros por referencia se reali!a creando un alias del
identificador de la variable que forma el par"metro actual, como se muestra en el
siguiente programa.
"include #iostream.$%
"include #conio.$%
void oferta(float S);

void main(void)
{ float precio;
cout ## -.KHI 3J 3I &3.2L '-##endl ;
cin%% precio;
oferta(precio);
cout ## - M2gL KJD3M '- ## precio ## endl;
cout ## - 3JL 3J .LN 3I 2, Q M3 M3J.K3NDL-##endl;
}
void oferta(float Sba4o)
{
ba4o T+,.= ;
cout ## -&3.2L 3FHgHML' - ## ba4o;
}
En el programa se puede decir que bajo es otro identificador asociado a la
variable precio, por lo que la funcin oferta$' realmente modifica el valor contenido
en dic(a variable. Seg#n lo anterior, podemos decir que es preferible utili!ar una
variable existente en lugar crear una nueva, y eliminar el paso de par"metros por
valor.
Supongamos que se desea intercambiar los valores enteros de a y b mediante
una funcin intercambio pero esta ve! usamos paso por referencia)

"include #iostream.$%
void intercambiar(int) int);
void main(void)
{ int a + >) b + B;
cout ## -a+ -## a## - ) b+ -## b##endl;
intercambiar (a) b); "" se en&Ia el contenido de a ; b
cout ## -a+ -## a## - ) b+ -## b##endl;
}
void intercambiar(int Sa) int Sb)
""asigna un alias a las &ariables a ; b de main$'
{ int au(+a;
a + b;
b + au(;
}
Salida)
a + > ) b + B
a + B ) b + >
En este caso mostrara por salida los cambios de las variables, ya que en la
funcin se crea un alias de las mismas variables paramtricas.
Si al argumento por referencia lo precedemos de la palabra const, dic(a variable
no podr" ser alterada en el "mbito de la funcin receptora, por lo tanto nunca afectar"
a la variable original.
O!:!1!8! Arre#los co&o "ar*&etros de f$ncin
,l pasar un arreglo como par"metro de una funcin en su invocacin, esta no
enva el contenido de los elementos del arreglo sino que, pasara la direccin de
comien!o del arreglo. El argumento de arreglo de la funcin invocada tomara la
misma direccin que el del arreglo enviado como par"metro.
.o que modifiquemos en el arreglo dentro de la funcin tambin se ver"
afectado en el arreglo paramtrico envido.
En el siguiente ejemplo se leen n nombres, convirtiendo a may#scula y se
muestran)
"include #conio.$%
"include #iostream.$%
"define ma( 2>
void Ieer( c$ar mVWVW) int n)
{ int i;
for(i+,; i#n; i55)
{ cout##a2n!rese el nombre"a##i51##a'a##endl;
cin%%mViW;
}
}
void Mostrar( c$ar mVWVW) int n)
{ int i;
cout##aIos nombres'a## endl;
for(i+,; i#n; i55)
cout##mViW##endl;
}
void Ma*uscula( c$ar mVW)
{ int i;
for(i+,; mViWY+_Z,_; i55)
if (mViW %+_a_ SS mViW#+_9_)
mViW+mViW C 32;
}
void main()
{ c$ar nomVma(WVma(W;
int n;
cout##a2n!rese cantidad de nombres'a
cin%%n;
cout##a2n!rese los nombres'a##endl;
Ieer(nom) n);
for(i + ,; i#n ; i55)
Ma*uscula( nomViW);
Mostrar(aViW)n));
}
O!:!1!9! P$ntero co&o "ar*&etros de $na f$ncin
.os apuntadores y arreglos nos (acen notar que la definicin de los argumentos
tipodato s890 y tipodato 4s0 son completamente equivalentes cuando se pasa un
nombre de un arreglo a una funcin. Oa que al pasar un arreglo como par"metro, lo
que en realidad se est" pasando es la direccin del comien!o del mismo.
En el siguiente ejemplo se lee una frase y muestra la muestra en min#scula y
en may#scula)
"include #conio.$%
"include #iostream.$%
"define ma( 1,,
void ma*uscula( c$ar Tm)
{ for(; TmY+_Z,_; m55)
if (Tm %+_a_ SS Tm#+_9_)
Tm + Tm C 32;
}
void minuscula( c$ar Tm)
{ for(; TmY+_Z,_; m55)
if (Tm %+_H_ SS Tm#+_R_)
Tm + Tm 5 32;
}
void main()
{ c$ar frase Vma(W)Tp;
p+frase;
cout##a2n!rese la frase'a
!ets(p);
ma*uscula( p);
cout##aIa frase en ma*usculaa##frase##endl;
minuscula( p);
cout##aIa frase en minusculaa##frase##endl;
}
O!<! 5unciones recursivas
Se dice que una funcin es recursiva cuando puede invocarse a s misma. En
cada invocacin se crean las variables locales, por lo que es indispensable incluir una
condicin de salida, ya que de no (acerlo se agotar" la memoria disponible en la pila.
El c"lculo del factorial de un n#mero es un problema cl"sico en la aplicacin de
las funciones recursivas. En el listado se presenta un programa en 'FF que calcula el
factorial de un n#mero dado.
"include #iostream.$%
"include #conio.$%
lon! int factorial(unsi!ned s$ort int);
void main()
{ unsi!ned s$ort int num;
lon! int result;
do { cout ## -3l GH.DL2HI del n?mero' - ;
cin%% num ;
} 8$ile(num #, ZZ num% 1P );
result + factorial(num);
cout ## - es ' - ## result;
}
lon! int factorial(unsi!ned s$ort int n)
{ if(n++,) return 1;
else return nT(factorial(nC1)) ;
}
En el cdigo anterior, si el n#mero dado por el usuario es >, el proceso reali!ado
por el programa se podra representar de la manera siguiente.
Numero de
invocaci1n
Valor de n esultado
1 4 44$factorial$M''
2 M M4$factorial$2''
M 2 24$factorial$1''
4 1 14$factorial$''
G 1
.i#$ra O! 1! Ta,la de res$ltado de $na f$ncin rec$rsi)a!
2esultados de invocar a la funcin factorial$' pas"ndole como par"metro el
n#mero >.
En cada invocacin, se crea en la pila una variable cuyo identificador es n y su
valor cambiar" como se muestra en la tabla %5igura N.=&. 'omo en las invocaciones =,
J, K y > el valor de n es diferente de ;, la funcin vuelve a invocarse a s misma,
quedando sin resolver el resultado.
'uando el valor de n es igual a ; %invocacin @&, la funcin retorna el valor = la
la invocacin >, por lo que el resultado en sta se calcula as)
1 T (factorial(,)) + 1 T 1 + 1
.a invocacin > retorna a la invocacin K el valor = y el resultado en la
invocacin > es)
2 T (factorial(1)) + 2 T 1 + 2
, su ve!, la invocacin K retorna a la invocacin J el valor J. El resultado en la
invocacin J es)
3 T (factorial(2)) + 3 T 2 + @
Posteriormente, la invocacin J retorna el valor M a la invocacin =. El
resultado en la invocacin = es)
6 T (factorial(3)) + 6 T @ + 26
5inalmente, la invocacin = retorna el valor J> a la funcin invocadora main$',
la cual asigna a la variable result el valor recibido % J> &.
CAPITULO R
E6TRUCTURA6B CLA6E6 ^ O5JETO6
R!1! Estr$ct$ras!
R!1!1! Conce"to!
-odas las variables que (emos utili!ado (asta a(ora permiten almacenar un dato
y de un #nico tipo, excepto los arreglos que almacenas varios datos pero de un mismo
tipo.
En ocasiones es necesario contar con tipos de datos que estn compuestos por
conjuntos de elementos de diferentes tipos entre s. Por ejemplo si se quiere
representar datos de personas esta puede estar asociada a muc(a informacin de la
persona, es decir cantidades matrices de variables, las cuales para poder dar relacin
entre ellas tendramos que (acerlo por su posicin pero aun as siguen siendo datos
desasociados. .o que dificulta su visin y uso. %5igura <.=&
No&,res A"ellidos 'ireccin _ etc!
PersonaV ` aJos0b aIalle%ob aCaracasb _ 111
Persona1 ` aMar/ab aGarc/ab aMat$r/nb _ 111
_ _ _ _ _ _ _
PersonaN ` AsDlie a6*ncDe3b aC$&anab _ 111
.i#$ra R! 1!'atos de "ersonas sin el $so de estr$ct$ras!
.as estructuras se crean con la finalidad de agrupar una o m"s variables,
generalmente de diferentes tipos, baj un mismo nombre para (acer m"s f"cil su
manejo y representacin. .as estructuras son tipos derivados definidos por el usuario
que representan colecciones de elementos.
,(ora sera m"s f"cil de expresar por ejemplo el conjunto de datos de una
persona como una fic(a de datos como por ejemplo nombre, apellido, direccin, etc.
6onde algunos de estos datos podran a su ve! ser representados por estructuras como
por ejemplo fec(as que estaran compuestos por los datos das, mes, a$o. %5igura <.J&
Persona4
^
PersonaJ
Persona=
Persona;
4ombre Q2osmilR
,pellido Q*nfanteR
^ ^
5ec(a J; ;J =?<@
.i#$ra R! 2! 'atos de "ersonas $sando estr$ct$ras!
3na estructura es un nuevo tipo de dato compuesto creado por el usuario con el
fin de agrupar datos con una relacin en com#n, estos grupos de datos ser"n los
conocidos como) datos miembros o campos o registros del nuevo tipo.
R!1!2! 6efinicin de tipos de estructuras
.a palabra struct se utili!a para definir un tipo compuesto o agrupacin de
datos %simples yPo compuestos&.
Para definir una estructura usaremos el siguiente formato)
struct nombre_nuevo_tipo { "" Composicin de Campos o registros
tipo_dato_1 nombre_campo_1;
N
tipo_dato_n nombre_campo_n;
};
6espus de definir un tipo de estructura, podemos declarar variables de ese tipo
as)
nombre_nuevo_tipo nombre_variable;
Se podr"n declarar variables derivadas o compuestas, arreglos, punteros,
referencias, con este nuevo tipo de dato definido.
Por ejemplo, si se requiere definir un nuevo tipo llamado persona cuyos
elementos sean)
ced$la n#mero entero largo.
no&,re cadena de caracteres.
.a estructura a definir seria)
struct persona {
lon! int cedula ;
c$ar nombreV>,W ;
} ;
En este caso, persona es un nuevo tipo que puede utili!arse para declarar una
variable de la estructura como)
persona estudiante ;
R!1!8! ,cceso a los miembros de una estructura.
Para acceder a los datos miembros o campos de una estructura utili!aremos el
operador de contenido %.&, de la forma)
Nombre_variable_estructura.dato_miembro;
3na ve! declarada una estructura, las variables permiten las siguientes
operaciones)
*niciali!ar la variable estructura, ya sea al declararla o despus de ello %mediante
una asignacin&, como se muestra en)
"" iniciali,acin al declarar estud
persona estud+{ 1123262>) `Iuisa &eraa };
persona estud1;
"" iniciali,acin por asignacin despu(s de la declaracin
estud1.cedula + 121=>312 ;
strcp*(estud1.nombre) `Hle(ander Flancoa) ;
Cbtener su direccin mediante el operador direccin a, como se muestra en)
persona estud) estud1;
persona Tp_estud + Sestud;
p_estud + Sestud1;
,cceder a sus miembros, como se muestra)
lon! int cedula;
persona estud+{ 1236>@B=) `Hrmando &aredesa };
cedula + estud1.cedula;
,signar una estructura a otra utili!ando el operador asignacin)
persona estud_a+{ 236>@B=P) `Hs$lie Mortaa };
persona estud_b+{ 16,,,,,1) `Valentina Valle4oa };
persona au(;
au( + estud_a;
estud_a + estud_b;
estud_b + au(;
En el siguiente ejemplo, lee datos de J personas y las muestra ordenadas por el
dato miembro cedula.
"include #iostream.$%
struct persona { lon! int cedula ;
c$ar nombreV>,W ;
} ;
void main()
{ persona per1) per2) au(; ""declara las &ariables estructuras
"" Lee los datos de personas
cout##aMatos primera persona'a##endl;
cout##a Nombre'a##endl;
!ets(per1.nombre);
cout##a .edula'a##endl;
cin%%per1.cedula;
cout##aMatos se!unda persona'a##endl;
cout##a Nombre'a##endl;
!ets(per2.nombre);
cout##a .edula'a##endl;
cin%%per2.cedula;
cout##endl;
"" .rdena los datos de personas por cedula
if(per1.cedula % per2.cedula)
{ au( + estud_a;
estud_a + estud_b;
estud_b + au(;
}
"" Ruestra los datos de personas ordenados por cedula
cout##aMatos Lrdenados'a##endl;
cout##per1.cedula##a a##per1.nombre##endl;
cout##per2.cedula##a a##per2.nombre##endl;
}
Se muestra en salida al ejecular)
Matos primera persona'
Nombre'Maria Iope9
.edula'12P2636>
Matos primera persona'
Nombre'guana ui9
.edula'1,P=====
Matos Lrdenados'
1,P===== guana ui9
12P2636> Maria Iope9
R!1!9! ,rreglos de Estructuras
.os arreglos se expresan como colecciones de variables de un mismo tipo el
cual se diferencian cada una de estas variables a travs de un ndice. .as estructuras
son variables compuestas, al igual que las variables primitivas, pueden agruparse en
arreglos y ser tratados de la misma forma que colecciones primitivas.
6espus de definir un tipo de estructura, podemos declarar arreglos de la forma)
nombre_nuevo_tipo nombre_coleccionV.antidad_elementosW;
Para matrices o arreglos bidimensionales)
nombre_nuevo_tipo nombre_matri9Vcant_filasWVcant_columnasW;
3n ejemplo de ello se muestra en el cdigo siguiente de b#squeda binaria de
una palabra en ingles para mostrar su expresin en espa$ol)
"include #iostream.$%
"include #strin!.$%
"" -efine la estructura diccE
struct dicc {
c$ar Tin!l ;
c$ar Tespa ;
} ;
"" -eclaramos un arreglo de estructura
dicc tablaVW + {
-absolute-)-absoluto-)
-append-)-ane(ar-)
-be!in-)-iniciar)principiar)comen9ar-)
-close-)-cerrar-)
-do-)-$acer-)
-file-)-arc$ivo-)
-8$ile-)-mientras-
};
"define NKM3JD (si9eof(tabla)Xsi9eof(dicc))
int busObin(c$ar T ) dicc T ) int) ;
void main()
{ c$ar palV=,W;
int nret ;
do{ cout ## -;n;n&ara finali9ar) escriba G2N en ' ;n-;
cout ## -;n &alabra en in!lbs ' -;
cin%% pal;
nret + busObin(pal)tabla)NKM3JD);
if(nret ++ C1)
{ if(strcmp(strupr(pal))-G2N-)++,)
cout ## -;n;nYY Ginali9ado YY;n;n-;
else
cout ## -;n;n&alabra no re!istrada;n;n-;
}
else cout ## -;n- ## pal ## -+- ## tablaVnretW.espa ;
}8$ile(strcmp(strupr(pal))- G2N-)Y+-,);- }
"" Busca una palabra en ingles
int busObin(c$ar Tpal) dicc Tt) int N)
{ int ba4o+,) alto+NC1) medio) cond;
8$ile(ba4o #+alto)
{ medio+(ba4o5 alto) X 2 ;
if((cond++strcmp(pal) tVmedioW.in!l)) # ,)
alto+medioC1 ;
else if(cond% ,)
ba4o + medio 5 1 ;
else
return (medio) ;
}
return(C1) ;
}
R!1!:! ,puntadores a estructuras
,l declarar una estructura se le asocia un bloque de memoria. .a direccin
inicial del bloque puede asignarse a un apuntador, por lo que la estructura puede
manejarse a travs de ste.
3n apuntador a una estructura se declara de la misma forma en que se declara
cualquier apuntador.
Para evaluar el contenido de los datos miembros de la direccin de memoria
asignada al puntero, es necesario un nuevo operador ?ZU@B usado de la forma)
puntero_estructuraC%dato_miembro;
Por ejemplo, si usamos el tipo dicc definido anteriormente, podemos escribir la
lnea)
dicc Tapd ;
que declara a apd como un apuntador a objetos de tipo dicc.
En este momento, se puede declarar una variable din"mica utili!ando el
apuntador apd, como se muestra a continuacin)
apd + ne8 dicc;
El acceso a los elementos de la estructura apuntada por apd se logra a travs)
apdC%in!l;
apdC%espa;
En el listado siguiente se muestra el manejo de una lista del tipo de estructura
alumnos.
"include #iostream.$%
"include #conio.$%

void inserta()) elimina()) desplie!a();
"" -efine a alumno como un tipo de estructura
struct alumno { c$ar nombreV2>W;
int calif;
struct alumno Tsi!;
};
alumno Tprimero) Tactual;
void main()
{ c$ar opcion;
primero + actual + NKII ;
do { clrscr();
cout ## -I2JDH '-##endl;
cout ## -1.C 2n!resar alumno-##endl;
cout ## -2.C Mostrar lista alumnos-##endl;
cout ## -,.C Jalir-##endl;
cout ## -3scriba el n?mero de su opci1n ' -;
opcion+!etc$e();
s8itc$(opcion)
{ case c1c ' inserta(); brea7;
case c2c ' desplie!a(); brea7;
}
} 8$ile(opcion Y+c,c);
}

void inserta()
{ alumno Tnuevo;
nuevo + ne8 alumno;
if(Ynuevo)
{ cout ## `No $a* memoriaa##endl; !etc$();
}
else { cout ## -2n!rese alumno' -##endl;
cout ## -Nombre' -; !ets(nuevoC%nombre);
cout ## -.alificacion'-; cin%% nuevoC%calif;
if(Yprimero)
{ nuevoC%si! + primero;
primeroC%si! + nuevo;
actual + nuevo;
}
else { nuevoC%si! + actualC%si!;
actualC%si! + nuevo ;
}
}
void desplie!a()
{ actual+primero;
clrscr();
cout##aIistado de estudiantes'a##endl;
if(Yactual)
cout ## `Iista vaciaa##endl;
8$ile(actual)
{ cout ## actualC%nombre## - - ## actualC%calif##endl;
actual + actualC%si!;
}
!etc$();
}
R!2! 3niones
.os tipos union comparten muc(as de las caractersticas sint"cticas y
funcionales de los tipos struct, sin embargo existen algunas diferencias7 la principal
es que la union permite que solamente uno de sus miembros est activo a la ve!,
mientras que en la estructura todos los miembros est"n activos al mismo tiempo. Ctra
diferencia es que el tama$o de la union es el tama$o del miembro m"s grande,
mientras que en la estructura su tama$o es la suma de los tama$os de sus miembros.
.as uniones son recomendables cuando se van a manejar variables que pueden
compartir espacio en la memoria, debido a que sus valores van a requerirse en
momentos diferentes.
Por ejemplo, sean tres variables) una de tipo int, otra de tipo float y otra de tipo
double.
Si no van a manejarse simult"neamente, puede definirse un nuevo tipo $nion
que las abarque de la forma)
union nums {
int ( ; XX 2 b*tes
float * ; XX 6 b*tes
double 9 ; XX = b*tes
} ;
En este momento se cuenta con un nuevo tipo llamado nums, as que podemos
utili!arlo para efectuar la siguiente declaracin)
nums varnums ; "" Ce declara la &ariable &arnums
"" @ue ocupa ] b;tes de memoriaE
Se pueden accesar los miembros de varnums a travs del operador punto, por
ejemplo)
varnums.( + 1, ; "" Ce asigna el &alor 1 al miembro
"" / de la union &arnumsE

R!8! Clases = o,%etos
R!8!1! 'efinicin de $na clase
3na clase es muy parecido a una estructura, ya que la misma es una estructura
de tipo especial que permite representar caractersticas reales de los objetos o cosas,
que no podemos reali!ar con las estructura, dando una perspectiva real en un
programa.
3na clase representa al conjunto de objetos que comparten una estructura y
comportamientos comunes.
3na clase es un tipo definido por el usuario que describe los atributos y
mtodos de los objetos que se crearan a partir de la misma. .os atributos definen el
estado de un determinado objeto y los mtodos son las operaciones que definen su
comportamiento.
.a definicin de una clase consta de dos partes) el nombre de la clase
precedido por la palabra reservada class, y el cuerpo de la clase encerrado entre
llaves y seguido de un punto y coma. Esto es)
class nombre_clase {
cuerpo_de_la_clase
};
El cuerpo de la clase en general consta de modificadores de acceso %public,
protected y private&, atributos, mensajes y mtodos. 3n mtodo implcitamente define
un mensaje %el nombre del mtodo es el mensaje&.
3n ejemplo de la definicin de una clase, seria la clase punto que puede tomar
la siguiente forma)
class punto { prEvate' ""acceso pri&ado de los datos miembros
int ()* ; "" Riembros -atos o Dtributos
public' ""acceso publico de los metodos
void fun() { return *; } "" Funciones Riembros o Retodos
N
} ;
R!8!1!1! Atri,$tos!
Son componentes de un objeto que almacenan datos. -ambin se les denomina
variables miembro. Estos datos pueden ser de tipo primitivo (int) double) c$ar...) o, a
su ve!, de otro tipo de objeto %lo que se denomina a!re!aci1n o composici1n de
objetos&. .a idea es que un atributo representa una propiedad determinada de un
objeto.
3n atributo es lo mismo que una variable cualquiera, salvo que como los
atributos se declaran para pertenecer a una clase especfica, se dice que todos los
atributos de dic(a clase son miembros de la misma. .a declaracin de los atributos es
exactamente igual que declarar cualquier otra variable. ,unque con la diferencia de
que estos se les adiciona el tipo de acceso, lo cual pueden ser manejados como
variables comunes %public& o mediante el uso de mtodos para el caso de las privadas
%prEvate&.
Ejemplo de la clase punto podemos representarlo como un conjunto de datos
miembros o atributos visibles y no visibles como lo son (, *, color.
class punto {
public' XXacceso pblico de los m(todos
c$ar colorV2>W;
prEvate' ""acceso pri&ado de los datos miembros
int ()* ; "" Riembros -atos o Dtributos pri&ados
public' ""acceso pblico de los m(todos
void fun() { return *; } "" Funciones Riembros o R(todos
N
} ;
En el ejemplo color representa un dato miembro del objeto que es visible de
manera externa, es decir puede ser usada de la forma tradicional. , diferencia de los
datos miembro x y y los cuales no podr"n ser visibles de forma externa lo cual
implicara que no existe para las funciones y deben ser manejadas a travs del uso de
funciones miembros o mtodos de la clase.
R!8!1!2! M0todos!
Son un componente de un objeto que lleva a cabo una determinada accin o
tarea con los atributos.
En comparacin con la programacin tradicional, un mtodo es lo mismo que
una funcin cualquiera, salvo que como los mtodos se declaran para pertenecer a
una clase especfica, se dice que todos los mtodos de dic(a clase son miembros de la
misma. Por lo dem"s, la declaracin y definicin de los mtodos es exactamente igual
que declarar y definir cualquier otra funcin.
.as funciones miembro o mbtodos se incluyen en la definicin de una clase, de
dos formas)
,l definir el mtodo dentro de la definicin de la clase.
Por ejemplo)
class punto
{ int ()* ;
public'
int da(() { return ( ; } "" -efine el m(todo dentro de la clase
};
6eclarar el metodo dentro de la definicin de la clase y escribir la definicin de la
funcin fuera de la definicin de la clase.
Por ejemplo)
class punto
{ int ()* ;
public'
int da(() ; XX Meclaraci1n del mbtodo dentro de la clase
};
int punto''da(() XX Mefinici1n del mbtodo fuera de la clase
{
return ( ;
}
En la lnea de cabecera de la definicin de la funcin miembro da(() se utili!a
el llamado operador de resolucin de "mbito %''&. Este operador indica que la funcin
da(() es una funcin miembro de la clase punto.
Barias clases diferentes pueden usar los mismos nombres de funcin. El
compilador sabe cu"l funcin pertenece a cu"l clase y esto es posible por el operador
de resolucin de "mbito y el nombre de la clase.
R!8!1!8! Ti"os de acceso!
3na de las caractersticas fundamentales de una clase es ocultar tanta
informacin como sea posible. Por consiguiente, es necesario imponer ciertas
restricciones en el modo en que se puede manipular una clase y de cmo se puede
utili!ar los datos y el cdigo dentro de una clase.
.as funciones miembros o dato miembro de una clase slo pueden ser llamadas
relativas a un objeto especfico. Para llamar a una funcin miembro o dato miembro
visible desde alguna parte del programa que se encuentre fuera de la clase, se debe
usar el nombre del objeto y el operador de direccionamiento %.& punto.
""Para acceder a un atributo &isible de la clase
Nombre_ob4eto.nombre_atributo;
""Para acceder a un m(todo &isible de la clase
Nombre_ob4eto.nombre_metodo(par<metro_del_metodo);
Ejemplo)
"include #iostream.$%
"" Esto define la clase CRender
class .ender { public'
c$ar bufferV2>@W;
void m_enderi9ar(const c$ar Tcadena);
};
"" implementar m3Renderi,ar$' para la clase
void .ender''m_enderi9ar(const c$ar Tcadena)
{ strcp*(buffer) cadena); ""copia la cadena
}
void main ()
{ .ender render1) render2; "" crear 2 objetos clase
render1.m_enderi9ar(-2niciali9ando el ob4eto render1-);
render2.m_enderi9ar(-2niciali9ando el ob4eto render2-);

cout ## -buffer en render1' -;
cout ## render1.buffer ## endl; "" tenemos acceso a buffer es pblico
cout ## -buffer en render2' -;
cout ## render2.buffer ## endl;
}
Por visibilidad se entiende al acto de acceder a los miembros de una clase. En
este sentido, los miembros de una clase pueden ser) p?blicos, privados y prote!idos.
3n miembro p#blico significa que el acceso al mismo puede darse dentro del
interior de la clase, dentro de una subclase, y desde un objeto instanciado de
cualquiera de estas. Por ejemplo, los miembros de la clase .ender son accesibles
dentro de la misma y podr"n accederse desde cualquier otra clase que se derive de
.ender, as como desde cualquier objeto instanciado de estas.
3n miembro privado significa que el acceso al mismo puede darse solamente
dentro del interior de la clase que lo posee. 4ormalmente, el programador creador de
una clase declara a los atributos de la clase como privados y a los mtodos como
p#blicos, esto con la idea de que el usuario de la clase no pueda tener acceso a los
atributos sino es a travs de los mtodos definidos para el caso.
3n miembro protegido se comporta de manera parecida a un miembro privado,
salvo que estos son accesibles dentro de la clase que lo posee y desde las clases
derivadas, pero no desde los objetos instanciados a ra! de dic(as clases.
Por defecto al crear miembros de una clase %atributos o mtodos& si no se les
indica el tipo de accesibilidad por defecto, ser"n privados. Son necesarios mtodos
p#blicos para poder acceder a las variables o mtodos que no sean p#blicos.
class &ar { "" atributos por defecto pri&ados
double a) b;
public' "" m(todos de &isibilidad publica
double e(ta() { return a; }
double e(tb() { return b; }
};
R!8!2! 'efinicin de O,%etos
3n objeto representa alguna entidad de la vida real, es decir, alguno de los
objetos que pertenecen a una clasificacin con los que podemos interactuar. , travs
del estudio de ellos se adquiere el conocimiento necesario para, mediante la
abstraccin y la generali!acin, agruparlos seg#n sus caractersticas en conjuntos,
estos conjuntos determinan las clases de objetos a utili!ar. Primero existen los
objetos, luego aparecen las clases en funcin de la solucin que estemos buscando.
Dsta es la forma m"s com#n de adquirir conocimiento aunque no es la #nica. En
ocasiones el proceso puede ser a la inversa y comen!ar el an"lisis en una base terica
abstracta, sustentada por el conocimiento previo que da lugar primeramente a clases
de objetos que satisfagan las necesidades de la solucin.
.os objetos tienen caractersticas fundamentales que nos permiten conocerlos
mediante la observacin, identificacin y el estudio posterior de su comportamiento7
estas caractersticas son)
Identidad! Es la propiedad que permite a un objeto diferenciarse de otros.
Co&"orta&iento! El comportamiento de un objeto est" directamente relacionado
con su funcionalidad y determina las operaciones que este puede reali!ar o a las
que puede responder ante mensajes enviados por otros objetos.
Estado! El estado de un objeto se refiere al conjunto de los valores de sus
atributos en un instante de tiempo dado.
Se define a un objeto como la instancia de una clase.
3na instancia es un elemento tangible %ocupa memoria durante la ejecucin del
programa& generado a partir de una definicin de clase. -odos los objetos empleados
en un programa (an de pertenecer a una clase determinada. 6e la forma)
class Dipo_clase { ""atributos
""m(todos
};
Dipo_clase nombre_ob4eto_Dipo_clase;
Ejemplo)
class punto
{ int ()* ;
public'
int e(t((){ return ( ; }
int e(t*(){ return * ; }
void asi!(() { ( + a; }
void asi!*() { * + b; }
void mostrar(){ cout##a( a##(##a ) a##*##a )a ; }
};
void main()
{ punto a; "".bjeto a del tipo punto
a.asi!((1,);
a.asi!*(1>);
a.mostrar();
}
Salida)
% =; , =@ &
CAPITULO L
PA6O 'E MEN6AJE67 McTO'O6B PA6O 'E PARJMETRO6
L!1! Control de acceso a los &ie&,ros de $na clase!
El control de acceso se suele llamar tambin ocultacin de la implementacin.
*ncluir funciones dentro de las estructuras %a menudo llamado encapsulacin& produce
tipos de dato con caractersticas y comportamiento, pero el control de acceso pone
fronteras en esos tipos.
3na clase puede contener partes p?blicas y partes privadas. Por defecto, todos
los miembros definidos en la clase son privados. Para (acer las partes de una clase
p#blicas %esto es, accesible desde cualquier parte de su programa& deben declararse
despus de la palabra reservada public. -odas las variables o funciones definidas
despus de public son accesibles a las restantes funciones del programa.
Especialmente, el resto de su programa accede a un objeto a travs de sus funciones y
datos p#blicos.
6ado que una caracterstica clave de la PCC es la ocultacin de datos, debe
tener presente que aunque puede tener variables p#blicas, desde un punto de vista
conceptual debe tratar de limitar o eliminar su uso. En su lugar, debe (acer todos los
datos privados y controlar el acceso a ellos, a travs de funciones p#blicas. El
mecanismo para (acer privados datos o funciones es anteponerle la palabra reservada
private.
Por defecto, una clase es privada, aunque es conveniente especificar la
visibilidad expresamente, por legibilidad y por compatibilidad con versiones
posteriores que pueden recomendar su uso obligatorio. %5igura ?.=&
Existen tres clases de usuarios de una clase)
.a propia clase
3suarios genricos
'lases derivadas
'ada usuario tiene diferentes privilegios o niveles de acceso. 'ada nivel de
privilegio de acceso se asocia con una palabra reservada)
private. Por defecto todo lo declarado dentro de una clase es privado %private&,
y slo se puede acceder a ella con las funciones miembros declaradas en el
interior de la clase,
public. .os miembros que se declaran en la regin p#blica %public& se puede
acceder a travs de cualquier objeto de la clase de igual modo que se accede a
los miembros de una estructura.
&rotected. .os miembros que se declaran en la regin protegida %protected&
slo se pueden acceder por funciones miembros declaradas dentro de la clase,
por funciones miembro de clases derivadas de esta clase.
.i#$ra L! 1! Iisi,ilidad de $na clase!
Ejemplo de visibilidad de miembros de una clase)
class punto
{ int () * ;
public'
int color;
void asi!(() { ( + a; }
void asi!*() { * + b; }
void mostrar2(){ cout##a( a##(##a ) a##*##a )a ; }
private'
void mostrar(){ mostrar2(); }
};
void main()
{ punto a; "".bjeto a del tipo punto
a.color + 1; ""asignacin del atributo publico
a.( + 2,; XX3LYYY atributo / de a no es &isible
a.asi!((1,); X"asignacin del atributo / de a
XX usando un m(todo publico
a.mostrar2(); XX3LYYY m(todo pri&ado de no &isible
a.mostrar(); ""llamada al m(todo pri&ado a tra&(s de uno publico
}
Es necesaria la existencia de un mtodo p#blico para acceder a atributos y
mtodos privados.
L!2! M0todos de $na clase!
3n mtodo como ya (a visto es una funcin miembro la cual cumple un
propsito especifico al igual como una funcin, solo que esta es parte de la clase con
el propsito adicional de poder interactuar con los atributos de la clase.
Para declarar un mtodo su estructura general consta de dos partes, la
declaracin y el cuerpo del mtodo.
Meclaracion_ del_ mbtodo {
.uerpo_del_metodo
};
.a Meclaracion_del_metodo proporciona informacin sobre su nombre, la
accesibilidad del mtodo, el n#mero de par"metros que recibe, etc.
El .uerpo_del_metodo contiene el conjunto de sentencias que manipula los
datos de cada objeto.
L!2!1! Pasos de &ensa%es!
.os mbtodos de una clase constituyen la lgica de la clase, es decir, contienen
el cdigo que manipula el estado del objeto. 'onstituyen el mecanismo utili!ado para
implementar los mensa4es entre objetos. kuiere decir, cuando un objeto se comunica
con otro por un mensaje lo (ace por medio de la invocacin al mtodo
correspondiente del objeto.
3n paso de mensa4e no es m"s que el mecanismo de invocara un mtodo por
medio de las referencias de la siguiente forma)
referencia.metodo (parametros);
Existen diversos tipos de paso de mensaje seg#n sea la definicin de sus
prototipos y que par"metros recibe.
L!2!1!1! Paso de Par*&etros!
Son los valores paramtricos que se enva a un mtodo en el momento de su
invocacin. Estos permiten diferenciar prototipos o funciones que cumplen un mismo
propsito pero con la diferencia de los datos enviados en el momento de su
invocacin son de tipos diferentes yPo con uno o m"s par"metros.
""sin par)metros o defecto
referencia.metodo ();
""por par)metros
referencia.metodo (par<metro_tipo1);
referencia.metodo (par<metro_tipo2);
referencia.metodo (parametro1) parametro2)..)parametron);
,l declara mtodos de una clase con un mismo nombre, se diferenciaran los
mtodos por los par"metros que recibe.
Seg#n sean sus par"metros los mtodos pueden ser mbtodos por defecto
aquellos que no reciben datos y mbtodos parambtricos los que reciben datos
adicionales para su funcionalidad.
L!2!1!2! El "$ntero tDis!
En uno de los puntos anteriores coment"bamos que un mtodo perteneciente a
una clase tena acceso a los miembros de su propia clase sin necesidad de pasar como
par"metro el objeto con el que se estaba trabajando. Esto no es tan sencillo, puesto
que es lgico pensar que los atributos %datos& contenidos en la clase son diferentes
para cada objeto de la clase, es decir, se reserva memoria para los miembros de datos,
pero no es lgico que cada objeto ocupe memoria con una copia de los mtodos, ya
que replicaramos muc(o cdigo.
En realidad, los objetos de una clase tienen un atributo especfico asociado, su
direccin. .a direccin del objeto nos permitir" saber que variables debemos
modificar cuando accedemos a un miembro de datos. Esta direccin se pasa como
par"metro %implcito& a todas las funciones miembro de la clase y se llama t$is.
Si en alguna funcin miembro queremos utili!ar nuestra propia direccin
podemos utili!ar el puntero como si lo (ubiramos recibido como par"metro. Por
ejemplo, para retornar el valor de un atributo escribimos)
float empleado''cuanto_cobra () {
return sueldo;
}
Pero tambin podramos (aber (ec(o lo siguiente)
float empleado''cuanto_cobra () {
return t$isC%sueldo;
}
3tili!ar el puntero dentro de una clase suele ser redundante, aunque a veces es
#til cuando trabajamos con punteros directamente.
L!2!2! M0todos so,recar#ados!
'ada mtodo tiene una forma, que son su nombre, el tipo y n#mero de sus
par"metros. Existe una caracterstica para tener dos mtodos con el mismo nombre.
Esta caracterstica se denomina sobrecar!a de mbtodos.
El concepto de sobrecar!a de mbtodos se puede aplicar siempre que los
par"metros sean diferentes, bien por su tipo, bien porque el n#mero de par"metros de
un mtodo u otro es diferente. 6e la forma)
class Nom_clase{
void nom_metodo() {N }
void nom_metodo( tipoa parametro() { N }
void nom_metodo(tipob parametro*) { N }
void nom_metodo(tipo par<metro1) tipo parametro2) { N }
N.
};
Ejempl)
class Hrticulo { private'
float precio;
public'
void set&recio() { precio + 3.>,;
}
void set&recio(float ne8&recio) {
precio + nuevo&recio;
}
};
Entonces cuando (acemos un llamado a este mtodo, el compilador (ace
referencia al tipo de par"metro. .a sobrecarga seria redefinir cualquiera de estos
mtodos utili!ando los mismos par"metros pero para un proceso distinto.
L!2!8! Constr$ctores = destr$ctores!
.os constructores y los destructores son un tipo de sobrecarga de funciones
miembros especiales.
Podemos clasificar los objetos en cuatro tipos diferentes seg#n la forma en que
se crean)
Lb4etos autom<ticos' son los que se crean al encontrar la declaracin del
objeto y se destruyen al salir del "mbito en que se declaran.
Lb4etos est<ticos' se crean al empe!ar la ejecucin del programa y se
destruyen al terminar la ejecucin.
Lb4etos din<micos' son los que se crean empleando el operador ne8 y se
destruyen con el operador delete.
Lb4etos miembro' se crean como miembros de otra clase o como un elemento
de un arreglo.
.os objetos que se crean con el uso explcito del constructor son objetos
autom"ticos.
L!2!8!1! Constr$ctores
3n constructor especifica la manera en que ser" creado e iniciali!ado un nuevo
objeto de cierta clase. .os constructores en 'FF pueden ser definidos por el usuario
generados por el lenguaje. El compilador de 'FF invoca autom"ticamente al
constructor apropiado cada ve! que se defina un nuevo objeto.
Esto puede ocurrir en una declaracin de datos, cuando se copia un objeto o a
travs de la asignacin din"mica de memoria a un nuevo objeto por medio del
operador ne8.
.os constructores se pueden considerar como funciones de iniciali!acin, y
como tales pueden tomar cualquier tipo de par"metros, incluso por defecto. .os
constructores se pueden sobrecargar, por lo que podemos tener muc(os constructores
para una misma clase %como ya sabemos, cada constructor debe tomar par"metros
distintos&.
Existe un constructor especial que podemos definir o no definir que tiene una
funcin muy especfica) copiar atributos entre objetos de una misma clase. Si no lo
definimos se usa uno por defecto que copia todos los atributos de los objetos, pero si
lo definimos se usa el nuestro.
Este constructor se usa cuando iniciali!amos un objeto por asignacin de otro
objeto.
Podemos definir un constructor por defecto de la forma)
class Nom.lase { N
Nomb.lase() "" Constructor por defecto
{ "" iniciali,aciones de atributos
}
};
Podemos definir un constructor por ar!umento parambtricos de la forma)
class Nom.lase { N
Nomb.lase(tipo parametrico)"" Constructor por par)metros
{ "" iniciali,aciones por parametros
}
};
Para a$adir un constructor a la clase punto escribimos)
class punto
{ int ()* ;
public'
int da(() { return ( ; }
int da*() { return * ; }
punto() XX constructor por defecto
{ ( + , ; * + , ; }
punto(int n() int n*) "" constructor por par)metro
{ ( + n( ;
* + n* ;
}
};
En el momento de instanciar o crear un objeto se (ace llamado al constructor
iniciali!ando al objeto. 6e la forma)
void main()
{ punto a; ""<niciali,acin punto a constructor por defecto
punto b(1,)1,); XX<niciali,acin punto b con constructor por par)metro
}
L!2!8!2! 'estr$ctores
.os destructores destruyen a los objetos creados, liberando la memoria
asignada. Pueden ser invocados explcitamente por medio del operador delete.
Podemos definir un destructor usando la negacin implcita del constructor
mediante el operador %^& de la forma)
class Nom.lase { N
\Nomb.lase() "" destructor
{ }
};
Siguiendo con el ejemplo de la clase punto)
class punto
{ int ()* ;
public'
int da(() { return ( ; }
int da*() { return * ; }
punto(int n() int n() ;
\punto() ; "" -eclaracion del -estructor
};
punto''punto(int n() int n()
{ ( + n( ;
* + n* ;
}
punto''\punto() "" -efinicion del -estructor
{ delete ( ;
delete * ;
}
L!2!9! M0todos est*ticos = f$nciones a&i#as
6entro de las peculiaridades de las clases encontramos dos tipos de funciones
especiales) los mtodos est"ticos y las funciones amigas. .os comentamos separados
del bloque relativo a clases y miembros por su similitud y por la importancia de las
funciones amigas en la sobrecarga de operadores.
Su caracterstica com#n es que no poseen par"metro implcito t$is.
L!2!9!1! M0todos est*ticos
,l igual que los atributos est"ticos mencionados en el punto anterior, las
funciones miembro est"ticas son globales para los miembros de la clase y deben ser
definidas fuera del "mbito de la declaracin de la clase.
Estos mtodos son siempre p#blicos, se declaren donde se declaren. ,l no tener
par"metro t$is no pueden acceder a los miembros no est"ticos de la clase %al menos
directamente, ya que se le podra pasar un puntero al objeto para que modificara lo
que fuera&.
L!2!9!2! .$nciones a&i#as ?friend@
Son funciones que tienen acceso a los miembros privados de una clase sin ser
miembros de la misma. Se emplean para evitar la ineficiencia que supone el tener que
acceder a los miembros privados de una clase a travs de mtodos.
'omo son funciones independientes de la clase no tienen par"metro t$is, por lo
que el acceso a objetos de una clase se consigue pas"ndoles como par"metro una
referencia al objeto %una referencia como tipo implica pasar el objeto sin copiar,
aunque se trata como si fuera el objeto y no un puntero&, un puntero o el mismo
objeto. Por la misma ra!n, no tienen limitacin de acceso, ya que se definen fuera de
la clase.
Para (acer amiga de una clase a una funcin debemos declararla dentro de la
declaracin de la clase precedida de la palabra friend, como se muestra en el
siguiente cdigo)
class / { private'
int i;
...
friend int f(/S) int);
"" funcin amiga @ue toma como par)metros una referencia a
"" un objeto del tipo S ; un entero ; retorna un entero
};
En la definicin de la funcin %que se (ace fuera de la clase como las funciones
normales& podremos usar y modificar los miembros privados de la clase amiga sin
ning#n problema)
int f(/S ob4eto) int i) { int 4 + ob4eto.i;
ob4eto.i + i;
return 4;
}
Es importante ver que aunque las funciones amigas no pertenecen a la clase se
declaran explcitamente en la misma, por lo que forman parte de la interface de la
clase.
3na funcin miembro de una clase puede ser amiga de otra)
class / { ...
void f();
...
};
class 0 { ...
friend void /''f();
};
Si queremos que todas las funciones de una clase sean amigas de una clase
podemos poner)
class / {
friend class 0;
...
};
En el ejemplo todas las funciones de la clase O son amigas de la clase 1, es
decir, todos los mtodos de O tienen acceso a los miembros privados de 1.
L!8! Asi#nacin de o,%etos
.a forma de iniciali!ar un objeto es mediante el uso del operador de asignacin
%W&. Por ejemplo)
class punto { int ()* ;
public'
int da(() { return ( ; }
int da*() { return * ; }
punto() { ( + , ; * + , ; }
punto(int n() int n*) { ( + n( ; * + n* ; }
};
void main()
{ punto a) b(1,)1,);
a + b;
}
'uando se reali!a la operacin asignacin, ambos objetos existen. En 'FF el
operador de asignacin, por omisin de la clase seria)
puntoS punto''operator+(const puntoS pun)
{ ( + pun.(;
* + pun.*;
return Tt$is;
}
L!9! E%e&"lo de Pro#ra&a $sando clases
Programa que suma n#meros complejos)
"include #iostream.$%
class Num.omp
{ private'
double real;
double comp;
public'
Num.omp();
Num.omp(double);
Num.omp(double) double);
Num.ompT suma(Num.ompS);
double !eteal();
double !et.omp();
};
Num.omp''Num.omp() {
real + ,;
comp + ,;
}
Num.omp''Num.omp(double real) {
t$isC%real + real;
comp + ,;
}
Num.omp''Num.omp(double real) double comp) {
t$isC%real + real;
t$isC%comp + comp;
}
Num.ompT Num.omp''suma(Num.ompS otro) {
return ne8 Num.omp(t$isC%real 5 otro.real) t$isC%comp 5 otro.comp);
}
double Num.omp''!eteal() {
return t$isC%real;
}
double Num.omp''!et.omp() {
return t$isC%comp;
}
void main() {
Num.omp a(23) 1);
Num.omp b(C1) >);
Num.ompT c + a.suma(b);
cout ## -Ia suma es' - ## cC%!eteal() ## -5- ##
c%!et.omp() ## -i- ## endl;
delete c;
}
CAPITULO 1V
;ERENCIA
1V!1! ;erencia!
.a (erencia es una propiedad esencial de la Programacin Crientada a Cbjetos
que consiste en la creacin de nuevas clases a partir de otras ya existentes. Este
trmino (a sido tomado prestado de la (erencia biolgica, donde un (ijo ciertas
facetas fsicas o del comportamiento de sus progenitores.
.a (erencia en 'FF es un mecanismo de abstraccin creado para poder facilitar
y mejorar el dise$o de las clases de un programa. 'on ella se pueden crear nuevas
clases a partir de clases ya (ec(as, siempre y cuando tengan un tipo de relacin
especial.
.as clases que (eredan de clases base se denominan derivadas, estas a su ve!
pueden ser clases bases para otras clases derivadas. Se establece as una clasificacin
jer"rquica.
.a (erencia es una forma de reutili,acin del softUare, en la cual se crean
clases nuevas a partir de clases existentes, mediante la absorcin de sus atributos y
comportamientos, y enriqueciendo stos con las capacidades que las clases nuevas
requieren.
1V!2! Jerar+$/a de clases!
'ada nueva clase obtenida mediante (erencia se conoce como clase deri&ada, y
las clases a partir de las cuales se deriva, clases base. ,dem"s, cada clase derivada
puede usarse como clase base para obtener una nueva clase derivada. O cada clase
derivada puede serlo de una o m"s clases base. En este #ltimo caso (ablaremos de
deri&acin mltiple.
Esto nos permite crear una jerarqua de clases tan compleja como sea necesario.
Ese es el principio de la programacin orientada a objetos. Esta propiedad nos
permite encapsular diferentes partes de cualquier objeto real o imaginario, y
vincularlo con objetos m"s elaborados del mismo tipo b"sico, que (eredar"n todas sus
caractersticas. .o veremos mejor con un ejemplo.
3n ejemplo muy socorrido es de las personas. Supongamos que nuestra clase
base para clasificar a las personas en funcin de su profesin sea :Persona:. Presta
especial atencin a la palabra :clasificar:, es el punto de partida para buscar la
solucin de cualquier problema que se pretenda resolver usando PCC. .o primero
que debemos (acer es buscar categoras, propiedades comunes y distintas que nos
permitan clasificar los objetos, y crear lo que despus ser"n las clases de nuestro
programa. Es muy importante dedicar el tiempo y atencin necesarios a esta tarea, de
ello depender" la flexibilidad, reutili!acin y eficacia de nuestro programa.
-en en cuenta que las jerarquas de clases se usan especialmente en la
resolucin de problemas complejos, es difcil que tengas que recurrir a ellas para
resolver problemas sencillos.
Siguiendo con el ejemplo, partiremos de la clase :Persona:. %5igura =;.=&
*ndependientemente de la profesin, todas las personas tienen propiedades comunes,
nombre, fec(a de nacimiento, gnero, estado civil, etc.
.i#$ra 1V! 1! Jerar+$/a de clases "ara Persona
.a siguiente clasificacin debe ser menos general, supongamos que dividimos a
todas las personas en dos grandes clases) empleados y estudiantes. .o importante es
decidir qu propiedades que no (emos incluido en la clase :Persona: son exclusivas
de los empleados y de los estudiantes. Por ejemplo, los ingresos por nmina son
exclusivos de los empleados, la nota media del curso, es exclusiva de los estudiantes.
3na ve! (ec(o eso crearemos dos clases derivadas de Persona) :Empleado: y
:Estudiante:.
Aaremos una nueva clasificacin, a(ora de los empleados. Podemos clasificar a
los empleados en ejecutivos y comerciales. 6e nuevo estableceremos propiedades
exclusivas de cada clase y crearemos dos nuevas clases derivadas de :Empleado:)
:Ejecutivo: y :'omercial:.
,(ora veremos las ventajas de disponer de una jerarqua completa de clases.
'ada ve! que creemos un objeto de cualquier tipo derivado, por ejemplo de tipo
'omercial, estaremos creando en un slo objeto un 'omercial, un Empleado y una
Persona. 4uestro programa puede tratar a ese objeto como si fuera cualquiera de esos
tres tipos. Es decir, nuestro comercial tendr", adem"s de sus propiedades, como
comercial tambien, su nmina como empleado, y su nombre, edad y gnero como
persona.
Siempre podremos crear nuevas clases para resolver nuevas situaciones.
'onsideremos el caso de que en nuestra clasificacin queremos incluir una nueva
clase :9ecario:, que no es un empleado, ni tampoco un estudiante7 la derivaramos de
Persona. -ambin podemos considerar que un becario es ambas cosas. Sera un
ejemplo de derivacin m#ltiple, podramos (acer que la clase derivada 9ecario, lo
fuera de Empleado y Estudiante.
Podemos aplicar procedimientos genricos a una clase en concreto, por
ejemplo, podemos aplicar una subida general del salario a todos los empleados,
independientemente de su profesin, si (emos dise$ado un procedimiento en la clase
Empleado para ello.
1V!8! Clases ,ases = deri)adas!
.as clases creadas pueden ser reutili!adas en nuevos programas donde sus
definiciones requieran las mismas funcionalidades. 3na clase utili!ada para derivar
nuevas clases se denomina clase base %padre, superclase o ascendiente&.
3na clase creada de otra clase, donde permita utili!ar las funciones necesarias
de la clase %clase base) se denomina clase derivada o subclaseE .a terminologa
supone una clase base o clase padre, y una clase derivada o clase (ija. Esta relacin
supone un orden de jerarqua simple. , su ve!, una clase derivada puede ser utili!ada
como una clase base para derivar m"s clases. Por consiguiente se puede construir
jerarquas de clases, en las que cada clase sirve como padre o ra! de una nueva clase.
.as clases nuevas se denominan clases derivadas, en donde cada clase derivada se
convierte en candidata a clase base para alguna clase futura.
'ada clase derivada se debe referir a una clase base declarada anteriormente. .a
declaracin de una clase derivada tiene la siguiente sintaxis)

.lass clase_derivada' #especificadores_de_acceso% clase_base
{
...
};

El operador %7& nos indica que se (erede ..os especificadores de acceso pueden
ser) public, protected o private.
1V!8!1! Clases de deri)acin
.os especificadores de acceso a las clases base definen los posibles tipos de
derivacin) public, protected y private. El tipo de acceso a la clase base especfica
cmo recibir" la clase derivada a los miembros de la clase base. Si no se especifica un
acceso a la clase base, 'FF supone que su tipo de (erencia es privado.
Merivaci1n p?blica (public). -odos los miembros public y protected de la
clase base son accesibles en la clase derivada, mientras que los miembros
private de la clase base son siempre inaccesibles en la clase derivada.
"include #iostream.$%
class base { int i) 4;
public'
void set(int a) int b) { i + a; 4 + b; }
void mostrar() { cout ## i ## - - ## 4 ## -;n-; }
};

class derivada ' public base { int 7;
public'
derivada(int () { 7 + (; }
void mostrar_7()
{ cout ## 7 ## -;n-; }
};
void main()
{
derivada ob4(3);
ob4.set(1) 2); "" accesar a miembro de base
ob4.mostrar(); "" accesar a miembro de base
ob4.mostrar_7(); "" usa miembro de la clase deri&ada
};
Merivaci1n privada (private). -odos los miembros de la clase base se
comportan como miembros privados de la clase derivada. Esto significa que
los miembros public y protected de la clase base no son accesibles m"s que
por las funciones miembro de la clase derivada. .os miembros privados de la
clase siguen siendo inaccesibles desde la clase derivada.
"include #iostream.$%
class base { int i) 4;
public'
void set(int a) int b) { i + a; 4 + b; }
void mostrar() { cout ## i ## - - ## 4 ## -;n-; }
};
"" Riembros pblicos de HbaseH son pri&ados en Hderi&adaH
class derivada ' privatec base { int 7;
public'
derivada(int () { 7 + (; }
void mostrar_7()
{ cout ## 7 ## -;n-; }
};
void main()
{
derivada ob4(3);
ob4.set(1) 2); "" 3rrorYYY, no se puede acceder a set$'
ob4.mostrar(); "" 3rrorYYY, no se puede acceder a set$'
ob4.mostrar_7(); "" usa miembro de la clase deri&ada
};
Merivaci1n prote!ida (protected). -odos los miembros public y protected de
la clase base se comportan como miembros protected de la clase derivada.
Estos miembros no son, pues, accesibles al programa exterior, pero las clases
que se deriven a continuacin podr"n acceder normalmente a estos miembros
%datos o funciones&.
3sando &ie&,ros "rote#idos)
"include #iostream.$%
class base { protected'
int i) 4; "" pri&ados base, pero accesibles a deri&ada
public'
void set(int a) int b) { i + a; 4 + b; }
void mostrar() { cout ## i ## - - ## 4 ## -;n-; }
};

class derivada ' public base { int 7;
public'
"" deri&ada puede accesar en base a HjH e HiH
void set_7() { 7 + i T 4; }
void mostrar_7()
{ cout ## 7 ## -;n-; }
};
void main()
{
derivada ob4(3);
ob4.set(1) 2); "" .k, conocido por deri&ada
ob4.mostrar(); "" .k, conocido por deri&ada
ob4.set_7();
ob4.mostrar_7();
};
3sando "rotected "ara clase ,ase)
"include #iostream.$%
class base { int i;
protected'
int 4;
public'
int 7;
void seti(int a) { i + a; }
int !eti() { return i; }
};
"" Yeredar HbaseH como protectedE
class derivada ' protected base
{ public'
void set4(int a) { 4 + a; }; "" j es protected a@uiE
void set7(int a) "" k es tambien protectedE
{ 7 + a; };
int !et4() { return 4; }
int !et7() { return 7; }
};
void main()
{
derivada ob4;

"4 La pro/ima linea es ilegal por@ue seti$' es
un miembro protegido de deri&ada, lo cual lo
%ace inaccesible fuera de deri&adaE 4"
"" objEseti$1'0
"" cout WW objEgeti$'0 "" ilegal == geti$' es protectedE
"" objEk > 10 "" tambien ilegal por@ue k es protectedE
"" estas declaraciones son correctas
ob4.set7(1,);
cout ## ob4.!et7() ## - -;
ob4.set4(12);
cout ## ob4.!et4() ## - -;
}
1V!9! Ti"os de Derencia!
En 'FF existen los tipos de (erencia) simple y m?ltiple.
1V!9!1! ;erencia si&"le
.a $erencia simple es aquella en la que cada clase derivada (ereda de una
#nica clase. 'ada clase tiene un solo ascendiente, y puede tener muc(os
descendientes.
En la (erencia, las clases derivadas :(eredan: los datos y las funciones
miembro de las clases base, pudiendo las clases derivadas redefinir estos
comportamientos y a$adir comportamientos nuevos propios de las clases derivadas.
Para no romper el principio de encapsulamiento %ocultar datos cuyo conocimiento no
es necesario para el uso de las clases&, se proporciona un nuevo modo de visibilidad
de los datosPfunciones) :protected:. 'ualquier cosa que tenga visibilidad protected se
comportar" como p#blica en la clase 9ase y en las que componen la jerarqua de
(erencia, y como privada en las clases que no sean de la jerarqua de la (erencia.
,ntes de utili!ar la (erencia, nos tenemos que (acer una pregunta, y si tiene
sentido, podemos intentar usar esta jerarqua) Si la frase Xclase9Y ES+34 Xclase,Y
tiene sentido, entonces estamos ante un posible caso de (erencia donde clase , ser" la
clase base y clase 9 la derivada.
Ejemplo) clases 9arco, ,cora!ado, 'arguero, etc. un ,cora!ado ES+34 9arco,
un 'arguero ES+34 9arco, un -rasatl"ntico ES+34 9arco, etc.
En este ejemplo tendramos las cosas generales de un 9arco %en 'FF&.
class Farco {
protected'
c$ar Tnombre;
float peso;
public'
""Constructores ; dem)s funciones b)sicas de barco
};
y a(ora las caractersticas de las clases derivadas, podran %a la ve! que (eredan
las de barco& a$adir cosas propias del subtipo de barco que vamos a crear, por
ejemplo)
class .ar!uero' public Farco {
private'
float car!a;
""El resto de cosas
};
class Hcora9ado' public Farco {
private'
int numeroHrmas;
int Joldados;
XX 3l resto de cosas
};
'omo vimos existen K clases de derivacin o (erencia que se diferencian en el
modo de manejar la visibilidad de los componentes de la clase resultante)
;erencia "$,lica %class Merivada' public Fase &) 'on este tipo de (erencia se
respetan los comportamientos originales de las visibilidades de la clase 9ase en la
clase 6erivada.
;erencia "ri)ada %clase Merivada' private Fase&) 'on este tipo de (erencia
todo componente de la clase 9ase, ser" privado en la clase 6erivada %las propiedades
(eredadas ser"n privadas aunque estas sean p#blicas en la clase 9ase&
;erencia "rote#ida %clase Merivada' protected Fase&) 'on este tipo de
(erencia, todo componente publico y protegido de la clase 9ase, ser" protegido en la
clase 6erivada, y los componentes privados, siguen siendo privados.
1V!9!2! ;erencia &(lti"le!
.a (erencia m#ltiple es aquella en la cual una clase derivada tiene m"s de una
clase base.
.a (erencia m#ltiple es el mecanismo que permite al programador (acer clases
derivadas a partir, no de una sola clase base, sino de varias. Para entender esto mejor,
pongamos un ejemplo) 'uando ves a quien te atiende en una tienda, como persona
que es, podr"s suponer que puede (ablar, comer, andar, pero, por otro lado, como
empleado que es, tambin podr"s suponer que tiene un jefe, que puede cobrarte
dinero por la compra, que puede devolverte el cambio, etc.
Si esto lo trasladamos a la programacin sera (erencia m#ltiple %clase
empleado[tienda&)
class &ersona {
...
:ablar();
.aminar();
...
};
class 3mpleado {
&ersona 4efe;
int sueldo;
.obrar();
...
};
class empleado_tienda' public &ersona) 3mpleado {
...
HlmacenarJtoc7();
.omprobar3(istencias();
...
};
Por tanto, es posible utili!ar m"s de una clase para que otra (erede sus
caractersticas.
class clase_derivada' #especificadores_de_acceso1% clase_base1)
#especificadores_de_acceso2% clase_base2) N )
#especificadores_de_acceson% clase_basen
{
...
};
3na declaracin multiple seria la clase derivada M)
class F { ... };
class .1 ' public F { ... };
class .2 ' public F { ... };
class M ' public .1) .2 { ... };
Ejemplo Programa banco usando (erencia multiple.
"include#iostream.$%
"include#cstdlib.$%
"include#conio.$%
class valor
{ protected'
double cap)cap1)cap2)monto)capital;
public'
valor();
};
valor''valor()
{ capital+capital;
}
class ctacte
{ protected'
strin! num_cuenta;
public'
ctacte();
};
ctacte''ctacte()
{ num_cuenta+num_cuenta;
}
class accion
{ protected'
c$ar operacion;
public'
accion();
};
accion''accion()
{ operacion+operacion;
}
class propiedad ' public valor)ctacte)accion
{ protected'
c$ar rpta;
double monto)t)deposito)retiro;
public'
propiedad();
void calcular();
void mostrar();
};
propiedad''propiedad()
{ valor''capital+capital;
ctacte''num_cuenta+num_cuenta;
accion''operacion+operacion;
}
void propiedad''calcular()
{ cout##-nn-;
cout##-ttt 2NU3JH NKM3L M3 .K3NDH' -##endl;
cin%%num_cuenta;
s*stem(-cls-);
cout##-nn-;
cout##-ttt 2NU3JH .H&2DHI' -##endl;
cin%%capital;
s*stem(-cls-);
t+capital;
deposito+,;
retiro+,;

do
{
cout##-nn-
##-ttt hK3 L&3H.2LN M3J3H 3HI2RHn-
##-ttt +++ +++++++++ +++++ ++++++++nnn-
##-ti (1) M3&LJ2DL -##-nn-
##-ti (2) 3D2L -##-nn-;
cin%%operacion;
s8itc$(operacion)
{
casec1c' { cout##-nn-;
cout##-ttt2NU3JH M3&LJ2DL-##endl;
cin%%cap1;
deposito+deposito5cap1;
monto+capital5cap1;
capital+monto;
}brea7;
casec2c' { cout##-nn-;
cout##-ttt2NU3JH 3D2L-##endl;
cin%%cap2;
if (cap2 %capital)
cout##-No puede retirar mas dinero-## endl;
else{
retiro+retiro5cap2;
monto+capitalCcap2;
capital+monto;}
}brea7;
}
s*stem(-cls-);
cout##-M3J3H .LND2NKH JXN ' -##endl;
cin%%rpta;
}8$ile(rpta++cJcZZrpta++csc);
s*stem(-cls-);
}
void propiedad''mostrar()
{
calcular();
cout##-nn-
##-tttMLJDHNML MHDLJ IH .K3NDH FHN.H2Hn-
##-ttt+++++++++ +++++ ++ ++++++ ++++++++nnn-
##-ti Ju capital inicial es ' f -##t##-nn-
##-ti 3l deposito total es ' f -##deposito##-nn-
##-ti 3l retiro total es ' f -##retiro##-nn-
##-ti Ju actual capital es ' f -##capital##-nn-;
}
void main()
{
propiedad a;
a.mostrar();
!etc$();
}

También podría gustarte