opto
DESCRIPTION
optoTRANSCRIPT
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 1/160
¡Desafío de edición de octubre!Ayúdanos a referenciar artículos en Wikipedia.
Optoacoplador
Optoacoplador
Optoacoplador en encapsulado DIL-8
Tipo Semiconductor
Principio de funcionamiento Efecto fotoeléctrico
Símbolo electrónico
[editar datos en Wikidata]
Un optoacoplador , también llamado optoaislador o aislador acoplado ópticamente, es undispositivo de emisión y recepción que funciona como un interruptor activado mediante la luzemitida por un diodo LED que satura un componente optoelectrónico, normalmente en formade fototransistor o fototriac. De este modo se combinan en un solo dispositivo semiconductor,un fotoemisor y un fotorreceptor cuya conexión entre ambos es óptica. Estos elementos se
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 2/160
encuentran dentro de un encapsulado que por lo general es del tipo D!. "e suelen utilizarpara aislar eléctricamente a dispositivos muy sensibles.
Funcionamiento#editar $
El optoacoplador combina un LED y un fototransistor.
La figura de la izquierda muestra un optoacoplador %&'( formado por un LED y un
fototransistor. La tensión de la fuente de la izquierda y la resistencia en serie establecen unacorriente en el LED emisor cuando se cierra el interruptor "). "i dic*a corriente proporcionaun nivel de luz adecuado, al incidir sobre el fototransistor lo saturar+, generando una corrienteen -. De este modo la tensión de salida ser+ igual a cero con ") cerrado y a - con ")abierto.
"i la tensión de entrada var/a, la cantidad de luz también lo *ar+, lo que significa que latensión de salida cambia de acuerdo con la tensión de entrada. De este modo el dispositivopuede acoplar una se0al de entrada con el circuito de salida, aunque *ay que tener en cuentaque las curvas tensión1luz del LED no son lineales, por lo que la se0al puede distorsionarse."e venden optoacopladores especiales para este propósito, dise0ados de forma que tenganun rango en el que la se0al de salida sea casi idéntica a la de entrada.
La venta2a fundamental de un optoacoplador es el aislamiento eléctrico entre los circuitos deentrada y salida. 3ediante el optoacoplador, el 4nico contacto entre ambos circuitos es un *azde luz. Esto se traduce en una resistencia de aislamiento entre los dos circuitos del orden demiles de 35. Estos aislamientos son 4tiles en aplicaciones de alta tensión en las que lospotenciales de los dos circuitos pueden diferir en varios miles de voltios.
Tipos#editar $
En general, los diferentes tipos de optoacopladores se distinguen por su diferente etapa desalida. Entre los principales caben destacar el fototransistor, ya mencionado, elfototriac y elfototriac de paso por cero. En este 4ltimo, su etapa de salida es un triac de cruce por cero,que posee un circuito interno que conmuta al triac sólo en los cruce por cero de la fuente.
Etapa de salida a fototransistor.
Etapa de salida a fototriac.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 3/160
Bibliografía#editar $
• 3alvino, 6lbert !aul 7-8889. Principios de Electrónica.3c:ra;<=ill1nteramericana de Espa0a,". 6. U. ">& ?%<%?)<-(@?<
).
Aategor/aB • Aomponentes activos
3en4 de navegación• Arear una cuenta
• 6cceder
• 6rt/culo
• Discusión
• Leer
• Editar
• er *istorial
• !ortada
• !ortal de la comunidad
• 6ctualidad
• Aambios recientes
• !+ginas nuevas
• !+gina aleatoria
• 6yuda
• Donaciones
•
&otificar un error mprimir1exportar
• Arear un libro
• Descargar como !DC
• ersión para imprimir =erramientas
• Lo que enlaza aqu/
• Aambios en enlazadas
• "ubir arc*ivo
• !+ginas especiales
• Enlace permanente
• nformación de la p+gina
• Elemento de iidata• Aitar esta p+gina
En otros idiomas
• FGHIJK
• MNOPQRST
• AatalV
• WeXtina
• Dans
• Deutsc*
r
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 4/160
• Englis*
• Eesti
• Eusara
• YZ[\]
• "uomi
• Cran^ais
• _`
• 3agyar
• taliano
• 日本語
• QQQ
• 한국어
• Lietuvih
• &ederlands
• !olsi
• omnj
• kSST
• "imple Englis*• "vensa
• TRQSTQ
• ing it
• 中文
Editar enlaces
• Esta p+gina fue modificada por 4ltima vez el -( feb -8)( a las )(B%@.
• El texto est+ disponible ba2o la Licencia Areative Aommons 6tribución Aompartir
gual '.8 podr/an ser a
Optoacopladores(Electrónica Básica)
• Facebook74
• Twitter18
• 92
Los Optoacopladores u Optoaisladores son dispositivos que
podemos encontrar en múltiples aplicaciones dentro de un equipo
electrónico cuando una se!al debe ser transmitida desde un
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 5/160
circuito espec"#co a otro sin que exista conexión eléctrica entre
ambos$ % pesar de ser un elemento mu& utili'ado encierra mucos
misterios en su interior & estas incónitas se pro*undi'an cuando
su *uncionamiento correcto se pone en duda$ ¿Se puedencontrolar?¿Cómo sabemos si funcionan correctamente? +or lo
eneral la transmisión de la in*ormación dentro de
un Optoacoplador se reali'a desde un LED infrarrojo que no
responde en las mediciones con el multimetro a lo que
conocemos como un LED tradicional$ ¿Qué podemos hacer
entonces? ,eamos si en este art"culo podemos encontrar las
respuestas que necesitamos$
La evolución de los semiconductores en el mundo electrónico
encontró en los optoacopladores al reempla'o ideal para de-ar
de lado al relé (o relay ) & al transformador en especial en
aplicaciones diitales donde la velocidad de trans*erencia & la
conservación de la *orma de onda deb"a ser tan #el como *uera
posible en la salida re.e-ando en *orma id/ntica al *ormato que
presentaba en la entrada$ En el caso del relé la trans*erencia deuna se!al analóica es imposible del mismo modo que sucede con
los trans*ormadores a determinadas *recuencias & con *ormas de
onda 0especiales1$ Eloptoacoplador *ue la solución empleada en
múltiples aplicaciones que requer"an importantes cambios de
niveles de tensión entre los circuitos enla'ados donde se
requer"a aislación de determinado tipo de ruidos en la transmisión
de datos2 o en espacios industriales donde se pudiera (o pudiese)controlar mediante un impulso lóico de ba-a tensión una cara
con elevados consumos en corriente alterna$ Básicamente si
pudi/ramos resumirlo en una *rase podr"a ser 0la solución de baja
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 6/160
potencia a la activación aislada galvnicamente de cargas!
mediante un sistema de control1
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 7/160
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 8/160
Optoacopladores (Electrónica Básica)
% pesar de que un optoacoplador o 0acoplador de se"ales
eléctricas mediante un enlace óptico1 puede tomar *ormatos
*"sicos mu& variados su arquitectura es siempre reiterada en el
concepto *undamental$ +or un lado se utili'a para transmitir la
in*ormación un diodo LED infrarrojo construido a base de un
compuesto de Arseniuro de Galio que se enla'a en *orma óptica
con un detector encarado de capturar esa información luminosa y
transformarla en una se"al eléctrica id/ntica en su composición
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 9/160
de niveles a la que el LED emite$ Lueo la naturale'a de este
detector nos brindará una respuesta acorde al tipo de se!al
aplicada al LED & a la *unción espec"#ca para la que *ue construido
ese detector que trae consio el optoacoplador$
+or e-emplo si el elemento receptor (o detector ) es
un fototransistor podremos utili'ar el dispositivo para trans*erir
se!ales analóicas como puede ser audio o video$ 3i en cambio es
otro fotodiodo o unf oto-!" nos será útil como 0recti#cador
controlado y aislado eléctricamente1$ 4e este modo los detectores
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 10/160
se multiplican en *ormatos & tipo de aplicación como puede ser
un #riac (para traba-ar con corrientes alternas) & asta podemos
encontrar puertas lóicas como detectores dentro de
unoptoacoplador$ Lo que siempre conservará su naturale'a es elelemento transmisor o emisor2 sie$pre ser% un diodo (o un
con-unto de ellos) LED infrarrojo$
5lásico Optoacoplador tipo ranura para traba-ar con ruedas dentadas
Los Optoacopladores que traba-an por re.e6ión son mu& utili'ados en
robótica
Otro tema mu& importante es la ran variedad de encapsulados
que encontraremos delante de nuestros o-os & aunque no lo
creamos posible será un optoacoplador$ +or e-emplo uno mu&
popular dentro del mundo de los ro&ots “sigue-líneas” es
el !'(7) que traba-a por re.e6ión$ Otro tipo de acoplador óptico
mu& popular es el que trae una *orma de 071 & su activación se
basa &a no en un re.e-o sino en una interrupción de un a'
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 11/160
detectado en *orma permanente (en el tercer video acemos un
ensa&o con uno)$ El e6tremo más conocido & 0familiar 1 es el que
viene en el mismo tipo de encapsulado que un circuito interado
tradicional pero con menor cantidad de pines por lado$ Es decirnotarás que traen dos o tres pines por lado & eso además de
llamarte la atención te estará indicando que estás (889) *rente a
un optoacoplador$ 4e todos modos estos últimos o*recen una
presentación múltiple en un mismo encapsulado & su aspecto es el
de un circuito interado clásico con presentaciones de asta :
pines por lado (; optoacopladores individuales en un mismo
encapsulado)$
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 12/160
5ómo veri#car el *uncionamiento
<o te preocupes no te sientas como un marciano si te invade la
duda de su accionar adecuado & no sabes por dónde comen'ar a
medir2 ni qu/ parámetros controlar & muco menos cómo acerlo$La comprobación de *uncionamiento de este tipo de dispositivos no
es sencilla$ 3eamos sinceros & realistas desde el comien'o=
inde*ectiblemente (no tienes opción) debes retirarlo del luar de
traba-o donde se encuentre para reali'ar alunas pruebas que no
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 13/160
son comple-as que en mu& corto tiempo la puedes reali'ar & los
materiales necesarios para llevarlas a cabo son mu& básicos mu&
elementales$$odo esto vale si deseas hacer un trabajo apropiado!
claro est$ El primero que debemos acer a unoptoacoplador espor lóica inspeccionarlo *"sicamente$ Observarlo & veri#car que
su estructura est/ correcta sin demostraciones de quema'ón o
quebraduras en su estructura *"sica$ En el caso de los que se
encuentran en encapsulado tipo circuito interado suelen
0quebrarse1 al e6plotar & eso *acilita muco el dianóstico$ 3in
embaro cuando su aspecto es óptimo debemos comen'ar con la
medición estática más elemental que podemos acer= mediante eluso del mult"metro (en posición para medir diodos si es diital en
> ? @ si es analóico) buscar entre los pines *asta encontrar el
LED$ >ecuerda='O es un LED convencional por lo tanto el valor
obtenido en la medición podrá resultarte alo e6tra!o$ Observa=
7na ve' descubierto & comprobado el LED podemos pasar a acer
otro tipo de mediciones que puedan a&udarnos a incrementar la
seuridad de un buen *uncionamiento2 esto es que la in*ormaciónintroducida en el LED se pueda recuperar en el detector$ +ara esto
necesitaremos dos mult"metros & alunos cables con pin'as
caimanes o 0cocodrilo1 en sus e6tremos para apo&arnos
*"sicamente en el traba-o porque mantener cuatro puntas de
medición con sólo dos manos suele ser alo complicado de acer$
+or lo tanto un par de cables & alunos pines
de resistencias cortados pueden ser de ran a&uda$ 7na ve'identi#cado el LED &a tenemos la posibilidad de activar
el e$isor por lo tanto la búsqueda con el seundo instrumento
estará orientada a comprobar el *uncionamiento del
elementoreceptor o el detector que recibe el a' in*rarro-o$
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 14/160
>ápidamente siuiendo el m/todo anterior avan'amos a esta
instancia de la siuiente manera=
4esde que cono'co a los optoacopladores el m/todo mostrado
asta aqu" es por lo eneral su#ciente como para detectar el
buen *uncionamiento de este dispositivo sin necesidad de recurrir
a buscar en la web la o-a de datos del elemento que estamos
ensa&ando$ 3in embaro no ha faltado el diablo a la cita en varias
ocasiones & a pesar de encontrar estas mediciones correctas
eloptoacoplador no *uncionaba en su luar de traba-o en la
aplicación$ %*uera las mediciones eran óptimas mientras que en
circuito ba-o condiciones de traba-o el dispositivo no *uncionaba
de manera correcta$ 3i lo anali'amos en *orma detenida puede
e6istir una *ua de corriente desde el e$isor acia el detector &
los resultados 0 parecen1 ser los correctos sin embaro la
aislación a ambos lados de los elementos que componen
el optoacoplador no se cumple como deber"a ser$ +or lo tanto a
las mediciones e*ectuadas deber"amos arearle un m/todo
dinámico de ensa&o con tensión de traba-o que nos permitacomprobar los elementos a la ve' que tambi/n nos demuestre que
la aislación está presente entre los elementos$
%vancemos acia el m/tododinámico
En este punto te preuntarás los motivos por los cuales nocambiamos directamente esta 0piedra en el 'apato1 que cuesta
unas pocas monedas antes de perder tanto tiempo en ensa&os
sin embaro cuando descubres que no tienes uno nuevo para
reempla'arlo (ni lo conseuirás en varios d"as) estarás de acuerdo
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 15/160
en que siamos acia el ensa&o dinámico$ +ara reali'ar este
traba-o debemos ante todo saber con qu/ elemento estamos
traba-ando conocer su nomenclatura & por supuesto (aora s")
tener acceso a su o-a de datos$ +ara esto último e6isten mucosespacios en la web donde encontrar la in*ormación necesaria que
nos permitirá conocer la arquitectura interna del componente con
el que estamos traba-ando al que intentamos acerle los controles
sanitarios para saber si o'a de buena salud$ 3i no tenemos un
espacio de pre*erencia donde encontrar este tipo de in*ormación
bastará con escribir la nomenclatura en cualquier buscador web &
apuntar nuestra lectura acia los arcivos +4F que siempreaparecen$ 7na ve' que tenemos ese resultado podemos saber de
qu/ manera ensa&ar nuestro optoacoplador$
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 16/160
4urante la primera etapa del ensa&o lo más importante dentro de
la o-a de datos será descubrir las caracter"sticas *uncionales
del LED & no con*undirnos entre los valores má6imos & absolutos
que puede soportar el dispositivo respecto a los óptimos que se
pueden utili'ar para un *uncionamiento adecuado & seuroaranti'ando una lara vida útil$ A como por alún lado debemos
comen'ar vamos a acerlo con uno de los optoacopladores más
populares económicos & 0adoptados1 por la industria electrónica
(4e nada sirve durante el aprendi'a-e ablar de componentes que
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 17/160
verás solo una ve' en tu vida)$ +or lo tanto veamos alunas
particularidades que debemos tener en cuenta al momento de leer
la o-a de datos de un +!817= un optoacoplador analóico
clásico con un fotodiodo infrarrojo (emisor) &un fototransistor (detector) que nos o*rece en su salida los
pines !olector-E$isor para tomar all" 0en forma aislada y
proporcional1 las variaciones de intensidad luminosa que entreue
elLED infrarojo$ %demás este optoacoplador analóico es el
que más utili'amos & utili'aremos en los$ontajes de 'eo#eo$
5omo mencionamos antes los valores má6imos absolutos
del +!817 ablan de una corriente de LEDen *orma directa
(%or&ard Current ) de Cm% sin embaro traba-ando a ese
r/imen el optoacoplador puede durar unos pocos minutos antes
de calcinarse$ Dnsistamos en este concepto= 0eso es el mximo
absoluto! no el valor seguro de trabajo1$ +ara saber cuál es esta
0corriente seura de traba-o1 tenemos dos m/todos= uno es
observando las curvas presentes en las o-as de datos que nos
muestren los valores usuales dentro del 0 'rea de (peraciónSegura1 (OA Security O peration Area)$ En el rá#co mostrado
aba-o (dereca) es el área que se encuentra deba-o de la l"nea de
puntos$ +ara e-emplo podemos observar que con una corriente
de LED de m% @Cm% (& un poco más tambi/n) podemos traba-ar
sin problemas en todo el rano de tensiones (entre colector &
emisor) que permite aprovecar el *ototransistor del +!817$
Observa que si lo aces traba-ar con una corriente de LED deCm% no podrás llear a emplear valores de tensión de ,olts en
el fototransistor$ Gasta podr"amos decir que traba-ar con ,olts
ser"a estar mu& cerca de la 'ona 0no segura1
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 18/160
%demás el rá#co que muestra el !#" (Current T ransfer Ratio)
(i'quierda) es mu& claro2 para una tensión de traba-o en el
transistor de ,olts la corriente de LED alcan'a el má6imo
porcenta-e de!#" entre los @C & los Cm% de corriente directa de
LE4 (D*) en este modelo de +!817$ 3euramente te estarás preuntando ¿qué es el CTR? El concepto de interpretación más
sencillo que podemos volcar es el siuiente= un !#" del @CC9 nos
o*rece una relación de corrientes @ a @ en la entrada & la salida$
Esto es= por cada m% que circule por el diodo emisor circulará un
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 19/160
m% en el circuito 5olector H Emisor en el *ototransistor de salida$
+or e-emplo % una alimentación de ,olts ,ce ($ensión Colector )
*misor ) el 5T> I @CC9 de un +!817 está ubicado en apenas alo
más de m% de corriente de LED$ En estas condiciones en elcircuito de 5olector H Emisor se podrá recuperar una corriente
má6ima de 0algo ms de +m,1$ En cambio si el !#" aumenta a
un CC9 (m% de corriente de LE4) la corriente 5olector H Emisor
recuperada podrá ser de asta @Cm%$ (Observa en la o-a de datos
que el 5T> puede llear asta CC9 en otros modelos de +!817)$
En *unción de esto &a estamos en condiciones de saber una de las
bases *undamentales para traba-ar con un optoacopladoranaló,ico= Esto es cuánta corriente necesita el LED para traba-ar
en *orma seura & de qu/ modo se comportará la salida con cada
m% de traba-o en el LED$
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 20/160
El otro m/todo de comprobación (además del estático utili'ando
los mult"metros) es e*ectuando elensao din%$ico$ +ara nuestro
traba-o que es de comprobación de *uncionamiento no
necesitaremos saber si la relación de trans*erencia es plenamente
lineal a lo laro de todo el rano de corriente de LED$ Esoquedará para estudios posteriores cuando nos dediquemos al
dise!o electrónico$ +or aora que sólo intentamos saber si nuestro
optoacoplador está vivo o muerto debemos entender que si
loramos un *uncionamiento correcto como LED en el emisor
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 21/160
tenemos la mitad del traba-o resuelto$ +ara esto bastará con que
repasemos los cálculos ecos en el art.culo so&re LEDs en el
que aprendimos a obtener los valores de resistencias de
polari'ación para acer circular por el LED la corriente que nosinteresa$ En el me-or de los casos podemos colocar un control
variable que nos permita operar dentro del espacio OA &
observar as" los cambios en la salida (circuito 5olector H Emisor
del +!817)$ El e-emplo práctico entonces ser"a el siuiente para
una tensión de ensa&o en el circuito del LED de ,olts= una
resistencia m"nima de @:C Oms (D* JI Km%) & una má6ima de
@CCC Oms para una corriente directa de LE4 (D*) I a @m%$ 5onuna resistencia #-a de @:C Oms & un resistor a-ustable (preset)
de @M tendr"amos resuelto nuestro monta-e inicial de ensa&os$
,eamos qu/ resultados obtuvimos=
+or último en esta primera entrea sobre optoacopladores & su
ensa&o nos resta mencionar que podemos tambi/n e-ecutar
alunos traba-os simples con el circuito del detector para
comprobar (de#nitivamente) el correcto & completo*uncionamiento del optoacoplador ensa&ado$ Esto es= veri#car
que ante variaciones en la corriente de LED tenamos variaciones
en la corriente del circuito 5olector H Emisor en
el fototransistor de salida en el detector$ +ara esto utili'aremos
una simple erramienta como es un LED & una resistencia$ 7na
ve' que conocemos la disposición de pines delfototransistor en
la salida será mu& sencillo reali'ar la cone6ión como si se tratara(o tratase) de un transistor convencional sin embaro el utili'ado
para encender el LED será el fototransistor interno del
optoacoplador$ 5one6iones mediciones & resultados en este
video=
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 22/160
5omo pudimos ver a lo laro del art"culo descubrir los
componentes *undamentales de unoptoacoplador no es una
tarea titánica imposible o sólo reservada a enios$ Es mu& sencillo
apenas con un mult"metro puedes descubrir *ácilmenteel fotodiodo/ lueo ensa&arlo & &a tienes la mitad
deloptoacoplador en buen estado$ Lueo con los elementos de
siempre pondrás en marca aloptoacoplador para traba-ar en
*orma dinámica$ Nedirás corrientes & descubrirás las relaciones
que e6isten entre la realidad & la teor"a$ 3i antes todo esto era un
submundo impenetrable esperamos que con las e6plicaciones
entreadas & los videos de demostración alunas cosas se a&ancomen'ado a aclarar$
4e todos modos si alo no as comprendido recuerda que
estamos en el 0oro de Electrónica de 'eo#eo para traba-ar
-untos & tratar de a&udarte a despe-ar las tinieblas que pudieron
quedar en esta entrea$ +ara la pró6ima traba-aremos con otro
tipo de optoacoplador & asta qui'ás oranicemos alún
probador automático para optoacopladores$ +ara nosotros eraimportante que comprendas esta teor"a de lo contrario apretar un
botón sin saber qu/ se ace te resuelve el problema pero no te
ense!a nada$ <os encontramos en el Foro o en la pró6ima
entrea$ -$e esperamos.
=o2a de Datos+5:@K
8 -ulio C@
Electrónica aislación *otodiodo *ototransistor in*rarro-o optoacopladores
ledP:K
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 23/160
N%>DO3ilent Gill= >evelation P4 (Trailer) La música pop suenacada ve' más *uerte e iual
+O+3LA"E
Nicroso*t GoloLens= Feca precio & una demo inolvidable
P$8; vistas Q publicado el octubre K C@
Enlaces >ecomendados de la 3emana (<RP8)
P$K:: vistas Q publicado el octubre @C C@
Subes O3= 7n sistema operativo con la seuridad como prioridad
$:K@ vistas Q publicado el octubre 8 C@
Ne-ora el rendimiento de indows @C
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 24/160
$K8 vistas Q publicado el octubre @C C@
5rossOver= E-ecutar proramas de indows en %ndroid
$P; vistas Q publicado el octubre 8 C@
*ttpB11;;;.neoteo.com1optoacopladores<electronica<basica
ttp=UUwww$neoteo$comUoptoacopladoreselectronicabasica
jueves, 4 de septiembre de 2008
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 25/160
Optoacoplador: ¿Què son y còmo funcionan?
Optoacopladores
¿Qué son los optoacopladores y como funcionan?
Son conocidos como optoaisladores o dispositivos de acoplamiento óptico, basan su
funcionamiento en el empleo de un haz de radiación luminosa para pasar señales de un circuito a
otro sin coneión el!ctrica" #stos son muy $tiles cuando se utilizan por e%emplo,
&icrocontroladores '()s y*o '()+# si -ueremos prote.er nuestro microcontrolador este
dispositi/o es una buena opción" #n .eneral pueden sustituir los rel!s ya -ue tienen una /elocidad
de conmutación mayor, as0 como, la ausencia de rebotes"
1a .ran /enta%a de un optoacoplador reside en el aislamiento el!ctrico -ue puede establecerse
entre los circuitos de entrada y salida" 2undamentalmente este dispositi/o est3 formado por una
fuente emisora de luz, y un fotosensor de silicio, -ue se adapta a la sensibilidad espectral del
emisor luminoso, todos estos elementos se encuentran dentro de un encapsulado -ue por lo.eneral es del tipo DIP"
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 26/160
¿Qué tipo de Optoacopladores hay?
#isten /arios tipos de optoacopladores cuya diferencia entre s0 depende de los dispositivos de
salida -ue se inserten en el componente" Se.$n esto tenemos los si.uientes tipos:
Fototransistor : se compone de un optoacoplador con una etapa de salida formada por un
transistor 456" 1os mas comunes son el 4N25 y 4N5
Optotransistor (simbolo)
Optotransistor en configuración Darlington
Optotransistor de encapsulado ranurado
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 27/160
Optotransistor de encapsulado ranurado(fotografia)
Fototriac: se compone de un optoacoplador con una etapa de salida formada por un triac "
Fototriac de paso por cero: Optoacoplador en cuya etapa de salida se encuentra un triac de
cruce por cero" #l circuito interno de cruce por cero conmuta al triac sólo en los cruce por cero
de la corriente alterna" 'or e%emplo el !O"#4$
Optotiristor : 7iseñado para aplicaciones donde sea preciso un aislamiento entre una señal ló.ica
y la red"
#%emplos de circuitos utilizados al utilizar los optoacopladores:
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 28/160
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 29/160
8er documento online clic a%ui
+.radesco a las si.uientes pa.inas por brindarme informacion bastante util:
#lectron9ed
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 30/160
'ablin
control
Optoacopladores
!ublicado por ptimusronic en -8B(?
EtiquetasB Documentacion
6rtigos elacionadosB
• UL&-?8'B wué es
• AontadoresB Empezando
• ptoacopladorB wu son y c{mo funcionan
• wAomo usar un 3anual &E
• LD, wué son
25 Comentários:
1uis di%o"""
#celente tu pa.ina,
te ten.o una pre.unta, los dia.ramas -ue tienes en proteus sobre los 6riac es posible
simularlos?
por-ue no me sale la .rafica en el osciloscopio, estoy tratando de acti/arlos por fase, pero no
me funciona en proteus"
.racias de antemano si me puedes ayudar"
luis
;< de enero de =>>, ;=:@A
Optimus6ronic di%o"""
si luis, es posible, pero -ue /ersion de proteus tienes, ya -ue con las /ersiones del < en
adelante funciona"
;< de enero de =>>, ;@:;>
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 31/160
1uis di%o"""
Bracias Optimus,
ten.o la /ersion <"=S'C" pero no lo.ro hacer funcionar los 69(+) por fase ni por recorte de
onda"
tu has hecho la simulacion con el optotriac y al.un micro mane%ando un 69(+) en proteus?
te ha funcionado?
cual-uier ayuda me ser/iria"
feliz dia
;D de enero de =>>, <:>C
Optimus6ronic di%o"""
mmm""" -ue etraño, yo tu/e problemas en funcionar triacs en la /ersion C y supuestamente
ya se podia simular en /ersiones <" para serte sincero nunca he tratado de simular micros con
triacs" te de%o unos linEs -ue a lo me%or te pueden ayudar"
http:**cli".s*1sss5
http:**cli".s*FhGQd
http:**cli".s*A+H6r-
; de enero de =>>, ;;:AI
1uis di%o"""
Bracias por responder y .racias por los enlaces"
aspiro sacar lo mas pronto posible la solucion, y te la comentare, -uizas pueda ser/irle a mas
personas y lo puedas colocar en tu blo."
un abrazo y suerte,
1uis
=> de enero de =>>, C:;A
Optimus6ronic di%o"""
OPTOACOPLADOR
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 32/160
COMPARTE
!6A!L6D
Twittear
Comparte www.areatecnologia.com
OTRAS WEBS INTERESANTES
Tecnologia Industrial
Tecnologias
Ciencias
Blog de Tecnologia
¿Qué es un Optoacoplador?
Un optoacoplador es un componente electrnico !ue se utili"a como
transmisor # receptor ptico $de lu"%& es decir pueden transmitir de un punto a
otro una se'al el(ctrica sin necesidad de cone)in *+sica ni ca,les $por el aire%&
mediante una se'al luminosa. Por eso tam,i(n se llaman OptoInterruptor.
Acti-amos una lu" # esta lu" llega a un detector !ue genera una tensin de
salida& interruptor cerrado. i no se acti-a la lu" o no le llega la lu" al detector&
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 33/160
este no genera ninguna tensin de salida& es decir interruptor a,ierto.
i com,inamos una *uente ptica $generalmente un Led% con alg/n tipo de
detector ptico $generalmente un semiconductor de silicio llamado
*ototransistor% en un solo encapsulado& el dispositi-o resultante es un
optoacoplador o interruptor ptico.
uelen ser elementos !ue sustitu#en a los rel(s tradicionales. e suelen
utili"ar para aislar dos circuitos& uno !ue tra,a0a a poco tensin $el del LED%&
llamado de control # otro a muc1a tensin o a una tensin di*erente $el del
detector% llamado de potencia.
Imagina !ue con una pe!ue'a tensin acti-amos el LED del optoacoplador
$por e0emplo a 23% # la lu" !ue emite el led llega al detector del optoacoplador
# acti-a el detector creando una tensin de salida a 4453. Podemos acti-ar a la
salida motores& l6mparas& etc. a 4453 desde otro sitio en el !ue solo tenemos23& sin riesgo apenas para el !ue lo acti-a.
La aplicacin principal es en aislamiento entre los circuitos de control # los de
potencia.
Esto e-ita !ue la parte de tra,a0o $la del led% no tengan casi riesgos para el
!ue opera en ella& al no tener !ue tra,a0ar con la parte de alta tensin o
intensidad& !ue estar+a separada. 3eamos como *uncionan.
Otro uso mu# com/n en educacin son en coc1es seguidores de lu".
¿Cómo Funcona?
Tiene una salida de lu" $LED% # una entrada de lu"& !ue detecta cuando
reci,e la lu" del LED& cuando esta re,ota contra alguna super*icie
$*otodetector%. Como -es es similar al transistor& pero en lugar de corriente con
lu".
Cuando le llega una se'al el(ctrica a los dos e)tremos del LED $emisor% este
emite una se'al luminosa& !ue reci,e el receptor o detector. Este al reci,ir esta
se'al luminosa genera en sus ,ornes $patillas% una tensin el(ctrica& !ue ser6
la tensin de salida.
Como -emos cuando le llega una tensin a la entrada se genera una lu" # al
reci,irla el detector este genera una tensin de salida. Es como un interruptor.
i no llega lu" al detector el interruptor estar6 a,ierto& si le llega lu" del led el
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 34/160
interruptor ser+a cerrado.
O7O podr+a estar el led encendido pero no llegarle lu" al detector por !ue no
re,ota en ninguna super*icie. El interruptor estar+a a,ierto por !ue no se
produce tensin a la salida.
Algunos optoacopladores tienen un encapsulado con una c6mara de aire para
la transmisin de la lu". En este tipo si 1a# alg/n o,0eto dentro de la ranura no
llegar6 lu" al detector. Tam,i(n puede ser !ue no le llegue tensin al led #
tampoco tendr+amos tensin de salida. er+an los 4 casos posi,les.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 35/160
La ma#or+a de los optoacopladores utili"an un encapsulado llamado DIP
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 36/160
Como -es el DIP tiene un encapsulado mu# parecido a un circuito integrado&
incluso pueden presentar 1asta 8 pines o patillas por cada lado. En este caso
estamos 1a,lando de 9 optoacopladores indi-iduales en un mismo
encapsulado.
:i0(monos en el m6s normal !ue ser6 el de ; patillas& < por cada lado.
Como -es las patillas = # 4 son el emisor de lu" # la ; # 9 el receptor de la lu"
para !ue se acti-e.
>a# muc1os tipos di*erentes de optoacopladores& pero todos tienen un *oco
emisor de lu" LED. Lo !ue pueden cam,iar es el receptor de lu" !ue puede ser
un *otodiodo& *ototransistor& LACR& etc.
Un par6metro mu# importante en estos elementos es la e*iciencia& este
par6metro de*ine !ue cantidad de corriente necesitamos en el LED parao,tener la salida deseada. En el transistor # en el darlington esto se llama
Radio de trans*erencia de corriente $CTR%& esto se calcula simplemente
di-idiendo la corriente de salida entre la corriente de entrada re!uerida. La
ma#or+a de los optoacopladores tra,a0an a un CTR entre =5 # 25 por ciento.
El otro par6metro importante en optoacopladores es el -olta0e de aislamiento
el cual es de ?255 3olts durante = segundo.
Cone!ón de Optoacopladores
Es importante resaltar !ue tanto el led como el detector de,en lle-ar
siempre una resistencia en serie con ellos para protegerlos # limitar la
corriente !ue le llega al led. 3eamos el e0emplo@
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 37/160
si le ponemos un led a la salida
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 38/160
En este caso el optoacoplador encender+a el led. Donde -a conectado el led
de salida podr+amos poner un -olt+metro $o un pol+metro% # utili"arlo para
compro,ar el *uncionamiento del optoacoplador.
Lgicamente donde tenemos en el es!uema la 3ss 1a# podr+amos colocar el
receptor como una ,om,illa& tim,re& motor& etc. !ue se acti-ar+a con el
optoacoplador& al llegarle tensin al Led del optoacoplador con 3s. i ponemos
un pe!ue'o motor de c.c. o un led en 3ss este se acti-ar6 con el
optoacoplador. Pero si !ueremos se'ales de tensiones m6s ele-adas a la
salida
En 3ss tendr+amos !ue poner un rel( por !ue la tensin generada no ser6
mu# alta& si !ueremos receptores a m6s tensiones. i colocamos un rel(
podemos acti-arlo con el optoacoplador # este tener a la salida un circuito con
la tensin de 4453 en alterna& por e0emplo.
ormalmente en lugar de un rel( se pone un triac. 3eamos el circuito@
Este circuito electrnico de llama inter*ace de potencia& ,asado en un
optoacoplador DIODO TRIAC capa" de mane0ar cargas del orden de =5
amperios o m6s dependiendo la capacidad del triac a utili"ar a la salida.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 39/160
Lo primero !ue de,emos -eri*icar es !ue 1a#a se'al su*iciente para acti-ar
un LED& # luego acoplar esa se'al a este circuito tal cual.
3eamos este -ideo !ue e)plica el optoacoplador& *uncionamiento # un circuito
,6sico@
Crcuto "ara Coc#e $ue se %u&a por una '&nea Ne(ra
i !uieres aprender electrnica de *orma *6cil para todos& te recomendamos
el siguiente li,ro !ue contiene los conceptos ,6sicos de electrnica e)plicados
de *orma sencilla # amena& a1ora en o*erta por solo 9F.
Te de0amos este -ideo !ue e)plica el circuito para !ue constru#as un coc1e
!ue sigue a una l+nea negra& por e0emplo de cinta aislante. Mu# *6cil # por
supuesto lo primero un optoacoplador !ue cuando el led del optoacoplador
ilumina la l+nea negra no se re*le0a la lu" so,re el detector del optoacoplador
$la lu" la a,sor,e la cinta de color negro%.
i te 1a gustado 1a" clicG en Me Husta& Hracias@
Twittear
e permite la total o parcial reproduccin del contenido& siempre # cuando
se recono"ca # se enlace a este art+culo como la *uente de in*ormacin
utili"ada.
Dispositivos electrónicos de potencia:
Optoacopladores
#!+gina /ndice$ | #>ibliograf/a$
ndice
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 40/160
• ptoacopladores.
• Cuncionamiento del ptoacoplador.
• Diferentes tipos de ptoacopladores.
ptoacopladores
Un optoacoplador combina un dispositivo semiconductor formado por unfotoemisor, un fotoreceptor y entre ambos *ay un camino por donde setransmite la luz. odos estos elementos se encuentran dentro de unencapsulado que por lo general es del tipo D!.
Cuncionamiento del ptoacoplador
La se0al de entrada es aplicada al fotoemisor y la salida es tomada delfotoreceptor. Los optoacopladores son capaces de convertir una se0aleléctrica en una se0al luminosa modulada y volver a convertirla en unase0al eléctrica. La gran venta2a de un optoacoplador reside en elaislamiento eléctrico que puede establecerse entre los circuitos deentrada y salida.
Los fotoemisores que se emplean en los optoacopladores de potencia
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 41/160
son diodos que emiten r ayos infrarro2os 7ED9 y los fotoreceptorespueden ser tiristores o transistores.
Auando aparece una tensión sobre los terminales del diodo ED, esteemite un *az de rayos infrarro2o que transmite a través de una peque0aguia<ondas de pl+stico o cristal *acia el fotorreceptor. La energ/aluminosa que incide sobre el fotorreceptor *ace que este genere unatensión eléctrica a su salida. Este responde a las se0ales de entrada, quepodr/an ser pulsos de tensión.
Diferentes tipos de ptoacopladores
Fototransistor B se compone de un optoacoplador con una etapa de salidaformada por un transistor >}.
Fototriac B se compone de un optoacoplador con una etapa de salidaformada por un triac
Fototriac de paso por ceroB ptoacoplador en cuya etapa de salida seencuentra un triac de cruce por cero. El circuito interno de cruce por ceroconmuta al triac sólo en los cruce por cero de la corriente alterna.
#>ibliograf/a$ /0 1omingo ,guilar 2e"a3 jaguilar4ujaen0es5iguel 'ngel 5ontejo 6e73 radastan4s&in0net
ptoacoplador ~ wué Es y Aómo Utilizarlo
!osted on )% octubre, -8)% Under Aomponentes )) Aomments
"i quieres evitar que algunas partes de tu circuito se vean afectadas por corrientes o volta2es
excesivos que puedan destruir tus componentes 7como puede pasar a causa de los efectos
transitorios que sufren los transistores en suencendido y apaado, as/ como en otros muc*os
circuitos9, la solución m+s simple es aislar, separar esas partes. El dispositivo encargado de
realizar esa función es el ptoacoplador 7también conocido como ptoaislador 9.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 42/160
Las utilidades de este componente van muc*o m+s all+ que simplemente aislar circuitos. En
este post voy a explicarte cómo funciona un ptoacoplador, para qué sirve y cómo realizar un
monta2e con este componente, centr+ndome en su uso aislando circuitos para que no corras
el riesgo de destruir tus componentes electrónicos.
El ptoacoplador
Un ptoacoplador es un circuito integrado muy b+sico compuesto generalmente por un diodo
LED y un fototransistor unidos de tal forma que cuando una se0al eléctrica circula a través del
LED *aciendo que brille, la luz que este emite es recibida por la base del fototransistor,
que empieza a actuar en modo saturación.
!uedes utilizar este dispositivo a modo de interfaz entre dos circuitos, de tal forma que
quedar/an unidos ópticamente, lo que a efectos de protección del circuito, se traduce en
colocar una resistencia de un valor muy alto 7muc*os 359, lo que lo *ace especialmente 4til
para proteger contra los picos de tensión.
Aomo la luz que emite el LED var/a en función de la tensión y la corriente que circulan por él y
esta luz a su vez modifica el comportamiento del transistor, la se0al eléctrica que tendr+s a la
salida 7en el transistor9 depender+ de la se0al que tengas a la entrada, es decir, de
cómo ata!ues el LED.
En la pr+ctica esto se traduce en que si regulas bien el comportamiento de tu ptoacoplador
7y los componentes necesarios para su funcionamiento9, puedes conseguir que tu circuito
aislador sea invisible en la pr+ctica, es decir, no cambie el comportamiento de tu circuito
global. tra posibilidad es que te aproveches de la ganancia ue te proporciona el
fototransistor y lo utilices para a"plificar la se#al. En definitiva, como todo en electrónica,
el l/mite es tu imaginación.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 43/160
wué Utilidades iene un ptoacoplador
6dem+s de para aislar circuitos, se pueden utilizar ptoacopladores paraB
•
nterfaces en circuitos lógicos.
• nterfaces entre se0ales de corriente alterna y circuitos lógicos.
• En sistemas de recepción 7telefon/a9.
• Aontrol de potencia.
• 6 modo de relé.
• etc.
wAómo Utilizar un ptoacoplador
En el apartado anterior te comenté algunos de los monta2es que podr/as *acer con un
ptoacoplador. Aomo su función principal es la de aislar y m+s en proyectos D•, te voy a
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 44/160
ense0ar cómo realizar este monta2e y qué es lo que debes tener en cuenta. !ara ello me voy a
centrar en uno de los modelos m+s comunes, el ptoacoplador $%&'.
Características Básicas del 4N35.
Aaracter/sticas de la entrada 7LED9B
• La ca/da de volta2e t/pica del LED del %&'( es de ).)( 7para una corriente de )8m69.
• La corriente m+xima que puede soportar el LED sin destruirse es @8m6.
• La disipación de potencia m+xima de este componente es )-8m.
Aaracter/sticas de la salida 7Cototransistor9B
• La ca/da de volta2e de colector a emisor del fototransistor es de %( para una corriente
de colector de )m6.
• La ca/da de volta2e del emisor a la base es de €.? para una corriente de emisor de
)886.
•
La ca/da de volta2e del colector a la base es de )88 para una corriente de colector de)886.
• La ganancia de corriente 7=fe9 para una corriente de colector de -m6 y una ca/da
volta2e de colector a emisor de ( es de %88.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 45/160
Aomo siempre te digo, estas son simplemente algunas caracter/sticas b+sicas y no pueden en
ning4n caso sustituir al correspondiente Datas*eet del componente.
Debes tener en cuenta que el ptoacoplador $%&' est( co"puesto única"ente por un
diodo )ED y un fototransistor , por lo que en tu monta2e deber+s utilizar las correspondientesresistencias. e de2o un par de lins por si tienes alguna duda sobre estoB
). esistencia del LED de entrada.
-. Aomportamiento del transistor .
Montaje
En función del circuito que desees aislar con tu ptoacoplador, necesitar+s distintos
componentes 7fuentes, resistencias, etc.9 pero de forma general es esquema de tu circuito
deber/a ser similar a esteB
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 46/160
En este diagrama se *an aislado dos circuitos ópticamente. El circuito de entrada 7LED9 regula
el funcionamiento del otro 7fototransistor9, creando un comportamiento similar a un circuito con
relés.
Aomo puedes observar en este diagrama, el fototransistor del %&'( dispone de un pin para la
base 7donde incide la luz para regular el transistor9, con lo que también puedes utilizarlo como
un transistor b+sico o conmutar ambas funcionalidades cuando tu proyecto as/ lo requiera.
En caso de que tengas problemas en la realización de este monta2e, puedes ayudarte de la
siguiente imagen. El proyecto es el mismo pero sobre una >readboard.
&otaB "e trata de un monta2e genérico, por lo que no debes fi2arte en los valores de loscomponentes, solo en la composición del circuito.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 47/160
"in duda se podr/a profundizar muc*o m+s sobre los diversos monta2es que se puedenrealizar con el ctoacoplador %&'( 7o similar9 pero con la intención de que te sirva para
orientarte en cualquier futuro monta2e en el que desees aislar circuitos, *e intentado
realizar un post lo "(s genérico posible.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 48/160
6unque en esta entrada *e utilizado el %&'(, puedes realizar este "onta*e con cualuier
ptoacoplador , bastar/a con ec*arle un vistazo al Datas*eet correspondiente y adaptarlo a tu
circuito.
&o dudes en preguntar cualquier tipo de duda que te *aya surgido leyendo el post o montandotu circuito. La comunidad de EducaA*ip est+ aqu/ para ayudarte.
Aomo siempre te digo, si te gustó, comp+rtelo en tus redes sociales y, si no te quieres perder
ning4n post, suscr/bete.
Un saludo, Enrique.
%&'(, Cototransistor , ptoacoplador
8n optoacoplador! también conocido como opto9aislador! fotoacoplador ofoto5(S! es una pie7a de un circuito eléctrico que trans#ere energ:aeléctrica entre dos otras partes sin que les permita hacer unaconexión directa0 5ientras los optoacopladores ofrecen un elemento deaislamiento similar a un componente de relé! a menudo son la mejor elección para los dise"adores de circuitos! ya que son ms peque"os y encajan fcilmente en los sistemas de microcircuito utili7ados enelectrónica0
Otras personas est%n leendo• 5ómo probar un circuito optoacoplador Triac
• V5uál es la *unción de un reulador de volta-eW
0unción de los optoacopladoresUn optoacoplador es esencialmente un transmisor óptico y un receptor ópticoconectado por una barrera no conductora. Utiliza un rayo de luz para transferir energíade un elemento de circuito a otro y puede manejar voltajes de entrada de hasta !"" #.
$a barrera %ue separa los dos lados del optoacoplador est& hecho de un vidriotransparente o polímero de pl&stico %ue no conduce la electricidad' pero conduce luz.(l dispositivo físico real del optoacoplador est& normalmente encerrado en una carcasaoscura' no conductora. (st& fijado al circuito el)ctrico a trav)s de pe%ue*os dientesmet&licos y tiene orificios en cada e+tremo del pe%ue*o gabinete para %ue pasen atrav)s las cone+iones de cables.
!aracter.sticas
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 49/160
$a característica m&s importante de un optoacoplador es su eficiencia para transferirelectricidad. $a eficiencia de un optoacoplador se mide a trav)s de su cociente detransferencia de corriente ,-T/' %ue es la relación entre el cambio de corriente en ellado de salida de la barrera y el cambio de corriente en el lado de entrada de la barrera.$a mayoría de los optoacopladores trabajan a un -T entre 0" y !" por ciento.
$portancia$os optoacopladores son a menudo utilizados para separar dos elementos de circuito%ue operan con voltajes e+tremadamente diferentes. (sto evita da*os a la parte %uetrabaja a un voltaje menor. Tambi)n trabajan para evitar %ue los dos elementos seda*en por v oltaje inverso o sobrecargas de energía. 1ebido a esta característica' losoptoacopladores son mejor utilizados al asociarse con interruptores deencendido2apagado y la transferencia de datos digitales. 3eneralmente' se encuentranentre un transmisor y un receptor en un circuito el)ctrico.
!onsideraciones$os optoacopladores se construyen a menudo con diodos emisores de luz ,$(1s/ comoparte del lado del transmisor óptico. Un $(1 produce luz cuando el voltaje se a*ade aeste' haci)ndolo una fuente de luz perfecto para un optoacoplador. $as l&mparasincandescentes a veces tambi)n se utilizan en optoacopladores' sin embargo' no sontan eficientes como los $(1s' ya %ue distorsionan las se*ales de entrada y no duranmucho tiempo.
5ene6cios de los optoacopladores$os optoacopladores juegan un papel integral en muchos artículos comunes del hogar'tales como tel)fonos' tel)fonos celulares' circuitos de computadoras' módems de4nternet e incluso el circuito el)ctrico de la casa entera. $os optoacopladores se hanconvertido en esenciales para televisores modernos conforme ha crecido la tecnología y
la complejidad de los componentes digitales. 5e utilizan ampliamente para separar laspartes del circuito %ue manejan el receptor de cable' el rendimiento y la configuraciónde la pantalla.
'o dejes de leer
@ alimentos anticancer"enos quedebes empe'ar a incluir en tu dieta
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 50/160
Esta es la ra'ón por la cual <O debesusar isopos para limpiar tus ore-as
@ maneras de sacarle proveco al,icks ,apo>ub
ElectrónicaB teor/a y pr+ctica>L: DEDA6D 6 L6 ELEA‚&A6 E‚A6 • !ƒAA6, A& E"UE36",AAU", 3&6}E", =E63E&6" • „DE" DEDA6D" 6L 3U&D DE L6ELEA‚&A6.
Alases de optoacopladores y comofuncionan Aontrol de salidas 60adir comentarios
mar -8-8)'
Los optoacopladores su formato mas usual es el encapsulado DL, y pueden venir en grupos
de %, - ó ). El uso mas com4n es aislar circuitos y reducir ruidos de linea. >asan su
funcionamiento en el empleo de un *az de radiación infrarro2a para pasar se0ales de un
circuito a otro sin conexión eléctrica. Estos son muy 4tiles cuando se utilizan por e2emplo,
3icropr ocesadores o 3icrocontroladores !As. La venta2a frente a los relés es la ausencia de
rebotes y una velocidad de conmutación mayor. tra venta2a seria en la transmisión de
se0ales analógicas entre circuitos separados eléctricamente, esto con el relé es imposibleporque traba2a a contacto abierto o cerrado.
+,u- tipo de ptoacopladores ay/
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 51/160
El ptotransistor de encapsulado ranurado lo podemos utilizar como interruptos optico, y su
uso puede ser por e2emplo, para detectar un final de carrera, o también para contar el n4mero
de vueltas de un cilindro o disco el cual tiene una terminación opaca que pasa por en medio
del optotransistor en cada vuelta.
Optotransistor de encapsulado ranurado
Este optoacoplador reflexivo o también llamado sensor optico reflexivo es utilizado muc*o en
robotica en los seguidores de lineas. Uno de los mas conocidos es el A&•€8 y las
caracter/sticas de este componente sonB
• Dise0o compacto.
• ango de funcionamiento de 8 mm a -8 mm de distancia.
• 6lta sensibilidad.
• >a2a corriente.
• !rotegido de la luz ambiente.
• Crecuencia de corte de *asta %8 =z.
Las aplicaciones van desde robots seguidores de lineas, fotocopiadoras, interruptor deproximidad, contador de ob2etos, etc.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 52/160
Optoacoplador re"le#ivo $%&'0(
6qu/ podemos ver los s/mbolos electrónicos t/picos en los esquemas de los optoacopladores.
$lases de optoacopladores, s)mbolos electrónicos
Existen varios tipos de optoacopladores cuya diferencia entre s/ depende de los dispositivos
de salida que se inserten en el componente. uedar/a clasificado de la siguiente maneraB
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 53/160
• 0ototransistor B se compone de un optoacoplador con una etapa de salida formada
por un transistor >}. Los mas comunes son el %&-( y %&'(.
• ptotransistor en configuración Darlington.
• 0ototriacB se compone de un optoacoplador con una etapa de salida formada por un
triac.
• 0ototriac de paso por ceroB ptoacoplador en cuya etapa de salida se encuentra un
triac de cruce por cero. El circuito interno de cruce por cero conmuta al triac sólo en los
cruce por cero de la corriente alterna. !or e2emplo el 3A'8%).
• ptotiristor B Dise0ado para aplicaciones donde sea preciso un aislamiento entre una
se0al lógica y la red.
!ublicado por vicente a las ))B-@ pm
wecibe los articulos nuevos de ElectrónicaB teor/a ypr+ctica …e los mando a tu correo†
…"uscr/bete gratis a nuestra ;eb†
Escribe tu dirección de correo1
2 co"entarios en 34lases de optoacopladores y co"o funcionan5
).
)alo 6arra"pie 4abanillas diceB-%18€1-8)( a las %B)- am
Es un tema muy bueno y estoy muy interesado
esponder
-.
*ai7ellk diceB
3e apunto
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 54/160
8-18?1-8)( a las )B() am
nteresante tema gracias por tus aportaciones al tema ..saludos desde *onduras
esponder
De*a un 4o"entario&ombre 7equerido9
E<mail 7equerido9
E>
u Aomentario
0.
6. Utilización de opto acopladores
7. Ejemplo de cálculo de una carga según el triac seleccionado
8. Conclusión
!. Bibliografía
INT!"UCCI#N
9uchos sistemas digitales controlan a otros sistemas o realizan funciones de control tales %ue
deben ser interconectados a una etapa de manejo de potencia' con base en T445TO(5
,triacs' 5-' etc./ para actuar sobre cargas resistivas o inductivas en sistemas de iluminación' o
en procesos industriales o en control de velocidad de motores' entre otros.
(l manejo de potencia' es decir la manipulación de altas corrientes' de hasta varios centenares
de amperios' implica el tener consideraciones de seguridad el)ctrica para los operarios y de
protección para el sistema digital.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 55/160
(s deseable %ue la intercone+ión entre ambas etapas ,la digital y la de potencia/ se haga por un
medio de acoplamiento %ue permita aislar el)ctricamente los dos sistemas. (sto se puede
lograr con los dispositivos llamados O:TO;-O:$;1O(5' mediante los cuales se obtiene un
acoplamiento óptico y' al mismo tiempo' un aislamiento el)ctrico. :or ello tambi)n se les
conoce como O:TO;45$;1O(5. (l acoplamiento se efect<a en el rango del espectro infra=
rojo a partir de dispositivos emisores de luz' usualmente 4(1 ,infra=rojo/ $(1s
,diodos emisores de luz/' actuando como emisores y utilizando dispositivos detectores de luz
,optodetectores/' actuando como receptores.
$a razón fundamental para llevar a cabo acoplamiento óptico y aislamiento el)ctrico es por
protección de la etapa o sistema digital ya %ue si ocurre un corto en la etapa de potencia' o
cual%uier otro tipo de anomalía el)ctrica' el O:TO;-O:$;1O protege toda la circuitería
digital de control. (l sistema digital puede variar entre un sistema discreto o un sistema de
mayorintegración ,en escalas 554' 954' #$4 o #$54/ o un sistema integrado programable a
nivel de memorias ,(:O9 o ((:O9/ o a nivel de dispositivos programables >inteligentes>
,microprocesadores' microcontroladores' dispositivos lógicos programables' arreglos lógicos
programables' controladores lógicos programables o computadores/.
UTI$I%&CI#N "E !'T! &C!'$&"!E(
#eamos a continuación algunos dispositivos O:TO;45$;1O(5' e+traídos del manual de
reemplazos (-3 ,para dispositivos semiconductores/' en donde se pueden apreciar varias tipos
de elementos de O:TO;-O:$;94(?TO@ por fototransistor' fotodarlington' foto5-'
fotoT4;-' fotoF(T' etc. Todos ellos se estudian en la teoría de la optoelectrónica con
dispositivos semiconductores basados en 5ilicio ,5i/ o 3ermanio ,3e/.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 56/160
Trabajaremos' a manera de ejemplo' con el O:TO;-O:$;1O 9O- 7"00 ,o 9O- 7"0"/ %ue
corresponde al caso (-3 7"8 ,o 7"8A/ de los diagramas anteriores. $a siguiente es
la distribución de pines del circuito integrado ,4-/ optoaclopador seleccionado. ?- significa
%ue este pin o patilla no se conecta.
Configuración de pines
(l siguiente es el diagrama de blo%ues general para la cone+ión de un sistema digital a una
etapa de potencia mediante el uso de un optoaclopador.
"iagrama de blo)ues para intercone*ión de un sistema digital + un sistema depotencia
-ontinuando con el ejemplo' como sistema de potencia vamos a trabajar con un sistema de
iluminación ,carga resistiva/ cuya potencia es manejada por un T4;-. (n lo %ue sigue' se
e+pondr&n las configuraciones est&ndar empleadas para hacer acoplamiento óptico entre
sistemas digitales y etapas de potencia. (l montaje re%uerido se selecciona de acuerdo con lasnecesidades del sistema.
,!NT&-E E(T.N"& B.(IC! /C!N $!0IC& "I0IT&$ '!(ITI1&2
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 57/160
,!NT&-E (I $& $#0IC& "I0IT&$ E( NE0&TI1&3
,!NT&-E '&& &(E0U& "I('&! 4 'E,ITI ,!NIT!E! &"ICI!N&$"E $& (&$I"&
(n ocasiones hay dificultades por problemas de corriente para disparar el T4;-' en cuyo caso
una solución alterna sería con un transformador de 49:U$5O5 o de :U$5O5' con el cual no
hay acoplamiento óptico pero se logra un acoplamiento inductivo. $a relación de espiras del
transformador es 0@0.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 58/160
Un transformador de impulsos típico es el -; 6; serie "0!. 5e utiliza en aplicaciones
industriales y en electromedicina.
;hora bien' si la carga no es resistiva' es necesario adicionar una red - o $ para garantizar el
disparo del T4;-. (sta red tiene cierta complejidad' pero permite asegurar precisión en los
disparos y' adem&s' protege contra disparos aleatorios e indeseados producidos por ruidos
electromagn)ticos.
:ara obviar los problemas de corriente tambi)n puede utilizarse un amplificador con transistor'
pero en este caso ya no se tiene aislamiento el)ctrico.
:ara finalizar este artículo' se da un ejemplo de c&lculo para una etapa de potencia basada en
un Triac.
E-E,'$! "E C.$CU$! "E UN& C&0& (E05N E$ TI&C (E$ECCI!N&"!
(n este ejemplo partimos de dos hechos@ la potencia se controlar& con un T4;-' y la carga a
manejar ser& resistiva como en el caso de las l&mparas para un sistema de luces secuenciales en
arreglos de navidad ,l&mparas e+teriores/ o en una discoteca o en un teatro. (l Triac se
selecciona de acuerdo a la corriente de operación y esta depender& del n<mero de l&mparas autilizar. $os pasos para el c&lculo son como sigue@
0. 1efinición de par&metros@
0. 5ean ?C ?<mero de l&mparas a utilizar por cada T4;-.
DC (l #atiaje o potencia de cada una de las l&mparas ,8" D' " D' 0"" D'etc./
#C #oltaje de la red ,00" # ó 66" #/. (ste voltaje es 95
4C $a corriente consumida por cada l&mpara
4E C $a corriente especificada del T4;- ,seg<n el manual del fabricante/
6. -&lculo de la corriente %ue consume cada l&mpara@ 4C D2#.
7. -&lculo de ?@ ?C 4E24.
?OT; 0@ :or seguridad' es conveniente disminuir ? en un 7" apro+imadamente. ecuerde
%ue nunca se debe trabajar cerca del límite del regímen m&+imo especificado por el fabricante.
?OT; 6@ -ada T4;- debe llevar su buen disipador de calor. ?o olvide %ue cuando se manejan
altas corrientes' hay tendencia a fuerte disipación de potencia en forma de calor y este es el
principal enemigo de los semiconductores.
-ontinuando con el ejemplo' supongamos %ue se tiene@
#C 00" # ,de la línea de alimentación de voltaje/ DC 8" Datts ,potencia nominal de cada una de las l&mparas/
4EC ; ,corriente del Triac' seg<n las especificaciones del manual/
;plicando el paso 6' se tiene@ 4 C 8"200" C ".77 ; C 77 m;
$uego' aplicando el paso 7' se tiene ? C 2".77 G ?C0.! $&mparas
(n forma pr&ctica y teniendo en cuenta la ?ota 0' Tomar ?C 0" $&mparas.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 59/160
Otro ejemplo puede ser a la inversa' es decir partir del n<mero de l&mparas y hallar la corriente
4E' del T4;-' necesaria para operar el sistema. Una vez hallada se tiene en cuenta el criterio del
7" m&s para seleccionar el Triac comercial %ue cumpla con el re%uerimiento.
C!NC$U(I#N
5iempre %ue se vaya a interconectar un sistema digital cual%uiera a un sistema de potencia' es
necesario hacer optoacoplamiento' para garantizar aislamiento el)ctrico. 1e no hacerlo se
corren enormes riesgos %ue se traducir&n en problemas de seguridad el)ctrica' da*os costosos
en los sistemas de control digitales y perjuicios al proceso de producción sobre el cual se est&
operando.
(l optoaclopador es un dispositivo relativamente simple' muy f&cil de usar' con una amplia
variedad de tipos de acoplamiento y de muy bajo costo. :or ello sería imperdonable no hacer
uso de )l cuando se va a controlar potencia.
(n cuanto al c&lculo de la carga o del dispositivo de manejo de corriente en la etapa de potencia
siempre ser& absolutamente recomendable hacer uso del criterio de seguridad del 7" respecto
de los regímenes m&+imos se*alados por el fabricante. (s la <nica manera de evitar dolores de
cabeza' algunas veces irreversible' en el manejo de dispositivos de potencia.
BIB$I!0&67&
• Boylestad obert y ?ashelsHy $ouis. Electrónica3 Teoría de Circuitos3 (ditorial
:rentice Iall Iispanoamericana' 9)+ico' 0JJA.
• 9aloney K. Timothy. Electrónica Industrial3 "ispositi8os + (istemas. (ditorial
:rentice Iall Iispanoamericana' ,9*ico: ;<<<
• ,anual de reemplazos EC0. 5ilvania' U5;' 6"""
• Dilliams' ;rthur. ,icroprocesadores: dispositi8osoptoelectrónicos: perif9ricos + de interfaz3 (erie de circuitos integrados. 9c
3raL Iill' 9)+ico' 0JAJ.
:or
Ing3 Nelson úa Ceballos
1ecano de las tecnologías en (lectrónica y en 9antenimiento de (%uipo Biom)dico.
Aomentarios
•
3Xbado : de Octubre de CC a las @K=@ Q ) A89:;;E)E: <A8A;E
Le falta precisión.3ostrando =>= de un total de = comentarios.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 60/160
!+ginasB = ?ara de*ar un co"entario@ regístrese gratis o si ya est( registrado@ inicie sesión.
Trabaos relacionados
Actividades en la planeación de sistemas
de información.
!alla"#os de los $ec$os% !erramientas para documentar
procesos & decisiones% 'rboles de decisi(n% Tablas de
decisi(n% Es%%%
Computadores Cuánticos
) lo lar#o del *ltimo medio si#lo+ las computadoras $an
ido duplicando su ,elocidad cada dos aos+ al tiempo
.ue el tama%%%
Comunicación de datos
)plicaciones de las comunicaciones de datos en los
ne#ocios% Intercambio electr(nico de datos /EDI0%
!ard1are para el so%%%
2er mas trabaos de 3eneral
&ota al lectorB es posible que esta p+gina no contenga todos los componentes del traba2o origi
Leer m+sB *ttpB11;;;.monografias.com1traba2os'(1acoplamiento<optico1acoplamiento<optico.s*tml‡ixzz'oU-q;l=b
;a transmisión de se"ales digitales en la corriente alterna! o ,C! esimposible sin la asistencia de un detector de cruce por cero 99circuitoseléctricos que detectan cuando la corriente alcan7a el punto de cruce por
cero de la onda0Otras personas est%n leendo
• 5ómo crear tu propio láser para cortar
• PC *otora*"as que sacarán al obsesivo que tienes dentro
Los *ec*os(n una gr&fica de ondas' el cruce por cero es la línea recta %ue bisecta la onda. (n
electrónica' el cruce por cero identifica donde la función de onda cambia de positivo anegativo o viceversa. (n un interruptor atenuante de luz' por ejemplo' un detector decruce por cero permite ajustes del nivel de poder en la corriente el)ctrica' ya %ue esospuntos no tienen voltaje. $a interrupción de la corriente en cual%uier otro puntodel circuito el/ctrico crea un pico de poder potencialmente da*ino.
0unción$os detectores de cruce por cero son vitales en la transmisión de se*ales digitales atrav)s de los circuitos de corriente alterna' tal como los módems u otros aparatos
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 61/160
digitales. $a ausencia de este componente e+plica por %u) el audio digitalmentecontrolado produce ruido cuando el usuario sube muy r&pido el volumen. -uando laganancia sólo se aumenta en los puntos de cruce por cero' no hay entrada ni ruido dese*al.
!o$paradores$os detectores de cruce por cero trabajan usualmente en conjunto con loscomparadores' %ue son dispositivos el)ctricos %ue comparan la fuerza de la se*al,voltaje o corriente/ y cambian la salida basada en la se*al m&s fuerte. 9ientras %ue losamplificadores comparadores operacionales an&logos son ampliamente usados' loschips dedicados comparadores de voltaje funcionan mejor para los dispositivosdigitales.
'o dejes de leer
-.'.). DEEAE" DE AUAE ! AE
3uc*os circuitos electrónicos operan con doble polaridad, el detector de cruce por cero ˆsensaˆ cua
6lgo un poco m+s dif/cil es detectar el ˆcruce por ceroˆ de una se0al electrónica de una sola polaridˆnivel de ceroˆ, y luego el circuito operar+ con tal nivel para ˆsensarˆ cuando la se0al esta por encima
6lgo aun m+s dif/cil es cuando la se0al no posee ˆnivel de continuaˆ porque se lo *a filtrado. En tal determinar el punto de cruce para determinar cuando la se0al esta por deba2o del nivel promedio y
!ero todas las explicaciones anteriores que ˆclaramenteˆ explican los tipos de detectores por cruce
Los detectores de cruce por cero se utilizan para detectar los tipos de se0ales, o diferentes significapositivaˆ indicar+ un ˆuno lógicoˆ y en su parte negativa un ˆcero lógicoˆ. El detector de cruce por cerun ˆunoˆ o un ˆceroˆ.Aon se0ales analógicas los detectores de cruce por cero operan con formas de ondas muc*o mas la for ma de onda, el nivel promedio de la se0al, ayudar a integrar o diferenciar se0ales, etc.oda aquella ˆfunción matem+ticaˆ a aplicar a la se0al que requiera determinar el ˆnivel de ceroˆ de t
EEB?) DE C:1
El uso m+s com4n de un detector de cruce de cero es para gobernar la aplicación de corriente alte7dimmer9B la corriente alterna es una onda senoidal que va circulando en un sentido y en otro a razódecir su intensidad es cero. En circuitos de corriente alterna para dismunuir la potencia de la carga
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 62/160
durante la pausa, la carga permanece apagada, al disparar el 6A la carga se enciende y permaal 6A. El per/odo de la corrienet alterna a @8 ciclos1segundo es de )@.@€ milisegundos, cada ?.'pausas de %.)( milisegundos entonces la carga se ve disminuida a la mitad.
=ay un circuito muy simple para detectar cruce de cero que es el opto<aislante L))) al cual se le
"omentarios
&o tienes permiso para a0adir comentarios.
' !A#EGO"A
LO S7E E3 7< 4ETE5TO> 4E
5>75E +O> 5E>OW%B>DL ; C@ %4ND<
La transmisión de se!ales diitales a trav/s de la corriente alterna o %5resulta imposible sin detectores de cruce por cero H circuitos el/ctricosque detectan cuando la corriente alcan'a el punto de cruce por cero dela onda$
En un rá#co de *orma de onda el cruce por cero es la l"nea recta que
divide en dos la onda$ En electrónica un paso por cero identi#ca dondela ola de *unción pasa de positivo a neativo o viceversa$ En unreulador de intensidad de lu' por e-emplo un detector de cruce porcero permite a los a-ustes de nivel de potencia de corriente en tensióncomo los puntos no tienen tensión$ La interrupción de la corriente en elresto del ciclo de onda crea un pico de ener"a potencialmente da!ina$
4etectores de cruce por cero son vitales para la transmisión de se!alesdiitales a trav/s de circuitos de corriente alterna como en los módems& otros dispositivos diitales$ La ausencia de un circuito detector de
cruce por cero e6plica por qu/ dispositivos de audio controladosdiitalmente producen ruido cuando un usuario sube el volumendemasiado rápido$ 5uando la anancia sólo aumenta a cero puntos decruce no a& entrada & no ab"a ruido de la se!al$
5ruce por cero detectores suelen traba-ar en con-unto con loscomparadores H dispositivos el/ctricos que comparan intensidad de la
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 63/160
se!al (volta-e o corriente) & la salida de conmutación basándose en lase!al más *uerte$ Nientras que los comparadores analóicosampli#cadores operacionales son ampliamente utili'ados #cascomparador de tensión dedicados *uncionan me-or para los dispositivosdiitales$
L'EA +3'#O
Dr a la entrada
E'#"ADA A'#E"O"
Dnenier"a Electrónica
acasi el K mar$ CP
1etector de cruce por cero
Muisiera %ue me e+plicaras con un ejemplo claro las utilidades de un optoacoplador
%ue tenga detector de cruce por cero por ejemplo para el manejo de control de
potencia' %ue ventajas tiene el poder contar con dicho detector.
3EY7D> >E3+O<4E> NZ3 D<FO5ON+%>TD>
2 RESPUESTAS
"E+3E#A DE GO'
1
,oni:
5u uso m&s com<n es el de poder conmutar cargas grandes con dispositivos no tan
potentes.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 64/160
9e e+plico@
(l momento crítico para controlar una m&%uina ,motor'.../ es en la encendida. (n ese
momento' se consume unas veces m&s corriente de la %ue se consume normalmente.
5i conectas la m&%uina en cual%uier momento' tienes %ue poner un dispositivo decontrol %ue aguante cone+iones de esa gran corriente.
:ero si puedes detectar el paso por cero y conectar la m&%uina en ese instante' cuando
se consuma toda esa corriente' el dispositivo de control ya estar& conduciendo.
:odr& tener lo %ue se llama >un poder de marcha2corte> inferior.
:iensa en el interruptor de una habitación. 5i lo accionas puede ser %ue salga alguna
chispa. :ues si lo pudieras accionar justo en el momento en %ue el voltaje es cero' la
intensidad del circuito en a%uel momento tambi)n sería cero. -uando la corriente
comenzara a augmentar' el interruptor ya estaría accionado y no habría chispa.
el K mar$ CP
,OT%> 1
5ONE<T%>
5ON+%>TD>
"E+3E#A DE LEOO0#
1
leosoft +roramacion %van'ada en ,isualBasic traba-o ace mas de @a!os$$$
Un optoacoplador con detector de cruce por cero es un opto normal con el agregado de
ese detector' lo %ue hace es conectar la carga a su salida unicamente cuando la tensión
en altena alcanza los " volts' la ventaja es %ue no conectarías la carga con una tensio
elevada en ese momento ya %ue vos no controlas la tensión de alterna' eso hace %ue los
e%uipos de potencia o l&mparas no sufran descargas abruptas por la cone+ión de la
tensio en cual%uier punto de la se*al.
5i haces esto con laparitas comunes de 66" veras %ue te duran muchísimo m&s' si
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 65/160
recoras las l&mparas siempre se %ueman a la hora de encenderlas' nunca cunado est&n
encendidas' eso es por%ue las llaves comunes de tecla en una casa no controlan en %ue
intentar de la se*al esta a la hora de conectar.
el : mar$ CP,OT%> 1
5ONE<T%>
5ON+%>TD>
AÑADE TU RESPUESTA
Ga' clic para >E3+O<4E> o +E4D> NZ3 D<FO>N%5D[<
Más respuestas relacionadas
;ctivar un optoacoplador
ecibe mi cordial saludo. (stoy tratando de hacer un interruptor para apagar y encender una
fuente de 8" ;mperios' pero no he podido encontrar cómo se >activa> el optoacoplador. N:uedo
usar una pila y de %u) voltaje -ompr) un pulsador pues esa es la...
3 respuestas
1e optoacoplador a rel)
1eseo activar pe%ue*os rel)s a 68# ;-' con un consumo de bobina de !"m;' %uisiera hacerlo
con optoacopladores por ejemplo el 9O-7"6"' todos los es%uemas %ue encuentro a*aden un
triac a su salida para este activar la carga' se puede poner el rel) a la...
1 respuesta
1udas con leds en mecanismos
Ie instalado en mi casa me+anismos ;+olute de Bticino' %ue llevan un led de se*alización azul.
$a mayoría me funcionan bien' pero me encuentro los siguientes problemas@ 0.= (n la mayoría
de los enchufes se apaga el led al conectar alg<n aparato' pero...
2 respuestas
N-ómo hacer una fuente regulada
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 66/160
?ecesito rectiicar un voltaje de entrada de !"" a !!" #;- monof&sico' y alimentar una carga
de 7;mperes a 68#1- ademas debe estar protegida por varistores. Tengo un circuito %ue
estoy dise*ando para esto. Tomo el voltaje de entrada' lo paso por un...
1 respuesta
egular el primario de un transformador
(n primer lugar' he acudido a casas de electrónica buscando este >regulador> y en cuanto les
e+plico %ue hay un transformador de por medio todos rehuyen el tema. 9e e+plico' la
aplicación en sí' consta de un transformador de 67"#=777# y 76"#;. (n el...
1 respuesta
3enedor trif&sico
5olo %uería saber cuales son los m)todos para poner un generador en paralelo y %ueinstrumentos de medida se utilazan
1 respuesta
4nstalación de detector de movimiento en un garaje con minutero
Muiero instalar un detector de movimiento en un garaje donde la instalación se encuentra con
un contactor con un minutero de escalera y est& conectado a 7 hilos' con varios pulsadores. $a
cone+ión al detector de movimiento la he realizando...
1 respuesta
Tensión sin luz
Ie instalado una l&mpara de bajo consumo en un dormitorio y veo %ue al apagarla' )sta intenta
encenderse ,como un fluorescente averiado/. Ie medido en los cables del techo 06! voltios con
la luz apagada ,la tensión de mi casa es 66" voltios/. Iay dos...
3 respuestas
4nterruptor con dos entradas y dos salidas
?o se si esto ya lo han preguntado antes' pero no lo he encontrado' por esto te realiazo la
pregunta. Tengo dos bombillas con dos interruptores y 1O5 F;5(5 ,lo pongo así para %ue
%uede claro %ue no puede ser una conmutada' %ue solo tiene una fase/....
1 respuesta
-ircuitos el)ctricos
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 67/160
NMu) significa circuito bajo carga' Mue diferencia hay entre seccionador e interruptor.
1 respuesta
Dnicio » Detectorde cruce por cero optoaislado
Detector de cruce por cero optoaislado
Este es el dise!o de un detector de cruce por cero optoaislado$ 3u misión es
conectarse a un microcontrolador para controlar el cruce por cero de la se!al de
corriente alterna de la red el/ctrica & poder acer disparos de triacs & control de
*ase de *orma sincroni'ada$ 3olamente da un impulso con el semiciclo positivo de
la se!al de la red$
El requisito de dise!o es que el consumo sea m"nimo mientras se mantiene elaislamiento con el microcontrolador$
La #ura muestra el esquema del circuito$
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 68/160
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 69/160
>@ & > *orman una *uente de alimentación resistiva para alimentar el circuito$ 3u
misión es carar el condensador 5@ para que cuando se produ'ca el cruce por cero
S@ lo descarue a trav/s del optoacoplador dando un impulso neativo en la
salida$ La resistencia (>@\>) se calcula para que el condensador se carue en
@Cms a menos de @,$ Las resistencias se dividen en dos para que cada una
soporte una tensión menor &a que están conectadas directamente a la tensión de
alimentación (P;C,p)$ El diodo 'ener 4; aranti'a que la tensión nunca suba por
encima de los @,$ La potencia de las resistencias es de @U para disipar la
ener"a consumida$ El consumo de este circuito es de m% como má6imo$
S@ conduce cuando la tensión de la red supera la tensión de 4\,be de S@$ Esto
sini#ca que el transistor comien'a a consumir cuando la tensión supera @,
apro6imadamente & se mantiene en conducción asta que S se pone a conducir o
asta que el condensador 5@ se descarue (CCu3 apro6imadamente)$ S@ está
con#urado como *uente de corriente por 4 & 4 -unto con >K para proporcionar
Cm% como má6imo que es lo que soporta el ;<$ La corriente está limitada en
el diodo emisor de lu' por >K$ >: aranti'a inmunidad *rente al ruido ba-ando la
impedancia de entrada del transistor & poniendo a masa su base durante el
semiciclo neativo$ 5on los valores especi#cados S@ comien'a a conducir cuando
la tensión de la red alcan'a los , apro6imadamente$
5uando la tensión de la red lleue a @, apro6imadamente 4P se pone a conducir
& pone en saturación a S cortocircuitando la base de S@ & poni/ndolo en corte$
Esto permite que el condensador 5@ se vuelva a carar lentamente asta que
alcance su valor má6imo al #nal de la mitad del periodo de la onda que traba-a a
CG'$
4urante el semiciclo neativo no se absorbe corriente de la red debido a los diodos
4@ & 4$
:eguinos en redes sociales
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 70/160
ransistores bipolares 7Aonceptos >asicos9
wue es un transistor bipolar
Un transistor es un dispositivo electrónico que tiene la caracter/stica de permitir el
paso de la corriente en un 4nico sentido y de una forma controlada. 6 modo grafico para ilustrar el comportamiento lo podemos asociar a un interruptor
con una entrada y salida de corriente y un botón que permite o no la circulación.
El comportamiento es el mismo, el interruptor es un pulso eléctrico que se env/a a
uno de sus terminales y permite la circulación de una corriente m+s grande por los
otros dos terminales.
!osee tres terminales con los siguientes nombre 4olectorFaseE"isorG.
Fase FG1 "iguiendo la l/nea del e2emplo podemos decir que es el pin donde se
inyecta la se0al que lo Šenciende o apaga‹, a esta corriente se la denominacorriente de base.
4olector 4G1 3ediante este pin es donde se alimenta el transistor, se lo conecta a
una fuente para suministrarle la energ/a externa.
E"isor EG1 Es el pin por donde se obtiene el resultado de inyectar la corriente de
base y alimentarlo por el colector
Distintos tipos de transistores bipolares
Existen dos tipos de transistores bipolares 7%?% y ?%?9, la diferencia radicar en
los materiales de construcción y en el sentido de la corriente de polarización
7corriente que circula entre la >ase y el Emisor9
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 71/160
Cuncionalmente no existen diferencias entre estos dos transistores, solo la
polaridad de sus electrodos.
0actor de a"plificación del transistor Feta o H0EG
"e conoce como >eta o =CE y es la ganancia de corriente que se obtiene en el
Aolector al aplicar una corriente determinada en la base.
Es decir que si tengo un >eta Œ )88 significa que en el terminar de colector voy a
tener una corriente )88 veces mayor a la corriente de base, >eta Œ A 1 >
w!ara que sirve un transistor
Aomo nterruptorB
Aomo mencionamos antes, podemos utilizar el transistor como una llave
electrónica, para permitir o no el flu2o de corriente de un terminal a otro.
Es muy 4til para casos donde estoy traba2ando con niveles de corriente
peque0os y necesito alimentar dispositivos que consumen grandes cantidades
de corriente."upongamos que mediante un pin de salida de un micro controlador 76rduino
por e2emplo9, quiero encender una lamparita de (, si lo conecto en forma
directa la lamparita no se encender/a por que la corriente que suministra el
micro controlador es muy ba2a, %8m6 para ser exacto.
Una lamparita de esa potencia conectado a una bater/a de )- consume una
corriente de %88m6, claramente inalcanzable si conecto la l+mpara directa al
micro controlador.
!or lo tanto la solución seria conectar la salida del micro controlador a la >asedel transistor el colector del transistor a la fuente de )- en serie con la l+mpara,
de esta manera al inyectar un pulso a la base Šenciendo‹ el transistor y permito
la circulación de corriente por el colector, y la l+mpara se enciende.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 72/160
Aomo se ve en la imagen, la corriente de %8m6 que circula por la base, es la
que saldr/a del controlador.
Aomo amplificadorB
Aomo di2imos antes, el transistor tiene la caracter/stica de permitirnos controlar
el nivel de corriente a la salida mediante una peque0a corriente de entrada.
Aorriente de salida 7A9 Œ =CEAorriente de entrada 7>9
eamos el siguiente e2emploB
"upongamos que tenemos un ransistor de =CE Œ )8 7los comerciales son de
valor superior a )(89 al que le ingresa a la base una corriente alterna de forma
senoidal de %m6 7>9 de pico 7variando entre <%m6 y %m69, dado que =CE Œ )8
nos indica que la corriente de salida de colector 7A9 variara entre <%8m6 y %8m6
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 73/160
La corriente que circula por el colector 7la de color azul9, es entregada por la pilade Ž pero controlada por la corriente de entrada 7la ro2a9, respetando la misma
forma pero modificando su amplitud. "i la se0al ro2a fuese una se0al de audio, la
se0al azul es la misma se0al de audio pero m+s audible 7amplificador9
egiones de funcionamiento
egión de corte
Decimos que un transistor se encuentra en Aorte cuando la Aorriente de
Aolector 7A9 es aproximadamente cero, por lo que *ace que toda la tensión
caiga en el transistor y que las resistencias de colector y emisor casi no disipen
potencia, esto se da cuando la corriente de base 7>9 es muy cercana a 8 y *ace
que la corriente de colector 7A9 también lo sea, con lo cual se comporta como
un circuito abierto.
egión de "aturación
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 74/160
Decimos que un transistor se encuentra "aturado cuando la Aorriente de
Aolector 7A9 es la Aorriente de Aolector 3+xima o esta muy cercano a ella.
"e presenta cuando la Diferencia de !otencial entre Aolector y Emisor 7ver ley
de *m9 cae por deba2o de la tensión umbral AEsat.
En esta región la relación AŒ>eta> de2a de cumplirse.
!odemos decir que el transistor en esta zona se comporta como un cable, por
que la diferencia de potencial entre sus terminales es cero.
egión 6ctiva
Es la zona entre la región de "aturación y Aorte, es donde la relación > Œ=CEA se cumple.
En esta región la corriente depende de la corriente de base y de la ganancia del
transistor 7beta o =CE9, este ultimo dato lo entrega el fabricante. "i queremos
utilizar el transistor como 6mplificador de se0al debemos utilizarlo en este
región.
"e dice que en esta zona el comportamiento del transistor es Špredecible‹ ya
que el comportamiento del mismo se puede aseme2ar a un sistema lineal, en la
realidad existe un peque0o error en realizar esta aproximación ya que la curvaque lo caracteriza no es una recta si no que tiene una leve curvatura, a efectos
pr+cticos es muy 4til pensar que el transistor se comporta en forma lineal en
esta zona dado que el error que comentemos en pensarlo de esa manera es
muy peque0o, casi imperceptible.
Aonfiguraciones b+sicas de un transistor Existen tres tipos de configuración para un transistor, cada una de ellas tiene
venta2as y desventa2as seg4n la aplicación que necesitamos realizar.
Aolector Aom4n 7seguidor de emisor9
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 75/160
Decimos que el transistor esta configurado en Aolector Aom4n cuando la se0al
de entrada se aplica a la base y la se0al de salida se obtiene del emisor, esta
configuración tiene una alta impedancia de entrada y una ba2a impedancia de
salida, por lo tanto es 4til para realizar acoplamientos con otras etapas del
circuito.
La ganancia de tensión, olta2e de salida1olta2e de entrada 71"9 nunca ser+
mayor a uno, en la practica la tensión de salida es aproximadamente el (8 de
la tensión de entrada. Alaramente esta configuración no ser+ una buena
elección si queremos usarlo como amplificador.
Emisor Aom4n
Decimos que el transistor esta configurado en Emisor Aom4n cuando la se0al
de entrada se aplica a la base y la se0al de salida se obtiene del Aolector, la
se0al a la salida es igual a la de entrada pero invertida y amplificada en un factor
aproximado ~A1E, si tenemos una E peque0a en comparación con A
tendremos una gran ganancia, con lo cual es una configuración muy utilizada
para amplificar se0ales.
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 76/160
>ase Aom4n
En esta configuración, la se0al de entrada ingresa por el Emisor y la se0al de
salida "ale por el Aolector, tiene como caracter/stica principal de tener una muy
buena amplificación de tensión.
!osee una impedancia de entrada muy ba2a, como se puede ver la base esta
conectada a tierra por eso es el terminal com4n.
)81)8 ~ '8 ;;;.Electrontools.com!ublicado por Aristian eloso en )-B%€
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 77/160
%o *ay comentarios:
Publicar un comentario en la entrada
Entrada m+s reciente Entrada antigua!+gina principal
• 45#ina de inicio
• Todas las cate#or6as
• )rte & $umanidades
• )utos & transporte
• 7elle"a & moda
• iencias sociales
• Ciencias y matemáticas
• omer & beber
• omputadoras e internet
• Deportes
• Educaci(n & formaci(n
• Electr(nica de consumo
• Embara"o & maternidad
• 9amilia+ )mor & relaciones
• !o#ar & ardiner6a
• :ue#os & recreaci(n
• ;ascotas
• ;edio ambiente
• ;*sica & entretenimiento
• <e#ocios locales
• <e#ocios & finan"as
• <oticias & e,entos• 4ol6tica & #obierno
• =estaurantes
• Salud & belle"a
• Sociedad & cultura
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 78/160
• 2iaes
• >a$oo & sus 4roductos
• Internacional
• )cerca de
Ciencias y matemáticas Ingeniería
Siguiente
¿Que SignificanLas Siglas "HFE" De Un Multimetro?
¡¡¡ PORFAVOOOR ¡¡¡
Seguir
2 respuestas
Notificar abuso
Respuestas
Mejor respuesta: Es para medir la ganancia emisor comun en un transistor de union bipolar.. en
la teoría viene siendo la letra BETA del alfabeto griego. Saludos.
Pako V. Rochin · hace 6 años
1
Pulgar hacia arriba
0
Pulgar hacia abajo
Comentario
Notificar abuso
•
Sirve para medir la ganancia de corriente estatica de un transistor bipolar o BJT (Bipolar JunctionTransistor)
El nombre bien escrito es hFE y es la ganancia estatica de corriente en emisor comun (estatica se
aplica al circuito al circuito en corriente continua)
La h proviene de hibrido ya que el transistor se caracteriza por parametros denominados h entre los
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 79/160
que podemos encontrar el hie (relacionado con la resistencia de entrada), hoe (relacionado con la
resistencia de salida), hfe (Ganancia dinamica de corriente en emisor comun), hFE (Ganancia
estatica de corriente en emisor comun)
La F de forward en polarizacion directa
La E de Emisor comun
DIODO · hace 6 años
2
Pulgar hacia arriba
0
Pulgar hacia abajo
Comentario
Notificar abuso
¿Que Significan Las Siglas "HFE" De Un Multimetro?
Agregar tu respuesta
'eccón ) *
Comentarios en CJJEl arc1i-o iostream.1ManipuladoresEl arc1i-o iomanip.1:unciones de salida:unciones de entrada
'eccón + *
Declaracin # de*inicin de *unciones3aria,les glo,ales # localesPar6metros por de*ecto/mero -aria,le de argumentoso,recarga de *uncionesRecursi-idad
'eccón , *
Encapsulado
ClasesMiem,ros pu-lc # pr.ateConstructores # destructoresM(todos constImplementacin en l+neaEmpa!uetado
'eccón / *
Operaciones de escrituraOperaciones de lecturaOperaciones con arc1i-os ,inariosLectura # escritura en un arc1i-oalida a impresora
'eccón 0 * 'eccón 1 *
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 80/160
Un arra# de o,0etos
Una cadena incrustada
O,0eto con puntero interno
O,0eto u,icado din6micamente
O,0eto con puntero a otro o,0eto
Lista enla"ada de o,0etos
O,0etos anidados
o,recarga de operadores
o,recarga de *unciones
Lección 1
De acuerdo a su definici(n+ ?? es una e@tensi(n del len#uae + unsupercununto+ esto implica para .uién decide iniciar sus estudios en ?? .ue
para empe"ar dispone de un len#uae completo como soporte a los nue,osconceptos introducidos por ??+ esto si#nifica .ue todo lo .ue podemos
pro#ramar en )<SI- funciona en ?? & esto a su ,e" es una buena ra"(n paraafirmar la importancia .ue tiene en el aprendi"ae de ?? el conocimiento pre,io
del len#uae + por lo tanto se supone .ue el lector est5 familiari"ado con todo loe@puesto en el curso en l6nea de la secci(n pro#ramando en %
Comentarios en C
Es natural tratar en primer lu#ar la manera de $acer comentarios en el c(di#ofuente de un pro#rama escrito en ??+ & para probar la afirmaci(n $ec$a en el
p5rrafo anterior+ el si#uiente c(di#o escrito en debe com pilar perfectamente% Le
llamaremos al c(di#o comenta1.cpp+ $abr5 notado .ue la e@tensi(n !.cpp serefiere a C -plus-plus% An compilador de ?? sabe .ue el c(di#o est5 escrito en?? precisamente por la e@tensi(n del arc$i,o .ue contiene el c(di#o fuente%
/******************************************//* comenta1.cpp *//******************************************/
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 81/160
#include <stdio.h>
int main(){ float corriente, voltaje, resistencia; /* tres variales */
printf(!"ste prorama calcula volaje de acuerdo a la le$ de %hm&n!); printf(!'alor de la corriente, en amperes&n!); scanf(!f!, corriente); printf(!'alor de la resistencia, en ohms&n!); scanf(!f!, resistencia);
voltaje+corriente*resistencia; /* calculo de voltaje */
printf(!"l valor del voltaje es de f voltios&n!, voltaje);
return ;-
)un.ue se trata de un pro#rama escrito en + por la sencilla ra"(n de .ue elarc$i,o de c(di#o fuente lle,a la e@tensi(n B%cpp+ el compilador lo trata como unc(di#o ?? ,5lido+ esto demuestra la total compatibilidad de .ue disponemos al
pro#ramar en ?? con respecto al len#uae % Empero ?? introduce unamanera m5s pr5ctica de $acer comentarios al utili"ar doblemente el s6mbolo de
barra inclinada para indicarle al compilador .ue el resto de la l6nea de c(di#o .uesi#ue a la doble barra inclinada es un comentario & por lo tanto debe i#norarse enel proceso de compilaci(n% )l contrario del mecanismo para $acer comentariosen .ue puede abarcar ,arias l6neas de c(di#o+ el estilo utili"ado en ?? s(lo es,5lido $asta el final del ren#l(n en donde es utili"ada la doble barra inclinada%
)$ora nuestro pro#rama lo modificamos para utili"ar comentarios en ??C
//******************************************// comenta.cpp//******************************************
#include <stdio.h>
int main(){ float corriente, voltaje, resistencia; // tres variales
printf(!"ste prorama calcula volaje de acuerdo a la le$ de %hm&n!); printf(!'alor de la corriente, en amperes&n!); scanf(!f!, corriente); printf(!'alor de la resistencia, en ohms&n!); scanf(!f!, resistencia);
voltaje+corriente*resistencia; // calculo de voltaje
printf(!"l valor del voltaje es de f voltios&n!, voltaje);
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 82/160
return ;-
Se aprecia de inmediato la comodidad del nue,o estilo de introducircomentarios en el c(di#o fuente de ?? adem5s del doble beneficio .uerepresenta el poder se#uir utili"ando los comentarios en % Se debe tener ciertas
precauciones al manear los comentarios pues aun.ue ?? reconoce ambosmétodos+ el est5ndar )<SI- en s6 no reconoce la mec5nica de ?? para loscomentarios+ dic$o en otras palabras+ no escriba c(di#o en )<SI- pensando entérminos de ??+ lo contrario+ como &a lo probamos+ es perfectamente ,5lido%
2ol,er al principio
La librería iostream."
)un.ue comenta2.cpp es un pro#rama ?? ,5lido sabemos .ue es en realidadun pro#rama escrito en & nosotros estamos interesados en aprender los aspectosnue,os introducidos en ??+ pues bien+ un cambio mu& importante es en lamanera en .ue se manea la entrada & salida de datos en el pro#rama% )l i#ual .ueen + ?? no inclu&e operaciones de entrada & salida como parte del len#uae ens6+ en cambio define la librer6a iostream .ue a#re#a funciones de entrada & salidamu& ele#antes% )l pro#ramar en nos familiari"amos con el arc$i,o stdio.h endonde est5 definida entre otras+ la funci(n printf().ue como sabemos sir,e paraescribir datos en el dispositi,o est5ndar de salida+ .ue en la #ran ma&or6a de loscasos es el monitor de la computadora% omo la funci(n printf() se desarroll( casidesde los ori#enes de + la funci(n $a sufrido una serie de transformaciones .uela $a $ec$o crecer en tamao+ como resultado de esto+ cuando incluimos lafunci(n printf() en nuestro pro#rama tambien incluimos todas las opcionesa#re#adas con el tiempo aun.ue no las utilicemos% An caso similar sucede con lafunci(n scanf()%
?? propone una soluci(n mu& interesante al tratar las operaciones de
entrada-salida /ES0 no como una funci(n+ sino como una clase .ue implementauna #ran capacidad de formatos para entrada & salida de datos+ de ésta manera el pro#ramador ?? toma s(lo las car5cter6sticas .ue el trabao re.uiere% )un.ue no$emos definido .ué es una clase+ ten#a en cuenta .ue en ?? las operaciones deES est5n definidas en una clase+ éste es un punto importante% E@isten cuatrofluos de ES /iostreams0 predefinidosC
• cin+ asociado al dispositi,o de entrada est5ndar%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 83/160
• cout+ asociado al dispositi,o de salida est5ndar%
• cerr+ asociado al dispositi,o de error est5ndar%
• clo#+ salida almacenada temporalmente para el dispositi,o de errorest5ndar%
Tomando en cuenta lo dic$o estamos en condici(n de modificar el pro#ramaanterior para utili"ar los fluos de ES+ de ésta manera &a no necesitamos elarc$i,o de cabecera stdio.h el cual lo $emos sustituido por elarc$i,o iostream.h .ue nos permite utili"ar los fluos de ES
//******************************************// entsal.cpp//******************************************
#include <iostream.h>
int main(){ float corriente, voltaje, resistencia; // tres variales
cout << !"ste prorama calcula volaje de acuerdo a la le$ de %hm&n!; cout << !'alor de la corriente, en amperes&n!; cin >> corriente; cout << !'alor de la resistencia, en ohms&n!; cin >> resistencia;
voltaje+corriente*resistencia; // calculo de voltaje
cout << !"l valor del voltaje es de ! << voltaje << ! voltios&n!;
return ;-
El pro#rama entsal.cpp es idéntico a comenta2.cpp+ sin embar#o es importante$acer notar lo si#uiente+ no se recomienda me"clar la funci(n printf() con el fluode salida cout en el mismo pro#rama &a .ue se #enerar6an dos fluosindependientes $acia el mismo dispositi,o de salida con resultadosimpredecibles% omparando los dos *ltimos pro#ramas es f5cil asimilar el usode cin & cout % Atili"amos el fluo de salida cout en conunci(n con el operador de
inserción+ $$ para mostrar un mensae en la pantalla del monitor% De manerasimilar+ utili"amos el fluo de entrada cin en conunci(n con el operador de
extracción+ %% para asi#nar un ,alor a las ,ariablesllamadas corriente & resistencia% Obser,e .ue no es necesario utili"ar el operadorde direcci(n & con las ,ariables de entrada% La l6nea F demuestra el uso de,arios operadores de inserci(n en una sola l6nea de c(di#o+ obser,e .ue las
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 84/160
cadenas & los datos se desplie#an en el orden en .ue se escriben en la l6nea dec(di#o+ tambien obser,e el espacio en blanco al final de la primera cadena & al
principio de la se#unda cadena de ésta l6nea de c(di#o%
En términos #enerales declaramos el arc$i,o de cabecera iostream.h para
operaciones de fluos de ES+ éste suele incluir otros arc$i,os de cabeceraadicionales .ue declaran funciones+ macros+ clases & ,alores necesarios en lasoperaciones con fluos de entrada /istream.h0+ fluos de salida /ostream.h0+ buffersde fluos / streamb.h0 & manipuladores de fluo /imanip.h0 principalmente%)nali"aremos éstas tres partes por separado%
2ol,er al principio
&tili'ando manipuladores
An manipulador es un ,alor .ue podemos e@traer ( insertar de un fluo de ES para lo#rar un efecto especial en estos% An manipulador parece un obeto .ueinsertamos ( e@traemos de un fluo pero #eneralmente solo cambia el estado delmismo% E@isten tres manipuladores comunes+ dec+ oct & hex los cuales permitendesple#ar un ,alor numérico en base decimal+ octal & $e@adecimalrespecti,amente+ & otros m5s declarados en el arc$i,o iomanip.h entre los .uefi#uran setw()+ setfill()+ setprecision()+ setiosflags() & resetiosflags()%
(anipuladores básicos
En el si#uiente pro#rama+ manipu01.cpp+ se demuestra el uso de losmanipuladores b5sicos oct + hex+ & dec% El pro#rama inicia solicit5ndole introducir un n*mero+ mismo .ue se almacena en la ,ariable de tipo int llamada numero+ enforma predeterminada+ el sistema desplie#a los ,alores numéricos utili"ando la
base G+ esto se demuestra en el primer mensae desple#ado por el pro#rama en lal6nea H% Ense#uida se utili"a el operador de inserci(n /0 para introducir elmanipulador oct .ue cambia la base para desplie#ue numérico a octal por lo .ueel ,alor contenido en la ,ariable llamada numero se desplie#a en pantalla en su
e.ui,alente de base 8% Obser,e .ue el contenido de la ,ariable no $a cambiado+solo se modifica la forma para desple#ar un ,alor numérico en el dispositi,oest5ndar de salida%
//*********************************************************// manipu1.cpp//*********************************************************
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 85/160
#include <iostream.h>
int main(){ int numero;
cout <<!ntrodu0ca un numero! << endl; cin >> numero;
cout <<!"l numero introducido en ase decimal es ! << numero << endl;
cout << oct; // 2hora traajamos en ase octal cout << !3amiando a ase octal el numero introducido se ! !despliea asi ! << numero << endl;
cout << he4; // 5raajamos en ase he4adecimal cout << !"l mismo numero en ase he4adecimal es !; cout << numero << endl;
cout << !ntrodu0ca otro numero! << endl; cin >> numero; cout << !"l numero es ! << numero << endl;
cout << dec; // 6estituimos la ase predeterminada
return ;-
De manera similar se utili"a el operador de inserci(n para introducir a$ora elmodificador hex .ue sir,e para cambiar el desplie#ue numérico a base J ($e@adecimal+ entonces el pro#rama muestra el ,alor almacenado en numero pero
representado en base J% uando utili"amos los manipuladores oct ( hex leindicamos al sistema la base numérica .ue deseamos para representar nuestros,alores numéricos+ una ,e" cambiada la representaci(n numérica+ ésta permanece$asta .ue especifi.uemos una nue,a base ( $asta .ue apa#uemos el sistema+ parademostrar ésta situaci(n+ en la parte final del pro#rama se le solicita introducirotro n*mero+ obser,ar5 .ue el desplie#ue en pantalla parece no coincidir con eln*mero introducido+ éste fen(meno sucede por.ue estamos acostumbrados a
pensar en términos #enerales+ utili"ando la base G+ pero con un an5lisis m5scuidadoso encontramos .ue no e@iste error al#uno+ sencillamente el pro#ramadesplie#a los ,alores numéricos utili"ando el *ltimo modificador especificado+
.ue en éste caso es de tipo $e@adecimal% El pro#rama termina utili"ando una ,e"m5s el operador de inserci(n para especificar la base G como la deseada pararepresentar los ,alores numéricos en el dispositi,o est5ndar de salida%
4ara m5s informaci(n en relaci(n con los sistemas numéricosconsulte Sistemas numéricos & representaci(n de datos de la secci(n onceptos
b5sicos%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 86/160
)l arc"ivo iomanip."
El arc$i,o de cabecera llamado iomanip.h define un conunto demanipuladores adicionales a los b5sicos tratados en el p5rrafo anterior+#eneralmente se trata de los si#uientesC
• set*+,+ se utili"a con fluos istream & ostream%
• setfill+,+ se utili"a con fluos istream & ostream%
• setprecision+,+ se utili"a con fluos istream & ostream%
• setiosfla#s+,+ se utili"a con fluos istream%
• resetiosfla#s+,+ se utili"a con fluos istream & ostream%
Empe"amos estudiando el manipulador setw()+ &a sea .ue se utilice con fluosde entrada /istream0 ( fluos de salida /ostream0 establece el anc$o de campo al,alor especificado dentro del paréntesis del manipulador como se demuestra en el
pro#rama manipu02.cpp%
//*********************************************************// manipu.cpp//*********************************************************
#include <iostream.h> // para operaciones de "/7#include <iomanip.h> // define diferentes manipuladores
int main(){ int i;
cout << ! "l ancho de este campo es de 89! << endl; for(i+1; i<9; i::) { cout << set(i); cout << !1! << endl; cout << set(i); cout << !1! << endl; cout << set(i); cout << !18! << endl; cout << endl; - cout << set(89); cout << !"l ancho de este campo es de 89! << endl; return ;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 87/160
El manipulador setw()+ como &a se dio+ establece el anc$o de un campo desalida pero su efecto solo se aplica a la salida del ,alor si#uiente+ la si#uienteoperaci(n de inserci(n ( e@tracci(n restablece el ,alor del anc$o del campo acero .ue es el ,alor predeterminado+ por ésta ra"(n se utili"a ,arias ,eces elmanipulador setw() a lo lar#o del pro#rama manipu02.cpp+ compil5ndolo
podemos apreciar los espacios en blanco a la i".uierda del campo de salida .ueresultan de especificar diferentes ,alores de tipo int %
En el si#uiente pro#rama de eemplo+ manipula0.cpp+ especificamosdiferentes ,alores de anc$o de campo para los datos correspondientes a lascalificaciones de un pe.ueo #rupo ficticio de estudiantes con el obeto de darleal reporte de calificaciones una meor apariencia+ en éste pro#rama utili"amos elmanipulador setfill() para especificar .ue deseamos rellenar los espacios en
blanco+ definidos por el manipulador setw()+ con el car5cter de punto% Se puedeobser,ar .ue al utili"ar el manipulador setfill() su efecto permanece para todoslos fluos de ES $asta .ue se selecciona otro car5cter diferente% )l final del
pro#rama especificamos utili"ar el car5cter de espacio en blanco para rellenar losespacios+ .ue es el car5cter predeterminado%
//*********************************************************// manipu8.cpp//*********************************************************
#include <iostream.h> // para operaciones de "/7#include <iomanip.h> // define diferentes manipuladores
int main(){
cout << setfill(.); // rellenar con puntos
cout << !6eporte de calificaciones&n! << endl;cout << !6oerto 2ndrade! << set() << !=! << endl;cout << !2ndrea ?utierre0! << set(1@) << !=@! << endl;cout << !Aisseth 7anche0! << set() << !=B! << endl;cout << !2nastasio 3astro! << set(1@) << !B! << endl;cout << !Carara 3lintonsD$! << set(1B) << !B=! << endl;cout << !Eartin Flores ?arcia! << set(1) << !@1! << endl;
cout << setfill(&); // se restalece el carGcter de llenado
return ;-
En el pro#rama comenta1.cpp+ escrito en + se reali"( un sencillo c5lculoutili"ando ,alores de tipo float + al eecutarlo obser,amos .ue la salida mostradaen la pantalla in,ariablemente desple#aba seis d6#itos decimales+ inclusointroduciendo ,alores .ue dieran por resultado un ,alor e@acto% En comparaci(n+
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 88/160
el mismo pro#rama escrito en ??+ entsal.cpp+ desplie#a autom5ticamente losd6#itos decimales de acuerdo al c5lculo reali"ado+ sin embar#o+ en ciertasaplicaciones puede ser deseable especificar un n*mero determinado de d6#itos adesple#ar por el fluo de ES% 4ara éste fin se utili"a elmanipulador setprecision() en donde podemos especificar mediante un ,alor de
tipo int el n*mero de d6#itos a la derec$a del punto decimal a desple#ar en pantalla+ estudie el pro#rama llamado manipu0!.cpp
//*********************************************************// manipuH.cpp//*********************************************************
#include <iostream.h> // para operaciones de "/7#include <iomanip.h> // define diferentes manipuladores
int main()
{ int i;doule variale1+, variale+B;
for(i+; i<1; i::){
cout << setprecision(i);cout << variale1/variale << endl;
-return ;
-
>a $abr5 notado .ue los fluos de ES tienen ciertos ,alores predefinidos & .ue
éstos ,alores se pueden modificar utili"ando manipuladores como oct & hex+sucede .ue los fluos de ES tienen un campo para especificar los ,alorescorrespondientes & éstos campos se llaman banderas (flags)% El arc$i,o decabecera ios.h define diferentes especificaciones de banderas% ;ediante el uso delmanipulador setiosflags() nuestros pro#ramas pueden manipular muc$as de éstas
banderas utili"ando a su ,e" el operador de alcance+ identificado por un par des6mbolos de dos puntos /--0 & .ue nos sir,e para acceder a una ,ariable dealcance #lobal ( a los miembros de una clase% =ecuerde .ue en la si#uientelecci(n daremos la definici(n de una clase & demostraremos detalladamente eluso del operador de alcance+ por lo pronto es importante .ue conser,e en mente
los datos pre,ios de ésta lecci(n pues ser5n aplicados pr5cticamente en todo pro#rama .ue escriba en ??%
En una determinada secci(n del arc$i,o de cabecera ios.h podemos encontrarlas definiciones para las diferentes banderas como un tipo de dato enum+#eneralmente de la si#uiente maneraC
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 89/160
enum{ sDips + 41, // 7alta espacios en lanco durante la entrada left + 4, // justifica a la i0Iuierda riht + 4H, // justifica a la derecha internal + 4=, // relleno despuJs de sino K indicador de ase dec + 41, // ase decimal oct + 4, // ase octal he4 + 4H, // ase he4adecimal shoase + 4=, // muestra indicador de ase durante la salida shopoint + 41, // punto decimal oliatorio en float uppercase + 4, // salida he4 en ma$Lsculas shopos + 4H, // sino positivo oliatorio scientific + 4=, // notaciKn de tipo 8.1H898"8 fi4ed + 41, // dMitos decimales predeterminados unituf + 4, // desaloja flujos despuJs de inserciKn stdio + 4H // desaloja stdout, stderr despuJs de inserciKn-;
4uede identificar f5cilmente al#unos de los manipuladores .ue &a $emosestudiado & a$ora ,eremos c(mo se utili"an éstas banderas mediante elmanipulador setiosflags() & c(mo restituimos las condiciones ori#inales medianteel manipulaodr resetiosflags()+ estudie & compile el si#uienteeemplo+ manipu0".cpp+ adem5s e@perimente con las banderas no incluidas en el
pro#rama+ esto& se#uro .ue no presentar5 problema al#uno comprender el uso delas diferentes banderas%
//***********************************************
// manipu.cpp//***********************************************
#include <iostream.h>#include <iomanip.h>
int main(){
int numero;
cout << !ntrodu0ca un numero&n!;cin >> numero;cout << !"l valor introducido en ase 1 es ! << numero
<< endl;
cout << setiosflas(iosoct);cout << !en ase octal es ! << numero << endl;cout << setiosflas(ioshe4);cout << !$ en ase he4adecimal es ! << numero << endl;cout << setiosflas(iosuppercaseNiosshoase);cout << !utili0ando los manipuladores uppercase $ shoase!
! el valor es ! << numero << endl;cout << resetiosflas(ioshe4);cout << !2hora el valor se representa en ase octal asi !
<< numero << endl;
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 90/160
cout << resetiosflas(iosuppercaseNiosshoaseNiosoct);cout << setiosflas(iosshoposNiosshopointNiosfi4ed);cout << !2hora el valor es ! << (float)numero << endl;
cout << resetiosflas(iosshoposNiosshopointNiosfi4ed);
cout << !"l valor es ! << numero << endl;return ;
-
El pro#rama manipu0".cpp empie"a solicit5ndole un n*mero el cual esdesple#ado inmediatamente para demostrar los austes predeterminados para losfluos de ES+ después se utili"a la bandera oct para representar el ,alorintroducido en base octal+ lue#o de mostrar el ,alor en pantalla se ,uel,e autili"ar la bandera hex ésta ,e" para mostrar el n*mero introducido en base$e@adecimal% En ésta parte del pro#rama+ l6nea F+ es con,eniente $acer notar
.ue $emos modificado dos ,eces la representaci(n .ue deseamos darle a losfluos de ES+ en éste orden+ primero indicamos .ue deseamos la base octal & posteriormente la base $e@adecimal+ si después de la l6nea F utili"amos elmanipulador setiosflags(ios##oct) la representaci(n de los fluos de ES no ser5 en
base octal sino en $e@adecimal+ entonces+ si deseamos nue,amente larepresentaci(n del ,alor numérico introducido en base octal necesitamosreestablecer la bandera oct anteriormente establecida en la l6nea K+ para estoutili"amos el manipulador resetiosflags() como est5 ilustrado en la l6nea M &
posteriormente en las l6neas J & F del pro#rama% uando sea necesarioespecificar ,arias banderas podemos $acer uso del operador $% tanto con el
manipulador setiosflags() como con resetiosflags() tal & como se puede apreciaren las l6neas G+ J+ N & MG del pro#rama%
2ol,er al principio
unciones de salida
Sabemos .ue un pro#rama ?? utili"a el operador de inserci(n /0 para
mostrar datos de salida+ tambien .ue el fluo de salida cout est5 definido comouna clase & por lo tanto contiene ciertas funciones+ llamadas miembro% En los pro#ramas .ue $emos ,isto $asta éste momento utili"amos el fluo desalida cout en conunto con el operador de inserci(n para mostrar datos desalida+ sin embar#o podemos $acer uso de las funciones miembro de salidadefinidas para el fluo cout en caso de necesitar un control m5s preciso+ lasfunciones principales para el fluo de salida est5n definidas en el
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 91/160
arc$i,o ostream.h% )nali"ando éste arc$i,o de cabecera podemos ,er lasfunciones mencionadas+ pero adem5s podemos apreciar .ue la clase ostream est5deri,ada de la clase ios & por lo tanto tambien podemos utili"ar con los fluos desalida las funciones propias de la clase ios% =ecuerde .ue en la si#uiente lecci(ntrataremos el tema de las clases+ por lo pronto es bueno .ue empiece a
familiari"arse con la terminolo#6a de la pro#ramaci(n en ??% 2eamos uneemplo de las funciones miembro de cout llamadas put & write%
//***********************************************// salida1.cpp//***********************************************
#include <iostream.h>
int main(){
int letra;char letrasOP+!Qroramacion en 3:: por 'irilio!!?ome0 Rerete!;
for(letra+2; letra <+ S; letra::){
cout << letra << ! !;-cout << !&n&n!;
for(letra+2; letra <+ S; letra::){
cout.put((char)letra);cout << ! !;
-cout << !&n&n!;
cout.rite(letras, 1);cout << endl;
return ;-
El pro#rama contiene dos bucles .ue demuestran la diferencia entre utili"ar lafunci(n miembro put ,ersus el mecanismo tradicional cout % Obser,e .ue$emos declarado una ,ariable de tipo int llamadaletra+ por ésta ra"(n el primer
bucle desplie#a las letras del alfabeto+ s(lo .ue en sus respecti,os e.ui,alentesdecimales del c(di#o )SII% El se#undo bucle es pr5cticamente i#ual al primeroe@cepto por el uso de la funci(n miembro de la clase ostream llamada put .ue deacuerdo a su definici(n+ su ar#umento debe ser de tipo char + por lo tanto debemosmoldear nuestra ,ariable de tipo int para .ue sea a$ora de tipo char & as6 poderutili"arla en la funci(n miembro put % !abr5 notado .ue para tener acceso a unafunci(n miembro de una clase utili"amos el operador punto /.0% >a en la parte
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 92/160
final del pro#rama encontramos un eemplo del uso de la funci(n miembrollamada write+ ésta desplie#a el n*mero indicado de car5cteres+ en éste caso +empe"ando por el principio del arre#lo de tipo char llamado letras% Estudiando elarc$i,o de cabecera ostream.h podemos determinar las funciones miembro de laclase ostream & sus respecti,os ar#umentos+ comparando ésta informaci(n con
los eemplos a.u6 presentados nos a&udar5 a entender la manera en .ue serelacionan las definiciones de las diferentes funciones con sus aplicacionesreales+ pr5ctica .ue recomiendo ampliamente%
En el pro#rama manipu0".cpp anali"amos diferentes especificaciones de banderas .ue establecimos mediante el uso del manipulador setiosflags()+ pues bien+ podemos utili"ar la funci(n miembro setf() para reali"ar la misma funci(n.ue con el manipulador setiosflags() & en forma similar+ podemos utili"ar lafunci(n unsetf() para los mismos prop(sitos .ue el manipulador resetiosflags()+incluso es posible combinar diferentes especificaciones de bandera mediante eluso del operador $%+ m5s interesante a*n es .ue podemos utili"ar la funci(nmiembro flags() para determinar el estado ori#inal de las banderas de fluo deES+ #uardar el dato en una ,ariable & posteriormente utili"arlo para restituir lacondici(n ori#inal de operaci(n de las banderas de fluo+ como lo demuestra elsi#uiente pro#rama+ llamado salida02.cpp
//***********************************************// salida.cpp//***********************************************
#include <iostream.h>#include <iomanip.h>
int main(){
lon anderasToriinales;int numero+9H;
anderasToriinales+cout.flas();cout << !anderas oriinales es ! << cout.flas() << endl;cout.setf(iosshoaseNiosuppercaseNioshe4);cout << !anderas modificadas es ! << cout.flas() << endl;cout << !la variale numero en ase 19 es !
<< numero << endl;cout.flas(anderasToriinales);cout << !restituidas las anderas oriinales, &nahora !
!la variale numero en ase 1 es ! << numero << endl;cout << !anderas oriinales es ! << cout.flas() << endl;
return ;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 93/160
Se aprecia c(mo el uso adecuado de las funciones miembro puede simplificarun c(di#o fuente & $acer el pro#rama m5s eficiente+ ésta es una buena ra"(n paratomarse un tiempo & e@aminar los diferentes arc$i,os de cabecera incluidos connuestro compilador+ de pasada respondemos a la pre#unta Pué arc$i,os decabecera debo utili"ar en mi pro#ramaQ ;u& importante es familiari"arse con la
documentaci(n incluida en el compilador .ue utilicemos+ adem5s es una buena pr5ctica como pro#ramador%
2ol,er al principio
unciones de entrada
4ara Asted no debe ser &a cosa e@traa .ue en ?? utili"amos el operador de
e@tracci(n /''0 en conunto con el fluo cin para reali"ar operaciones de entrada%El fluo de entrada cin tambien est5 definido como una clase & su declaraci(n laencontramos en el arc$i,o de cabecera istream.h unto con sus respecti,asfunciones miembro+ al#unas de las cuales anali"aremos en el si#uiente pro#rama+llamadoentrada.cpp+ sin duda al#una no tendr5 problema en comprender loe@puesto en el si#uiente c(di#oC
//***********************************************// entrada.cpp//***********************************************
#include <iostream.h>#include <ct$pe.h>
int contador; // automGticamente iniciali0ada en cero
int main(){
char te4toO9HP, letra;
cout << !5eclee una linea de te4to $ presione enter&n&n!;cin.etline(te4to, si0eof(te4to));cout << !&n&n"l te4to introducido es&n&n! << te4to
<< !&n! << !el cual contiene ! << cin.count()U1<< ! carGcteres! << endl;cout << !&n&n5eclee otra linea de te4to Iue inclu$a una 4&n!;
do{
letra+cin.et();cout << (char)toupper(letra);contador::;
-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 94/160
hile(letraV+4);cout << !&n&nWsted escriio ! << contadorU1 << ! carGcteres !
!antes de la 4! << endl;
return ;-
<o est5 de m5s recordar .ue una ,ariable de tipo #lobal es autom5ticamenteiniciali"ada a cero% El pro#rama entrada.cpp demuestra el uso de al#unasfunciones miembro de la clase istream+ empe"ando por la funci(nllamada getline() .ue lee una l6nea de te@to $asta encontrar un car5cter de retornode carro /n 0+ similarmente se $ace uso de la funci(n miembro gcount() paradeterminar el n*mero de car5cteres le6dos+ ésta funci(n inclu&e el car5cter deretorno de carro+ por lo tanto restamos uno al ,alor retornado por la funci(n para.ue el resultado desple#ado sea el correcto /l6nea N0% En la se#unda parte del
pro#rama se utili"a la funci(n miembro llamada get()+ ésta lee un solo car5cter
borr5ndolo de la memoria de almacenamiento temporal+ se con,ierte a ma&*sculautili"ando la funci(n toupper() moldeando la salida de ésta a tipo char & sedesplie#a el resultado en pantalla% Rste proceso se repite merced de un bucle do-
while $asta encontrar un car5cter @% ompare el resultado obtenido de la cuentaefectuada en el bucle do-while por la ,ariable llamada contador con el resultadoobtenido al utili"ar la funci(n miembro gcount()%
Es importante e@perimentar con lo e@puesto en éste cap6tulo+ con frecuenciaaprendemos detalles .ue por al#una causa nos pasan inad,ertidos con la simplelectura del te@to+ adem5s cada compilador tiene sus detalles particulares .ue
con,iene conocer para conse#uir el m5@imo pro,ec$o del mismo%
2ol,er al principio
Lección / -
unciones en C
?? es un len#uae .ue soporta totalmente el concepto llamado4ro#ramaci(n Orientada a Obetos & por lo tanto centra su atenci(n en losobetos+ no obstante+ las funciones si#uen siendo un componente central de todo
pro#rama & merecen atenci(n especial por las caracter6sticas nue,as a#re#adas por ??% 4ara informaci(n adicional puede consultar el art6culo referente alas funciones en %
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 95/160
4rimero la definici(nC Ana función es una sección de código independiente*
con nombre* +ue e,ecuta una tarea especfica opcionalmente de/uel/e un /alor
al programa +ue la llamó% )$ora ,eamos las partes de la definici(nC
• Ana funci(n tiene un nico nombre+ al utili"ar éste nombre en otras partes
del pro#rama se pueden eecutar los enunciados contenidos en la funci(n%) esto se le conoce como llamar a la función% Ana funci(n puede serllamada desde otra funci(n%
• Ana funci(n es independiente% Ana funci(n puede eecutar sus tareas sininterferencia en ( de otras partes del pro#rama%
• Ana funci(n e,ecuta una tarea especfica% Esta es la parte f5cil de ladefinici(n% Ana tarea es un trabao discreto .ue su pro#rama debe eecutarcomo parte de su desempeo #eneral+ por eemplo mandar una l6nea dete@to a impresi(n+ ordenar una lista ( $acer un c5lculo matem5tico%
• Ana funci(n opcionalmente de/uel/e un /alor al programa +ue la llamó%uando un pro#rama llama a una funci(n se eecutan los enunciadoscontenidos en ésta+ si si pro#rama lo re.uiere+ éstos enunciados puedende,ol,er un ,alor al pro#rama .ue llam( a la funci(n%
uando un pro#rama llama a una funci(n+ la eecuci(n del c(di#o salta a la posici(n inicial definida por el nombre de la funci(n+ el pro#rama eecuta los
enunciados contenidos en ésta & posteriormente el pro#rama .ue llam( a lafunci(n contin*a en la l6nea de c(di#o si#uiente% Ana funci(n bién diseadaeecuta una tarea espec6fica & f5cil de entender% Es recomendable ante una tareacomplicada+ di,idirla en m*ltiples funciones & entonces llamarlas a su debidomomento%
2ol,er al principio
0eclaración y definición de funciones4ara utili"ar una funci(n en un pro#rama se re.uiere en primer lu#ar
declararla & después definirla% La declaraci(n de la funci(n le indica alcompilador el nombre+ el tipo de dato de,uelto por la funci(n & los par5metros
pasados a la funci(n% ) la declaraci(n de una funci(n se le llama tambiénel prototipo de la f unci(n% uando un pro#rama llama a una funci(n+ el pro#rama
puede en,iar $acia la funci(n informaci(n en la forma de uno o m5s argumentos%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 96/160
Los ar#umentos son datos .ue la funci(n puede necesitar para reali"ar su trabao%uando la funci(n termina su trabao+ la eecuci(n del pro#rama re#resa a la l6neasi#uiente a la llamada a la funci(n% Las funciones pueden en,iar informaci(n al
pro#rama en la forma de un ,alor de,uelto%
El prototipo de una funci(n pro,ee al compilador con informaci(n de unafunci(n .ue ser5 definida posteriormente en el pro#rama% El prototipo inclu&e+ eneste orden+ el tipo de ,alor .ue la funci(n de,ol,er5+ el nombre de la funci(n+ elcual debe ser si#nificati,o del trabao reali"ado por la funci(n+ & el tipo de,ariables utili"adas como ar#umentos .ue ser5n pasados a la funci(n%Opcionalmente se puede incluir el nombre de las ,ariables utili"adas comoar#umentos% El prototipo de una funci(n+ como todo enunciado eecutable en un
pro#rama ?? debe terminarse con un s6mbolo de punto & coma%
La definición de una funci(n es en s6 la funci(n misma+ est5 compuesta en su
primer l6nea de c(di#o por el encabeado .ue debe ser idéntico al prototipo de lafunci(n pero en éste caso no se utili"a el punto & coma+ adem5s+ al contrario del
prototipo+ donde es opcional incluir el nombre de las ,ariables utili"adas comoar#umentos+ en el encabe"ado de la funci(n se debe incluir el nombre de las,ariables% Ense#uida del encabe"ado est5 el cuerpo de la funci(n .ue contiene+encerrados entre lla,es+ los enunciados eecutables propios del trabao a eecutar
por la funci(n% Si la funci(n de,uel,e un tipo de ,alor+ éste se debe especificar alfinal del cuerpo de la funci(n%
on toda la informaci(n reunida $asta este punto+ estamos en condici(n de
escribir un pro#rama .ue demuestre el prototipo & definici(n de una funci(n%4ersonalmente+ primero escribo la definici(n de la funci(n & después copio elencabe"ado de la misma para formar el prototipo+ a#re#andole un punto & comaal final del enunciado%
//*********************************************************// funcion1.cpp// Xemuestra el prototipo $ definiciKn de una funciKn// (c)1@@@, 'irilio ?Kme0 Rerete//*********************************************************
#include <iostream.h>
// Qrototipo de funcionesvoid resta(int valor1, int valor);int multiplica(int, int);
// FunciKn principalint main(){
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 97/160
int numero1, numero, resultado;
cout << !ntrodu0ca dos numeros! << endl; cin >> numero1 >> numero;
resta(numero1, numero); // llama a la funciKn !resta! resta(numero, numero1);
resultado + multiplica(numero1, numero);
cout << !Aa multiplicacion de los dos valores es ! << resultado << endl;
return ;-
// FunciKn restavoid resta(int valor1, int valor){ int sustraccion; // variale local
sustraccion + valor1 U valor; cout << !Aa resta de los dos valores es ! << sustraccion << endl;-
// FunciKn multiplicaint multiplica(int valor1, int valor){ int local; // variale local
local + valor1 * valor;
return local;-
En el c(di#o funcion1.cpp se demuestra el uso b5sico de las funciones en un pro#rama ??+ se aprecia en primer lu#ar el prototipo de dos funciones+ unallamada resta & la otra propiamente llamadamultiplica+ utili"ando nombressi#nificati,os para las funciones e,itamos $acer comentarios redundantes &facilitamos la lectura del c(di#o% En el prototipo de la funci(n resta est5especificada la palabra cla,e void lo .ue nos indica .ue la funci(n resta node,uel,e ,alor al#uno al pro#rama .ue la llame+ adem5s especifica dos ,ariablesde tipo int llamadas valor1 & valor/ para ser utili"adas como ar#umentos de lamisma% =ecuerde .ue en el prototipo de la funci(n no es necesario incluir losnombres de las ,ariables utili"adas como ar#umentos+ esto se demuestra el el
prototipo de la funci(n llamada multiplica .ue como est5 indicado+ de,uel,e un,alor de tipo int & re.uiere dos ,ariables de tipo int como ar#umentos%
>a en el cuerpo de la funci(n principal+ main( ) el pro#rama empie"adeclarando tres ,ariables llamadas numero1+ numero/ & resultado+ le solicita
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 98/160
introducir dos n*meros .ue son almacenados en las,ariables numero1 & numero2 & entonces llama en primer lu#ar a la funci(nllamada resta( ) en la l6nea pasandole como ar#umentos las ,ariablesllamadas numero1 & numero2% El pro#rama entonces brinca a la parte del c(di#odonde se encuentra la funci(n llamada resta( )+ en el encabe"ado de ésta funci(n
,emos .ue se especifican para los ar#umentos de la funci(n los nombres de dos,ariables+ /alor1 &/alor2+ en el encabe"ado de la funci(n s6 es obli#atorioespecificar el nombre de las ,ariables utili"adas como ar#umentos+ se trata enefecto+ de la declaraci(n de dos ,ariables de tipo int .ue ser5n utili"adas en formalocal por la funci(n% Dentro del cuerpo de la funci(n resta se declara una,ariable int llamada sustraccion en donde se almacena el resultado de restar los,alores pasados como ar#umentos a la funci(n+ éste resultado se desplie#a en
pantalla como parte de los enunciados eecutables de la funci(n%
La funci(n resta( ) no de,uel,e un ,alor al pro#rama+ as6 .ue una ,e"terminados los enunciados eecutables de la misma la eecuci(n del pro#ramacontin*a en la l6nea + pero entonces el pro#rama ,uel,e a llamar a lafunci(n resta( )+ sin embar#o obser,e .ue los ar#umentos est5n in,ertidos conrespecto a la llamada anterior+ ésto demuestra .ue los ,alores se pasan a lafunci(n en el orden en .ue son colocados en la llamada+ de tal manera .ue en lase#unda llamada a la funci(n resta( )+ /alor1 toma el ,alor almacenado en la,ariable llamada numero2 & /alor2 toma el ,alor almacenado en numero1%Después de eecutar por se#unda ,e" la funci(n resta( ) el pro#rama contin*a enla l6nea H en donde se asi#na a la ,ariable llamada resultado el ,alor de,uelto
por la funci(n llamada multiplica+ , a la .ue nue,amente le pasamos comoar#umentos los ,alores almacenados en las ,ariablesllamadas numero1 & numero2+ esto es+ el pro#rama llama a lafunci(n multiplica( ) & &a en el cuerpo de ésta funci(n se declara una ,ariablelocal de tipo int llamada local en donde se almacena el resultado de multiplicarlos ,alores pasados a la funci(n como ar#umentos+ después la funci(n de,uel,eel ,alor almacenado en la ,ariable llamada local % 9inalmente el pro#ramadesplie#a el ,alor almacenado en resultado & termina de,ol,iendo al sistema el,alor de G%
2ol,er al principio
ariables locales y #lobales
En ?? est5 permitido declarar ,ariables en cual.uier parte del c(di#o fuente%)dem5s de pasar ,ariables como parte del ar#umento de una funci(n+ también es
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 99/160
posible declarar ,ariables dentro del cuerpo de una funci(n+ a este tipo de,ariables se les llama locales &a .ue s(lo son *tiles dentro del cuerpo de lafunci(n% Los par5metros utili"ados en una funci(n se consideran como ,ariablesde tipo local & se utili"an e@actamente de la misma manera+ como lo demuestra elfra#mento de c(di#o si#uiente tomado del pro#rama funcion1.cpp%
int multiplica(int valor1, int valor){ int local; // variale local
local + valor1 * valor;
return local;-
Los par5metros de la funci(n+ ambos de tipo int + llamados /alor1 & /alor2 son
en efecto ,ariables de alcance local al i#ual .ue la ,ariable declarada como detipo int llamada local dentro del cuarpo de la funci(n multiplica( )% El alcance deuna ,ariable es simplemente el espacio dentro del c(di#o fuente donde la ,ariable
puede ser utili"ada+ #eneralmente éste espacio est5 limitado por el par de lla,es.ue sir,en para encerrar las l6neas de c(di#o .ue conforman una funci(n+#eneralmente+ por.ue e@isten e@cepciones en ?? como es el caso de las,ariables utili"adas en el encabe"ado de un bucle for + sin embar#o éste asunto
puede tener ,ariantes de acuerdo al nue,o est5ndar )<SI-?? & por lo tantoal#unos compiladores pueden limitar la e@istencia de éstas ,ariablesestrictamente al c(di#o contenido dentro del bucle for %
) las ,ariables .ue declaramos fuera del cuerpo de cual.uier funci(n se dice.ue tienen un alcance #lobal & por lo tanto estas funciones est5n disponibles paracual.uier funci(n del pro#rama+ inclu&endo amain( )% Las ,ariables locales .uetienen el mismo nombre .ue las ,ariables #lobales no cambian el ,alor de las#lobales+ sin embar#o una ,ariable local con el mismo nombre .ue una ,ariable#lobal oculta a la ,ariable #lobal% Los conceptos discutidos $asta este momento.uedan demostrados en el si#uiente pro#ramaC
//*********************************************************// funcion.cpp// Xemuestra el alcance de las variales en 3::// (c)1@@@, 'irilio ?Kme0 Rerete//*********************************************************
#include <iostream.h>
int loal; // se iniciali0a automaticamente en cero
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 100/160
void funcion1(int parametro);
int main(){ int local1, i, loal+8;
cout << local1 << endl << endl; cout << !ntrodu0ca un numero! << endl; cin >> local1; cout << !7u numero es ! << local1 << endl; cout << endl;
for(i+; i<; i::) { int local; // vGlida solo dentro del ucle
local + i; cout << local1 << !&t!; cout << local << endl; -
funcion1(local1);
cout << !Aa variale &!loal&! local vale ! << loal << endl; cout << !Aa variale &!loal&! loal vale ! << loal << endl;
loal+H;
cout << !Aa variale &!loal&! local ahora vale ! << loal << endl; cout << !Aa variale &!loal&! loal vale ! << loal << endl;
//cout << local << endl;
return ;-
void funcion1(int parametro){ loal + loal : parametro;-
Estudiamos en primer lu#ar lo concerniente a las ,ariables de alcance localllamadas local1 & local2+ al i#ual .ue en + las ,ariables locales no sonautom5ticamente iniciali"adas con un ,alor i#ual a cero+ por éste moti,o elresultado desple#ado en la l6nea N es incierto+ sin embar#o al introducir un ,alor & almacenarlo en local1 tenemos la certe"a de utili"ar correctamente ésta,ariable% ;as adelante+ dentro del bucle for se declara otra ,ariable de alcancelocal llamada local2 en la l6nea K+ ésta ,ariable s(lo es *til para los enunciadoscontenidos dentro del bucle+ para demostrarlo puede .uitar el comentario del
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 101/160
enunciado de la l6nea HH & entonces el compilador #enerar5 un mensae de errorindicando .ue la ,ariable local2 no $a sido declarada% Después del
bucle for llamamos a la funci(n llamada funcion1( ) pas5ndole como par5metro ala ,ariable llamada local1+ al $acer ésto+ el compilador en realidad crea una copiade la ,ariable local1 & asi#na el ,alor contenido en ésta a la ,ariable de alcance
local llamda parametro+ a éste proceso se le conoce como pasar un parámetropor valor% >a dentro de la funci(n+ se suma el ,alor de parametro al de la,ariable de alcance #lobal llamada global cambiando de ésta forma el ,alorcontenido en la ,ariable de alcance #lobal llamada global % omo $abr5obser,ado+ la funci(n principal contiene a su ,e" una ,ariable llamada global +ésta por supuesto de alcance local% En las l6neas MH a la HH se demuestra c(mouna ,ariable de alcance local oculta a una ,ariable de alcance #lobal .ue tienen elmismo nombre+ adem5s se demuestra c(mo utili"ar el operador de alcance
global /--0 para tener acceso a una ,ariable de alcance #lobal oculta por una,ariable $om(nima de alcance local% También se demuestra .ue una ,ariablelocal no cambia el ,alor contenido en una ,ariable de alcance #lobal $om(nima%
2ol,er al principio
Parámetros por defecto
4ara cada par5metro declarado en el prototipo de la funci(n & en sudefinici(n+ una llamada a la funci(n debe pasar un ,alor del tipo espec6fico+ si ladefinici(n de la funci(n difiere ( si Asted comete un error al pasar un ,alore.ui,ocado a la funci(n+ entonces el compilador #enerar5 un mensae de error+ la*nica e@cepci(n a la re#la es si el prototipo de la funci(n declara un /alor por
defecto para el parmetro% An valor por defecto es el ,alor a utili"ar en caso de.ue nin#uno sea especificado+ as6+ una declaraci(n de una funci(n podr6a ser estaC
char unaTfuncion(int defecto+1);
En éste eemplo se declara una funci(n llamada una3funcion .ue toma un
par5metro de tipo int + pero en caso de .ue no se inclu&a el par5metro necesario+entonces se utili"ar5 el ,alor de G para ser utili"ado por la funci(n% omo no esabsolutamente necesario utili"ar nombres para los par5metros en el prototipo deuna funci(n+ también podemos escribir la declaraci(n de una funci(n de lasi#uiente maneraC
char unaTfuncion(int + 1);
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 102/160
Es posible asi#narle ,alores por defecto a todos los par5metros de unafunci(n+ pero con una condici(n+ si cual.uiera de los par5metros no lle,a un,alor por defecto+ entonces los par5metros pre,ios no podr5n lle,ar un ,alor pordefecto+ por eemplo+ si el prototipo de una funci(n es parecido a estoC
char unaTfuncion(int parametro1, int parametro, int parametro8);
Asted puede asi#nar un ,alor por defecto a parametro2 solo si se le $aasi#nado un ,alor por defecto a parametro% Asted solo podr5 asi#nar un ,alor
por defecto a parametro1 solo si se le $a asi#nado ,alores por defectoa parametro2 & a parametro% El si#uiente pro#rama demuestra lo dic$oC
//*********************************************************// funcion8.cpp
// Xemuestra parametros con valores por defecto// (c)1@@@, 'irilio ?Kme0 Rerete//*********************************************************
#include <iostream.h>
int areaTdeTunTcuo(int lonitud, int ancho + , int alto + );
int main(){ int lonitud + 1; int ancho + ; int alto + 1; int area;
area + areaTdeTunTcuo(lonitud, ancho, alto); cout << !2rea del primer cuo ! << area << endl;
area + areaTdeTunTcuo(lonitud, ancho); cout << !2rea del seundo cuo ! << area << endl;
area + areaTdeTunTcuo(lonitud); cout << !2rea del tercer cuo ! << area << endl;
return ;-
areaTdeTunTcuo(int lonitud, int ancho, int alto){ return (lonitud * ancho * alto);-
2ol,er al principio
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 103/160
23mero variable de ar#umentos
Ana de las caracter6sticas atracti,as de ?? es la manera estricta en .ue,erifica el tipo de par5metros utili"ados en las funciones+ sin embar#o $abr5ocasiones en las .ue necesitemos una funci(n con un n*mero ,ariable de
par5metros+ un eemplo es la funci(n printf( )% El )<SI- dispone de una seriede macros para determinar el n*mero de ar#umentos utili"ados en una funci(n+éstas macros est5n definidas en el arc$i,o de cabecera stdar#." & también est5ndisponibles para ?? pero necesitamos una manera de e,itar .ue el compilador?? $a#a un c$e.ueo estricto de los ar#umentos pasados a una funci(n+ esto seconsi#ue utili"ando tres puntos como se indica en la l6nea del si#uiente
pro#ramaC
//*********************************************************
// funcionH.cpp// Xemuestra el uso de un nLmero variale de arumentos// (c)1@@@, 'irilio ?Kme0 Rerete//*********************************************************
#include <iostream.h>#include <stdar.h>
// Xeclara una funciKn con un parGmetro oliatoriovoid variosTarumentos(int numero, ...);
int main(){ int indice + ; int uno + 1, dos + ;
variosTarumentos(uno, indice); variosTarumentos(8, indice, indice : dos, indice : uno); variosTarumentos(dos, B, 8);
return ;-
void variosTarumentos(int numero, ...){ vaTlist parametros; int indice;
// llama a la macro inicial vaTstart(parametros, numero);
cout << !Aos parametros son !; for (indice + ; indice < numero ; indice::) { // Xetermina el numero de parametros cout << vaTar(parametros, int) << ! !; -
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 104/160
cout << endl;
// conclu$e la macro vaTend(parametros);-
El prototipo indicado en la l6nea dice .ue se re.uiere un par5metro detipo int & a partir de éste el compilador no c$ecar5 el tipo & n*mero dear#umentos pasados a la funci(n llamada/arios3argumentos( )% Obser,ar5 .ue el
pro#rama consiste en tres llamadas a lafunci(n /arios3argumentos( ) precisamente con diferente n*mero de ar#umentosen cada llamada+ Asted puede poner el n*mero .ue desee de par5metros en lallamada a la funci(n siempre & cuando el primer par5metro sea uno de tipo int +después de ésto es responsabilidad su&a utili"ar con cuidado el tipo & n*mero dear#umentos pasados a la funci(n+ se debe e,itar escribir c(di#o .ue resulte dif6cilde interpretar%
2ol,er al principio
Sobrecar#a de funciones
?? permite crear m5s de una funci(n con el mismo nombre las cuales sediferenciar5n por el n*mero de par5metros utili"ados ( en el tipo de éstos o en5mbos% El ,alor re#resado por las funciones puede ser i#ual ( diferente sin
embar#o dos o m5s funciones con el mismo nombre & par5metros pero con ,alorde retorno diferente #enerar5 un mensae de error por parte del compilador% )l proceso de llamar a m5s de una funci(n con el mismo nombre se lellama sobrecar#a de funciones% El si#uiente pro#rama demuestra la sobrecar#ade la funci(n llamada polimorfoC
//*********************************************************// funcion.cpp// Xemuestra la sorecara de funciones// (c)1@@@, 'irilio ?Kme0 Rerete//*********************************************************
#include <iostream.h>
void polimorfo(float numero);void polimorfo(int numero);float polimorfo(char *te4to, int numero);
int main(){
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 105/160
float valor; int valor; char cadenaOP+!"l nuevo valor es !;
cout << !ntrodu0ca un valor flotante! << endl; cin >> valor;
polimorfo(valor);
valor + valor; polimorfo(valor);
valor + valor * ; valor + polimorfo(cadena, valor);
polimorfo(valor);
return ;-
void polimorfo(float numero){ cout <<!"l valor introducido es ! << numero << endl;-
void polimorfo(int numero){ cout <<!Aa parte entera es ! << numero << endl;-
float polimorfo(char *te4to, int numero){ cout << te4to << numero << endl; return (numero * 8.1H19);-
Este pro#rama demuestra adem5s lo estricto .ue es ?? con respecto a c$ecar el tipo de par5metros pasados a una funci(n% En la l6nea H asi#namos a una,ariable de tipo int llamada /alor2 el contenido de la ,ariable detipo float llamada /alor % Truncar la parte fraccionaria de la ,ariablellamada /alor ( introducir un n*mero entero no es suficiente para llamar a lafunci(n polimorfo(int numero)+ es necesario utili"ar las ,ariables de tipoadecuado+ es decir+ los par5metros formales declarados en el prototipo de lasfunciones%
2ol,er al principio
4ecursividad
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 106/160
Ana funci(n se puede llamar a s6 misma+ a este proceso se lellama recursividad & puede ser directa e indirecta% Es directa cuando una funci(nse llama a s6 misma% Ocurre recursi,idad indirecta cuando una funci(n llama aotra funci(n & ésta *ltima llama a la primera% )mbos tipos de recursi,idad se danen dos formas+ a.uellas .ue e,entualmente terminan & producen un resultado & el
caso en .ue la recursi,idad nunca termina produciendo un bucle infinito & dea.u6 una falla en tiempo de eecuci(n por falta de memoria% )l#unos
pro#ramadores piensan .ue este *ltimo caso es di,ertido+ sobre todo cuando le pasa a otra persona% C-0
Es importante notar .ue cuando una funci(n se llama a s6 misma+ una nue,acopia de ésta funci(n es la .ue se eecuta% Las ,ariables locales de la se#undafunci(n no interfieren con las ,ariables locales de la primera+ as6 mismo+ las,ariables locales no se pueden afectar mutuamente% Tomemos como eemplo un
pro#rama .ue calcule el factorial de un numero entero introducido por el usuario%El factorial est5 definido como el producto del n*mero en cuestion por todos losnumeros enteros menores .ue él+ de tal manera .ue el factorial de K U KBHBMBBU G% El c(di#o puede ser as6C
//*********************************************************// funcionB.cpp// Xemuestra recursividad// (c)1@@@, 'irilio ?Kme0 Rerete//*********************************************************
#include <iostream.h>
doule factorial(int valor);
int j+1;
int main(){ int numero;
cout << !ntrodu0ca un numero! << endl; cin >> numero; cout << endl;
cout << numero << !V es iual a ! << factorial(numero) << endl;
cout << !7e llamo a la funcion factorial ! << j << ! veces! << endl;
return ;-
doule factorial(int valor)
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 107/160
{ doule resultado;
if(valor<+1) return 1; else { resultado + (valor*factorial(valorU1)); j + j:1; -
return resultado;-
omo el factorial de un n*mero suele dar como resultado un ,alor mu&#rande necesitamos utili"ar una funci(n de tipo double .ue tome como par5metroun ,alor de tipo int + dic$a funci(n la $emos declarado con el nombre de factorial %Atili"amos una ,ariable de alcance #lobal llamada , para lle,ar un re#istro del
n*mero de ,eces en .ue la funci(n factorial( ) es llamada% El pro#rama empie"asolicit5ndole un n*mero entero & después llama por primera ,e" a lafunci(n factorial( )% La recursi,idad necesita una condici(n para .ue en elmomento oportuno detener la acci(n+ por ésta ra"(n+ lafunci(n factorial( ) determina en primer lu#ar si el ,alor pasado como par5metrode la funci(n es i#ual a + en cu&o caso la funci(n retorna % Si el ,alor del
par5metro es ma&or .ue + entonces la funci(n factorial( )se llama a s6 mismatomando como par5metro el ,alor ori#inal menos uno+ multiplicando éste ,alor
por el ,alor del par5metro ori#inal & almacenando el resultado en la ,ariablellamada resultado+ como se aprecia en la l6nea M8 del pro#rama% ada ,e" .ue la
funci(n factorial( ) sea llamada con un par5metro ma&or .ue se incrementa la,ariable #lobal llamada ,+ ésta ,ariable debe tener 5mbito #lobal por.uenecesitamos compartir el ,alor acumulado en la ,ariable entre todas las copias.ue en determinado momento se $a#an de la funci(n factorial( )+ como resultadodel fen(meno de recursi,idad% An eemplo adicional de recursi,idad loencontrar5 en el pro#rama llamado funcion4.cpp .ue est5 incluido en el arc$i,ocomprimido Cplus2.ip & .ue puede descar#ar al final de éste art6culo%
2ol,er al principio
Lección 5
Clases y encapsulado
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 108/160
La 5rogramación $rientada a $b,etos trae consi#o una serie de términosnue,os+ familiari"arnos & aprender a manear éstos conceptos es de sumaimportancia para el futuro del pro#ramador moderno% Empe"amos éste art6culodando una definici(nC nos referimos al encapsulado como el proceso deformar ob6etos% An obeto encapsulado también es a menudo llamado un tipo de
dato abstracto .ue es uno de los temas principales de la 4ro#ramaci(n Orientadaa Obetos+ sin el encapsulado+ lo cual in,olucra el uso de una ( m5s clases noe@istir6a la 4ro#ramaci(n Orientada a Obetos /4OO para abre,iar0% En la
pro#ramaci(n por procedimientos tradicional+ di#amos utili"ando + es normaldeclarar una serie de ,ariables con nombres representati,os de un tipo espec6fico
para el dato en cuesti(n+ as6+ si declaramos al#unas ,ariables de tipo int sabemos.ue podemos asi#narles ,alores numéricos dentro de un ran#o espec6fico+también podemos reali"ar ciertas operaciones con éstas ,ariables+ como sumar+restar * otros c5lculos & adem5s podemos asi#nar los resultados a otra ,ariabledel mismo tipo% El tipo de las ,ariables indicaC
• El tamao en memoria de la ,ariable%
• El tipo de informaci(n .ue puede almacenar%
• Las acciones .ue se pueden eecutar en ellas%
En términos #enerales podemos decir .ue un tipo es una cate#or6a% Tipos .uenos resultan familiares pueden ser+ carro+ casa+ persona & forma entre muc$as
m5s% En ??+ el pro#ramador puede crear el tipo .ue sea necesario con toda lafuncionalidad & potencia .ue aporta el len#uae% La necesidad de crear tiposnue,os est5 en el $ec$o de .ue pro#ramamos para resol,er problemas de la ,idareal+ como por eemplo simular el funcionamiento de un sistema de calefacci(n%)un.ue es posible describirlo utili"ando ,alores numéricos & cadenas decaracteres+ si utili"amos representaciones de los obetos con los .ue estamostrabaando+ sobre todo trat5ndose de problemas compleos+ resulta muc$o m5sf5cil lo#rar resultados satisfactorios al crear ,ariables .ue representen poreemplo+ sensores de calor+ termostatos & calefactores% uanto m5s cercanas secorrespondan las ,ariables a la realidad+ tanto m5s f5cil ser5 escribir el pro#rama%
4ero+ 4ara .ué necesitamos encapsular datosQ
)ncapsulado
omo sabemos+ una estructura es una colecci(n de tipos de datos pre,iamentedefinidos & ordenados en una forma con,eniente para el pro#rama% En ?? laestructura presenta una meora con respecto a su prima del len#uae + permite
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 109/160
especificar funciones miembro lo .ue resulta mu& pr5ctico en términos deordenar di,ersas partes del c(di#o de acuerdo a su funcionalidad% 2eamos el
primer c(di#o de este art6culoC
//***********************************************// clases1.cpp// Y1@@@, 'irilio ?Kme0 Rerete//***********************************************
#include <iostream.h>
struct ohm{ float voltaje; float resistencia; float corriente;
float amperios(float voltios, float ohmios);
-;
float ohmamperios(float voltios, float ohmios){ return voltios / ohmios;-
int main(){ struct ohm calculo1; // "n 3:: no es indispensale ohm calculo; // especificar la palara !struct! float resultado;
calculo1.voltaje + 1B; calculo1.resistencia + HB; calculo.corriente + .B; calculo.resistencia + ;
calculo1.corriente + calculo1.amperios(calculo1.voltaje, calculo1.resistencia); resultado + calculo.amperios(18., HB);
calculo.voltaje + calculo.corriente * calculo.resistencia;
cout << !Aa corriente en el calculo 1 es de ! << calculo1.corriente << ! amperios! << endl;
cout << !"l voltaje en el calculo es de ! << calculo.voltaje << ! voltios! << endl;
cout << !Aa corriente en el calculo 8 es de ! << resultado << ! amperios! << endl;
return ;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 110/160
omo puede ,er+ declaro una estructura llamada ohm .ue contiene tres,ariables miembro de tipo float llamadas /olta,e+ resistencia & corriente+ tambiénest5 contenida dentro de la estructura el prototipo de la funci(n miembrollamada amperios .ue toma dos par5metros de tipo float & de,uel,e un ,alor detipo float % En el cuerpo de la funci(n principal+ en primer lu#ar declaramos dos
,ariables de tipo ohmllamadas calculo1 & calculo2 adem5s de una ,ariablecon,encional de tipo float llamada resultado% En )<SI- es obli#atorioespecificar la palabra cla,e struct al declarar ,ariables+ no as6 en ?? como est5demostrado en las l6neas H & K% )l declarar ,ariables de tipo ohm decimos .ueson ob,etos de la estructura llamada ohm+ por lo tanto calculo1 & calculo2 sontambién conocidos como ob,etos de tipo ohm% En las l6neas 8 a la M del
pro#rama iniciali"amos las ,ariables con al#unos ,alores utili"ando el operador punto de la misma manera como se $ace en + la principal diferencia la tenemosen la l6nea MM donde asi#namos a la ,ariable calculo1.corriente el ,alor de,uelto
por la funci(n miembro llamada calculo1.amperios( )+ de manera similar+ en lal6nea MK asi#namos a la ,ariable de tipo float llamadaresultado el ,alor de,uelto
por la funci(n calculo2.amperios( )+ finalmente se desplie#an los resultados en pantalla% Deducimos f5cilmente .ue éste procedimiento para $acer un c5lculoresulta ries#oso+ sencillamente podemos cometer un error .ue resultar6a dif6cil decorre#ir% Se supone .ue al declarar una funci(n miembro de la estructura ohm es
para facilitar el maneo del pro#rama al tener reunidos en una sola secci(n loselementos relacionados del c(di#o+ pero ,emos una des,entaa al accederlibremente tanto a las ,ariables como a la funci(n de tipo ohm%
2ol,er al principio
Clases
?? proporciona una alternati,a mu& interesante llamada clase+ con éstainstrucci(n propia de ?? & de la 5$$ podemos a#rupar efecti,amente una seriede ,ariables & funciones miembro+ & al i#ual .ue con la estructura+ la clase nossir,e para construir nue,os tipos de datos% Ana clase es una colecci(n de,ariables+ a menudo de diferentes tipos+ combinadas con funciones relacionadas%Ana clase nos permiteencapsular o a#rupar una serie de ,ariables & funciones enuna colecci(n a la cu5l llamamos ob,eto% Similarmente a la estructura+ llamamosa las ,ariables como /ariables miembro en tanto .ue a las funciones lesllamamos funciones miembro+ también conocidas como m7todos% 4ara declararuna clase utili"amos la palabra cla,e class% El si#uiente pro#rama demuestra elencapsulado & la manera para declarar & utili"ar una claseC
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 111/160
//***********************************************// clases.cpp// Y1@@@, 'irilio ?Kme0 Rerete//***********************************************
#include <iostream.h>
class ohm{ float voltaje; float resistencia; float corriente;
pulic void asina(float, float); void muestra(void);-;
void ohmasina(float volts, float amperios)
{ voltaje + volts; corriente + amperios; resistencia + volts / amperios;-
void ohmmuestra(void){ cout << !"l voltaje es ! << voltaje << endl; cout << !Aa corriente es ! << corriente << endl; cout << !Aa resistencia es ! << resistencia << endl;-
int main(){ ohm calculo1, calculo; float volt, ampere;
cout << !'alor de voltaje ! << endl; cin >> volt; cout << !'alor de la corriente ! << endl; cin >> ampere; cout << endl;
calculo1.asina(volt, ampere); calculo.asina(volt*H, ampere/);
cout << !6esultados del ojeto &!calculo1&!! << endl; calculo1.muestra(); cout << endl;
cout << !6esultados del ojeto &!calculo&!! << endl; calculo.muestra();
return ;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 112/160
2eamos las partes nue,as .ue nos presenta el pro#rama clases02.cpp &$a#amos una comparaci(n funcional con respecto al pro#rama clases01.cpp% )l
principio tenemos la declaraci(n de una clase llamada ohm & entre las lla,es .uedelimitan a ésta se encuentran las ,ariables miembrollamadas /olta,e+ resistencia & corriente todas de tipo float % También tenemos a
las funciones miembro llamadasasigna( ) .ue toma dos par5metros de tipo float +& muestra( ) .ue no lle,a par5metros% )mbas funciones de,uel,en un ,alorde /oid + es decir+ no de,uel,en ,alor al#uno% La declaraci(n de la clase terminacon un s6mbolo de punto & coma después de la lla,e de cierre+ nos indica .ue setrata en efecto de una instrucci(n ?? ,5lida% )l declarar ésta clase no se est5asi#nando memoria para ohm+ sencillamente se le est5 indicando al compilador.ue cosa es ohm+ .ue tipo de datos contiene //olta,e+ resistencia & corriente0 &.ue puede $acer/asigna( ) & muestra( )0% También le indica al compilador eltamao .ue se re.uiere para cada ohm creado en el pro#rama+ como tenemos tres,ariables de tipo float + cada una de H b&tes+ en total tenemos un tamao
para ohm de b&tes% Los métodos no toman espacio por.ue no es necesarioreser,ar espacio en memoria para las funciones+ éstas son parte inte#ral del
pro#rama al ser compilado% En comparaci(n con la estructura definida en el pro#rama clases01.cpp e@isten al#unas diferencias m6nimas .ue m5s adelantediscutiremos%
Después de la declaraci(n de la clase si#ue la definici(n de sus métodos%omo se trata de funciones se aplica lo ,isto en el cap6tulo anterior+ funciones en?? con una e@cepci(n+ en el encabe"ado utili"amos en primer lu#ar el tipo dedato .ue el método de,uel,e se#uido del nombre de la clase a la .ue pertenece elmétodo+ el operador de resoluci(n #lobal /--0 & por *ltimo el nombre del método%El primer método+ llamado asigna( ) toma dos par5metros de tipo float + uno paraasi#nar el ,alor de ,oltae & otro para asi#nar el ,alor de la corriente+ el métodocalcula internamente el correspondiente ,alor para la resistencia & asi#na elresultado a la ,ariable miembro llamada resistencia+ de ésta manera+ elmétodo asigna( ) como su nombre lo indica+ asi#na a las ,ariables miembro de laclase ohm sus respecti,os ,alores de acuerdo a la le& de O$m% El se#undométodo+ llamado muestra( ) simplemente desplie#a en pantalla el resultado de losc5lculos efectuados basados en la le& de O$m%
En la funci(n principal main( ) en primer lu#ar declaramos dos ob6etos de laclase ohm llamados calculo1 & calculo2 en la l6nea MK% En la l6nea MJ se declarande forma tradicional dos ,ariables de tipo float llamadas /olt & ampere% El
pro#rama empie"a solicit5ndole .ue introdu"ca en primer lu#ar el ,alorcorrespondiente al ,oltae & lo almacena en la ,ariable local llamada /olt + lomismo ocurre para el ,alor de la corriente .ue se alamacena en la ,ariable localllamada ampere+ después de ésto el pro#rama efect*a dos c5lculos+ el primero en
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 113/160
la l6nea HH% 4ara el obeto de la clase ohm llamado calculo1llamamos a la funci(nmiembro llamada asigna( ) utili"ando el operador punto /.0 de la misma manera.ue se $ace al utili"ar estructuras+ utili"ando como par5metros los ,alores
pre,iamente almacenados en las ,ariables /olt & ampere% 4ara el obeto de laclase ohm llamado calculo2 a su ,e" llamamos a su método
llamado asigna( ) pero el ,alor correspondiente al primer par5metro lomultiplicamos por H en tanto .ue el ,alor de la corriente lo di,idimos entre +ésto simplemente para tener dos ,alores diferentes & as6 poder distin#uir losresultados obtenidos como se aprecia en la l6nea HK% De ésta manera $emosasi#nado de manera efecti,a los respecti,os ,alores para el calculo1 &el calculo2% En comparaci(n con el pro#rama clases01.cpp Asted podr5 obser,ar.ue es posible efectuar un c5lculo de corriente utili"ando la funci(n miembrollamada amperios( ) pasando como par5metros los ,alores almacenadosen calculo2.corriente & calculo1./olta,e dondo como resultado un ob,io error%Sin embar#o éste error no se detecta al momento de compilar el pro#rama+(mo entonces el pro#rama clases02.cpp resuel,e éste conflictoQ
2ol,er al principio
(iembros public y private
?? define tanto para las estructuras como para las clases tres caracter6sticasaplicables a los miembros de éstas de tal manera .ue puedenser public+ private ( protected+ éstas son palabras cla,e de ??% La palabracla,e public implica .ue es posible tener libre acceso tanto a las ,ariables como alas funciones miembro de un obeto utili"ando el operador punto+ como se $aceen el pro#rama clases01.cpp% 4or el contrario+ la palabracla,e private condiciona el acceso a los miembros de una clase solamenteutili"ando los métodos de la clase en s6% La palabra cla,e protected laestudiaremos m5s adelante% De lo dic$o sealaré la primera diferencia entre unaestructura & una clase en ??+ por defecto+ los miembros de una estructura son decaracter public en tanto .ue los miembros de una clase tienen la
propiedad pri/ate+ con respecto a la clase ohm del pro#rama clases02.cpp las,ariables miembro tienen todas el caracter de pri/ate+ Asted puede ,erificar éstotratando de asi#nar un ,alor de la si#uiente maneraC
calculo1.voltaje + 1B.=; // "66%6, !voltaje! es private
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 114/160
En el pro#rama clases02.cpp solo es posible asi#nar ,alores a las ,ariablesutili"ando el método llamado asigna( ) & ustamente podemos utili"ar éstemétodo por.ue lo $emos declarado como public+ est5 claramente sealado alutili"ar la palabra cla,e public en la l6nea H del pro#rama+ ésto si#nifica .ue enla clase llamada ohm todos los miembros declarados+ sean ,ariables ( métodos en
se#uida de la palabra cla,e public son de libre acceso utili"ando el operador punto% En la 5$$ se dice .ue los miembros de caracter pri/ate constitu&en datos
ocultos+ por lo &a e@puesto+ las ,ariables miembro de la clase ohmest5n ocultas para el resto del pro#rama% Es pr5ctica #eneral en ?? declarar a las ,ariablesmiembro de una clase como pri/ate en tanto .ue a los métodos les corresponde elcaracter de public+ sin embar#o ésto depende de las necesidades propias del
pro#rama% El pro#rama clases02.cpp demuestra claramente la importancia demantener ocultas a las ,ariables miembro+ de ésta manera se e,itan errores dec5lculo atribuibles al diseo del pro#rama% 7arne Stroustrup+ el in,entor de ??dio Los mecanismos de control de acceso de ?? pro,een protecci(n contraaccidentes+ no contra fraudes /)=;+ FFG0% En el arc$i,ocomprimido clases0.ip .ue puede descar#ar al final de éste art6culo encontrar5un pro#rama adicional llamado clases0.cpp .ue le permitir5 comparar lafuncionalidad del pro#rama clases02.cpp pero utili"ando una estructura+ a$ora
bién+ si es posible efectuar el mismo trabao con dos palabras cla,e diferentes+u5l es la ra"(n de la e@istencia de éstas dos entidades aparentemente i#ualesQLa respuesta a ésta pre#unta es de car5cter $ist(rico+ ?? e,olucion( a partir de+ de $ec$o+ el nombre inicial de ?? era con clases% ?? aporta en todocaso una estructura m5s poderosa & adem5s a#re#a el uso de clases .ue como,eremos a continuaci(n tienen caracter6sticas adicionales no compartidas por lasestructuras%
2ol,er al principio
Constructores y destructores
Sabemos &a .ue al declarar ,ariables de clase estamos constru&endo obetos%on frecuencia es con,eniente .ue las ,ariables miembro de una clase seaniniciali"adas a un ,alor espec6fico de acuerdo a las necesidades del pro#rama+éste proceso de iniciali"aci(n ase#ura .ue los datos del pro#rama no conten#an,alores inser,ibles% 4ara iniciali"ar a las ,ariables miembro de clase se utili"a unafunci(n miembro especial llamada constructor% An constructor puede tomar los
par5metros .ue sean necesarios pero no de,uel,e ,alor al#uno+ ni a*n detipo /oid + adem5s+ un constructor lle,a el mismo nombre .ue la clase a la .ue
pertenece% An constructor eecuta todas las instrucciones .ue sean re.ueridas
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 115/160
para el correcto funcionamiento del obeto creado% <aturalmente+ si $ablamos deuna funci(n especial para iniciali"ar los obetos de nuestro pro#rama+ natural es.ue también e@ista una funci(n especial .ue nos a&ude a destruir los obetoscuando no sean &a necesarios+ dic$a funci(n se llamaapropiadamente+ destructor% Ana funci(n destructor no toma par5metros & al
i#ual .ue el constructor + no de,uel,e ,alor al#uno+ adem5s+ el destructor lle,a elmismo nombre de la clase a la .ue pertenece anteponiéndole una tilde /8 0% En el
pro#rama clases02.cpp se utili"( un método llamado asigna( ) para iniciali"ar las,ariables miembro de caracter pri/ate% Ana funci(n constructora $ace éste mismotrabao pero de una manera m5s eficente &a .ue un constructor se eecutaautom5ticamente cada ,e" .ue un obeto sea creado% Similarmente+un destructor se eecuta autom5ticamente cada ,e" .ue un obeto sea destruido%Estas caracter6sticas propias de los constructores & destructores son mu& *tilescuando los obetos $acen uso de los recursos del sistema /por eemplo+ laasi#naci(n din5mica de memoria0 & se re.uiere .ue éstos recursos sean liberados
para un posterior uso% El pro#rama clases0!.cpp demuestra los puntos principalesa considerar para el uso de los constructores & destructoresC
//***********************************************// clasesH.cpp// Xemuestra constructores $ destructores// Y1@@@, Zaime 'irilio ?Kme0 Rerete//***********************************************
#include <iostream.h>
class cuo{ // variales miemro float ancho, fondo, altura; int id; // mJtodo privado int contenido(float uno, float dos, float tres);
pulic // constructor cuo (float anchoTinicial, float fondoTinicial, float alturaTinicial, int identificador); // constructor sorecarado cuo(void); // destructor (oserve la tilde [) [cuo(); // mJtodo para otener el volumen void volumen(float nuevoTancho, float nuevoTfondo, floatnuevoTaltura);-;
// definiciKn del constructor sin parGmetroscuocuo(void)
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 116/160
{ cout << !3onstructor sin parametros...! << endl; ancho + ; fondo + ; altura +; volumen(ancho, fondo, altura);-
// definiciKn del constructor con parGmetroscuocuo(float anchoTinicial, float fondoTinicial, float alturaTinicial, int identificador){ ancho + anchoTinicial; fondo + fondoTinicial; altura + alturaTinicial; cout << !3onstructor del ojeto ! << identificador << endl; volumen(ancho, fondo, altura);-
// definiciKn del destructor
cuo[cuo(){ cout << !Xestructor...! << endl;-
// mJtodo !contenido! (private)int cuocontenido(float uno, float dos, float tres){ return uno : dos : tres;-
// mJtodo !volumen! (pulic)void cuovolumen(float nuevoTancho, float nuevoTfondo, floatnuevoTaltura){ float volTcuo, elementos;
volTcuo + nuevoTancho*nuevoTfondo*nuevoTaltura; elementos + contenido(nuevoTancho, nuevoTfondo, nuevoTaltura);
cout << !"l volumen es ! << volTcuo << endl; cout << !$ contiene ! << elementos << ! pie0as! << endl << endl;-
cuo cajaH(8, 8, 8, H); // una caja loal
// funciKn principal
int main(){ cuo caja1(1, 1, 1, 1), caja(, , , ), caja8; float anchoTlocal, fondoTlocal, alturaTlocal;
cout << !Ruevo ancho para el cuo 1! << endl; cin >> anchoTlocal; cout << !Ruevo fondo para el cuo 1! << endl; cin >> fondoTlocal; cout << !Rueva altura para el cuo 1! << endl;
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 117/160
cin >> alturaTlocal; cout << endl;
cout << !Ruevos valores del cuo 1! << endl; caja1.volumen(anchoTlocal, fondoTlocal, alturaTlocal); // otros valores para el cuo cout << !Ruevos valores del cuo ! << endl; caja.volumen(anchoTlocal:1, fondoTlocal*8, alturaTlocal:);
return ;-
An cuidadoso estudio del c(di#o & los conceptos ser5n f5cilmente asimilados%En este caso tenemos una clase llamada cubo declarada en las l6neas F a la N+contiene tres ,ariables miembro de tipo float & decaracter pri/ate llamadas ancho+ fondo+ altura & una m5s de tipo int llamada id + lafunci(n de ésta *ltima es dar a los obetos un elemento de identificaci(n tal .ueal eecutar el pro#rama nos a&ude a comprender su funcionamiento% An métodode caracter pri/ate llamado contenido( ) determina la cantidad de pie"as .ue cadacaa contiene de acuerdo a los ,alores pasados como par5metros+ el ,alorobtenido es ficticio pero demuestra una caracter6stica interesante como ,eremosm5s adelante% En la secci(n public de la clase encontramos la declaraci(n de un
par de constructores+ uno en la l6nea F .ue toma cuatro par5metros & otro m5s enla l6nea % 4or lo estudiado en el cap6tulo anterior+ 9unciones en ??+ nos damoscuenta .ue la funci(n constructora llamada cubo est5 sobrecar#ada+ el pro#ramallamar5 a la funci(n constructora adecuada en base al n*mero & tipo de
par5metros pasados a la funci(n% En la l6nea H est5 la declaraci(n de la
funci(n destructora+ obser,e .ue lle,a una tilde /8 0 en el nombre% 4or *ltimo+ enla l6nea J tenemos el prototipo del método llamado /olumen( ) .ue sir,e paradeterminar el ,olumen de los obetos de tipo cubo .ue el pro#rama crea%
omo los constructores+ el destructor & los métodos son funciones de ??tenemos en las l6neas MG a la N las respecti,as definiciones .ue el estudiante notendr5 dificultad al#una en comprender% Obser,e .ue en ambos constructores sellama a la funci(n miembro llamada /olumen( )+ en las l6neas MJ & HN+ & .ue no se$ace uso del operador punto para tener acceso a la funci(n% El destructor de$ec$o no $ace otra cosa .ue desple#ar un mensae en pantalla para indicarnos el
momento en .ue se eecuta+ es normal .ue una funci(n destructora no lle,einstrucciones eecutables+ sin embar#o debemos utili"ar una funci(n destructoracada ,e" .ue utili"emos un constructor%
La funci(n constructora se eecuta cada ,e" .ue creamos un obeto detipo cubo+ en la l6nea NH se declara un obeto de éste tipo llamado ca,a!+ mas .uela declaraci(n de una ,ariable parece la llamada a una funci(n+ & en efecto+ lafunci(n .ue estamos llamando es la función constructora de la clase cubo+ como
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 118/160
se puede ,er+ tiene cuatro par5metros+ los primeros tres corresponden de acuerdoal prototipo dado para el constructor+ el anc$o+ el fondo & la altura del cubollamado ca,a!+ el cuarto par5metro tiene la funci(n de identificador% por lo tanto+al declarar al obeto llamado ca,a! se eecuta la funci(n constructora .ue tomacuatro par5metros+ es decir+ la eecuci(n del pro#rama salta de la l6nea NH a la
l6nea HG% Dentro del constructor se asi#nan los respecti,os ,alores para el anc$o+el fondo & la altura de la caa & se llama al método /olumen( )+ l6nea HN+ o sea .uela eecuci(n del pro#rama brinca de la l6nea HN a la JM% En elmétodo /olumen( ) se calcula el ,olumen de la caa & después se llama a lafunci(ncontenido( ) de caracter pri/ate para determinar la cantidad de pie"as .uecontiene la caa% omo &a se dio+ éste ,alor es ficticio+ pero demuestra elconcepto de ocultar información% Obser,e .ue no e@iste mecanismo al#uno .uenos permita conocer el contenido de las caas cuando son éstas creadas+ tampocoes posible llamar al método contenido( ) desde nin#una otra parte del pro#rama.ue no sea desde el interior del método /olumen( )% El concepto de ocultarinformaci(n tiene #ran ,alor en la 5$$% Obser,e adem5s .ue al crear el obetollamado ca,a! el constructor se eecuta incluso antes de la funci(n
principal main( )%
>a en la funci(n principal creamos otras tres caasllamadas ca,a1+ ca,a2 & ca,a+ al crear ésta *ltima se eecuta el constructorcorrespondiente de acuerdo a los par5metros incluidos+ es decir+ nin#uno parala ca,a% El pro#rama le solicita .ue introdu"ca nue,os ,alores para la ca,a1 &llama al método /olumen( ) para calcular las nue,as dimensiones de la caa+ dic$oen otras palabras+ la ca,a1 cambiar5 de tamao & por tanto de contenido% Losnue,os ,alores para la ca,a2 se obtienen de unas sencillas operaciones aritméticasefectuadas con los ,alores dados para la ca,a1+ l6nea FH del pro#rama% Insisto+ elcontenido de la caa constitu&e una ,erdadera sorpresa+ en otras palabras+ elcontenido de las caas se trata como una caa ne#ra% ompile+ eecute &e@perimente con éste pro#rama+ probablemente descubra caracter6sticasadicionales con respecto al uso de los constructores & destructores%
2ol,er al principio
(7todos const
)l declarar un método de clase como de tipo const se d5 la promesa de .ue elmétodo no cambiar5 el ,alor de nin#uno de los miembros de la clase% 4aradeclarar un método de clase como constante se coloca la palabracla,e const después del paréntesis pero antes del s6mbolo de punto & coma+
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 119/160
similarmente se inclu&e en el encabe"ado de la definici(n del método% En el pro#rama clases0!.cpp el método llamado /olumen( ) no puede ser declaradocomo const por.ue éste método asi#na ,alores a las ,ariables miembro+ sinembar#o el método contenido si puede ser declarado como const &a .ue sufunci(n no implica cambiar los datos en la clase+ por lo tanto el método
contenido puede ser declarado as6C
int contenido(float uno, float dos, float tres) const;
La definici(n de éste método ser5 a$ora as6C
// mJtodo !contenido! (private)int cuocontenido(float uno, float dos, float tres) const{ return uno : dos : tres;
-
Atili"ar la palabra cla,e const es de a&uda para e,itar errores en tiempo decompilaci(n+ se considera una buena pr5ctica de pro#ramaci(n declararcomo const a todos a.uellos métodos .ue no afectan a los miembros de una clase+al $acer ésto se establece una especie de contrato con el compilador+ aclaro ésteconcepto% LLamamos clientes a a.uellas partes de un pro#rama .ue crean &utili"an obetos de su clase+ Asted puede pensar en la interfa de la clase+ es decir+la declaraci(n de la clase+ como un contrato con éstos clientes+ éste contratoindica .ué datos de su clase est5n disponibles & c(mo los manear5 su clase% )l
declarar al método contenido( ) como const se est5 estableciendo en el contrato.ue éste método no afectar5 el ,olumen de la caa+ o sea+ el contenido de la caano tiene nada .ue ,er con el tamao de la misma%
2ol,er al principio
9mplementación en línea
omo los métodos de una clase son en realidad funciones+ podemos entoncesindicarle al compilador .ue $a#a éstas funciones en lnea% La palabracla,e inline se coloca antes del tipo de dato .ue la funci(n de,uel,e+ poreemplo+ el método contenido( ) podemos declararlo en lnea de la si#uientemaneraC
// mJtodo !contenido! (private)
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 120/160
inline int cuocontenido(float uno, float dos, float tres) const{ return uno : dos : tres;-
En forma similar podemos $acer el método en l6nea inclu&endo la definici(n
dentro de la declaraci(n de la claseC
class cuo{ // variales miemro float ancho, fondo, altura; int id; // mJtodo privado int contenido(float uno, float dos, float tres) { return uno : dos : tres; - // mJtodo en lMnea
pulic // constructor cuo (float anchoTinicial, float fondoTinicial, float alturaTinicial, int identificador); // constructor sorecarado cuo(void); // destructor (oserve la tilde [) [cuo(); // mJtodo para otener el volumen void volumen(float nuevoTancho, float nuevoTfondo, floatnuevoTaltura);-;
Obser,e .ue para el método llamado contenido( ) en realidad &a no e@iste prototipo+ se elimin( el s6mbolo de punto & coma+ adem5s se insert( el cuerpo dela funci(n inmediatamente después de la declaraci(n del método%
2ol,er al principio
)mpa:uetado
ada funci(n .ue se declara en una clase debe tener una definici(n% ) ladefinici(n también se le llama implementaci(n de la funci(n+ como toda funci(n+la definici(n de un método de clase tiene un encabe"ado & un cuerpo de lafunci(n% La definici(n debe estar en un arc$i,o .ue el compilador puedaencontrar+ éste arc$i,o lle,a por lo #eneral la e@tensi(n B%cpp% Asted tiene lalibertad de poner la declaraci(n del método /el prototipo0 en éste arc$i,o pero
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 121/160
ésto no se considera como una buena pr5ctica de pro#ramaci(n+ lo .ue $acen lama&or6a de los pro#ramadores es poner la declaraci(n del método en un arc$i,ode cabecera .ue lle,a la e@tensi(n B%$ ( B%$pp% 4or eemplo+ podemos colocar ladeclaraci(n del la clase cubo en un arc$i,o de cabecera llamado cubo.h & a lasimplementaciones de las funciones miembro en un arc$i,o llamado cubo.cpp+
después indicamos al preprocesador .ue inclu&a el arc$i,o decabecera cubo.h a#re#ando ésta l6nea en el arc$i,o cubo.cppC
#include !cuo.h!
La declaraci(n de una clase le indica al compilador .ué es la clase+ .ué datosalmacena & .ué funciones desempea% La declaraci(n de una clase es llamada suinterfa" por.ue le indica al usuario c(mo interactuar con la clase% La interfa"#eneralmente se almacena en un arc$i,o de cabecera con la e@tensi(n B%$ (
B%$pp% La definici(n de una funci(n le indica al compilador c(mo trabaa lafunci(n% La definici(n de una funci(n es llamada la implementaci(n del métodode clase & se #uarda en un arc$i,o con la e@tensi(n B%cpp% Los detalles de laimplementaci(n de una clase son de importancia para el desarrollador de lamisma% Los clientes de la clase+ ésto es+ el pro#rama .ue utili"a la clase+ nonecesitan saber c(mo se $an implementado las funciones de la clase%
on referencia al pro#rama clases0!.cpp podemos reordenarlo de la si#uientemanera+ en un arc$i,o de cabecera incluimos la definici(n de la clasellamada cubo+ el arc$i,o se llamar5 entonces cubo.hC
//***********************************************// cuo.h// Xeclara la clase !cuo!// Y1@@@, Zaime 'irilio ?Kme0 Rerete//***********************************************
#include <iostream.h>
class cuo{ // variales miemro float ancho, fondo, altura; int id; // mJtodo privado int contenido(float uno, float dos, float tres) { return uno : dos : tres; - // mJtodo en lMnea
pulic // constructor
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 122/160
cuo (float anchoTinicial, float fondoTinicial, float alturaTinicial, int identificador); // constructor sorecarado cuo(void); // destructor (oserve la tilde [) [cuo(); // mJtodo para otener el volumen void volumen(float nuevoTancho, float nuevoTfondo, floatnuevoTaltura);-;
La implementaci(n de la clase cubo a$ora est5 en un arc$i,ollamado cubo.cpp+ obser,e .ue inclu&e una llamada al preprocesador para indicar .ue ane@e el contenido del arc$i,o llamado cubo.h+ en la l6nea 8%
//***********************************************// cuo.cpp
// mplementaciKn de la clase !cuo!// Y1@@@, Zaime 'irilio ?Kme0 Rerete//***********************************************
#include <iostream.h>#include !cuo.h!
// definiciKn del constructor sin parGmetroscuocuo(void){ cout << !3onstructor sin parametros...! << endl; ancho + ; fondo + ; altura +;
volumen(ancho, fondo, altura);-
// definiciKn del constructor con parGmetroscuocuo(float anchoTinicial, float fondoTinicial, float alturaTinicial, int identificador){ ancho + anchoTinicial; fondo + fondoTinicial; altura + alturaTinicial; cout << !3onstructor del ojeto ! << identificador << endl; volumen(ancho, fondo, altura);-
// definiciKn del destructorcuo[cuo(){ cout << !Xestructor...! << endl;-
// mJtodo !volumen! (pulic)void cuovolumen(float nuevoTancho, float nuevoTfondo, floatnuevoTaltura)
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 123/160
{ float volTcuo, elementos;
volTcuo + nuevoTancho*nuevoTfondo*nuevoTaltura; elementos + contenido(nuevoTancho, nuevoTfondo, nuevoTaltura);
cout << !"l volumen es ! << volTcuo << endl; cout << !$ contiene ! << elementos << ! pie0as! << endl << endl;-
El pro#rama .ue $ace uso de la clase cubo est5 especificado en el c(di#ollamado clases0".cpp+ obser,e .ue es posible crear ,arios pro#ramas diferentes.ue utilicen m5s de una clase+ cada una con un prop(sito diferente% Interesante es$acer notar .ue el arc$i,o cubo.cpp es posible distribuirlo en forma precompiladaen forma de librer6a est5tica+ posiblemente se llamar6a cubo.lib+ de tal manera .uelos usuarios de la clase cubo am5s se enterar6an de c(mo se implementaron losmétodos de la clase% El pro#rama clases0".cpp es el si#uienteC
//***********************************************// clases.cpp// \ace uso de la clase cuo// Y1@@@, Zaime 'irilio ?Kme0 Rerete//***********************************************
#include <iostream.h>#include !cuo.h!
cuo cajaH(8, 8, 8, H); // una caja loal
// funciKn principalint main(){ cuo caja1(1, 1, 1, 1), caja(, , , ), caja8; float anchoTlocal, fondoTlocal, alturaTlocal;
cout << !Ruevo ancho para el cuo 1! << endl; cin >> anchoTlocal; cout << !Ruevo fondo para el cuo 1! << endl; cin >> fondoTlocal; cout << !Rueva altura para el cuo 1! << endl; cin >> alturaTlocal; cout << endl;
cout << !Ruevos valores del cuo 1! << endl; caja1.volumen(anchoTlocal, fondoTlocal, alturaTlocal); // otros valores para el cuo cout << !Ruevos valores del cuo ! << endl; caja.volumen(anchoTlocal:1, fondoTlocal*8, alturaTlocal:);
return ;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 124/160
El $ec$o de separar la declaraci(n de una clase en un arc$i,o de cabecera & laimplementaci(n de sus métodos en otro tiene también un moti,o pr5ctico+ $abr5obser,ado .ue ?? no est5 $ec$o para pro#ramas sencillos pues para efectuartareas relati,amente simples se utili"an una ma&or cantidad de l6neas de c(di#o+la #ran ,entaa de empa.uetar obetos la encontraremos cuando se trate el tema
de la $erencia+ adem5s el empa.uetado facilita la reutili"aci(n de c(di#o & laimplementaci(n de bibliotecas de funciones .ue son dos puntos mu& fuertes en la
pro#ramaci(n en ??%
2ol,er al principio
Lección ;
)ntrada<Salida de arc"ivos
En el cap6tulo trabaamos con fluos de ES $acia los dispositi,os est5ndar por defecto definidos en ?? .ue son el teclado para operaciones de entrada+ & elmonitor para operaciones de salida% )$ora .ue tenemos una meor perspecti,aacerca de .ué son las clases+ cap6tulo M+ es con,eniente dar una repasadaal cap6tulo & en éste art6culo trataremos los principales aspectos de lasoperaciones de ES en arc$i,os%
Operaciones de escritura en arc"ivos
El arc$i,o de cabecera fstream." define lasclases ifstream+ ostream & fstream para operacionesde lectura+ escritura & lectura6escritura en arc$i,os respecti,amente% 4aratrabaar con arc$i,os debemos crear obetos de éstas clases de acuerdo a lasoperaciones .ue deseamos efectuar% Empe"amos con las operaciones de escritura+
para lo cual b5sicamente declaramos un ob,eto de la clase ofstream+ despuésutili"amos la funci(n miembro open para abrir el arc$i,o+ escribimos en el
arc$i,o los datos .ue sean necesarios utili"ando el operador de inserci(n & por*ltimo cerramos el arc$i,o por medio de la funci(n miembro close+ éste procesoest5 ilustrado en nuestro primer pro#rama+ archi/01.cpp%
//***********************************************// archiv1.cpp// Xemuestra la escritura Gsica en archivo// Y1@@@, Zaime 'irilio ?Kme0 Rerete
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 125/160
//***********************************************
#include <fstream.h>
int main(){ ofstream archivo; // ojeto de la clase ofstream
archivo.open(!datos.t4t!);
archivo << !Qrimera lMnea de te4to! << endl; archivo << !7eunda lMnea de te4to! << endl; archivo << !]ltima lMnea de te4to! << endl;
archivo.close(); return ;-
En el pro#rama se $a creado un obeto de la clase ofstream llamado archi/o+
posteriormente se utili"a la funci(n miembro open para abrir el arci,oespecificado en la cadena de te@to .ue se encuentra dentro del paréntesis de lafunci(n% 4or lo ,isto en el cap6tulo M sabemos .ue podemos in,ocar a la funci(nconstructora de clase de tal manera .ue el arc$i,o también se puede abrirutili"ando la si#uiente instrucci(nC
ofstream archivo(!datos.t4t!); // constructora de ofstream
<aturalmente+ al utili"ar la funci(n constructora &a no es necesario utili"ar lafunci(n miembro open+ ésta forma de abrir un arc$i,o es preferida por.ue elc(di#o es m5s compacto & f5cil de leer% De la misma forma .ue se utili"anmanipuladores de salida para modificar la presentaci(n en pantalla de los datosdel pro#rama+ i#ual es posible utili"ar éstos manipuladores al escribir datos en unarc$i,o como lo demuestra el pro#rama archi/02.cpp+ obser,e .ue se utili"a unconstructor para crear & abrir el arc$i,o llamado 7atos.txt C
//***********************************************// archiv.cpp// Xemuestra el uso de manipuladores// Y1@@@, Zaime 'irilio ?Kme0 Rerete
//***********************************************
#include <iostream.h>#include <fstream.h>#include <iomanip.h>
int main(){ ofstream archivo(!Xatos.t4t!); // constructor de ofstream int numero;
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 126/160
cout << !ntrodu0ca un numero! << endl;
cin >> numero; archivo << !"l valor introducido en ase 1 es ! << numero << endl;
archivo << resetiosflas(iosdec); archivo << setiosflas(iosoct); archivo << !en ase octal es ! << numero << endl;
archivo << resetiosflas(iosoct); archivo << setiosflas(ioshe4); archivo << !$ en ase he4adecimal es ! << numero << endl; archivo << setiosflas(iosuppercaseNiosshoase); archivo << !utili0ando los manipuladores uppercase $ shoase! ! el valor es ! << numero << endl;
archivo << resetiosflas(iosuppercaseNiosshoase);
archivo << resetiosflas(ioshe4); archivo << setiosflas(iosshoposNiosshopointNiosfi4ed); archivo << !Wtili0ando los manipuladores shopos,! ! shopoint $ fi4ed ! << (float)numero << endl;
archivo << resetiosflas(iosshoposNiosshopointN
iosfi4ed); archivo << !Finalmente el valor es ! << numero << endl;
archivo.close();
return ;-
(odos de apertura de arc"ivo
)l especificar la apertura de un arc$i,o como se $a mostrado en los pro#ramas anteriores+ el pro#rama sobreescribe cual.uier arc$i,o e@istentellamado 7atos.txt en el directorio de trabao del pro#rama% Dependiendo del
prop(sito del pro#rama es posible .ue sea necesario a#re#ar datos a los &ae@istentes en el arc$i,o+ o .ui"5 sea necesario .ue las operaciones del pro#ramano se lle,en a cabo en caso de .ue el arc$i,o especificado e@ista en el disco+ paraéstos casos podemos especificar el modo de apertura del arc$i,o inclu&endo un
par5metro adicional en el constructor+ cual.uiera de los si#uientesC
• ios--app Operaciones de aadidura%
• ios--ate oloca el apuntador del arc$i,o al final del mismo%
• ios--in Operaciones de lectura% Esta es la opci(n por defecto para obetosde la clase ifstream%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 127/160
• ios--out Operaciones de escritura% Esta es la opci(n por defecto paraobetos de la clase ofstream%
• ios--nocreate Si el arc$i,o no e@iste se suspende la operaci(n%
• ios--noreplace rea un arc$i,o+ si e@iste uno con el mismo nombre laoperaci(n se suspende%
• ios--trunc rea un arc$i,o+ si e@iste uno con el mismo nombre lo borra%
• ios--binary Operaciones binarias%
De esta manera+ podemos modificar el modo de apertura del pro#rama archi/02.cpp para .ue los datos del pro#rama se concatenen en el
arc$i,o 7atos.txt simplemente escribiendo el constructor as6Cofstreamarchivo(!Xatos.t4t!, iosapp);% Si deseamos .ue el pro#rama no sobreescribaun arc$i,o e@istente especificamos el constructor de ésta maneraC ofstreamarchivo(!Xatos.t4t!, iosnoreplace);% Atili"ando los especificadores de modode apertura se puede conse#uir un ma&or control en las operaciones de ES enarc$i,os%
2ol,er al principio
Operaciones de lectura de arc"ivos
4ara abrir un arc$i,o & reali"ar operaciones de lectura se crea un obeto de laclase ifstream & se procede pr5cticamente de la misma forma .ue lo e@puesto enel apartado anterior% Después de abrir el arc$i,o se puede leer su contenidoutili"ando las funciones miembro de la clase ifstream o bién el operador dee@tracci(n% uando se lee un arc$i,o+ por lo #eneral se empie"a al principio delmismo & se leer5 su contenido $asta .ue se encuentre el final del arc$i,o% 4aradeterminar si se $a lle#ado al final del arc$i,o se puede utili"ar la funci(n
miembro eof como condici(n de un bucle while% )dem5s se puede utili"ar lafunci(n miembro fail para detectar un error al abrir el arc$i,o+ esto se demuestraen el si#uiente pro#rama+ archi/0.cppC
//***********************************************// archiv8.cpp// Xemuestra operaciones de lectura de archivos// Y1@@@, Zaime 'irilio ?Kme0 Rerete
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 128/160
//***********************************************
#include <fstream.h>
int main(){ ifstream archivo(!Cesos.t4t!, iosnoreplace); char lineaO1=P; lon contador + A;
if(archivo.fail()) cerr << !"rror al arir el archivo Cesos.t4t! << endl; else hile(Varchivo.eof()) { archivo.etline(linea, si0eof(linea)); cout << linea << endl; if((::contador H)++) { cout << !3%R5RW2...!;
cin.et(); - - archivo.close(); return ;-
El pro#rama crea un obeto de la clase ifstream para abrir el arc$i,ollamado 8esos.txt utili"ando el constructor de clase & especificando la
bandera ios##noreplace .ue e,ita .ue el arc$i,o sea sobreescrito% Si por al#*nmoti,o ocurre un error al abrir el arc$i,o se #enera el mensae de error
especificado en la l6nea J% En ausencia de errores el pro#rama entra en un bucle while el cual est5 e,aluado por efecto de la funci(n miembro eof( ) de talmanera .ue el bucle se eecuta $asta encontrar el final del arc$i,o% Atli"ando lafunci(n miembro getline( ) se obtiene una l6nea de te@to & se e@$ibe en pantalla+l6nea + lue#o utili"amos una instrucci(n condicional if con el operador dem(dulo /=0 para determinar si se $an le6do H l6neas de te@to% ada ,e" .ue elcontador de l6neas di,idido entre H dé como resultado un res6duo de cero el
pro#rama se detiene permitiendo leer las H l6neas de te@to pre,ias% 4aracontinuar se debe presionar la tecla enter & entonces el pro#rama leer5 & mostrar5en pantalla las si#uientes H l6neas de te@to+ l6neas a la J%
Anali'ando el 7>ito de )<S de arc"ivos
En el pro#rama archi/0.cpp se utili"( la funci(n miembro fail( ) paradeterminar el é@ito de la operaci(n de apertura del arc$i,o 8esos.txt % La funci(nmiembro fail( ) produce el ,alor de si ocurre un error en la operaci(n dearc$i,o% Similarmente es recomendable utili"ar otras funciones para ,erificar no
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 129/160
solo la apertura de arc$i,o sino también las operaciones de lectura & escritura+ lasfunciones miembro .ue nos permiten éstas pruebas son las si#uientesC
• #ood 4roduce un si la operaci(n pre,ia fué e@itosa%
• eof 4roduce un si se encuentra el final del arc$i,o%
• fail 4roduce un si ocurre un error%
• bad 4roduce un si se reali"a una operaci(n in,5lida%
Tres de las cuatro funciones enlistadas .uedan demostradas en el si#uiente pro#rama llamado archi/0!.cpp el cual copia el contenido del arc$i,ollamado 8esos.txt en uno llamado Copia.txt % En primer lu#ar se crea un obeto dela clase ifstream llamado origen .ue nos sir,e para abrir el arc$i,o 8esos.txt paraoperaciones de lectura+ la funci(n miembro origen.fail( ) nos indica la e@istenciade un error+ en caso de .ue éste e@ista se desplie#a un mensae en pantalla & el
pro#rama termina% Si la apertura del arc$i,o 8esos.txt fué e@itosa se procedeentonces a la si#uiente parte del pro#rama donde se crea un obeto de laclase ofstream llamado destino para operaciones de escritura el cual especifica.ue el arc$i,o a crear se llamar5 Copia.txt & de acuerdo a la
bandera ios##noreplace+ si e@iste un documento con el nombre de Copia.txt lafunci(n constructora fallar5+ éste proceso es detectado por la funci(nmiembro destino.fail( ) desple#ando un mensae en pantalla & terminando el
pro#rama% archi/0!.cpp es un pro#rama .ue sir,e para copiar un arc$i,o basadoen caracteres )SII%
//*********************************************************// archivH.cpp// Xemuestra J4ito en operaciones de "/7 de archivos// Y1@@@, Zaime 'irilio ?Kme0 Rerete//*********************************************************
#include <fstream.h>#include <stdli.h>
int main(){ ifstream orien(!Cesos.t4t!); char lineaO1=P;
if(orien.fail()) cerr << !"rror al arir el archivo Cesos.t4t! << endl; else { ofstream destino(!3opia.t4t!, iosnoreplace);
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 130/160
if(destino.fail()) cerr << !"rror al crear el archivo &!3opia.t4t&!! << endl; else { hile(Vorien.eof()) { orien.etline(linea, si0eof(linea)); if(orien.ood()) // si lectura oD $ if(orien.eof()) // si eof, U> termina e4it(1); // el prorama else destino << linea << endl; if(destino.fail()) { cerr << !Fallo de escritura en archivo! << endl; e4it(1); - -
- destino.close(); - orien.close();
return ;-
En caso .ue las operaciones de apertura de los arc$i,os in,olucrados en el pro#rama archi/0!.cpp sean e@itosas+ entonces se inicia un bucle en donde se leeen primer lu#ar una l6nea de te@to+ l6nea N del pro#rama+ el é@ito de éstaoperaci(n es monitoreado por la funci(n miembro origen.good( )+ si ésta funci(nindica .ue la lectura del arc$i,o fué e@itosa entonces la funci(nmiembro origen.eof( ) ,erifica si la l6nea en cuesti(n es el final del arc$i,o+ si noes as6+ entonces la l6nea le6da se escribe en el arc$i,o Copia.txt + entonces lecorresponde a la funci(n miembro destino.fail( ) ,erificar .ue el proceso deescritura tu,o é@ito+ l6nea MM del pro#rama% El bucle se repite $asta encontrar elfinal del arc$i,o+ condici(n .ue se ,erifica tanto en la linea K como en la F del
pro#rama%
2ol,er al principio
Operaciones con arc"ivos binarios
Las operaciones de fluos de arc$i,os se eecutan en forma predeterminada enmodo de te@to+ sin embar#o $a& ocasiones en donde se re.uiere reali"aroperaciones en arc$i,os binarios+ como sucede con arc$i,os de estructuras de
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 131/160
datos ( a.uellos .ue contienen datos numéricos de punto flotante% ) manera de prueba trate de relai"ar una copia de un arc$i,o eecutable utili"ando el pro#rama archi/0!.cpp+ se dar5 cuenta .ue si bién+ el pro#rama no marca errores+el resultado sencillamente no es el esperado% La prueba definiti,a es comparar eltamao en b&tes del arc$i,o ori#inal contra el tamao del arc$i,o copiado%
El pro#rama archi/0".cpp eecuta operaciones de ES en arc$i,os utili"ando elmodo binario /ios##binar0+ éste pro#rama puede copiar efecti,amente un arc$i,oeecutable+ en el eemplo 9rchi/0!.:;: + #enerando un nue,o arc$i,ollamado Copia.:;: + el nue,o c(di#o+ basado en archi/0!.cpp es el si#uienteC
//*********************************************************// archiv.cpp// Xemuestra operaciones con archivos inarios// Y1@@@, Zaime 'irilio ?Kme0 Rerete
//*********************************************************
#include <fstream.h>#include <stdli.h>
int main(){ ifstream orien(!2rchivH.e4e!, iosinar$); char lineaO1P;
if(orien.fail()) cerr << !"rror al arir el archivo 2rchivH.e4e! << endl; else {
ofstream destino(!3opia.e4e!, iosinar$); if(destino.fail()) cerr << !"rror al crear el archivo &!3opia.e4e&!! << endl; else { hile(Vorien.eof()Vorien.fail()) { orien.read(linea, si0eof(linea)); if(orien.ood()) { destino.rite(linea, si0eof(linea)); if(destino.fail())
{ cerr << !"rror en el archivo &!3opia.e4e&!! << endl; e4it(1); - - else if(Vorien.eof()) { cerr << !"rror en el archivo &!2rchivH.e4e&!! << endl;
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 132/160
e4it(1); - - - destino.close(); - orien.close();
return ;-
Obser,ar5 .ue se utili"a la funci(n miembro origen.read( ) para leer un b&tedel arc$i,o especificado por el obeto de la clase ifstream llamado origen+ l6neaN% En forma similar+ se utili"a la funci(n miembro destino.write( ) para escribirun b&te en el arc$i,o especificado para el obeto de laclase ofstream llamado Copia.:;: + l6nea MG del pro#rama% La comprobaci(n delas operaciones de ES se reali"an como se indic( para el pro#rama archi/0!.cpp%
Si se desea utili"ar los operadores de inserci(n & e@tracci(n para operaciones deES en arc$i,os binarios se re.uiere sobrecar#ar éstos operadores+ ésto lotrataremos m5s adelante cuando se aborde el tema de la sobrecar#a de operadoresen ??%
2ol,er al principio
Lectura y escritura en un arc"ivo
!asta este punto $emos efectuado operaciones+ sea de escritura o bién delectura en un arc$i,o+ tanto en formato de te@to como en formato binario perotoda,6a no se $an efectuado 5mbas operaciones en un mismo arc$i,o% En ciertasaplicaciones es necesario efectuar operaciones de lecturaescritura en un arc$i,ocomo es el caso de una base de datos+ para esto es necesario crear un obeto de laclase fstream% uando un pro#rama abre un arc$i,o para operaciones de ES éstemantiene el re#istro de dos apuntadores de arc$i,o+ uno para operaciones delectura & otro para operaciones de escritura% omo en la ma&or6a de los casos en.ue se abre un arc$i,o para operaciones de ES se efect*a acceso aleatorio+
anali"aremos ésta condici(n%Acceso aleatorio de arc"ivos
En los pro#ramas presentados $asta este punto se $an reali"adosoperaciones secuenciales en el arc$i,o+ &a sea para escritura ( lectura de datos+empe"ando por el principio & continuando $asta el final del mismo% Lasoperaciones aleatorias en un arc$i,o no necesariamente inician por el principio
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 133/160
del arc$i,o+ en lu#ar de ésto es posible despla"arse por el contenido del arc$i,o para reali"ar una operaci(n de ES% 4ara mo,er los apuntadores de arc$i,o a posiciones espec6ficas se utili"an dos funcionesC see?#+ , coloca el apuntador deescritura de arc$i,o en un lu#ar espec6fico+ & see?p+ , mue,e el apuntador delectura a una posici(n espec6fica en el arc$i,o+ la sint5@is de las funciones es
éstaC
• seeDp(despla0amiento, posicion)
• seeD(despla0amiento, posicion)
El par5metro desplaamiento especifica la cantidad de b&tes .ue semo,er5 el apuntador de arc$i,o+ puede ser un ,alor positi,o ( ne#ati,o% El
par5metro posicion especifica el lu#ar del arc$i,o a partir del cual semo,er5 el apuntador de arc$i,o+ de acuerdo a las si#uientes banderas
• ios::beg Desde el principio del arc$i,o
• ios::cur Desde la posici(n actual del apuntador
• ios::end Desde el fin del arc$i,o
4ara demostrar las operaciones aleatorias con,iene #enerar un bre,earc$i,o de te@to en donde poder efectuar al#unas operaciones de ES+ useel si#uiente c(di#oC
//***********************************************// letras.cpp// ?enera un aecedario// Y1@@@, Zaime 'irilio ?Kme0 Rerete//***********************************************
#include <fstream.h>
int main(){ ofstream archivo(!Aetras.t4t!);
for(char letra+2; letra <+S; letra::) archivo << letra; archivo.close();
return ;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 134/160
El c(di#o #enera un alfabeto en el arc$i,o llamado <etras.txt + a$orautili"aremos el pro#rama archi/04.cpp para na,e#ar por el contenido delarc$i,o & #enerar una palabra ami#able en pantallaC
//*********************************************************// archiv9.cpp// Xemuestra lectura $ escritura en un archivo// Y1@@@, Zaime 'irilio ?Kme0 Rerete//*********************************************************
#include <fstream.h>
int main(){ char letra; fstream letras(!Aetras.t4t!, iosinNiosout);
letras.seeD(B, iose); // otiene la letra \
letra+letras.et(); letras.seeDp(, iosend); letras << letra; // coloca la letra al final
letras.seeD(U18, iosend); // otiene la letra % letra + letras.et(); letras.seeDp(, iosend); letras << letra;
letras.seeD(U1B, iosend); // otiene la letra A letra + letras.et(); letras.seeDp(, iosend); letras << letra;
letras.seeD(, iose); // otiene la letra 2 letra + letras.et(); letras.seeDp(, iosend); letras << letra;
letras.seeD(UH, iosend); hile(Vletras.eof()) cout.put((char)letras.et());
letras.close();
return ;-
Obser,e .ue para posicionar el apuntador de lectura de arc$i,o a partirdel fin del mismo se utili"a un n*mero ne#ati,o & adem5s la lecturaa,an"a $acia el final del arc$i,o% 4or la naturale"a del
pro#rama archi/04.cpp solo desple#ar5 el mensae =$<9 en pantalla unasola ,e"+ esto es por.ue las letras .ue forman la palabra !OL) se leendel arc$i,o & a su ,e" se escriben al final del mismo+ el c(di#o toma en
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 135/160
cuenta las letras pre,iamente escritas+ lineas F a la M% 4ara un meorentendimiento del funcionamiento del pro#rama utilice el depurador deerrores de su compilador en la modalidad de paso por paso%
2ol,er al principio
Salida a impresora
De la misma manera en .ue es posible escribir la salida en un arc$i,o+$abr5 ocasiones en las .ue es necesario producir constancia en papelutili"ando una impresora% En #eneral es posible tratar a la impresora comouno m5s de los dispositi,os disponibles para la salida de datos+ se crea unobeto de la clase ofstream especificando como nombre de arc$i,o la
palabra P42+ tal & como lo demuestra el *ltimo pro#rama de éstecap6tulo+ archi/0>.cppC
//***********************************************// archivB.cpp// Xemuestra la salida a impresora// Y1@@@, Zaime 'irilio ?Kme0 Rerete//***********************************************
#include <fstream.h>#include <stdli.h>
int main(){ char te4toO9P; ofstream impresora(!Q6R!); ifstream archivo(!Cesos.t4t!);
if (archivo.fail()) cerr << !"rror al arir el archivo &!Cesos.t4t&!! << endl; else { hile (Varchivo.eof()) {
archivo.etline(te4to, si0eof(te4to)); if (archivo.ood()) { impresora << te4to << endl; if (impresora.fail()) { cerr << !"rror de escritura en impresora! << endl; e4it(1);
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 136/160
- - else if (Vimpresora.eof()) { cerr << !"rror al leer el archivo &!Cesos.t4t&!! << endl; e4it(1); - - archivo.close(); impresora.close(); -
return ;-
2ol,er al principio
Lección @
Pro#ramando en CEncapsulado II
El encapsulado prote#e a los datos de daos accidentales & los constructores#aranti"an una adecuada iniciali"aci(n+ ambos pre,ienen errores .ue todosestamos e@puestos a cometer &a .ue al escribir una clase pensamos s(lo en losaspectos internos de la misma+ posteriormente+ al utili"arla no necesitamos
preocuparnos por los detalles de la clase+ concentrandonos en resol,er el problema .ue enfrentamos al momento% omo podr5 adi,inar+ e@isten muc$osm5s aspectos .ue debemos tratar respecto al uso & beneficios de las clases% El
prop(sito de éste cap6tulo es ilustrar al#unos de los aspectos de ( ?? con lasclases & obetos% En orden de un estudio sistem5tico+ utili"aremos como punto de
partida el *ltimo pro#rama de eemplo del cap6tulo anterior%
&n array de ob6etos
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 137/160
En el primer c(di#o de eemplo de este cap6tulo anali"aremos el concepto de unarra& de obetos+ obser,e .ue $emos declarado un arra& de H caas /#rupo;B0 enla l6nea MFC
#include <iostream.h>class caja{ int lonitud; int ancho; static int datoTe4tra; // Xeclaracion de datoTe4tra pulic caja(void); // 3onstructor void coloca(int nuevoTlonitud, int nuevoTancho); int area(void); int e4tra(void) {return datoTe4tra::;--;
int cajadatoTe4tra; // Xefinicion de datoTe4tra
cajacaja(void) // mplementacion del constructor{ lonitud + =; ancho + =; datoTe4tra + 1;-
// "ste metodo coloca un tama^o de caja a los dos parametros de entradavoid cajacoloca(int nuevoTlonitud, int nuevoTancho){ lonitud + nuevoTlonitud;
ancho + nuevoTancho;-
// "ste metodo calcula $ retorna el area de una instancia de cajaint cajaarea(void){ return (lonitud * ancho);-
int main(){ caja chica, mediana, rande, rupoOHP; // 7iete cajas paratraajar chica.coloca(, B);
rande.coloca(1, );
for (int indice + 1 ; indice < H ; indice::) //rupoOP usa eldefault rupoOindiceP.coloca(indice : 1, 1);
cout << !"l area de caja chica es ! << chica.area() << !&n!; cout << !"l area de caja mediana es ! << mediana.area() << !&n!; cout << !"l area de caja rande es ! << rande.area() << !&n!;
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 138/160
for (indice + ; indice < H ; indice::) cout << !"l arra$ area caja es ! << rupoOindiceP.area() << !&n!;
cout << !"l valor de datos e4tra es ! << chica.e4tra() << !&n!; cout << !"l valor de datos e4tra es ! << mediana.e4tra() << !&n!; cout << !"l valor de datos e4tra es ! << rande.e4tra() << !&n!;
cout << !"l valor de datos e4tra es ! << rupoOP.e4tra() << !&n!; cout << !"l valor de datos e4tra es ! << rupoO8P.e4tra() << !&n!;
return ;-
=especto al funcionamiento del constructor recordar5 .ue cada uno de los cuatroobetos ca6a ser5n iniciali"ados a los ,alores definidos dentro del constructor &a.ue el constructor ser5 eecutado para cada obeto ca6a definido% 4ara definir unarra& de obetos debemos disponer de un constructor sin par5metros para dic$oobeto% /)*n no $emos ilustrado un constructor con par5metros de iniciali"aci(n
pero lo $aremos en el pr(@imo eemplo0% Esto es una consideraci(n de eficiencia&a .ue probablemente ser6a un error iniciali"ar todos los elementos de un arra& deobetos al mismo ,alor%En la l6nea HM tenemos un bucle for .ue empie"a con + deando .ue el primerobeto llamado #rupoB+ utilice el ,alor almacenado por default cuando se llam(al constructor% Obser,e .ue al en,iar un mensae a uno de los obetos se utili"a elmismo constructor como con cual.uier obeto+ el nombre del arra& se#uido de su6ndice entre corc$etes se utili"a para en,iar un mensae a uno de los obetos delarra&+ como se demuestra en la l6nea HH% Otro método es llamado en losenunciados de salida en la l6nea K donde el area de las cuatro caas en el
arra& #rupo son enlistadas en el monitor%
0eclaración y definición de una variable
) manera de ilustraci(n se $a incluido una ,ariable adicionalllamada datoDe>tra en la l6nea N+ como se $a utili"ado la palabracla,e static para modificar ésta ,ariable+ es por lo tanto una ,ariable e@terna &solo e@istir5 una copia de la misma% Los siete obetos de esta clase compartir5nuna sola copia de la ,ariable la cual es #lobal para los obetos definidos en lal6nea MF% La ,ariable $a sido declarada lo .ue nos dice .ue e@iste en al#*n lu#ar+
pero a*n no $a sido definida% Ana declaraci(n nos indica la e@istencia de la,ariable & le asi#na un nombre+ pero la definici(n+ ,al#a la redundancia+ defineun lu#ar para almacenarla dentro del espacio de memoria de la computadora% 4ordefinici(n+ una ,ariable est5tica puede ser declarada en el encabe"ado de unaclase pero no puede ser definida a$6+ por lo #eneral se $ace en el arc$i,o deimplementaci(n% En este caso se $a definido en la l6nea K & por lo tanto puedeutili"arse en toda la clase%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 139/160
2ol,er al principio
&na cadena dentro de un ob6eto
En el si#uiente pro#rama ,eremos el primer eemplo de un obeto con una cadenaincrustada+ bueno+ en realidad contiene un puntero incrustado+ pero como ambosfuncionan de manera similar+ estudiar uno nos lle,a a comprender al otro+ elc(di#o es el si#uienteC
#include <iostream.h>
class caja{
int lonitud; int ancho; char *lineaTdeTte4to; pulic caja(char *lineaTdeTentrada); // 3onstructor void coloca(int nuevaTlonitud, int nuevoTancho); int otieneTarea(void);-;
cajacaja(char *lineaTdeTentrada) // mplementacion delconstructor{ lonitud + =; ancho + =;
lineaTdeTte4to + lineaTdeTentrada;-
// "ste metodo determina el tama^o de la caja seun los parametros deentradavoid cajacoloca(int nuevaTlonitud, int nuevoTancho){ lonitud + nuevaTlonitud; ancho + nuevoTancho;-
// 3alcula $ retorna el area de una instancia de cajaint cajaotieneTarea(void)
{ cout << lineaTdeTte4to << !+ !; return (lonitud * ancho);-
int main(){ caja chica(!caja chica !), mediana(!caja mediana !), rande(!cajarande !);
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 140/160
chica.coloca(, B); rande.coloca(1, );
cout << !"l area de la !; cout << chica.otieneTarea() << !&n!; cout << !"l area de la !; cout << mediana.otieneTarea() << !&n!;
cout << !"l area de la !; cout << rande.otieneTarea() << !&n!;
return ;-
La l6nea N contiene un puntero a un c"ar llamado lineaDdeDte>to% El constructorlle,a un par5metro de entrada llamado lineaDdeDentrada el cual es un puntero auna cadena la cual ser5 copiada a la cadena llamada lineaDdeDte>to dentro delconstructor% Asted puede obser,ar .ue al momento de definir las tres caas $emos
aadido una cadena constante como par5metro en cada declaraci(n la cual esutili"ada por el constructor como los datos a los cuales seala el puntero% uandollamamos a obtieneDarea+ , el las l6neas H a HN+ desple#amos el mensae & elarea es retornada% Es prudente poner estas operaciones en métodos diferentes &a.ue no $a& una aparente cone@i(n entre desple#ar el mensae & calcular el area+
pero se $a escrito de ésta manera con prop(sito de ilustraci(n% Lo .ue éstosi#nifica es la posibilidad de tener un método con un efecto lateral+ el mensaedesple#ado en el monitor & el ,alor retornado+ es decir+ el area de la caa%omplile & eecute éste pro#rama para un meor entendimiento de sufuncionamiento%
2ol,er al principio
&n ob6eto con un puntero interno
!a#amos unas modificaciones a nuestro c(di#o para presentar un eemplo de un puntero incrustado el cual ser5 utili"ado para asi#nar datos din5micamente+ elc(di#o es a$oraC
#include <iostream.h>
class caja{ int lonitud; int ancho; int *puntero; pulic
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 141/160
caja(void); // 3onstructor void coloca(int nuevaTlonitud, int nuevoTancho, intvalorTalmacenado); int otieneTarea(void) {return lonitud * ancho;- //mplementacion en linea int otieneTvalor(void) {return *puntero;- //mplementacion en linea
[caja(); // Xestructor-;
cajacaja(void) // mplementacion del constructor{ lonitud + =; ancho + =; puntero + ne int; *puntero + 11;-
// "ste metodo determina el tama^o de la caja seun los parametros deentrada
void cajacoloca(int nuevaTlonitud, int nuevoTancho, intvalorTalmacenado){ lonitud + nuevaTlonitud; ancho + nuevoTancho; *puntero + valorTalmacenado;-
caja[caja(void) // Xestructor{ lonitud + ; ancho + ; delete puntero;-
int main(){ caja chica, mediana, rande;
chica.coloca(, B, 1BB); rande.coloca(1, , @@@);
cout << !"l area de la caja chica es ! << chica.otieneTarea() <<!&n!; cout << !"l area de la caja mediana es ! << mediana.otieneTarea() <<!&n!; cout << !"l area de la caja rande es ! << rande.otieneTarea() <<
!&n!; cout << !"l valor almacenado en caja chica es ! <<chica.otieneTvalor() << !&n!; cout << !"l valor almacenado en caja mediana es ! <<mediana.otieneTvalor() << !&n!; cout << !"l valor almacenado en caja rande es ! <<rande.otieneTvalor() << !&n!;
return ;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 142/160
En la l6nea N declaramos un puntero a una ,ariable de tipo int+ pero s(lo es un puntero+ no $a& espacio para almacenamiento asociado a él% El constructor portanto ubica una ,ariable de tipo entero en la pila /$eap0 para utili"arla con el
puntero en la l6nea G% debe .uedarle claro .ue los tres obetos definidos en lal6nea H cada uno contiene un puntero el cual seala a tres diferentes ubicaciones
en la pila /$eap0+ cada obeto tiene su propia ,ariable ubicada din5micamente para su uso pri,ado+ m5s a*n+ cada una tiene almacenada el ,alor de por.uela l6nea almacena ese ,alor en cada una de las tres ubicaciones+ una por cadallamada al constructor% En un pro#rama tan pe.ueo no $a& manera de desbordarla pila as6 .ue no se re.uiere una prueba de disponibilidad de memoria%El método llamado coloca + , tiene asociado tres par5metros siendo el tercero elutili"ado para asi#nar el ,alor a la nue,a ,ariable din5micamente ubicada% Lastres areas se desplie#an se#uidas por los ,alores almacenados en las ,ariableadin5micamente ubicadas% En éste pro#rama es necesario el uso de un destructor&a .ue sin éste+ al terminar el pro#rama principal dear6amos tres ,ariablesdin5micamente ubicadas en la pila sin nin#*n puntero .ue seale a ellas+ ser6aninaccesibles & ocupar6an espacio en memoria sin pro,ec$o+ por esta ra"(nutili"amos el destructor para delete /borrar0 la ,ariable a la .ue se refiere el
puntero llamado puntero+ en este caso+ las l6neas MH & MK asi#nan cero a las,ariables .ue ser5n autom5ticamente borradas+ aun.ue no absolutamentenecesarias+ son enunciados permitidos en ??%
2ol,er al principio
&n ob6eto ubicado dinámicamente
<ue,amente modificamos el c(di#o de eemplo para mostrar un obeto ubicadodin5micamente+ estudie el si#uiente eemploC
#include <iostream.h>
class caja{
int lonitud; int ancho; pulic caja(void); // 3onstructor void coloca(int nuevaTlonitud, int nuevoTancho); int otieneTarea(void);-;
cajacaja(void) // mplementacion del constructor{
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 143/160
lonitud + =; ancho + =;-
// "ste metodo determina el tama^o de la caja seun los parametros deentradavoid cajacoloca(int nuevaTlonitud, int nuevoTancho)
{ lonitud + nuevaTlonitud; ancho + nuevoTancho;-
// "ste metodo calcula $ retorna el area de una instancia de cajaint cajaotieneTarea(void){ return (lonitud * ancho);-
int main(){
caja chica, mediana, rande; caja *puntero;
chica.coloca(, B); rande.coloca(1, );
puntero + ne caja;
cout << !"l area de la caja chica es ! << chica.otieneTarea() <<!&n!; cout << !"l area de la caja mediana es ! << mediana.otieneTarea() <<!&n!; cout << !"l area de la caja rande es ! << rande.otieneTarea() <<!&n!; cout << !Aa nueva area de caja es ! << punteroU>otieneTarea() <<!&n!; punteroU>coloca(1, 1); cout << !Aa nueva area de caja es ! << punteroU>otieneTarea() <<!&n!;
delete puntero;
return ;-
En la l6nea MK definimos un puntero a un obeto de tipo ca6a & como s(lo es un
puntero con nada a .ué sealar+ ubicamos din5micamente un obeto para este puntero en la l6nea HG+ con el obeto creado en la pila /$eap0 como cual.uier,ariable ubicada din5micamente% uando el obeto es creado en la l6nea HG+ elconstructor es llamado autom5ticamente para asi#nar ,alores a las dos ,ariablesde almacenamiento internas+ obser,e .ue el constructor no es llamado durante ladefinici(n del puntero &a .ue no $a& nada .ue iniciali"ar+ es llamado al ubicar elobeto%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 144/160
La referencia a los componentes del obeto son maneados de una manera similara como se $ace en las estructuras+ utili"ando el operador de puntero como seilustra en las l6neas HK a HN% 9inalmente+ el obeto es borrado en la l6nea HF & el
pro#rama termina% ) estas alturas $abr5 notado .ue el uso de obetos es similar alas estructuras%
2ol,er al principio
&n ob6eto con un puntero a otro ob6eto
La si#uiente modificaci(n a nuestro pro#rama nos muestra un obeto con unareferencia interna a otro obeto de su propia claseC
#include <iostream.h>
class caja{ int lonitud; int ancho; caja *otraTcaja; pulic caja(void); // 3onstructor void coloca(int nuevaTlonitud, int nuevoTancho); int otieneTarea(void); void apuntaTalTsiuiente(caja *dondeTapuntar); caja *otieneTsiuiente(void);-;
cajacaja(void) // mplementacion del constructor{ lonitud + =; ancho + =; otraTcaja + RWAA;-
// "ste metodo determina el tama^o de la caja seun los parametros deentradavoid cajacoloca(int nuevaTlonitud, int nuevoTancho){
lonitud + nuevaTlonitud; ancho + nuevoTancho;-
// "ste metodo calcula $ retorna el area de una instancia de cajaint cajaotieneTarea(void){ return (lonitud * ancho);-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 145/160
// "ste metodo olia al puntero a se^alar al parametro de entradavoid cajaapuntaTalTsiuiente(caja *dondeTapuntar){ otraTcaja + dondeTapuntar;-
// "ste metodo retorna la caja se^alada
caja *cajaotieneTsiuiente(void){ return otraTcaja;-
int main(){ caja chica, mediana, rande; caja *cajaTpuntero;
chica.coloca(, B); rande.coloca(1, );
cout << !"l area de la caja chica es ! << chica.otieneTarea() <<!&n!; cout << !"l area de la caja mediana es ! << mediana.otieneTarea() <<!&n!; cout << !"l area de la caja rande es ! << rande.otieneTarea() <<!&n!; chica.apuntaTalTsiuiente(mediana); mediana.apuntaTalTsiuiente(rande); cajaTpuntero + chica; cajaTpuntero + cajaTpunteroU>otieneTsiuiente(); cout << !Aa caja senalada tiene una area de ! << cajaTpunteroU>otieneTarea() << !&n!;
return ;-
El constructor contiene el enunciado .ue asi#na al puntero el ,alor de <ALL parainiciali"arlo en la l6nea G% Es buena idea iniciali"ar los punteros de sus
pro#ramas a al#o% En las l6neas & M declaramos dos métodos adicionales+ elde la l6nea M no se $a mencionado a*n en este tutorial+ éste método re#resa un
puntero a un obeto de la clase ca6a% omo Asted sabe+ es posible re#resar un puntero a una estructura en & el método de la l6nea M es la construcci(ne.ui,alente en ??% La implementaci(n en las l6neas H a la HK re#resa el
puntero almacenado como una ,ariable miembro dentro del obeto%
An puntero adicional llamado ca6aDpuntero est5 definido en el pro#rama principal para usarse posteriormente & en la l6nea KF $acemos el punteroincrustado dentro de ca6a c"ica sealando a ca6a mediana% En la l6nea JG$acemos .ue el puntero incrustado en ca6a mediana seale a ca6a #rande%!emos #enerado efecti,amente una lista enla"ada con tres elementos% En la l6neaJ $ecemos .ue el puntero e@tra seale a la ca6a c"ica+ continuando en la l6neaJ lo utili"amos para referirnos a la ca6a c"ica & actuali"arla al ,alor contenido
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 146/160
en la ca6a c"ica el cual es la direcci(n de la ca6a mediana% De esta manera$emos atra,esado de un elemento de la lista a otro en,iando un mensae a uno delos obetos%
La palabra clave t"is
La palabra t"is se defini para cual.uier obeto como un puntero al obeto en elcual est5 contenido+ concretamente se define como
nomreTdeTlaTclase *this;
& es iniciali"ada para sealar al obeto para el cual la funci(n miembro esin,ocada+ esta instrucci(n es mu& *til cuando se trabaa con punteros+especialmente con listas enla"adas cuando se re.uiere referenciar a un puntero aun obeto .ue Asted insertar5 en la lista% El uso de la palabra cla,e t"is a*n no se$a ilustrado pero lo $aremos posteriormente en este tutorial%
2ol,er al principio
&na lista enla'ada de ob6etos
El si#uiente pro#rama de eemplo es una lista enla"ada escrita en notaci(norientada a obetosC
#include <iostream.h>
class caja{ int lonitud; int ancho; caja *otraTcaja; pulic caja(void); // 3onstructor void coloca(int nuevaTlonitud, int nuevoTancho); int otieneTarea(void);
void apuntaTalTsiuiente(caja *dondeTapunta); caja *otieneTsiuiente(void);-;
cajacaja(void) // mplementacion del constructor{ lonitud + =; ancho + =; otraTcaja + RWAA;-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 147/160
// "l tama^o de la caja de acuerdo a los parametros de entradavoid cajacoloca(int nuevaTlonitud, int nuevoTancho){ lonitud + nuevaTlonitud; ancho + nuevoTancho;-
// 3alcula $ reresa el area de una instancia de cajaint cajaotieneTarea(void){ return (lonitud * ancho);-
// %lia al puntero a se^alar al parametro de entradavoid cajaapuntaTalTsiuiente(caja *dondeTapunta){ otraTcaja + dondeTapunta;-
// 6eresa la caja se^aladacaja *cajaotieneTsiuiente(void){ return otraTcaja;-
int main(){ caja *inicio + RWAA; // 7iempre se^ala el inicio de la lista caja *temp; // Quntero temporal caja *cajaTpuntero; // Wtili0ado para la creacion de caja // 7e enera la lista for (int indice+; indice<1; indice::) { cajaTpuntero + ne caja; cajaTpunteroU>coloca(indice : 1, indice : 8); if (inicio ++ RWAA) { inicio + cajaTpuntero; // Qrimer elemento en la lista - else { tempU>apuntaTalTsiuiente(cajaTpuntero); // "lementoadicional - temp + cajaTpuntero; -
// Xespliea la lista temp + inicio; do { cout << !"l area es ! << tempU>otieneTarea() << !&n!; temp + tempU>otieneTsiuiente(); - hile (temp V+ RWAA); // Corra la lista temp + inicio;
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 148/160
do { temp + tempU>otieneTsiuiente(); delete inicio; inicio + temp; - hile (temp V+ RWAA);
return ;-
Este pro#rama es mu& similar al anterior+ de $ec$o es idéntico $asta .ueentramos en el pro#rama principal main + ,% =ecordar5 .ue en el pro#ramaanterior la *nica manera .ue ten6amos para utili"ar el puntero incrustado era atra,es del uso de dos métodos llamados apuntaDalDsi#uiente
+ , & obtieneDsi#uiente los cuales est5n enlistados en las l6neas MN a la HJ del presente pro#rama+ las utili"aremos para construir nuestra lista enla"ada+ después
la recorreremos & desple#aremos los resultados+ finalmente borraremos la listacompleta /delete0 para liberar el espacio de la pila /$eap0%En las l6neas KG a la K definimos tres punteros para utili"arlos en el pro#rama% El
puntero llamado inicio siempre sealar5 al principio de la lista+ pero temp semo,er5 a lo lar#o de la lista conforme la ,amos creando% El punterollamado ca6aDpuntero ser5 utili"ado para la creaci(n de cada obeto+ e@ecutamosun bucle en las l6neas KH a la JN para #enerar la lista donde en la l6nea KJ ubicadin5micamente un nue,o obeto de la clase ca6a & la l6nea KN le asi#na datos amanera de ilustraci(n% Si este es el primer elemento en la lista+ el
puntero inicio se coloca para sealar a este elemento+ pero si el elemento &5
e@iste+ el *ltimo elemento de la lista es asi#nado para sealar al nue,o elemento%En cual.uier caso+ el puntero temp es asi#nado para sealar al *ltimo elementode la lista en preparaci(n para a#re#ar un nue,o elemento+ si es .ue lo $a&%En la l6nea JF+ el puntero llamado temp seala al primer elemento de la listaactuali"andose en la l6nea NM en su recorrido por la lista en cada pasada del bucle+cuando temp obtiene el ,alor <ALL pro,eniente del *ltimo elemento de la lista+finali"a el recorrido por la misma% 4or *ltimo+ borramos la lista completa unelemento a la ,e" en cada pasada del bucle de las l6neas N8 a la 8H
2ol,er al principio
Lección E
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 149/160
Pro#ramando en CEncapsulado III
Ob6etos anidados
El si#uiente pro#rama muestra un eemplo de clases anidadas lo .ue resulta enobetos anidados% An obeto anidado puede ilustrarse utili"ando su computadoracomo analo#6a+ la computadora en s6 est5 compuesta de ,arios elementos .uetrabaan untos pero cada uno desempea una labor diferente+ como el teclado+ eldisco duro & la fuente de alimentaci(n% La computadora est5 compuesta de éstos& otros elementos mu& diferentes entre s6 al #rado .ue es deseable discutir porseparado lo concerniente al teclado & al disco duro% Ana clase computadora puede
estar compuesta de ,arios obetos diferentes anidando las clases diferentes dentrode la clase computadora
4or otra parte+ si deseamos discutir respecto a las unidades de disco+ podr6amosdesear e@aminar las caracter6sticas de las unidades de disco en #eneral+ despuéslos detalles del disco duro & los diferentes discos fle@ibles% Esto in,olucrar6a eluso de la $erencia por.ue la ma&or6a de los datos acerca de 5mbos tipos de discos
pueden ser caracteri"ados & aplicados a la unidad de disco #enérica & utili"ar lainformaci(n para e@plicar las caracter6sticas en com*n% La $erencia laestudiaremos en las si#uientes lecciones+ por lo pronto nos concentraremos en la
clase anidada ( incrustadaC
#include <iostream.h>
class correo{ int remitente; int franIueo; pulic void coloca(int claseTinterna, int franIueoTinterno) {remitente + claseTinterna; franIueo + franIueoTinterno;- int otieneTfranIueo(void) {return franIueo;-
-;
class caja{ int lonitud; int ancho; correo etiIueta; pulic void coloca(int l, int , int s, int p) {lonitud + l; ancho + ; etiIueta.coloca(s, p);-
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 150/160
int otieneTarea(void) {return lonitud * ancho;--;
int main(){ caja chica, mediana, rande;
chica.coloca(, H, 1, 8); mediana.coloca(, 9, , B); rande.coloca(=, 1, H, @=);
cout << !"l area es ! << chica.otieneTarea() << !&n!; cout << !"l area es ! << mediana.otieneTarea() << !&n!; cout << !"l area es ! << rande.otieneTarea() << !&n!;
return ;-
Este eemplo contiene una clase llamada ca6a .ue a su ,e" contiene un obeto
incrustado de otra clase en la l6nea N+ la clase correo% Este obeto est5 disponible para utili"arse s(lo dentro de la implementaci(n de ca6a por definici(n% El pro#rama principal main + , tiene obetos definidos de la clase ca6a pero nin#*nobeto de correo por lo .ue la clase correo no puede ser referenciada en el
pro#rama principal% En éste caso los obetos de la clase correo est5n destinados autili"arse dentro de la clase ca6a & un eemplo est5 dado en la l6nea G donde seen,6a un mensae al método eti:ueta.coloca + , para iniciali"ar las ,ariables%
De primordial importancia es el $ec$o de .ue no $a& un solo obeto de laclase correo declarado directamente en el pro#rama principal+ éstos son
in$erentemente declarados cuando los obetos de la claseca6a son declarados% 4or supuesto .ue se pueden declarar obetos de la clase correo en el pro#rama principal si es necesario+ pero no en el pro#rama de eemplo% 4ara estar completa+la clase ca6a debe tener uno o m5s métodos para usar la informaci(n almacenadaen el obeto de la clase correo%
2ol,er al principio
Sobrecar#a de operadoresEl si#uiente c(di#o presenta un eemplo de sobrecar#a de operadores+ esto le
permite definir una clase de obetos & redefinir el uso de los operadores normales+el resultado final es .ue los obetos de la nue,a clase pueden utili"arse de unamanera tan natural como con los tipos predefinidos+ de $ec$o+ parecen ser partedel len#uae en lu#ar de una adici(n su&a%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 151/160
#include <iostream.h>
class caja{ int lonitud; int ancho;
pulic void coloca(int l, int ) {lonitud + l; ancho + ;- int otieneTarea(void) {return lonitud * ancho;- friend caja operator:(caja a, caja ); // 7uma dos cajas friend caja operator:(int a, caja ); // 7uma una constante a unacaja friend caja operator*(int a, caja ); // Eultiplica caja por unaconstante-;
caja operator:(caja a, caja ) // 7uma el ancho de dos cajas{ caja temp;
temp.lonitud + a.lonitud; temp.ancho + a.ancho : .ancho; return temp;-
caja operator:(int a, caja ) // 7uma una constante a caja{ caja temp; temp.lonitud + .lonitud; temp.ancho + a : .ancho; return temp;-
caja operator*(int a, caja ) // Eultiplica caja por una constante{ caja temp; temp.lonitud + a * .lonitud; temp.ancho + a * .ancho; return temp;-
int main(){ caja chica, mediana, rande; caja temp;
chica.coloca(, H);
mediana.coloca(, 9); rande.coloca(=, 1);
cout << !"l area es ! << chica.otieneTarea() << !&n!; cout << !"l area es ! << mediana.otieneTarea() << !&n!; cout << !"l area es ! << rande.otieneTarea() << !&n!;
temp + chica : mediana; cout << !Aa nueva area es ! << temp.otieneTarea() << !&n!; temp + 1 : chica;
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 152/160
cout << !Aa nueva area es ! << temp.otieneTarea() << !&n!; temp + H * rande; cout << !Aa nueva area es ! << temp.otieneTarea() << !&n!;
return ;-
En este caso sobrecar#amos los operadores de ? & B con las declaraciones en lasl6neas G a la + & en las definiciones en las l6neas K a la MN% Los métodos est5ndeclarados como funciones friend por lo .ue podemos utili"ar la funci(n dedoble par5metro como est5 indicado% Si no utili"amos la construcci(n friend lafunci(n ser6a parte de uno de los obetos & tal obeto ser6a el receptor delmensae% Inclu&endo la construcci(n friend nos permite separar éste método delobeto & llamar al método con una notaci(n fia+ utili"ando ésta técnica puedeescribirse como ob6eto1 ob6eto/ en lu#ar de ob6eto1.operador+ob6eto/,%)dem5s sin la construcci(n friend no podr6amos utili"ar una sobrecar#a con una
,ariable de tipo int para el primer par5metro por.ue no podemos en,iar unmensae a una ,ariable de tipoint como en int.operador+ob6eto,% Dos de lostres operadores sobrecar#ados usan un int para el primer par5metro por lo .ue esnecesario declararlos como funciones friend% <o e@iste un l6mite superior en eln*mero de sobrecar#as para un operador dado+ cual.uier n*mero de sobrecar#as
puede utili"arse siempre & cuando los par5metros sean diferentes para cadasobrecar#a particular%
El encabe"ado en la l6nea K ilustra la primera sobrecar#a donde el operador ? essobrecar#ado dando el tipo retornado se#uido por la palabra cla,e operator & el
operador .ue deseamos sobre#ar#ar% Los dos par5metros formales & susrespecti,os tipos son listados en paréntesis & las operaciones normales son dadasen la implementaci(n de la funci(n en las l6neas N a la G% El estudianteobser,ador notar5 .ue la implementaci(n de las funciones friend no son parte dela clase por.ue el nombre de la clase no est5 antes del nombre del método en lal6nea K%La ma&or diferencia la encontramos en la l6nea K donde éste método es llamadoutili"ando la notaci(n infia en lu#ar del formato usual de en,iar mensaes% omolas ,ariables c"ica & mediana son obetos de la clase ca6a+ el sistema buscar5 unamanera de utili"ar el operador ? en los dos obetos de la clase ca6a & la
encontrar5 en el operador sobrecar#ado operator .ue &a $emos discutido% En lal6nea KH pedimos al sistema .ue sume un int a un obeto de la clase ca6a por lo.ue el sistema encontrar5 la otra sobrecar#a del operador ? .ue empie"a en lal6nea M para eecutar la operaci(n solicitada% )dem5s en la l6nea KJ le pedimos alsistema .ue utilice el operador B con una constante de tipo int & un obeto de laclase ca6a lo .ue .ueda satisfec$o en las l6neas M a MN% Obser,e .ue ser6a ile#altratar de $acer la operaci(n in,ersa+ #rande!; &a .ue no definimos para utili"ar
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 153/160
los métodos de ésta manera% Obser,e adem5s .ue cuando usamos la sobrecar#ade operadores estamos a la ,e" utili"ando sobrecar#a de nombres de funci(n &a.ue al#unos de los nombres son los mismos% El resultado de la eecuci(n del
pro#rama es ésteC
2ol,er al principio
Sobrecar#ando funciones en una clase
El pro#rama si#uiente es un eemplo del nombre de una funci(n sobrecar#adodentro de una clase+ en éste pro#rama el constructor también es sobrecar#ado enuno de los métodos para ilustrar .ue ésto es posible+ estudie el si#uiente c(di#oC
#include <iostream.h>
class muchosTnomres{ int lonitud; int ancho; pulic muchosTnomres(void);// 3onstructors muchosTnomres(int lon); muchosTnomres(int lon, int anc); void despliea(void);// Xispla$ functions
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 154/160
void despliea(int uno); void despliea(int uno, int dos); void despliea(float numero);-;
muchosTnomresmuchosTnomres(void){
lonitud + =; ancho + =;-
muchosTnomresmuchosTnomres(int lon){ lonitud + lon; ancho + =;-
muchosTnomresmuchosTnomres(int lon, int anc){ lonitud + lon;
ancho + anc;-
void muchosTnomresdespliea(void){ cout << !Xe la funcion despliea(void) , area + ! << lonitud * ancho<< !&n!;-
void muchosTnomresdespliea(int uno){ cout << !Xe la funcion despliea(int uno) area + ! << lonitud *ancho << !&n!;-
void muchosTnomresdespliea(int uno, int dos){ cout << !Xe la funcion de dos int, area + ! << lonitud * ancho <<!&n!;-
void muchosTnomresdespliea(float numero){ cout << !Xe la funcion despliea(float), area + ! << lonitud * ancho<< !&n!;-
int main(){ muchosTnomres chica, mediana(1), rande(1, 1); int neto + 1HH; float pi + 8.1H1, nomina + 1.;
chica.despliea(); chica.despliea(1); chica.despliea(neto,1); chica.despliea(nomina);
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 155/160
mediana.despliea(); rande.despliea(pi);
return ;-
Tenemos tres constructores+ el .ue es llamado en determinado momento esseleccionado por el n*mero & tipos de los par5metros en la definici(n% En la l6neaKN del pro#rama principal son declarados los tres obetos cada uno con diferenten*mero de par5metros & una inspecci(n de los resultados indicar5 .ue el correctoconstructor fué llamado basado en el n*mero de par5metros%=especto al comentario .ue si#ue puede pensar .ue es un poco tonto+ pero enrealidad se trata de un asunto importante+ a lo lar#o de éste tutorial $emos estadoutili"ando un operador sobrecar#ado el cual no le $a causado confusi(n al#una+se trata del operador .ue forma parte de la clase cout el cual opera como una
funci(n sobrecar#ada &a .ue la manera en .ue desplie#a los datos est5 en funci(ndel tipo de ,ariable de entrada o del campo .ue deseamos desple#ar%
Al#unos m7todos por defecto
)*n en el caso en .ue Asted no inclu&a constructores u operadoressobrecar#ados+ Asted cuenta con al#unos definidos autom5ticamente por elcompilador+ esto lo ilustramos en el si#uiente c(di#o de eemplo & tambiénmostramos el por .ué al#unas ,eces es m5s con,eniente escribir sus propiosmétodos para $acer el trabao .ue se supone deben $acer los métodos dados por
el compilador+ antes debemos indicar una lista de re#las .ue los pro#ramadoresdeben se#uir para una correcta implementaci(n en ??C
• Si no $a& constructores definidos por el escritor de la clase+ el compilador#enerar5 uno autom5ticamente & un constructor copia+ ambosconstructores los definiremos en bre,e%
• Si el autor de la clase inclu&e cual.uier constructor en la misma+ elcompilador no #enerar5 constructor al#uno%
•
Si el escritor de la clase no inclu&e un constructor copia+ el compilador#enerar5 uno+ pero si el escritor inclu&e un constructor copia+ elcompilador no lo #enerar5 autom5ticamente%
• Si el autor de la clase inclu&e un operador de asi#naci(n+ el compilador noincluir5 uno autom5ticamente+ en caso contrario se #enerar5 un operadorde asi#naci(n%
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 156/160
ual.uier clase declarada & utili"ada en ?? debe tener una manera de crear unobeto por.ue el compilador+ por definici(n+ debe llamar a un constructor cuandodefinimos un obeto% Si no pro,eemos un constructor + el compilador #enerar5uno .ue pueda llamar durante la creaci(n de un obeto+ éste es el constructor pordefecto & lo $emos utili"ado inconcientemente en una buena cantidad de
pro#ramas en éste tutorial% El constructor por defecto no iniciali"a nin#una de las,ariables miembro+ pero prepara todas las referencias internas necesarias & llamaal constructor base+ si e@iste /uando estudiemos la $erencia sabremos .ué es unconstructor base0% El c(di#o de nuestro nue,o eemplo es ésteC
#include <iostream.h>#include <strin.h>#include <stdli.h>
class defectos{ int tamano; // Wn simple valor almacenado char *cadena; // Wn nomre para el dato almacenado pulic // "sto sorecara el constructor por defecto defectos(void); // "sto sorecara el constructor copia por defecto defectos(defectos enTojeto); // "sto sorecara el operador de asinacion por defecto defectos operator+(defectos enTojeto); // "ste destructor es necesario en caso de uicacion dinamica [defectos(void); // Finalmente, un par de metodos void colocaTdato(int enTtamano, char *enTcadena);
void otieneTdato(char *fueraTcadena);-;
defectosdefectos(void){ tamano + ; cadena + ne charOP; strcp$(cadena, !!);-
defectosdefectos(defectos enTojeto){ tamano + enTojeto.tamano; cadena + ne charOstrlen(enTojeto.cadena) : 1P; strcp$(cadena, enTojeto.cadena);-
defectos defectosoperator+(defectos enTojeto){ delete OP cadena; tamano + enTojeto.tamano; cadena + ne charOstrlen(enTojeto.cadena) : 1P; strcp$(cadena, enTojeto.cadena);
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 157/160
return *this;-
defectos[defectos(void){ delete OP cadena;-
void defectoscolocaTdato(int enTtamano, char *enTcadena){ tamano + enTtamano; delete OP cadena; cadena + ne charOstrlen(enTcadena) : 1P; strcp$(cadena, enTcadena);-
void defectosotieneTdato(char *fueraTcadena){ char tempO1P; strcp$(fueraTcadena, cadena);
strcat(fueraTcadena, ! + !); Titoa(tamano, temp, 1); strcat(fueraTcadena, temp);-
int main(){ char ufferO=P; defectos miTdato;
miTdato.colocaTdato(=, !tamano de somrero!); miTdato.otieneTdato(uffer); cout << uffer << !&n&n!;
defectos masTdato(miTdato); masTdato.colocaTdato(1, !tamano de 0apato!); miTdato.otieneTdato(uffer); cout << uffer << !&n!; masTdato.otieneTdato(uffer); cout << uffer << !&n!;
miTdato + masTdato; miTdato.otieneTdato(uffer); cout << uffer << !&n!; masTdato.otieneTdato(uffer); cout << uffer << !&n!;
return ;-
La l6nea declara un constructor por defecto el cual es llamado cuando Asteddefine un obeto sin par5metros+ en éste caso el constructor es necesario por.uetenemos una cadena incrustada en la clase .ue re.uiere una ubicaci(n din5mica &una iniciali"aci(n de la cadena a nulo% Debemos pensar un poco para comprender .ue nuestro constructor es meor .ue el aportado por el compilador el cual nos
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 158/160
dear6a con un puntero no iniciali"ado% El constructor por defecto se utili"a en lal6nea N del pro#rama%
)l constructor copia
El constructor copia es #enerado autom5ticamente por Asted por el compiladoren caso de .ue no $a&a sido definido+ se utili"a para copiar el contenido de unobeto a un nue,o obeto durante la construcci(n del susodic$o% Si el compiladorlo #enera simplemente copiar5 el contenido del ori#inal en un nue,o obeto comoen una copia b&te por b&te+ lo .ue puede ser no deseable% 4ara clases sencillas sin
punteros esto por lo #eneral es suficiente+ pero en el presente eemplo tenemos un puntero como miembro de clase as6 .ue copiar6a el puntero b&te por b&te dandocomo resultado dos punteros sealando al mismo sitio% 4ara este pro#ramadeclaramos nuestro propio constructor copia en la l6nea M & se implementa en lal6neas MG a la MK% An estudio cuidadoso de la implementaci(n re,elar5 .ue la
nue,a clase es idéntica a la ori#inal pero la nue,a clase cuenta con su propiacadena% omo ambos constructores contienen ubicaci(n din5mica+ debemosase#urarnos .ue el dato ubicado sea destruido cuando terminemos de utili"ar losobetos+ por lo .ue es necesario un destructor cu&a implementaci(n la ,emos enlas l6nea HJ a la HF% El constructor copia es utili"ado en la l6nea NN%
)l operador de asi#nación
)un.ue no es demasiado ob,io+ pero éste pro#rama re.uiere de un operador deasi#naci(n por.ue el pro,isto por el compilador simplemente copia el obeto
fuente al obeto de destino b&te por b&te+ esto conducir6a a un problema similar aldiscutido con el constructor copia% El operador de asi#naci(n es declarado en lal6nea K & definido en las l6neas MN a la HH donde desubicamos la ,iea cadena enel obeto e@istente antes de ubicar espacio para el nue,o te@to & copiar el te@todel obeto fuente en el nue,o obeto+ el operador de asi#naci(n se utili"a en lal6nea 8H% Debe .uedar claro para el estudiante .ue cuando en una clase esdefinida para incluir cual.uier cantidad de ubicaci(n din5mica+ los tres métodosmostrados en el eemplo deben utili"arse unto con el correspondiente destructor+de omitirlos el pro#rama tendr5 un comportamiento err5tico e impredecible%ompile & eecute el pro#rama+ el resultado es ésteC
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 159/160
2ol,er al principio
ttp=UUwww$etnasso*t$comUbibliotecaUWsearc]termIc^books]cateor&Ilibros]proramacion^books]criteriaIpost]date]4E35^lanIall^sinceIall
7/17/2019 OPTO
http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 160/160