opto

30
¡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 un dispositivo de emisión y recepción que funciona como un interruptor activado mediante la luz emitida por un diodo LED que satura un componente optoelectrónico, normalmente en forma de 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

Upload: efrainrodrigoajata

Post on 06-Jan-2016

113 views

Category:

Documents


7 download

DESCRIPTION

opto

TRANSCRIPT

Page 1: OPTO

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

Page 2: OPTO

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.

Page 3: OPTO

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*

Page 4: OPTO

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

Page 5: OPTO

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

Page 6: OPTO

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

Page 7: OPTO

7/17/2019 OPTO

http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 7/160

Page 8: OPTO

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

Page 9: OPTO

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

Page 10: OPTO

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'

Page 11: OPTO

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

Page 12: OPTO

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

Page 13: OPTO

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$

Page 14: OPTO

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

Page 15: OPTO

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$

Page 16: OPTO

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

Page 17: OPTO

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

Page 18: OPTO

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

Page 19: OPTO

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$

Page 20: OPTO

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

Page 21: OPTO

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=

Page 22: OPTO

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

Page 23: OPTO

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

Page 25: OPTO

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"

Page 26: OPTO

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

Page 27: OPTO

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:

Page 28: OPTO

7/17/2019 OPTO

http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 28/160

Page 29: OPTO

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

Page 30: OPTO

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 =>>, ;@:;>

Page 31: OPTO

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

Page 32: OPTO

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&

Page 33: OPTO

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

Page 34: OPTO

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.

Page 35: OPTO

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

Page 36: OPTO

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@

Page 37: OPTO

7/17/2019 OPTO

http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 37/160

  si le ponemos un led a la salida

Page 38: OPTO

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.

Page 39: OPTO

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

Page 40: OPTO

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

Page 41: OPTO

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.

Page 42: OPTO

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.

Page 43: OPTO

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

Page 44: OPTO

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.

 

Page 45: OPTO

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

Page 46: OPTO

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.

 

Page 47: OPTO

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.

Page 48: OPTO

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

Page 49: OPTO

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

Page 50: OPTO

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/

Page 51: OPTO

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.

Page 52: OPTO

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

Page 53: OPTO

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

Page 54: OPTO

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.

Page 55: OPTO

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

Page 56: OPTO

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

Page 57: OPTO

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.

Page 58: OPTO

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.

Page 59: OPTO

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.

Page 60: OPTO

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

Page 61: OPTO

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

Page 62: OPTO

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

Page 63: OPTO

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.

Page 64: OPTO

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

Page 65: OPTO

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

Page 66: OPTO

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

Page 67: OPTO

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$

Page 69: OPTO

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

 

Page 70: OPTO

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

Page 71: OPTO

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.

Page 72: OPTO

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

Page 73: OPTO

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

Page 74: OPTO

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

Page 75: OPTO

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.

Page 76: OPTO

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%€ 

Page 77: OPTO

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

Page 78: OPTO

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

Page 79: OPTO

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 *

Page 80: OPTO

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 *//******************************************/

Page 81: OPTO

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

Page 82: OPTO

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%

Page 83: OPTO

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

Page 84: OPTO

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//*********************************************************

Page 85: OPTO

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%

Page 86: OPTO

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 ;-

Page 87: OPTO

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+

Page 88: OPTO

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

Page 89: OPTO

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;

Page 90: OPTO

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

Page 91: OPTO

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

Page 92: OPTO

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 ;-

Page 93: OPTO

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::;

-

Page 94: OPTO

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 %

Page 95: OPTO

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%

Page 96: OPTO

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(){

Page 97: OPTO

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

Page 98: OPTO

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

Page 99: OPTO

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

Page 100: OPTO

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

Page 101: OPTO

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

Page 102: OPTO

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

Page 103: OPTO

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) << ! !;  -

Page 104: OPTO

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(){

Page 105: OPTO

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

Page 106: OPTO

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)

Page 107: OPTO

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

Page 108: OPTO

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

Page 109: OPTO

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 ;-

Page 110: OPTO

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

Page 111: OPTO

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 ;-

Page 112: OPTO

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

Page 113: OPTO

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

Page 114: OPTO

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

Page 115: OPTO

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)

Page 116: OPTO

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;

Page 117: OPTO

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

Page 118: OPTO

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+

Page 119: OPTO

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)

Page 120: OPTO

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

Page 121: OPTO

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

Page 122: OPTO

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)

Page 123: OPTO

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 ;-

Page 124: OPTO

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

Page 125: OPTO

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;

Page 126: OPTO

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%

Page 127: OPTO

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

Page 128: OPTO

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

Page 129: OPTO

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

Page 130: OPTO

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

Page 131: OPTO

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;

Page 132: OPTO

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

Page 133: OPTO

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 ;-

Page 134: OPTO

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

Page 135: OPTO

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

Page 136: OPTO

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

Page 137: OPTO

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!;

Page 138: OPTO

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%

Page 139: OPTO

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 !);

Page 140: OPTO

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

Page 141: OPTO

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 ;-

Page 142: OPTO

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{

Page 143: OPTO

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%

Page 144: OPTO

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

Page 145: OPTO

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

Page 146: OPTO

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;-

Page 147: OPTO

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;

Page 148: OPTO

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

Page 149: OPTO

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

Page 150: OPTO

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%

Page 151: OPTO

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;

Page 152: OPTO

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

Page 153: OPTO

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

Page 154: OPTO

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

Page 155: OPTO

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%

Page 156: OPTO

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

Page 157: OPTO

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

Page 158: OPTO

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

Page 159: OPTO

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

Page 160: OPTO

7/17/2019 OPTO

http://slidepdf.com/reader/full/opto563db84a550346aa9a924d8a 160/160