100% encontró este documento útil (1 voto)
297 vistas160 páginas

OPTO

opto
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
297 vistas160 páginas

OPTO

opto
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Desafo de edicin de octubre!

Aydanos a referenciar artculos en Wikipedia.

Optoacoplador
Optoacoplador

Optoacoplador en encapsulado DIL-8

Tipo

Semiconductor

Principio de funcionamiento

Efecto fotoelctrico

Smbolo electrnico

[editar datos en Wikidata]

Un optoacoplador, tambin llamado optoaislador o aislador acoplado pticamente, es un


dispositivo de emisin y recepcin que funciona como un interruptor activado mediante la luz
emitida por un diodo LED que satura un componente optoelectrnico, normalmente en forma
de fototransistor o fototriac. De este modo se combinan en un solo dispositivo semiconductor,
un fotoemisor y un fotorreceptor cuya conexin entre ambos es ptica. Estos elementos se

encuentran dentro de un encapsulado que por lo general es del tipo DIP. Se suelen utilizar
para aislar elctricamente a dispositivos muy sensibles.

Funcionamiento[editar]

El optoacoplador combina un LED y un fototransistor.

La figura de la izquierda muestra un optoacoplador 4N35 formado por un LED y un


fototransistor. La tensin de la fuente de la izquierda y la resistencia en serie establecen una
corriente en el LED emisor cuando se cierra el interruptor S1. Si dicha corriente proporciona
un nivel de luz adecuado, al incidir sobre el fototransistor lo saturar, generando una corriente
en R2. De este modo la tensin de salida ser igual a cero con S1 cerrado y a V2 con S1
abierto.
Si la tensin de entrada vara, la cantidad de luz tambin lo har, lo que significa que la
tensin de salida cambia de acuerdo con la tensin de entrada. De este modo el dispositivo
puede acoplar una seal de entrada con el circuito de salida, aunque hay que tener en cuenta
que las curvas tensin/luz del LED no son lineales, por lo que la seal puede distorsionarse.
Se venden optoacopladores especiales para este propsito, diseados de forma que tengan
un rango en el que la seal de salida sea casi idntica a la de entrada.
La ventaja fundamental de un optoacoplador es el aislamiento elctrico entre los circuitos de
entrada y salida. Mediante el optoacoplador, el nico contacto entre ambos circuitos es un haz
de luz. Esto se traduce en una resistencia de aislamiento entre los dos circuitos del orden de
miles de M. Estos aislamientos son tiles en aplicaciones de alta tensin en las que los
potenciales 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 de
salida. Entre los principales caben destacar el fototransistor, ya mencionado, elfototriac y el
fototriac de paso por cero. En este ltimo, su etapa de salida es un triac de cruce por cero,
que posee un circuito interno que conmuta al triac slo en los cruce por cero de la fuente.

Etapa de salida a fototransistor.

Etapa de salida a fototriac.

Bibliografa[editar]

Malvino, Albert Paul (2000). Principios de Electrnica.


McGraw-Hill/Interamericana de Espaa,S. A. U. ISBN 84-481-25681.

Categora:

Componentes activos

Men de navegacin

Crear una cuenta

Acceder

Artculo
Discusin

Leer
Editar
Ver historial
Ir

Portada

Portal de la comunidad

Actualidad

Cambios recientes

Pginas nuevas

Pgina aleatoria

Ayuda

Donaciones

Notificar un error
Imprimir/exportar

Crear un libro

Descargar como PDF

Versin para imprimir


Herramientas

Lo que enlaza aqu

Cambios en enlazadas

Subir archivo

Pginas especiales

Enlace permanente

Informacin de la pgina

Elemento de Wikidata

Citar esta pgina


En otros idiomas

Catal

etina

Dansk

Deutsch


English

Eesti

Euskara

Suomi

Franais

Magyar

Italiano

Lietuvi

Nederlands

Polski

Romn

Simple English

Svenska

Ting Vit

Editar enlaces

Esta pgina fue modificada por ltima vez el 25 feb 2015 a las 15:46.

El texto est disponible bajo la Licencia Creative Commons Atribucin Compartir


Igual 3.0; podran ser a

Optoacopladores
(Electrnica Bsica)

Facebook74

Twitter18

92
Los Optoacopladores u Optoaisladores son dispositivos que
podemos encontrar en mltiples aplicaciones dentro de un equipo
electrnico, cuando una seal debe ser transmitida desde un

circuito especfico a otro, sin que exista conexin elctrica entre


ambos. A pesar de ser un elemento muy utilizado, encierra muchos
misterios en su interior y estas incgnitas se profundizan cuando
su funcionamiento correcto se pone en duda. Se pueden
controlar?Cmo sabemos si funcionan correctamente? Por lo
general, la transmisin de la informacin dentro de
un Optoacoplador se realiza 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? Veamos si en este artculo podemos encontrar las
respuestas que necesitamos.
La evolucin de los semiconductores en el mundo electrnico
encontr en los optoacopladores al reemplazo ideal para dejar
de lado al rel (o relay) y al transformador, en especial en
aplicaciones digitales, donde la velocidad de transferencia y la
conservacin de la forma de onda deba ser tan fiel como fuera
posible en la salida, reflejando en forma idntica al formato que
presentaba en la entrada. En el caso del rel, la transferencia de
una seal analgica es imposible, del mismo modo que sucede con
los transformadores a determinadas frecuencias y con formas de
onda especiales. Eloptoacoplador fue la solucin empleada en
mltiples aplicaciones que requeran importantes cambios de
niveles de tensin entre los circuitos enlazados, donde se
requera aislacin de determinado tipo de ruidos en la transmisin
de datos; o en espacios industriales, donde se pudiera (o pudiese)
controlar mediante un impulso lgico, de baja tensin, una carga
con elevados consumos en corriente alterna. Bsicamente, si
pudiramos resumirlo en una frase, podra ser la solucin de baja

potencia a la activacin aislada galvnicamente de cargas,


mediante un sistema de control

Optoacopladores (Electrnica Bsica)

A pesar de que un optoacoplador o acoplador de seales


elctricas mediante un enlace ptico puede tomar formatos
fsicos muy variados, su arquitectura es siempre reiterada en el
concepto fundamental. Por un lado, se utiliza para transmitir la
informacin un diodo LED infrarrojo, construido a base de un
compuesto de Arseniuro de Galio, que se enlaza en forma ptica
con un detector encargado de capturar esa informacin luminosa y
transformarla en una seal elctrica idntica, en su composicin

de niveles, a la que el LED emite. Luego, la naturaleza de este


detector nos brindar una respuesta acorde al tipo de seal
aplicada al LED y a la funcin especfica para la que fue construido
ese detector que trae consigo el optoacoplador.

Por ejemplo, si el elemento receptor (o detector) es


un fototransistor, podremos utilizar el dispositivo para transferir
seales analgicas como puede ser audio o video. Si en cambio es
otro fotodiodo, o unfoto-SCR, nos ser til como rectificador
controlado y aislado elctricamente. De este modo, los detectores

se multiplican en formatos y tipo de aplicacin, como puede ser


un Triac (para trabajar con corrientes alternas) y hasta podemos
encontrar puertas lgicas, como detectores dentro de
unoptoacoplador. Lo que siempre conservar su naturaleza es el
elemento transmisor o emisor; siempre ser un diodo (o un
conjunto de ellos) LED infrarrojo.

Clsico Optoacoplador tipo ranura para trabajar con ruedas dentadas

Los Optoacopladores que trabajan por reflexin son muy utilizados en


robtica

Otro tema muy importante es la gran variedad de encapsulados


que encontraremos delante de nuestros ojos y aunque no lo
creamos posible, ser un optoacoplador. Por ejemplo, uno muy
popular dentro del mundo de los robots sigue-lneas es
el CNY70, que trabaja por reflexin. Otro tipo de acoplador ptico
muy popular es el que trae una forma de U y su activacin se
basa, ya no en un reflejo, sino en una interrupcin de un haz

detectado en forma permanente (en el tercer video hacemos un


ensayo con uno). El extremo ms conocido y familiar, es el que
viene en el mismo tipo de encapsulado que un circuito integrado
tradicional, pero con menor cantidad de pines por lado. Es decir,
notars que traen dos o tres pines por lado y eso, adems de
llamarte la atencin, te estar indicando que ests (99%) frente a
un optoacoplador. De todos modos, estos ltimos ofrecen una
presentacin mltiple en un mismo encapsulado y su aspecto es el
de un circuito integrado clsico con presentaciones de hasta 8
pines por lado (4 optoacopladores individuales en un mismo
encapsulado).

Cmo verificar el funcionamiento


No te preocupes, no te sientas como un marciano si te invade la
duda de su accionar adecuado y no sabes por dnde comenzar a
medir; ni qu parmetros controlar y mucho menos cmo hacerlo.
La comprobacin de funcionamiento de este tipo de dispositivos no
es sencilla. Seamos sinceros y realistas desde el comienzo:
indefectiblemente (no tienes opcin) debes retirarlo del lugar de
trabajo donde se encuentre para realizar algunas pruebas que no

son complejas, que en muy corto tiempo la puedes realizar y los


materiales necesarios para llevarlas a cabo son muy bsicos, muy
[Link] esto vale si deseas hacer un trabajo apropiado,
claro est. El primero que debemos hacer a unoptoacoplador es,
por lgica, inspeccionarlo fsicamente. Observarlo y verificar que
su estructura est correcta sin demostraciones de quemazn o
quebraduras en su estructura fsica. En el caso de los que se
encuentran en encapsulado tipo circuito integrado, suelen
quebrarse al explotar y eso facilita mucho el diagnstico. Sin
embargo, cuando su aspecto es ptimo debemos comenzar con la
medicin esttica ms elemental que podemos hacer: mediante el
uso del multmetro (en posicin para medir diodos si es digital, en
R X 1 si es analgico) buscar entre los pines hasta encontrar el
LED. Recuerda:NO es un LED convencional por lo tanto, el valor
obtenido en la medicin podr resultarte algo extrao. Observa:
Una vez descubierto y comprobado el LED, podemos pasar a hacer
otro tipo de mediciones que puedan ayudarnos a incrementar la
seguridad de un buen funcionamiento; esto es, que la informacin
introducida en el LED se pueda recuperar en el detector. Para esto,
necesitaremos dos multmetros y algunos cables con pinzas
caimanes o cocodrilo en sus extremos, para apoyarnos
fsicamente en el trabajo, porque mantener cuatro puntas de
medicin con slo dos manos suele ser algo complicado de hacer.
Por lo tanto, un par de cables y algunos pines
de resistencias cortados pueden ser de gran ayuda. Una vez
identificado el LED, ya tenemos la posibilidad de activar
el emisor, por lo tanto, la bsqueda con el segundo instrumento
estar orientada a comprobar el funcionamiento del
elementoreceptor o el detector que recibe el haz infrarrojo.

Rpidamente, siguiendo el mtodo anterior, avanzamos a esta


instancia de la siguiente manera:
Desde que conozco a los optoacopladores, el mtodo mostrado
hasta aqu es, por lo general, suficiente como para detectar el
buen funcionamiento de este dispositivo sin necesidad de recurrir
a buscar en la web la hoja de datos del elemento que estamos
ensayando. Sin embargo, no ha faltado el diablo a la cita en varias
ocasiones y a pesar de encontrar estas mediciones correctas,
eloptoacoplador no funcionaba en su lugar de trabajo, en la
aplicacin. Afuera las mediciones eran ptimas, mientras que en
circuito, bajo condiciones de trabajo, el dispositivo no funcionaba
de manera correcta. Si lo analizamos en forma detenida, puede
existir una fuga de corriente desde el emisor hacia el detector y
los resultados parecen ser los correctos, sin embargo, la
aislacin a ambos lados de los elementos que componen
el optoacoplador no se cumple como debera ser. Por lo tanto, a
las mediciones efectuadas, deberamos agregarle un mtodo
dinmico de ensayo, con tensin de trabajo que nos permita
comprobar los elementos, a la vez que tambin nos demuestre que
la aislacin est presente entre los elementos.

Avancemos hacia el mtodo


dinmico
En este punto te preguntars los motivos por los cuales no
cambiamos directamente esta piedra en el zapato que cuesta
unas pocas monedas, antes de perder tanto tiempo en ensayos,
sin embargo, cuando descubres que no tienes uno nuevo para
reemplazarlo (ni lo conseguirs en varios das), estars de acuerdo

en que sigamos hacia el ensayo dinmico. Para realizar este


trabajo, debemos ante todo, saber con qu elemento estamos
trabajando, conocer su nomenclatura y por supuesto (ahora s)
tener acceso a su hoja de datos. Para esto ltimo, existen muchos
espacios en la web donde encontrar la informacin necesaria que
nos permitir conocer la arquitectura interna del componente con
el que estamos trabajando, al que intentamos hacerle los controles
sanitarios, para saber si goza de buena salud. Si no tenemos un
espacio de preferencia donde encontrar este tipo de informacin,
bastar con escribir la nomenclatura en cualquier buscador web y
apuntar nuestra lectura hacia los archivos PDF que siempre
aparecen. Una vez que tenemos ese resultado, podemos saber de
qu manera ensayar nuestro optoacoplador.

Durante la primera etapa del ensayo, lo ms importante dentro de


la hoja de datos ser descubrir las caractersticas funcionales
del LED y no confundirnos entre los valores mximos y absolutos
que puede soportar el dispositivo, respecto a los ptimos que se
pueden utilizar para un funcionamiento adecuado y seguro,
garantizando una larga vida til. Y como por algn lado debemos
comenzar, vamos a hacerlo con uno de los optoacopladores ms
populares, econmicos y adoptados por la industria electrnica
(De nada sirve, durante el aprendizaje, hablar de componentes que

vers solo una vez en tu vida). Por lo tanto, veamos algunas


particularidades que debemos tener en cuenta al momento de leer
la hoja de datos de un PC817: un optoacoplador analgico
clsico, con un fotodiodo infrarrojo (emisor) y
un fototransistor (detector) que nos ofrece en su salida los
pines Colector-Emisor, para tomar all en forma aislada y
proporcional, las variaciones de intensidad luminosa que entregue
elLED infrarojo. Adems, este optoacoplador analgico es el
que ms utilizamos y utilizaremos en losmontajes de NeoTeo.
Como mencionamos antes, los valores mximos absolutos
del PC817 hablan de una corriente de LEDen forma directa
(Forward Current) de 50mA, sin embargo, trabajando a ese
rgimen el optoacoplador puede durar unos pocos minutos, antes
de calcinarse. Insistamos en este concepto: eso es el mximo
absoluto, no el valor seguro de trabajo. Para saber cul es esta
corriente segura de trabajo tenemos dos mtodos: uno es
observando las curvas presentes en las hojas de datos que nos
muestren los valores usuales dentro del rea de Operacin
Segura (SOA, Security Operation Area). En el grfico mostrado
abajo (derecha), es el rea que se encuentra debajo de la lnea de
puntos. Para ejemplo, podemos observar que con una corriente
de LED de 5mA, 10mA (y un poco ms tambin) podemos trabajar
sin problemas en todo el rango de tensiones (entre colector y
emisor) que permite aprovechar el fototransistor del PC817.
Observa que si lo haces trabajar con una corriente de LED de
20mA no podrs llegar a emplear valores de tensin de 6Volts en
el fototransistor. Hasta podramos decir que trabajar con 5Volts
sera estar muy cerca de la zona no segura

Adems, el grfico que muestra el CTR (Current Transfer Ratio)


(izquierda) es muy claro; para una tensin de trabajo en el
transistor, de 5Volts, la corriente de LED alcanza el mximo
porcentaje deCTR entre los 10 y los 20mA de corriente directa de
LED (If), en este modelo de PC817. Seguramente, te estars
preguntando qu es el CTR? El concepto de interpretacin ms
sencillo que podemos volcar es el siguiente: un CTR del 100% nos
ofrece una relacin de corrientes 1 a 1 en la entrada y la salida.
Esto es: por cada mA que circule por el diodo emisor, circular un

mA en el circuito Colector Emisor en el fototransistor de salida.


Por ejemplo, A una alimentacin de 5Volts Vce (Tensin Colector
Emisor), el CTR = 100% de un PC817 est ubicado en apenas algo
ms de 2mA de corriente de LED. En estas condiciones, en el
circuito de Colector Emisor se podr recuperar una corriente
mxima de algo ms de 2mA. En cambio, si el CTR aumenta a
un 200% (5mA de corriente de LED) la corriente Colector Emisor
recuperada podr ser de hasta 10mA. (Observa en la hoja de datos
que el CTR puede llegar hasta 600% en otros modelos de PC817).
En funcin de esto, ya estamos en condiciones de saber una de las
bases fundamentales para trabajar con un optoacoplador
analgico: Esto es, cunta corriente necesita el LED para trabajar
en forma segura y de qu modo se comportar la salida, con cada
mA de trabajo en el LED.

El otro mtodo de comprobacin (adems del esttico, utilizando


los multmetros) es efectuando elensayo dinmico. Para nuestro
trabajo, que es de comprobacin de funcionamiento, no
necesitaremos saber si la relacin de transferencia es plenamente
lineal a lo largo de todo el rango de corriente de LED. Eso
quedar para estudios posteriores, cuando nos dediquemos al
diseo electrnico. Por ahora, que slo intentamos saber si nuestro
optoacoplador est vivo o muerto, debemos entender que si
logramos un funcionamiento correcto como LED en el emisor,

tenemos la mitad del trabajo resuelto. Para esto, bastar con que
repasemos los clculos hechos en el artculo sobre LEDs, en el
que aprendimos a obtener los valores de resistencias de
polarizacin para hacer circular por el LED la corriente que nos
interesa. En el mejor de los casos, podemos colocar un control
variable que nos permita operar dentro del espacio SOA y
observar as los cambios en la salida (circuito Colector Emisor
del PC817). El ejemplo prctico entonces, sera el siguiente, para
una tensin de ensayo en el circuito del LED de 5Volts: una
resistencia mnima de 180 Ohms (If <= 27mA) y una mxima de
1000 Ohms para una corriente directa de LED (If) >= a 1mA. Con
una resistencia fija de 180 Ohms y un resistor ajustable (preset)
de 1K tendramos resuelto nuestro montaje inicial de ensayos.
Veamos qu resultados obtuvimos:
Por ltimo, en esta primera entrega sobre optoacopladores y su
ensayo, nos resta mencionar que podemos tambin ejecutar
algunos trabajos simples con el circuito del detector para
comprobar (definitivamente) el correcto y completo
funcionamiento del optoacoplador ensayado. Esto es: verificar
que ante variaciones en la corriente de LED, tengamos variaciones
en la corriente del circuito Colector Emisor en
el fototransistor de salida, en el detector. Para esto utilizaremos
una simple herramienta como es un LED y una resistencia. Una
vez que conocemos la disposicin de pines delfototransistor en
la salida, ser muy sencillo realizar la conexin como si se tratara
(o tratase) de un transistor convencional, sin embargo, el utilizado
para encender el LED ser el fototransistor interno del
optoacoplador. Conexiones, mediciones y resultados, en este
video:

Como pudimos ver a lo largo del artculo, descubrir los


componentes fundamentales de unoptoacoplador no es una
tarea titnica, imposible o slo reservada a genios. Es muy sencillo,
apenas con un multmetro puedes descubrir fcilmente
el fotodiodo, luego ensayarlo y ya tienes la mitad
deloptoacoplador en buen estado. Luego, con los elementos de
siempre, pondrs en marcha aloptoacoplador para trabajar en
forma dinmica. Medirs corrientes y descubrirs las relaciones
que existen entre la realidad y la teora. Si antes todo esto era un
sub-mundo impenetrable, esperamos que con las explicaciones
entregadas y los videos de demostracin, algunas cosas se hayan
comenzado a aclarar.
De todos modos, si algo no has comprendido, recuerda que
estamos en el Foro de Electrnica de NeoTeo para trabajar
juntos y tratar de ayudarte a despejar las tinieblas que pudieron
quedar en esta entrega. Para la prxima, trabajaremos con otro
tipo de optoacoplador y hasta quizs organicemos algn
probador automtico para optoacopladores. Para nosotros era
importante que comprendas esta teora, de lo contrario, apretar un
botn sin saber qu se hace, te resuelve el problema, pero no te
ensea nada. Nos encontramos en el Foro o en la prxima
entrega. Te esperamos!
Hoja de DatosPC817
29 julio, 2012
Electrnicaaislacin, fotodiodo, fototransistor, infrarrojo, optoacopladores
led5,387

MARIO

Silent Hill: Revelation 3D (Trailer)La msica pop suena


cada vez ms fuerte e igual

MS POPULARES
Microsoft HoloLens: Fecha, precio, y una demo inolvidable
3.946 vistas | publicado el octubre 7, 2015

Enlaces Recomendados de la Semana (N329)


3.788 vistas | publicado el octubre 10, 2015

Qubes OS: Un sistema operativo con la seguridad como prioridad


2.871 vistas | publicado el octubre 9, 2015

Mejora el rendimiento de Windows 10

2.769 vistas | publicado el octubre 10, 2015

CrossOver: Ejecutar programas de Windows en Android


2.634 vistas | publicado el octubre 9, 2015

[Link]

[Link]

jueves, 4 de septiembre de 2008

Optoacoplador: Qu son y cmo 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 radiacin luminosa para pasar seales de un circuito a
otro sin conexin elctrica. Estos son muy tiles cuando se utilizan por ejemplo,
Microcontroladores PICs y/o PICAXE si queremos proteger nuestro microcontrolador este
dispositivo es una buena opcin. En general pueden sustituir los rels ya que tienen una velocidad
de conmutacin mayor, as como, la ausencia de rebotes.

La gran ventaja de un optoacoplador reside en el aislamiento elctrico que puede establecerse


entre los circuitos de entrada y salida. Fundamentalmente este dispositivo est formado por una
fuente emisora de luz, y un fotosensor de silicio, que se adapta a la sensibilidad espectral del
emisor luminoso, todos estos elementos se encuentran dentro de un encapsulado que por lo
general es del tipo DIP.

Qu tipo de Optoacopladores hay?


Existen varios tipos de optoacopladores cuya diferencia entre s depende de los dispositivos de
salida que se inserten en el componente. Segn esto tenemos los siguientes tipos:
Fototransistor: se compone de un optoacoplador con una etapa de salida formada por un
transistor BJT. Los mas comunes son el 4N25 y 4N35

Optotransistor (simbolo)

Optotransistor en configuracin Darlington

Optotransistor de encapsulado ranurado

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. El circuito interno de cruce por cero conmuta al triac slo en los cruce por cero
de la corriente alterna. Por ejemplo el MOC3041

Optotiristor: Diseado para aplicaciones donde sea preciso un aislamiento entre una seal lgica
y la red.

Ejemplos de circuitos utilizados al utilizar los optoacopladores:

Ver

documento

online clic

Agradesco a las siguientes paginas por brindarme informacion bastante util:


ElectronRed

aqui

Pablin

Ucontrol

Optoacopladores
Publicado por OptimusTronic en 20:58
Etiquetas: Documentacion
Artigos Relacionados:

ULN2803: Qu es?

Contadores: Empezando

Optoacoplador: Qu son y cmo funcionan?

Como usar un Manual NTE?

LDR, Qu son?

25 Comentrios:

Luis dijo...

Excelente tu pagina,
te tengo una pregunta, los diagramas que tienes en proteus sobre los Triac es posible
simularlos?
porque no me sale la grafica en el osciloscopio, estoy tratando de activarlos por fase, pero no
me funciona en proteus.
gracias de antemano si me puedes ayudar.
luis
17 de enero de 2009, 12:54

OptimusTronic dijo...
si luis, es posible, pero que version de proteus tienes, ya que con las versiones del 7 en
adelante funciona.
17 de enero de 2009, 15:10

Luis dijo...

Gracias Optimus,
tengo la version 7.2SP6. pero no logro hacer funcionar los TRIAC por fase ni por recorte de
onda.
tu has hecho la simulacion con el optotriac y algun micro manejando un TRIAC en proteus?
te ha funcionado?
cualquier ayuda me serviria.
feliz dia
18 de enero de 2009, 7:06

OptimusTronic dijo...
mmm... que extrao, yo tuve problemas en funcionar triacs en la version 6 y supuestamente
ya se podia simular en versiones 7. para serte sincero nunca he tratado de simular micros con
triacs. te dejo unos links que a lo mejor te pueden ayudar.
[Link]
[Link]
[Link]
19 de enero de 2009, 11:43

Luis dijo...

Gracias por responder y gracias por los enlaces.


aspiro sacar lo mas pronto posible la solucion, y te la comentare, quizas pueda servirle a mas
personas y lo puedas colocar en tu blog.
un abrazo y suerte,
Luis
20 de enero de 2009, 6:14

OptimusTronic dijo...

OPTOACOPLADOR

COMPARTE

OPTOACOPLADOR

Twittear

Comparte [Link]

OTRAS WEBS INTERESANTES


Tecnologia Industrial
Tecnologias
Ciencias
Blog de Tecnologia

Qu

es

un

Optoacoplador?

Un optoacoplador es un componente electrnico que se utiliza como


transmisor y receptor ptico (de luz), es decir pueden transmitir de un punto a
otro una seal elctrica sin necesidad de conexin fsica ni cables (por el aire),
mediante una seal luminosa. Por eso tambin se llaman OptoInterruptor.
Activamos una luz y esta luz llega a un detector que genera una tensin de
salida, interruptor cerrado. Si no se activa la luz o no le llega la luz al detector,

este no genera ninguna tensin de salida, es decir interruptor abierto.


Si combinamos una fuente ptica (generalmente un Led) con algn tipo de
detector ptico (generalmente un semiconductor de silicio llamado
fototransistor) en un solo encapsulado, el dispositivo resultante es un
optoacoplador
o
interruptor
ptico.
Suelen ser elementos que sustituyen a los rels tradicionales. Se suelen
utilizar para aislar dos circuitos, uno que trabaja a poco tensin (el del LED),
llamado de control y otro a mucha tensin o a una tensin diferente (el del
detector)
llamado
de
potencia.
Imagina que con una pequea tensin activamos el LED del optoacoplador
(por ejemplo a 5V) y la luz que emite el led llega al detector del optoacoplador
y activa el detector creando una tensin de salida a 220V. Podemos activar a la
salida motores, lmparas, etc. a 220V desde otro sitio en el que solo tenemos
5V,
sin
riesgo
apenas
para
el
que
lo
activa.
La aplicacin principal es en aislamiento entre los circuitos de control y los de
potencia.
Esto evita que la parte de trabajo (la del led) no tengan casi riesgos para el
que opera en ella, al no tener que trabajar con la parte de alta tensin o
intensidad,
que
estara
separada.
Veamos
como
funcionan.
Otro uso muy comn en educacin son en coches seguidores de luz.
Cmo

Funciona?

Tiene una salida de luz (LED) y una entrada de luz, que detecta cuando
recibe la luz del LED, cuando esta rebota contra alguna superficie
(fotodetector). Como ves es similar al transistor, pero en lugar de corriente con
luz.
Cuando le llega una seal elctrica a los dos extremos del LED (emisor) este
emite una seal luminosa, que recibe el receptor o detector. Este al recibir esta
seal luminosa genera en sus bornes (patillas) una tensin elctrica, que ser
la
tensin
de
salida.
Como vemos cuando le llega una tensin a la entrada se genera una luz y al
recibirla el detector este genera una tensin de salida. Es como un interruptor.
Si no llega luz al detector el interruptor estar abierto, si le llega luz del led el

interruptor

sera

cerrado.

OJO podra estar el led encendido pero no llegarle luz al detector por que no
rebota en ninguna superficie. El interruptor estara abierto por que no se
produce
tensin
a
la
salida.

Algunos optoacopladores tienen un encapsulado con una cmara de aire para


la transmisin de la luz. En este tipo si hay algn objeto dentro de la ranura no
llegar luz al detector. Tambin puede ser que no le llegue tensin al led y
tampoco tendramos tensin de salida. Seran los 2 casos posibles.

La mayora de los optoacopladores utilizan un encapsulado llamado DIP

Como ves el DIP tiene un encapsulado muy parecido a un circuito integrado,


incluso pueden presentar hasta 8 pines o patillas por cada lado. En este caso
estamos hablando de 4 optoacopladores individuales en un mismo
encapsulado.
Fijmonos en el ms normal que ser el de 6 patillas, 3 por cada lado.

Como ves las patillas 1 y 2 son el emisor de luz y la 6 y 4 el receptor de la luz


para
que
se
active.
Hay muchos tipos diferentes de optoacopladores, pero todos tienen un foco
emisor de luz LED. Lo que pueden cambiar es el receptor de luz que puede ser
un
fotodiodo,
fototransistor,
LASCR,
etc.
Un parmetro muy importante en estos elementos es la eficiencia, este
parmetro define que cantidad de corriente necesitamos en el LED para
obtener la salida deseada. En el transistor y en el darlington esto se llama
Radio de transferencia de corriente (CTR), esto se calcula simplemente
dividiendo la corriente de salida entre la corriente de entrada requerida. La
mayora de los optoacopladores trabajan a un CTR entre 10 y 50 por ciento.
El otro parmetro importante en optoacopladores es el voltaje de aislamiento
el
cual
es
de
7500
Volts
durante
1
segundo.
Conexin

de

Optoacopladores

Es importante resaltar que tanto el led como el detector deben llevar


siempre una resistencia en serie con ellos para protegerlos y limitar la
corriente
que
le
llega
al
led.
Veamos
el
ejemplo:

si

le

ponemos

un

led

la

salida?

En este caso el optoacoplador encendera el led. Donde va conectado el led


de salida podramos poner un voltmetro (o un polmetro) y utilizarlo para
comprobar
el
funcionamiento
del
optoacoplador.
Lgicamente donde tenemos en el esquema la Vss hay podramos colocar el
receptor como una bombilla, timbre, motor, etc. que se activara con el
optoacoplador, al llegarle tensin al Led del optoacoplador con Vs. Si ponemos
un pequeo motor de c.c. o un led en Vss este se activar con el
optoacoplador. Pero si queremos seales de tensiones ms elevadas a la
salida?
En Vss tendramos que poner un rel por que la tensin generada no ser
muy alta, si queremos receptores a ms tensiones. Si colocamos un rel
podemos activarlo con el optoacoplador y este tener a la salida un circuito con
la
tensin
de
220V
en
alterna,
por
ejemplo.
Normalmente en lugar de un rel se pone un triac. Veamos el circuito:

Este circuito electrnico de llama interface de potencia, basado en un


optoacoplador DIODO - TRIAC capaz de manejar cargas del orden de 10
amperios o ms dependiendo la capacidad del triac a utilizar a la salida.

Lo primero que debemos verificar es que haya seal suficiente para activar
un LED, y luego acoplar esa seal a este circuito tal cual.
Veamos este video que explica el optoacoplador, funcionamiento y un circuito
bsico:

Circuito

Para

Coche

que

se

Gua

por

una

Lnea

Negra

Si quieres aprender electrnica de forma fcil para todos, te recomendamos


el siguiente libro que contiene los conceptos bsicos de electrnica explicados
de
forma
sencilla
y
amena,
ahora
en
oferta
por
solo
4.

Te dejamos este video que explica el circuito para que construyas un coche
que sigue a una lnea negra, por ejemplo de cinta aislante. Muy fcil y por
supuesto lo primero un optoacoplador que cuando el led del optoacoplador
ilumina la lnea negra no se refleja la luz sobre el detector del optoacoplador
(la
luz
la
absorbe
la
cinta
de
color
negro).

Si te ha gustado haz click en Me Gusta, Gracias:


Twittear
Se permite la total o parcial reproduccin del contenido, siempre y cuando
se reconozca y se enlace a este artculo como la fuente de informacin
utilizada.
Dispositivos electrnicos de potencia:
Optoacopladores

[Pgina ndice] | [Bibliografa]

Indice

Optoacopladores.
Funcionamiento del Optoacoplador.
Diferentes tipos de Optoacopladores.
Optoacopladores

Un optoacoplador combina un dispositivo semiconductor formado por un


fotoemisor, un fotoreceptor y entre ambos hay un camino por donde se
transmite la luz. Todos estos elementos se encuentran dentro de un
encapsulado que por lo general es del tipo DIP.

Funcionamiento del Optoacoplador

La seal de entrada es aplicada al fotoemisor y la salida es tomada del


fotoreceptor. Los optoacopladores son capaces de convertir una seal
elctrica en una seal luminosa modulada y volver a convertirla en una
seal elctrica. La gran ventaja de un optoacoplador reside en el
aislamiento elctrico que puede establecerse entre los circuitos de
entrada y salida.

Los fotoemisores que se emplean en los optoacopladores de potencia

son diodos que emiten rayos infrarrojos (IRED) y los fotoreceptores


pueden ser tiristores o transistores.
Cuando aparece una tensin sobre los terminales del diodo IRED, este
emite un haz de rayos infrarrojo que transmite a travs de una pequea
guia-ondas de plstico o cristal hacia el fotorreceptor. La energa
luminosa que incide sobre el fotorreceptor hace que este genere una
tensin elctrica a su salida. Este responde a las seales de entrada, que
podran ser pulsos de tensin.
Diferentes tipos de Optoacopladores

Fototransistor: se compone de un optoacoplador con una etapa de salida


formada por un transistor BJT.
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. El circuito interno de cruce por cero
conmuta al triac slo en los cruce por cero de la corriente alterna.

[Bibliografa]
J. Domingo Aguilar Pea: jaguilar@[Link]
Miguel ngel Montejo Rez: radastan@[Link]

Optoacoplador Qu Es y Cmo Utilizarlo?


Posted on 14 octubre, 2014 Under Componentes 11 Comments

Si quieres evitar que algunas partes de tu circuito se vean afectadas por corrientes o voltajes
excesivos que puedan destruir tus componentes (como puede pasar a causa de los efectos
transitorios que sufren los transistores en suencendido y apagado, as como en otros muchos
circuitos), la solucin ms simple es aislar, separar esas partes. El dispositivo encargado de
realizar esa funcin es el Optoacoplador (tambin conocido como Optoaislador).

Las utilidades de este componente van mucho ms all que simplemente aislar circuitos. En
este post voy a explicarte cmo funciona un Optoacoplador, para qu sirve y cmo realizar un
montaje con este componente, centrndome en su uso aislando circuitos para que no corras
el riesgo de destruir tus componentes electrnicos.

El Optoacoplador

Un Optoacoplador es un circuito integrado muy bsico compuesto generalmente por un diodo


LED y un fototransistor unidos de tal forma que cuando una seal elctrica circula a travs del
LED haciendo que brille, la luz que este emite es recibida por la base del fototransistor,
que empieza a actuar en modo saturacin.
Puedes utilizar este dispositivo a modo de interfaz entre dos circuitos, de tal forma que
quedaran unidos pticamente, lo que a efectos de proteccin del circuito, se traduce en
colocar una resistencia de un valor muy alto (muchos M), lo que lo hace especialmente til
para proteger contra los picos de tensin.
Como la luz que emite el LED vara en funcin de la tensin y la corriente que circulan por l y
esta luz a su vez modifica el comportamiento del transistor, la seal elctrica que tendrs a la
salida (en el transistor) depender de la seal que tengas a la entrada, es decir, de
cmo ataques el LED.
En la prctica esto se traduce en que si regulas bien el comportamiento de tu Optoacoplador
(y los componentes necesarios para su funcionamiento), puedes conseguir que tu circuito
aislador sea invisible en la prctica, es decir, no cambie el comportamiento de tu circuito
global. Otra posibilidad es que te aproveches de la ganancia que te proporciona el
fototransistor y lo utilices para amplificar la seal. En definitiva, como todo en electrnica,
el lmite es tu imaginacin.

Qu Utilidades Tiene un Optoacoplador?

Adems de para aislar circuitos, se pueden utilizar Optoacopladores para:

Interfaces en circuitos lgicos.

Interfaces entre seales de corriente alterna y circuitos lgicos.

En sistemas de recepcin (telefona).

Control de potencia.

A modo de rel.

etc.

Cmo Utilizar un Optoacoplador?

En el apartado anterior te coment algunos de los montajes que podras hacer con un
Optoacoplador. Como su funcin principal es la de aislar y ms en proyectos DIY, te voy a

ensear cmo realizar este montaje y qu es lo que debes tener en cuenta. Para ello me voy a
centrar en uno de los modelos ms comunes, el Optoacoplador 4N35.

Caractersticas Bsicas del 4N35.

Caractersticas de la entrada (LED):

La cada de voltaje tpica del LED del 4N35 es de 1.15V (para una corriente de 10mA).

La corriente mxima que puede soportar el LED sin destruirse es 60mA.

La disipacin de potencia mxima de este componente es 120mW.

Caractersticas de la salida (Fototransistor):

La cada de voltaje de colector a emisor del fototransistor es de 45V para una corriente
de colector de 1mA.

La cada de voltaje del emisor a la base es de 7.8V para una corriente de emisor de
100A.

La cada de voltaje del colector a la base es de 100V para una corriente de colector de
100A.

La ganancia de corriente (Hfe) para una corriente de colector de 2mA y una cada
voltaje de colector a emisor de 5V es de 400.

Como siempre te digo, estas son simplemente algunas caractersticas bsicas y no pueden en
ningn caso sustituir al correspondiente Datasheet del componente.
Debes tener en cuenta que el Optoacoplador 4N35 est compuesto nicamente por un
diodo LED y un fototransistor, por lo que en tu montaje debers utilizar las correspondientes
resistencias. Te dejo un par de links por si tienes alguna duda sobre esto:
1. Resistencia del LED de entrada.
2. Comportamiento del transistor.

Montaje

En funcin del circuito que desees aislar con tu Optoacoplador, necesitars distintos
componentes (fuentes, resistencias, etc.) pero de forma general es esquema de tu circuito
debera ser similar a este:

En este diagrama se han aislado dos circuitos pticamente. El circuito de entrada (LED) regula
el funcionamiento del otro (fototransistor), creando un comportamiento similar a un circuito con
rels.
Como puedes observar en este diagrama, el fototransistor del 4N35 dispone de un pin para la
base (donde incide la luz para regular el transistor), con lo que tambin puedes utilizarlo como
un transistor bsico o conmutar ambas funcionalidades cuando tu proyecto as lo requiera.
En caso de que tengas problemas en la realizacin de este montaje, puedes ayudarte de la
siguiente imagen. El proyecto es el mismo pero sobre una Breadboard.

Nota: Se trata de un montaje genrico, por lo que no debes fijarte en los valores de los
componentes, solo en la composicin del circuito.

Sin duda se podra profundizar mucho ms sobre los diversos montajes que se pueden
realizar con el Octoacoplador 4N35 (o similar) pero con la intencin de que te sirva para
orientarte en cualquier futuro montaje en el que desees aislar circuitos, he intentado
realizar un post lo ms genrico posible.

Aunque en esta entrada he utilizado el 4N35, puedes realizar este montaje con cualquier
Optoacoplador, bastara con echarle un vistazo al Datasheet correspondiente y adaptarlo a tu
circuito.
No dudes en preguntar cualquier tipo de duda que te haya surgido leyendo el post o montando
tu circuito. La comunidad de EducaChip est aqu para ayudarte.
Como siempre te digo, si te gust, comprtelo en tus redes sociales y, si no te quieres perder
ningn post, suscrbete.
Un saludo, Enrique.

4N35, Fototransistor, Optoacoplador

Un optoacoplador, tambin conocido como opto-aislador, fotoacoplador o


fotoMOS, es una pieza de un circuito elctrico que transfiere energa
elctrica entre dos otras partes sin que les permita hacer
unaconexin directa. Mientras los optoacopladores ofrecen un elemento de
aislamiento similar a un componente de rel, a menudo son la mejor
eleccin para los diseadores de circuitos, ya que son ms pequeos y
encajan fcilmente en los sistemas de microcircuito utilizados en
electrnica.

Otras personas estn leyendo

Cmo probar un circuito optoacoplador Triac

Cul es la funcin de un regulador de voltaje?

Funcin de los optoacopladores


Un optoacoplador es esencialmente un transmisor ptico y un receptor ptico
conectado por una barrera no conductora. Utiliza un rayo de luz para transferir energa
de un elemento de circuito a otro y puede manejar voltajes de entrada de hasta 7500 V.
La barrera que separa los dos lados del optoacoplador est hecho de un vidrio
transparente o polmero de plstico que no conduce la electricidad, pero conduce luz.
El dispositivo fsico real del optoacoplador est normalmente encerrado en una carcasa
oscura, no conductora. Est fijado al circuito elctrico a travs de pequeos dientes
metlicos y tiene orificios en cada extremo del pequeo gabinete para que pasen a
travs las conexiones de cables.

Caractersticas

La caracterstica ms importante de un optoacoplador es su eficiencia para transferir


electricidad. La eficiencia de un optoacoplador se mide a travs de su cociente de
transferencia de corriente (CTR), que es la relacin entre el cambio de corriente en el
lado de salida de la barrera y el cambio de corriente en el lado de entrada de la barrera.
La mayora de los optoacopladores trabajan a un CTR entre 10 y 50 por ciento.

Importancia
Los optoacopladores son a menudo utilizados para separar dos elementos de circuito
que operan con voltajes extremadamente diferentes. Esto evita daos a la parte que
trabaja a un voltaje menor. Tambin trabajan para evitar que los dos elementos se
daen por voltaje inverso o sobrecargas de energa. Debido a esta caracterstica, los
optoacopladores son mejor utilizados al asociarse con interruptores de
encendido/apagado y la transferencia de datos digitales. Generalmente, se encuentran
entre un transmisor y un receptor en un circuito elctrico.

Consideraciones
Los optoacopladores se construyen a menudo con diodos emisores de luz (LEDs) como
parte del lado del transmisor ptico. Un LED produce luz cuando el voltaje se aade a
este, hacindolo una fuente de luz perfecto para un optoacoplador. Las lmparas
incandescentes a veces tambin se utilizan en optoacopladores, sin embargo, no son
tan eficientes como los LEDs, ya que distorsionan las seales de entrada y no duran
mucho tiempo.

Beneficios de los optoacopladores


Los optoacopladores juegan un papel integral en muchos artculos comunes del hogar,
tales como telfonos, telfonos celulares, circuitos de computadoras, mdems de
Internet e incluso el circuito elctrico de la casa entera. Los optoacopladores se han
convertido en esenciales para televisores modernos conforme ha crecido la tecnologa y
la complejidad de los componentes digitales. Se utilizan ampliamente para separar las
partes del circuito que manejan el receptor de cable, el rendimiento y la configuracin
de la pantalla.

No dejes de leer...

12 alimentos anticancergenos que


debes empezar a incluir en tu dieta

Esta es la razn por la cual NO debes


usar hisopos para limpiar tus orejas

15 maneras de sacarle provecho al

Vicks VapoRub

Electrnica: teora y prctica


BLOG DEDICADO A LA ELECTRNICA TERICA Y PRCTICA, CON ESQUEMAS,
CIRCUITOS, MONTAJES, HERRAMIENTAS Y VDEOS DEDICADOS AL MUNDO DE LA
ELECTRNICA.

Clases de optoacopladores y como


funcionan
Control de salidas Aadir comentarios

202013

mar

Los optoacopladores su formato mas usual es el encapsulado DIL, y pueden venir en grupos
de 4, 2 1. El uso mas comn es aislar circuitos y reducir ruidos de linea. Basan su
funcionamiento en el empleo de un haz de radiacin infrarroja para pasar seales de un
circuito a otro sin conexin elctrica. Estos son muy tiles cuando se utilizan por ejemplo,
Microprocesadores o Microcontroladores PICs. La ventaja frente a los rels es la ausencia de
rebotes y una velocidad de conmutacin mayor. Otra ventaja seria en la transmisin de
seales analgicas entre circuitos separados elctricamente, esto con el rel es imposible
porque trabaja a contacto abierto o cerrado.

Qu tipo de Optoacopladores hay?

El Optotransistor de encapsulado ranurado lo podemos utilizar como interruptos optico, y su


uso puede ser por ejemplo, para detectar un final de carrera, o tambin para contar el nmero
de vueltas de un cilindro o disco el cual tiene una terminacin opaca que pasa por en medio
del optotransistor en cada vuelta.

Optotransistor de encapsulado ranurado


Este optoacoplador reflexivo o tambin llamado sensor optico reflexivo es utilizado mucho en
robotica en los seguidores de lineas. Uno de los mas conocidos es el CNY70 y las
caractersticas de este componente son:

Diseo compacto.

Rango de funcionamiento de 0 mm a 20 mm de distancia.

Alta sensibilidad.

Baja corriente.

Protegido de la luz ambiente.

Frecuencia de corte de hasta 40 kHz.

Las aplicaciones van desde robots seguidores de lineas, fotocopiadoras, interruptor de


proximidad, contador de objetos, etc.

Optoacoplador reflexivo CNY70.


Aqu podemos ver los smbolos electrnicos tpicos en los esquemas de los optoacopladores.

Clases de optoacopladores, smbolos electrnicos

Existen varios tipos de optoacopladores cuya diferencia entre s depende de los dispositivos
de salida que se inserten en el componente. Quedara clasificado de la siguiente manera:

Fototransistor: se compone de un optoacoplador con una etapa de salida formada


por un transistor BJT. Los mas comunes son el 4N25 y 4N35.

Optotransistor en configuracin Darlington.

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. El circuito interno de cruce por cero conmuta al triac slo en los
cruce por cero de la corriente alterna. Por ejemplo el MOC3041.

Optotiristor: Diseado para aplicaciones donde sea preciso un aislamiento entre una
seal lgica y la red.

Publicado por vicente a las 11:26 pm

Recibe los articulos nuevos de Electrnica: teora y


prctica? Te los mando a tu correo!
Suscrbete gratis a nuestra web!
Escribe tu direccin de correo:

Me apunto

2 comentarios en Clases de optoacopladores y como funcionan

1.

Lalo Garrampie Cabanillas dice:


24/07/2015 a las 4:12 am
Es un tema muy bueno y estoy muy interesado

Responder

2.

jaiwellk dice:

02/08/2015 a las 1:51 am


Interesante tema gracias por tus aportaciones al tema ..saludos desde honduras

Responder

Deja un Comentario
Nombre

(Requerido)

E-mail

(Requerido)

WEB

Tu Comentario

1.
2.

Utilizacin de opto acopladores

3.

Ejemplo de clculo de una carga segn el triac seleccionado

4.

Conclusin

5.

Bibliografa

INTRODUCCIN
Muchos sistemas digitales controlan a otros sistemas o realizan funciones de control tales que
deben ser interconectados a una etapa de manejo de potencia, con base en TIRISTORES
(triacs, SCR, etc.) para actuar sobre cargas resistivas o inductivas en sistemas de iluminacin, o
en procesos industriales o en control de velocidad de motores, entre otros.
El manejo de potencia, es decir la manipulacin de altas corrientes, de hasta varios centenares
de amperios, implica el tener consideraciones de seguridad elctrica para los operarios y de
proteccin para el sistema digital.

Es deseable que la interconexin entre ambas etapas (la digital y la de potencia) se haga por un
medio de acoplamiento que permita aislar elctricamente los dos sistemas. Esto se puede
lograr con los dispositivos llamados OPTOACOPLADORES, mediante los cuales se obtiene un
acoplamiento ptico y, al mismo tiempo, un aislamiento elctrico. Por ello tambin se les
conoce como OPTOAISLADORES. El acoplamiento se efecta en el rango del espectro infrarojo a partir de dispositivos emisores de luz, usualmente IRED (infra-rojo) LEDs
(diodos emisores de luz), actuando como emisores y utilizando dispositivos detectores de luz
(optodetectores), actuando como receptores.
La razn fundamental para llevar a cabo acoplamiento ptico y aislamiento elctrico es por
proteccin de la etapa o sistema digital ya que si ocurre un corto en la etapa de potencia, o
cualquier otro tipo de anomala elctrica, el OPTOACOPLADOR protege toda la circuitera
digital de control. El sistema digital puede variar entre un sistema discreto o un sistema de
mayorintegracin (en escalas SSI, MSI, VLI o VLSI) o un sistema integrado programable a
nivel de memorias (EPROM o EEPROM) o a nivel de dispositivos programables "inteligentes"
(microprocesadores, microcontroladores, dispositivos lgicos programables, arreglos lgicos
programables, controladores lgicos programables o computadores).
UTILIZACIN DE OPTO ACOPLADORES
Veamos a continuacin algunos dispositivos OPTOAISLADORES, extrados del manual de
reemplazos ECG (para dispositivos semiconductores), en donde se pueden apreciar varias tipos
de elementos de OPTOACOPLAMIENTO: por fototransistor, fotodarlington, fotoSCR,
fotoTRIAC, fotoFET, etc. Todos ellos se estudian en la teora de la optoelectrnica con
dispositivos semiconductores basados en Silicio (Si) o Germanio (Ge).

Trabajaremos, a manera de ejemplo, con el OPTOACOPLADOR MOC 3011 (o MOC 3010) que
corresponde al caso ECG 3047 (o 3048) de los diagramas anteriores. La siguiente es
la distribucin de pines del circuito integrado (IC) optoaclopador seleccionado. NC significa
que este pin o patilla no se conecta.

Configuracin de pines
El siguiente es el diagrama de bloques general para la conexin de un sistema digital a una
etapa de potencia mediante el uso de un optoaclopador.

Diagrama de bloques para interconexin de un sistema digital y un sistema de


potencia
Continuando con el ejemplo, como sistema de potencia vamos a trabajar con un sistema de
iluminacin (carga resistiva) cuya potencia es manejada por un TRIAC. En lo que sigue, se
expondrn las configuraciones estndar empleadas para hacer acoplamiento ptico entre
sistemas digitales y etapas de potencia. El montaje requerido se selecciona de acuerdo con las
necesidades del sistema.
MONTAJE ESTNDAR BSICO (CON LOGICA DIGITAL POSITIVA)

MONTAJE SI LA LGICA DIGITAL ES NEGATIVA.

MONTAJE PARA ASEGURAR DISPARO Y PERMITIR MONITOREO ADICIONAL


DE LA SALIDA

En ocasiones hay dificultades por problemas de corriente para disparar el TRIAC, en cuyo caso
una solucin alterna sera con un transformador de IMPULSOS o de PULSOS, con el cual no
hay acoplamiento ptico pero se logra un acoplamiento inductivo. La relacin de espiras del
transformador es 1:1.

Un transformador de impulsos tpico es el CAR 2767A serie 07175. Se utiliza en aplicaciones


industriales y en electromedicina.
Ahora bien, si la carga no es resistiva, es necesario adicionar una red RC o RL para garantizar el
disparo del TRIAC. Esta red tiene cierta complejidad, pero permite asegurar precisin en los
disparos y, adems, protege contra disparos aleatorios e indeseados producidos por ruidos
electromagnticos.
Para obviar los problemas de corriente tambin puede utilizarse un amplificador con transistor,
pero en este caso ya no se tiene aislamiento elctrico.
Para finalizar este artculo, se da un ejemplo de clculo para una etapa de potencia basada en
un Triac.
EJEMPLO DE CLCULO DE UNA CARGA SEGN EL TRIAC SELECCIONADO
En este ejemplo partimos de dos hechos: la potencia se controlar con un TRIAC, y la carga a
manejar ser resistiva como en el caso de las lmparas para un sistema de luces secuenciales en
arreglos de navidad (lmparas exteriores) o en una discoteca o en un teatro. El Triac se
selecciona de acuerdo a la corriente de operacin y esta depender del nmero de lmparas a
utilizar. Los pasos para el clculo son como sigue:
1. Definicin de parmetros:
1.

Sean N= Nmero de lmparas a utilizar por cada TRIAC.

W= El Vatiaje o potencia de cada una de las lmparas (40 W, 60 W, 100 W,etc.)


V= Voltaje de la red (110 V 220 V). Este voltaje es RMS
I= La corriente consumida por cada lmpara
I = La corriente especificada del TRIAC (segn el manual del fabricante)
2. Clculo de la corriente que consume cada lmpara: I= W/V.
3. Clculo de N: N= I/I.
NOTA 1: Por seguridad, es conveniente disminuir N en un 30% aproximadamente. Recuerde
que nunca se debe trabajar cerca del lmite del regmen mximo especificado por el fabricante.
NOTA 2: Cada TRIAC debe llevar su buen disipador de calor. No olvide que cuando se manejan
altas corrientes, hay tendencia a fuerte disipacin de potencia en forma de calor y este es el
principal enemigo de los semiconductores.
Continuando con el ejemplo, supongamos que se tiene:
V= 110 V (de la lnea de alimentacin de voltaje)
W= 40 Watts (potencia nominal de cada una de las lmparas)
I= 6 A (corriente del Triac, segn las especificaciones del manual)
Aplicando el paso 2, se tiene: I = 40/110 = 0.363 A = 363 mA
Luego, aplicando el paso 3, se tiene N = 6/0.363 N=16.5 Lmparas
En forma prctica y teniendo en cuenta la Nota 1, Tomar N= 10 Lmparas.

Otro ejemplo puede ser a la inversa, es decir partir del nmero de lmparas y hallar la corriente
I, del TRIAC, necesaria para operar el sistema. Una vez hallada se tiene en cuenta el criterio del
30% ms para seleccionar el Triac comercial que cumpla con el requerimiento.
CONCLUSIN
Siempre que se vaya a interconectar un sistema digital cualquiera a un sistema de potencia, es
necesario hacer optoacoplamiento, para garantizar aislamiento elctrico. De no hacerlo se
corren enormes riesgos que se traducirn en problemas de seguridad elctrica, daos costosos
en los sistemas de control digitales y perjuicios al proceso de produccin sobre el cual se est
operando.
El optoaclopador es un dispositivo relativamente simple, muy fcil de usar, con una amplia
variedad de tipos de acoplamiento y de muy bajo costo. Por ello sera imperdonable no hacer
uso de l cuando se va a controlar potencia.
En cuanto al clculo 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 30% respecto
de los regmenes mximos sealados por el fabricante. Es la nica manera de evitar dolores de
cabeza, algunas veces irreversible, en el manejo de dispositivos de potencia.
BIBLIOGRAFA

Boylestad Robert y Nashelsky Louis. Electrnica. Teora de Circuitos. Editorial


Prentice Hall Hispanoamericana, Mxico, 1998.

Maloney J. Timothy. Electrnica Industrial. Dispositivos y Sistemas. Editorial


Prentice Hall Hispanoamericana, Mxico, 2000

Manual de reemplazos ECG. Silvania, USA, 2000


Williams, Arthur. Microprocesadores, dispositivos
optoelectrnicos, perifricos y de interfaz. Serie de circuitos integrados. Mc
Graw Hill, Mxico, 1989.

Por
Ing. Nelson Ra Ceballos
Decano de las tecnologas en Electrnica y en Mantenimiento de Equipo Biomdico.

Comentarios

Sbado, 28 de Octubre de 2006 a las 17:15 | 0

ARISTOTELES ZARATE
Le falta precisin.
Mostrando 1-1 de un total de 1 comentarios.

Pginas: 1
Para dejar un comentario, regstrese gratis o si ya est registrado, inicie sesin.

Trabajos relacionados

Actividades en la planeacin de sistemas


de informacin.
Hallazgos de los hechos. Herramientas para documentar
procesos y decisiones. rboles de decisin. Tablas de
decisin. Es...

Computadores Cunticos
A lo largo del ltimo medio siglo, las computadoras han
ido duplicando su velocidad cada dos aos, al tiempo
que el tama...

Comunicacin de datos
Aplicaciones de las comunicaciones de datos en los
negocios. Intercambio electrnico de datos (EDI).
Hardware para el so...
Ver mas trabajos de General
Nota al lector: es posible que esta pgina no contenga todos los componentes del trabajo origi

Leer ms: [Link]

La transmisin de seales digitales en la corriente alterna, o AC, es


imposible sin la asistencia de un detector de cruce por cero --circuitos
elctricos que detectan cuando la corriente alcanza el punto de cruce por
cero de la onda.

Otras personas estn leyendo

Cmo crear tu propio lser para cortar

30 fotografas que sacarn al obsesivo que tienes dentro

Los hechos
En una grfica de ondas, el cruce por cero es la lnea recta que bisecta la onda. En
electrnica, el cruce por cero identifica donde la funcin de onda cambia de positivo a
negativo o viceversa. En un interruptor atenuante de luz, por ejemplo, un detector de
cruce por cero permite ajustes del nivel de poder en la corriente elctrica, ya que esos
puntos no tienen voltaje. La interrupcin de la corriente en cualquier otro punto
del circuito elctrico crea un pico de poder potencialmente daino.

Funcin

Los detectores de cruce por cero son vitales en la transmisin de seales digitales a
travs de los circuitos de corriente alterna, tal como los mdems u otros aparatos

digitales. La ausencia de este componente explica por qu el audio digitalmente


controlado produce ruido cuando el usuario sube muy rpido el volumen. Cuando la
ganancia slo se aumenta en los puntos de cruce por cero, no hay entrada ni ruido de
seal.

Comparadores
Los detectores de cruce por cero trabajan usualmente en conjunto con los
comparadores, que son dispositivos elctricos que comparan la fuerza de la seal
(voltaje o corriente) y cambian la salida basada en la seal ms fuerte. Mientras que los
amplificadores comparadores operacionales anlogos son ampliamente usados, los
chips dedicados comparadores de voltaje funcionan mejor para los dispositivos
digitales.

No dejes de leer...
2.3.1. DETECTORES DE CRUCE POR CERO

Muchos circuitos electrnicos operan con doble polaridad, el detector de cruce por cero 'sensa' cuando se p

Algo un poco ms difcil es detectar el 'cruce por cero' de una seal electrnica de una sola polaridad, en e
'nivel de cero', y luego el circuito operar con tal nivel para 'sensar' cuando la seal esta por encima o por d

Algo aun ms difcil es cuando la seal no posee 'nivel de continua' porque se lo ha filtrado. En tal caso el c
determinar el punto de cruce para determinar cuando la seal esta por debajo del nivel promedio y cuando

Pero todas las explicaciones anteriores que 'claramente' explican los tipos de detectores por cruce por cero

Los detectores de cruce por cero se utilizan para detectar los tipos de seales, o diferentes significados de
positiva' indicar un 'uno lgico' y en su parte negativa un 'cero lgico'. El detector de cruce por cero es par
un 'uno' o un 'cero'.
Con seales analgicas los detectores de cruce por cero operan con formas de ondas mucho mas variante
la forma de onda, el nivel promedio de la seal, ayudar a integrar o diferenciar seales, etc.
Toda aquella 'funcin matemtica' a aplicar a la seal que requiera determinar el 'nivel de cero' de tal seal

EJEMPLO DE USO:

El uso ms comn de un detector de cruce de cero es para gobernar la aplicacin de corriente alterna a un
(dimmer): la corriente alterna es una onda senoidal que va circulando en un sentido y en otro a razn de 60
decir su intensidad es cero. En circuitos de corriente alterna para dismunuir la potencia de la carga, se dete

durante la pausa, la carga permanece apagada, al disparar el TRIAC la carga se enciende y permanece en
al TRIAC. El perodo de la corrienet alterna a 60 ciclos/segundo es de 16.67 milisegundos, cada 8.3 miliseg
pausas de 4.15 milisegundos entonces la carga se ve disminuida a la mitad.

Hay un circuito muy simple para detectar cruce de cero que es el opto-aislante TIL111 al cual se le agrega u

Comentarios
No tienes permiso para aadir comentarios.
SIN CATEGORA

LO QUE ES UN DETECTOR DE
CRUCE POR CERO?
ABRIL 4, 2015 ADMIN

La transmisin de seales digitales a travs de la corriente alterna, o AC,


resulta imposible sin detectores de cruce por cero circuitos elctricos
que detectan cuando la corriente alcanza el punto de cruce por cero de
la onda.
En un grfico de forma de onda, el cruce por cero es la lnea recta que
divide en dos la onda. En electrnica, un paso por cero identifica donde
la ola de funcin pasa de positivo a negativo o viceversa. En un
regulador de intensidad de luz, por ejemplo, un detector de cruce por
cero permite a los ajustes de nivel de potencia de corriente en tensin,
como los puntos no tienen tensin. La interrupcin de la corriente en el
resto del ciclo de onda crea un pico de energa potencialmente daina.
Detectores de cruce por cero son vitales para la transmisin de seales
digitales a travs de circuitos de corriente alterna, como en los mdems
y otros dispositivos digitales. La ausencia de un circuito detector de
cruce por cero explica por qu dispositivos de audio controlados
digitalmente producen ruido cuando un usuario sube el volumen
demasiado rpido. Cuando la ganancia slo aumenta a cero puntos de
cruce, no hay entrada y no haba ruido de la seal.
Cruce por cero detectores suelen trabajar en conjunto con los
comparadores dispositivos elctricos que comparan intensidad de la

seal (voltaje o corriente) y la salida de conmutacin basndose en la


seal ms fuerte. Mientras que los comparadores analgicos
amplificadores operacionales son ampliamente utilizados, fichas
comparador de tensin dedicados funcionan mejor para los dispositivos
digitales.
LNEAPUNTO

Ir a la entrada
ENTRADA ANTERIOR

Ingeniera Electrnica

hacasi el 27 mar. 03

Detector de cruce por cero


Quisiera que me explicaras con un ejemplo claro las utilidades de un optoacoplador
que tenga detector de cruce por cero por ejemplo para el manejo de control de
potencia, que ventajas tiene el poder contar con dicho detector.
SEGUIR RESPONDER MS INFO
COMPARTIR

2 RESPUESTAS
RESPUESTA DE GONIX

gonix

Su uso ms comn es el de poder conmutar cargas grandes con dispositivos no tan


potentes.

Me explico:
El momento crtico para controlar una mquina (motor,...) es en la encendida. En ese
momento, se consume unas 6 veces ms corriente de la que se consume normalmente.
Si conectas la mquina en cualquier momento, tienes que poner un dispositivo de
control que aguante conexiones de esa gran corriente.
Pero si puedes detectar el paso por cero y conectar la mquina en ese instante, cuando
se consuma toda esa corriente, el dispositivo de control ya estar conduciendo.
Podr tener lo que se llama "un poder de marcha/corte" inferior.
Piensa en el interruptor de una habitacin. Si lo accionas puede ser que salga alguna
chispa. Pues si lo pudieras accionar justo en el momento en que el voltaje es cero, la
intensidad del circuito en aquel momento tambin sera cero. Cuando la corriente
comenzara a augmentar, el interruptor ya estara accionado y no habra chispa.
el 27 mar. 03
VOTAR 1
COMENTAR
COMPARTIR
RESPUESTA DE LEOSOFT

leosoft, Programacion Avanzada en VisualBasic, trabajo hace mas de 15


aos...

Un optoacoplador con detector de cruce por cero es un opto normal con el agregado de
ese detector, lo que hace es conectar la carga a su salida unicamente cuando la tensin
en altena alcanza los 0 volts, la ventaja es que no conectaras la carga con una tensio
elevada en ese momento ya que vos no controlas la tensin de alterna, eso hace que los
equipos de potencia o lmparas no sufran descargas abruptas por la conexin de la
tensio en cualquier punto de la seal.
Si haces esto con laparitas comunes de 220 veras que te duran muchsimo ms, si

recoras las lmparas siempre se queman a la hora de encenderlas, nunca cunado estn
encendidas, eso es porque las llaves comunes de tecla en una casa no controlan en que
intentar de la seal esta a la hora de conectar.
el 28 mar. 03
VOTAR 1
COMENTAR
COMPARTIR
AADE TU RESPUESTA

Haz clic para RESPONDER o PEDIR MS INFORMACIN

Ms respuestas relacionadas
Activar un optoacoplador
Recibe mi cordial saludo. Estoy tratando de hacer un interruptor para apagar y encender una
fuente de 40 Amperios, pero no he podido encontrar cmo se "activa" el optoacoplador. Puedo
usar una pila y de qu voltaje? Compr un pulsador pues esa es la...

3 respuestas
De optoacoplador a rel
Deseo activar pequeos rels a 24V AC, con un consumo de bobina de 50mA, quisiera hacerlo
con optoacopladores por ejemplo el MOC3020, todos los esquemas que encuentro aaden un
triac a su salida para este activar la carga, se puede poner el rel a la...

1 respuesta
Dudas con leds en mecanismos
He instalado en mi casa mexanismos Axolute de Bticino, que llevan un led de sealizacin azul.
La mayora me funcionan bien, pero me encuentro los siguientes problemas: 1.- En la mayora
de los enchufes se apaga el led al conectar algn aparato, pero...

2 respuestas
Cmo hacer una fuente regulada?

Necesito rectiicar un voltaje de entrada de 500 a 550 VAC monofsico, y alimentar una carga
de 3Amperes a 247VDC ademas debe estar protegida por varistores. Tengo un circuito que
estoy diseando para esto. Tomo el voltaje de entrada, lo paso por un...

1 respuesta
Regular el primario de un transformador
En primer lugar, he acudido a casas de electrnica buscando este "regulador" y en cuanto les
explico que hay un transformador de por medio todos rehuyen el tema. Me explico, la
aplicacin en s, consta de un transformador de 230V-333V y 320VA. En el...

1 respuesta
Genedor trifsico
Solo quera saber cuales son los mtodos para poner un generador en paralelo y que
instrumentos de medida se utilazan

1 respuesta
Instalacin de detector de movimiento en un garaje con minutero
Quiero instalar un detector de movimiento en un garaje donde la instalacin se encuentra con
un contactor con un minutero de escalera y est conectado a 3 hilos, con varios pulsadores. La
conexin al detector de movimiento la he realizando...

1 respuesta
Tensin sin luz
He instalado una lmpara de bajo consumo en un dormitorio y veo que al apagarla, sta intenta
encenderse (como un fluorescente averiado). He medido en los cables del techo 125 voltios con
la luz apagada (la tensin de mi casa es 220 voltios). Hay dos...

3 respuestas
Interruptor con dos entradas y dos salidas
No 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 DOS FASES (lo pongo as para que
quede claro que no puede ser una conmutada, que solo tiene una fase)....

1 respuesta
Circuitos elctricos

Qu significa circuito bajo carga,? Que diferencia hay entre seccionador e interruptor.

1 respuesta
Inicio Detector de cruce por cero optoaislado

Detector de cruce por cero optoaislado


Este es el diseo de un detector de cruce por cero optoaislado. Su misin es
conectarse a un microcontrolador para controlar el cruce por cero de la seal de
corriente alterna de la red elctrica y poder hacer disparos de triacs y control de
fase de forma sincronizada. Solamente da un impulso con el semiciclo positivo de
la seal de la red.
El requisito de diseo es que el consumo sea mnimo, mientras se mantiene el
aislamiento con el microcontrolador.
La figura muestra el esquema del circuito.

R1 y R2 forman una fuente de alimentacin resistiva para alimentar el circuito. Su


misin es cargar el condensador C1 para que cuando se produzca el cruce por cero
Q1 lo descargue a travs del optoacoplador dando un impulso negativo en la
salida. La resistencia (R1+R2) se calcula para que el condensador se cargue en
10ms a menos de 12V. Las resistencias se dividen en dos para que cada una
soporte una tensin menor ya que estn conectadas directamente a la tensin de
alimentacin (340Vp). El diodo zener D4 garantiza que la tensin nunca suba por
encima de los 12,6V. La potencia de las resistencias es de 1/2W para disipar la
energa consumida. El consumo de este circuito es de 2mA como mximo.
Q1 conduce cuando la tensin de la red supera la tensin de D2+Vbe de Q1. Esto
significa que el transistor comienza a consumir cuando la tensin supera 1V
aproximadamente y se mantiene en conduccin hasta que Q2 se pone a conducir o
hasta que el condensador C1 se descargue (200uS aproximadamente). Q1 est
configurado como fuente de corriente por D5 y D6 junto con R7 para proporcionar
60mA como mximo, que es lo que soporta el 4N25. La corriente est limitada en
el diodo emisor de luz por R7. R8 garantiza inmunidad frente al ruido bajando la
impedancia de entrada del transistor y poniendo a masa su base durante el
semiciclo negativo. Con los valores especificados, Q1 comienza a conducir cuando
la tensin de la red alcanza los 6V aproximadamente.
Cuando la tensin de la red llegue a 12V aproximadamente, D3 se pone a conducir
y pone en saturacin a Q2, cortocircuitando la base de Q1 y ponindolo en corte.
Esto permite que el condensador C1 se vuelva a cargar lentamente hasta que
alcance su valor mximo al final de la mitad del periodo de la onda que trabaja a
50Hz.
Durante el semiciclo negativo no se absorbe corriente de la red debido a los diodos
D1 y D2.

Seguinos en redes sociales

Transistores bipolares (Conceptos Basicos)

Que es un transistor bipolar?


Un transistor es un dispositivo electrnico que tiene la caracterstica de permitir el
paso de la corriente en un nico sentido y de una forma controlada.
A modo grafico para ilustrar el comportamiento lo podemos asociar a un interruptor
con una entrada y salida de corriente y un botn que permite o no la circulacin.
El comportamiento es el mismo, el interruptor es un pulso elctrico que se enva a
uno de sus terminales y permite la circulacin de una corriente ms grande por los
otros dos terminales.
Posee tres terminales con los siguientes nombre (Colector/Base/Emisor).
Base (B): Siguiendo la lnea del ejemplo podemos decir que es el pin donde se
inyecta la seal que lo enciende o apaga, a esta corriente se la denomina
corriente de base.
Colector (C): Mediante este pin es donde se alimenta el transistor, se lo conecta a
una fuente para suministrarle la energa externa.
Emisor (E): 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 (NPN y PNP), la diferencia radicar en
los materiales de construccin y en el sentido de la corriente de polarizacin
(corriente que circula entre la Base y el Emisor)

Funcionalmente no existen diferencias entre estos dos transistores, solo la


polaridad de sus electrodos.

Factor de amplificacin del transistor (Beta o HFE)


Se conoce como Beta o HFE y es la ganancia de corriente que se obtiene en el
Colector al aplicar una corriente determinada en la base.
Es decir que si tengo un Beta = 100 significa que en el terminar de colector voy a
tener una corriente 100 veces mayor a la corriente de base, Beta = IC / IB

Para que sirve un transistor?


Como Interruptor:

Como mencionamos antes, podemos utilizar el transistor como una llave


electrnica, para permitir o no el flujo de corriente de un terminal a otro.
Es muy til para casos donde estoy trabajando con niveles de corriente
pequeos y necesito alimentar dispositivos que consumen grandes cantidades
de corriente.
Supongamos que mediante un pin de salida de un micro controlador (Arduino
por ejemplo), quiero encender una lamparita de 5W, si lo conecto en forma
directa la lamparita no se encendera por que la corriente que suministra el
micro controlador es muy baja, 40mA para ser exacto.
Una lamparita de esa potencia conectado a una batera de 12V consume una
corriente de 400mA, claramente inalcanzable si conecto la lmpara directa al
micro controlador.
Por lo tanto la solucin seria conectar la salida del micro controlador a la Base
del transistor el colector del transistor a la fuente de 12 en serie con la lmpara,
de esta manera al inyectar un pulso a la base enciendo el transistor y permito
la circulacin de corriente por el colector, y la lmpara se enciende.

Como se ve en la imagen, la corriente de 40mA que circula por la base, es la


que saldra del controlador.
Como amplificador:

Como dijimos antes, el transistor tiene la caracterstica de permitirnos controlar


el nivel de corriente a la salida mediante una pequea corriente de entrada.
Corriente de salida (IC) = HFE*Corriente de entrada (IB)

Veamos el siguiente ejemplo:


Supongamos que tenemos un Transistor de HFE = 10 (los comerciales son de
valor superior a 150) al que le ingresa a la base una corriente alterna de forma
senoidal de 4mA (IB) de pico (variando entre -4mA y 4mA), dado que HFE = 10
nos indica que la corriente de salida de colector (IC) variara entre -40mA y 40mA

La corriente que circula por el colector (la de color azul), es entregada por la pila
de 9V pero controlada por la corriente de entrada (la roja), respetando la misma
forma pero modificando su amplitud. Si la seal roja fuese una seal de audio, la
seal azul es la misma seal de audio pero ms audible (amplificador)

Regiones de funcionamiento
Regin de corte

Decimos que un transistor se encuentra en Corte cuando la Corriente de


Colector (IC) es aproximadamente cero, por lo que hace que toda la tensin
caiga en el transistor y que las resistencias de colector y emisor casi no disipen
potencia, esto se da cuando la corriente de base (IB) es muy cercana a 0 y hace
que la corriente de colector (IC) tambin lo sea, con lo cual se comporta como
un circuito abierto.

Regin de Saturacin

Decimos que un transistor se encuentra Saturado cuando la Corriente de


Colector (IC) es la Corriente de Colector Mxima o esta muy cercano a ella.
Se presenta cuando la Diferencia de Potencial entre Colector y Emisor (ver ley
de Ohm) cae por debajo de la tensin umbral VCEsat.
En esta regin la relacin IC=Beta*IB deja de cumplirse.
Podemos decir que el transistor en esta zona se comporta como un cable, por
que la diferencia de potencial entre sus terminales es cero.

Regin Activa

Es la zona entre la regin de Saturacin y Corte, es donde la relacin IB =


HFE*IC se cumple.
En esta regin la corriente depende de la corriente de base y de la ganancia del
transistor (beta o HFE), este ultimo dato lo entrega el fabricante. Si queremos
utilizar el transistor como Amplificador de seal debemos utilizarlo en este
regin.
Se dice que en esta zona el comportamiento del transistor es predecible ya
que el comportamiento del mismo se puede asemejar a un sistema lineal, en la
realidad existe un pequeo error en realizar esta aproximacin ya que la curva
que lo caracteriza no es una recta si no que tiene una leve curvatura, a efectos
prcticos es muy til 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 pequeo, casi imperceptible.

Configuraciones bsicas de un transistor


Existen tres tipos de configuracin para un transistor, cada una de ellas tiene
ventajas y desventajas segn la aplicacin que necesitamos realizar.
Colector Comn (seguidor de emisor)

Decimos que el transistor esta configurado en Colector Comn cuando la seal


de entrada se aplica a la base y la seal de salida se obtiene del emisor, esta
configuracin tiene una alta impedancia de entrada y una baja impedancia de
salida, por lo tanto es til para realizar acoplamientos con otras etapas del
circuito.
La ganancia de tensin, Voltaje de salida/Voltaje de entrada (VO/VS) nunca ser
mayor a uno, en la practica la tensin de salida es aproximadamente el 50% de
la tensin de entrada. Claramente esta configuracin no ser una buena
eleccin si queremos usarlo como amplificador.

Emisor Comn

Decimos que el transistor esta configurado en Emisor Comn cuando la seal


de entrada se aplica a la base y la seal de salida se obtiene del Colector, la
seal a la salida es igual a la de entrada pero invertida y amplificada en un factor
aproximado RC/RE, si tenemos una RE pequea en comparacin con RC
tendremos una gran ganancia, con lo cual es una configuracin muy utilizada
para amplificar seales.

Base Comn

En esta configuracin, la seal de entrada ingresa por el Emisor y la seal de


salida Sale por el Colector, tiene como caracterstica principal de tener una muy
buena amplificacin de tensin.
Posee una impedancia de entrada muy baja, como se puede ver la base esta
conectada a tierra por eso es el terminal comn.

10/10 30 [Link]
Publicado por Cristian Veloso en 12:47

No hay comentarios:
Publicar un comentario en la entrada
Entrada ms recienteEntrada antiguaPgina principal

Pgina de inicio

Todas las categoras

Arte y humanidades

Autos y transporte

Belleza y moda

Ciencias sociales

Ciencias y matemticas

Comer y beber

Computadoras e internet

Deportes

Educacin y formacin

Electrnica de consumo

Embarazo y maternidad

Familia, Amor y relaciones

Hogar y jardinera

Juegos y recreacin

Mascotas

Medio ambiente

Msica y entretenimiento

Negocios locales

Negocios y finanzas

Noticias y eventos

Poltica y gobierno

Restaurantes

Salud y belleza

Sociedad y cultura

Viajes

Yahoo y sus Productos

Internacional
Acerca de
Ciencias y matemticas Ingeniera
Siguiente

Que Significan Las Siglas "HFE" De Un Multimetro?


POR FAVOOOR
Seguir
2 respuestas
Notificar abuso

Respuestas

Mejor respuesta: Es para medir la ganancia emisor comun en un transistor de union bipolar.. en
la teora viene siendo la letra BETA del alfabeto griego. Saludos.
Pako V. Rochin hace 6 aos
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 Junction
Transistor)
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

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 aos
2
Pulgar hacia arriba
0
Pulgar hacia abajo
Comentario
Notificar abuso

Que Significan Las Siglas "HFE" De Un Multimetro?

Agregar tu respuesta

Leccin 1 :

Leccin 2 :

Comentarios en C++
El archivo iostream.h
Manipuladores
El archivo iomanip.h
Funciones de salida
Funciones de entrada

Declaracin y definicin de funciones


Variables globales y locales
Parmetros por defecto
Nmero variable de argumentos
Sobrecarga de funciones
Recursividad

Leccin 3 :
Encapsulado
Clases
Miembros public y private
Constructores y destructores
Mtodos const
Implementacin en lnea
Empaquetado
Leccin 5 :

Leccin 4 :
Operaciones de escritura
Operaciones de lectura
Operaciones con archivos binarios
Lectura y escritura en un archivo
Salida a impresora
Leccin 6 :

Un array de objetos
Una cadena incrustada
Objetos anidados
Objeto con puntero interno
Sobrecarga de operadores
Objeto ubicado dinmicamente
Sobrecarga de funciones
Objeto con puntero a otro objeto
Lista enlazada de objetos

Leccin 1
De acuerdo a su definicin, C++ es una extensin del lenguaje C, un
supercunjunto, esto implica para quin decide iniciar sus estudios en C++ que
para empezar dispone de un lenguaje completo como soporte a los nuevos
conceptos introducidos por C++, esto significa que todo lo que podemos
programar en ANSI-C funciona en C++ y esto a su vez es una buena razn para
afirmar la importancia que tiene en el aprendizaje de C++ el conocimiento previo
del lenguaje C, por lo tanto se supone que el lector est familiarizado con todo lo
expuesto en el curso en lnea de la seccin programando en C.

Comentarios en C++
Es natural tratar en primer lugar la manera de hacer comentarios en el cdigo
fuente de un programa escrito en C++, y para probar la afirmacin hecha en el
prrafo anterior, el siguiente cdigo escrito en C debe compilar perfectamente. Le
llamaremos al cdigo [Link], habr notado que la extensin *.cpp se
refiere a C-plus-plus. Un compilador de C++ sabe que el cdigo est escrito en
C++ precisamente por la extensin del archivo que contiene el cdigo fuente.
/******************************************/
/* [Link]
*/
/******************************************/

#include <stdio.h>
int main()
{
float corriente, voltaje, resistencia; /* tres variables */
printf("Este programa calcula volaje de acuerdo a la ley de Ohm\n");
printf("Valor de la corriente, en amperes?\n");
scanf("%f", &corriente);
printf("Valor de la resistencia, en ohms?\n");
scanf("%f", &resistencia);
voltaje=corriente*resistencia; /* calculo de voltaje */
printf("El valor del voltaje es de %f voltios\n", voltaje);
}

return 0;

Aunque se trata de un programa escrito en C, por la sencilla razn de que el


archivo de cdigo fuente lleva la extensin *.cpp, el compilador lo trata como un
cdigo C++ vlido, esto demuestra la total compatibilidad de que disponemos al
programar en C++ con respecto al lenguaje C. Empero C++ introduce una
manera ms prctica de hacer comentarios al utilizar doblemente el smbolo de
barra inclinada para indicarle al compilador que el resto de la lnea de cdigo que
sigue a la doble barra inclinada es un comentario y por lo tanto debe ignorarse en
el proceso de compilacin. Al contrario del mecanismo para hacer comentarios
en C que puede abarcar varias lneas de cdigo, el estilo utilizado en C++ slo es
vlido hasta el final del rengln en donde es utilizada la doble barra inclinada.
Ahora nuestro programa lo modificamos para utilizar comentarios en C++:
//******************************************
// [Link]
//******************************************
#include <stdio.h>
int main()
{
float corriente, voltaje, resistencia; // tres variables
printf("Este programa calcula volaje de acuerdo a la ley de Ohm\n");
printf("Valor de la corriente, en amperes?\n");
scanf("%f", &corriente);
printf("Valor de la resistencia, en ohms?\n");
scanf("%f", &resistencia);
voltaje=corriente*resistencia; // calculo de voltaje
printf("El valor del voltaje es de %f voltios\n", voltaje);

return 0;
}

Se aprecia de inmediato la comodidad del nuevo estilo de introducir


comentarios en el cdigo fuente de C++ adems del doble beneficio que
representa el poder seguir utilizando los comentarios en C. Se debe tener ciertas
precauciones al manejar los comentarios pues aunque C++ reconoce ambos
mtodos, el estndar ANSI-C en s no reconoce la mecnica de C++ para los
comentarios, dicho en otras palabras, no escriba cdigo en ANSI-C pensando en
trminos de C++, lo contrario, como ya lo probamos, es perfectamente vlido.
Volver al principio

La librera iostream.h
Aunque [Link] es un programa C++ vlido sabemos que es en realidad
un programa escrito en C y nosotros estamos interesados en aprender los aspectos
nuevos introducidos en C++, pues bien, un cambio muy importante es en la
manera en que se maneja la entrada y salida de datos en el programa. Al igual que
en C, C++ no incluye operaciones de entrada y salida como parte del lenguaje en
s, en cambio define la librera iostream que agrega funciones de entrada y salida
muy elegantes. Al programar en C nos familiarizamos con el archivo stdio.h en
donde est definida entre otras, la funcin printf()que como sabemos sirve para
escribir datos en el dispositivo estndar de salida, que en la gran mayora de los
casos es el monitor de la computadora. Como la funcin printf() se desarroll casi
desde los origenes de C, la funcin ha sufrido una serie de transformaciones que
la ha hecho crecer en tamao, como resultado de esto, cuando incluimos la
funcin printf() en nuestro programa C tambien incluimos todas las opciones
agregadas con el tiempo aunque no las utilicemos. Un caso similar sucede con la
funcin scanf().
C++ propone una solucin muy interesante al tratar las operaciones de
entrada-salida (E/S) no como una funcin, sino como una clase que implementa
una gran capacidad de formatos para entrada y salida de datos, de sta manera el
programador C++ toma slo las carctersticas que el trabajo requiere. Aunque no
hemos definido qu es una clase, tenga en cuenta que en C++ las operaciones de
E/S estn definidas en una clase, ste es un punto importante. Existen cuatro
flujos de E/S (iostreams) predefinidos:
cin, asociado al dispositivo de entrada estndar.

cout, asociado al dispositivo de salida estndar.


cerr, asociado al dispositivo de error estndar.
clog, salida almacenada temporalmente para el dispositivo de error
estndar.
Tomando en cuenta lo dicho estamos en condicin de modificar el programa
anterior para utilizar los flujos de E/S, de sta manera ya no necesitamos el
archivo de cabecera stdio.h el cual lo hemos sustituido por el
archivo iostream.h que nos permite utilizar los flujos de E/S
//******************************************
// [Link]
//******************************************
#include <iostream.h>
int main()
{
float corriente, voltaje, resistencia; // tres variables
cout << "Este programa calcula volaje de acuerdo a la ley de Ohm\n";
cout << "Valor de la corriente, en amperes?\n";
cin >> corriente;
cout << "Valor de la resistencia, en ohms?\n";
cin >> resistencia;
voltaje=corriente*resistencia; // calculo de voltaje
cout << "El valor del voltaje es de " << voltaje << " voltios\n";
return 0;
}

El programa [Link] es idntico a [Link], sin embargo es importante


hacer notar lo siguiente, no se recomienda mezclar la funcin printf() con el flujo
de salida cout en el mismo programa ya que se generaran dos flujos
independientes hacia el mismo dispositivo de salida con resultados
impredecibles. Comparando los dos ltimos programas es fcil asimilar el uso
de cin y cout. Utilizamos el flujo de salida cout en conjuncin con el operador de
insercin, << para mostrar un mensaje en la pantalla del monitor. De manera
similar, utilizamos el flujo de entrada cin en conjuncin con el operador de
extraccin, >> para asignar un valor a las variables
llamadas corriente y resistencia. Observe que no es necesario utilizar el operador
de direccin & con las variables de entrada. La lnea 19 demuestra el uso de
varios operadores de insercin en una sola lnea de cdigo, observe que las

cadenas y los datos se despliegan en el orden en que se escriben en la lnea de


cdigo, tambien observe el espacio en blanco al final de la primera cadena y al
principio de la segunda cadena de sta lnea de cdigo.
En trminos generales declaramos el archivo de cabecera iostream.h para
operaciones de flujos de E/S, ste suele incluir otros archivos de cabecera
adicionales que declaran funciones, macros, clases y valores necesarios en las
operaciones con flujos de entrada (istream.h), flujos de salida (ostream.h), buffers
de flujos (streamb.h) y manipuladores de flujo (imanip.h) principalmente.
Analizaremos stas tres partes por separado.
Volver al principio

Utilizando manipuladores
Un manipulador es un valor que podemos extraer insertar de un flujo de E/S
para lograr un efecto especial en estos. Un manipulador parece un objeto que
insertamos extraemos de un flujo pero generalmente solo cambia el estado del
mismo. Existen tres manipuladores comunes, dec, oct y hex los cuales permiten
desplegar un valor numrico en base decimal, octal y hexadecimal
respectivamente, y otros ms declarados en el archivo iomanip.h entre los que
figuran setw(), setfill(), setprecision(), setiosflags() y resetiosflags().
Manipuladores bsicos
En el siguiente programa, [Link], se demuestra el uso de los
manipuladores bsicos oct, hex, y dec. El programa inicia solicitndole introducir
un nmero, mismo que se almacena en la variable de tipo int llamada numero, en
forma predeterminada, el sistema despliega los valores numricos utilizando la
base 10, esto se demuestra en el primer mensaje desplegado por el programa en la
lnea 14. Enseguida se utiliza el operador de insercin (<<) para introducir el
manipulador oct que cambia la base para despliegue numrico a octal por lo que
el valor contenido en la variable llamada numero se despliega en pantalla en su
equivalente de base 8. Observe que el contenido de la variable no ha cambiado,
solo se modifica la forma para desplegar un valor numrico en el dispositivo
estndar de salida.
//*********************************************************
// [Link]
//*********************************************************

#include <iostream.h>
int main()
{
int numero;
cout <<"Introduzca un numero" << endl;
cin >> numero;
cout <<"El numero introducido en base decimal es: "
<< numero << endl;
cout << oct; // Ahora trabajamos en base octal
cout << "Cambiando a base octal el numero introducido se "
"despliega asi: " << numero << endl;
cout << hex; // Trabajamos en base hexadecimal
cout << "El mismo numero en base hexadecimal es: ";
cout << numero << endl;
cout << "Introduzca otro numero" << endl;
cin >> numero;
cout << "El numero es: " << numero << endl;
cout << dec;
}

// Restituimos la base predeterminada

return 0;

De manera similar se utiliza el operador de insercin para introducir ahora el


modificador hex que sirve para cambiar el despliegue numrico a base 16
hexadecimal, entonces el programa muestra el valor almacenado en numero pero
representado en base 16. Cuando utilizamos los manipuladores oct hex le
indicamos al sistema la base numrica que deseamos para representar nuestros
valores numricos, una vez cambiada la representacin numrica, sta permanece
hasta que especifiquemos una nueva base hasta que apaguemos el sistema, para
demostrar sta situacin, en la parte final del programa se le solicita introducir
otro nmero, observar que el despliegue en pantalla parece no coincidir con el
nmero introducido, ste fenmeno sucede porque estamos acostumbrados a
pensar en trminos generales, utilizando la base 10, pero con un anlisis ms
cuidadoso encontramos que no existe error alguno, sencillamente el programa
despliega los valores numricos utilizando el ltimo modificador especificado,
que en ste caso es de tipo hexadecimal. El programa termina utilizando una vez
ms el operador de insercin para especificar la base 10 como la deseada para
representar los valores numricos en el dispositivo estndar de salida.
Para ms informacin en relacin con los sistemas numricos
consulte Sistemas numricos y representacin de datos de la seccin Conceptos
bsicos.

El archivo iomanip.h
El archivo de cabecera llamado iomanip.h define un conjunto de
manipuladores adicionales a los bsicos tratados en el prrafo anterior,
generalmente se trata de los siguientes:
setw(), se utiliza con flujos istream y ostream.
setfill(), se utiliza con flujos istream y ostream.
setprecision(), se utiliza con flujos istream y ostream.
setiosflags(), se utiliza con flujos istream.
resetiosflags(), se utiliza con flujos istream y ostream.
Empezamos estudiando el manipulador setw(), ya sea que se utilice con flujos
de entrada (istream) flujos de salida (ostream) establece el ancho de campo al
valor especificado dentro del parntesis del manipulador como se demuestra en el
programa [Link].
//*********************************************************
// [Link]
//*********************************************************
#include <iostream.h>
#include <iomanip.h>

// para operaciones de E/S


// define diferentes manipuladores

int main()
{
int i;
cout << "
El ancho de este campo es de 36" << endl;
for(i=1; i<6; i++)
{
cout << setw(i);
cout << "1" << endl;
cout << setw(i);
cout << "12" << endl;
cout << setw(i);
cout << "123" << endl;
cout << endl;
}
cout << setw(36);
cout << "El ancho de este campo es de 36" << endl;
return 0;
}

El manipulador setw(), como ya se dijo, establece el ancho de un campo de


salida pero su efecto solo se aplica a la salida del valor siguiente, la siguiente
operacin de insercin extraccin restablece el valor del ancho del campo a
cero que es el valor predeterminado, por sta razn se utiliza varias veces el
manipulador setw() a lo largo del programa [Link], compilndolo
podemos apreciar los espacios en blanco a la izquierda del campo de salida que
resultan de especificar diferentes valores de tipo int.
En el siguiente programa de ejemplo, [Link], especificamos
diferentes valores de ancho de campo para los datos correspondientes a las
calificaciones de un pequeo grupo ficticio de estudiantes con el objeto de darle
al reporte de calificaciones una mejor apariencia, en ste programa utilizamos el
manipulador setfill() para especificar que deseamos rellenar los espacios en
blanco, definidos por el manipulador setw(), con el carcter de punto. Se puede
observar que al utilizar el manipulador setfill() su efecto permanece para todos
los flujos de E/S hasta que se selecciona otro carcter diferente. Al final del
programa especificamos utilizar el carcter de espacio en blanco para rellenar los
espacios, que es el carcter predeterminado.
//*********************************************************
//
[Link]
//*********************************************************
#include <iostream.h>
#include <iomanip.h>

// para operaciones de E/S


// define diferentes manipuladores

int main()
{
cout << setfill('.');
cout
cout
cout
cout
cout
cout
cout

<<
<<
<<
<<
<<
<<
<<

// rellenar con puntos

"Reporte de calificaciones\n" << endl;


"Roberto Andrade" << setw(20) << "85" << endl;
"Andrea Gutierrez" << setw(19) << "89" << endl;
"Lisseth Sanchez" << setw(20) << "87" << endl;
"Anastasio Castro" << setw(19) << "75" << endl;
"Barbara Clintonsky" << setw(17) << "78" << endl;
"Martin Flores Garcia" << setw(15) << "91" << endl;

cout << setfill('\0'); // se restablece el carcter de llenado


}

return 0;

En el programa [Link], escrito en C, se realiz un sencillo clculo


utilizando valores de tipo float, al ejecutarlo observamos que la salida mostrada
en la pantalla invariablemente desplegaba seis dgitos decimales, incluso
introduciendo valores que dieran por resultado un valor exacto. En comparacin,

el mismo programa escrito en C++, [Link], despliega automticamente los


dgitos decimales de acuerdo al clculo realizado, sin embargo, en ciertas
aplicaciones puede ser deseable especificar un nmero determinado de dgitos a
desplegar por el flujo de E/S. Para ste fin se utiliza el
manipuladorsetprecision() en donde podemos especificar mediante un valor de
tipo int el nmero de dgitos a la derecha del punto decimal a desplegar en
pantalla, estudie el programa llamado [Link]
//*********************************************************
//
[Link]
//*********************************************************
#include <iostream.h>
#include <iomanip.h>

// para operaciones de E/S


// define diferentes manipuladores

int main()
{
int i;
double variable1=22, variable2=7;

for(i=0; i<15; i++)


{
cout << setprecision(i);
cout << variable1/variable2 << endl;
}
return 0;

Ya habr notado que los flujos de E/S tienen ciertos valores predefinidos y que
stos valores se pueden modificar utilizando manipuladores como oct y hex,
sucede que los flujos de E/S tienen un campo para especificar los valores
correspondientes y stos campos se llaman banderas (flags). El archivo de
cabecera ios.h define diferentes especificaciones de banderas. Mediante el uso del
manipuladorsetiosflags() nuestros programas pueden manipular muchas de stas
banderas utilizando a su vez el operador de alcance, identificado por un par de
smbolos de dos puntos (::) y que nos sirve para acceder a una variable de
alcance global a los miembros de una clase. Recuerde que en la siguiente
leccin daremos la definicin de una clase y demostraremos detalladamente el
uso del operador de alcance, por lo pronto es importante que conserve en mente
los datos previos de sta leccin pues sern aplicados prcticamente en todo
programa que escriba en C++.
En una determinada seccin del archivo de cabecera ios.h podemos encontrar
las definiciones para las diferentes banderas como un tipo de dato enum,
generalmente de la siguiente manera:

enum
{

skipws
left
right
internal
dec
oct
hex
showbase
showpoint
uppercase
showpos
scientific
fixed
unitbuf
stdio

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

0x0001,
0x0002,
0x0004,
0x0008,
0x0010,
0x0020,
0x0040,
0x0080,
0x0100,
0x0200,
0x0400,
0x0800,
0x1000,
0x2000,
0x4000

//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

Salta espacios en blanco durante la entrada


justifica a la izquierda
justifica a la derecha
relleno despus de signo indicador de base
base decimal
base octal
base hexadecimal
muestra indicador de base durante la salida
punto decimal obligatorio en float
salida hex en maysculas
signo positivo obligatorio
notacin de tipo 3.145363E23
dgitos decimales predeterminados
desaloja flujos despus de insercin
desaloja stdout, stderr despus de insercin

};

Puede identificar fcilmente algunos de los manipuladores que ya hemos


estudiado y ahora veremos cmo se utilizan stas banderas mediante el
manipulador setiosflags() y cmo restituimos las condiciones originales mediante
el manipulaodr resetiosflags(), estudie y compile el siguiente
ejemplo, [Link], adems experimente con las banderas no incluidas en el
programa, estoy seguro que no presentar problema alguno comprender el uso de
las diferentes banderas.
//***********************************************
//
[Link]
//***********************************************
#include <iostream.h>
#include <iomanip.h>
int main()
{
int numero;
cout << "Introduzca un numero:\n";
cin >> numero;
cout << "El valor introducido en base 10 es: " << numero
<< endl;
cout << setiosflags(ios::oct);
cout << "en base octal es: " << numero << endl;
cout << setiosflags(ios::hex);
cout << "y en base hexadecimal es: " << numero << endl;
cout << setiosflags(ios::uppercase|ios::showbase);
cout << "utilizando los manipuladores uppercase y showbase"
" el valor es: " << numero << endl;
cout << resetiosflags(ios::hex);
cout << "Ahora el valor se representa en base octal asi: "
<< numero << endl;

cout << resetiosflags(ios::uppercase|ios::showbase|ios::oct);


cout << setiosflags(ios::showpos|ios::showpoint|ios::fixed);
cout << "Ahora el valor es: " << (float)numero << endl;
cout << resetiosflags(ios::showpos|ios::showpoint|
ios::fixed);

cout << "El valor es " << numero << endl;


return 0;

El programa [Link] empieza solicitndole un nmero el cual es


desplegado inmediatamente para demostrar los ajustes predeterminados para los
flujos de E/S, despus se utiliza la bandera oct para representar el valor
introducido en base octal, luego de mostrar el valor en pantalla se vuelve a
utilizar la bandera hex sta vez para mostrar el nmero introducido en base
hexadecimal. En sta parte del programa, lnea 19, es conveniente hacer notar
que hemos modificado dos veces la representacin que deseamos darle a los
flujos de E/S, en ste orden, primero indicamos que deseamos la base octal y
posteriormente la base hexadecimal, si despus de la lnea 19 utilizamos el
manipulador setiosflags(ios::oct) la representacin de los flujos de E/S no ser en
base octal sino en hexadecimal, entonces, si deseamos nuevamente la
representacin del valor numrico introducido en base octal necesitamos
reestablecer la bandera oct anteriormente establecida en la lnea 15, para esto
utilizamos el manipuladorresetiosflags() como est ilustrado en la lnea 23 y
posteriormente en las lneas 26 y 29 del programa. Cuando sea necesario
especificar varias banderas podemos hacer uso del operador OR tanto con el
manipulador setiosflags() como con resetiosflags() tal y como se puede apreciar
en las lneas 20, 26, 27 y 30 del programa.
Volver al principio

Funciones de salida
Sabemos que un programa C++ utiliza el operador de insercin (<<) para
mostrar datos de salida, tambien que el flujo de salida cout est definido como
una clase y por lo tanto contiene ciertas funciones, llamadas miembro. En los
programas que hemos visto hasta ste momento utilizamos el flujo de
salida cout en conjunto con el operador de insercin << para mostrar datos de
salida, sin embargo podemos hacer uso de las funciones miembro de salida
definidas para el flujo cout en caso de necesitar un control ms preciso, las
funciones principales para el flujo de salida estn definidas en el

archivo ostream.h. Analizando ste archivo de cabecera podemos ver las


funciones mencionadas, pero adems podemos apreciar que la clase ostream est
derivada de la clase ios y por lo tanto tambien podemos utilizar con los flujos de
salida las funciones propias de la clase ios. Recuerde que en la siguiente leccin
trataremos el tema de las clases, por lo pronto es bueno que empiece a
familiarizarse con la terminologa de la programacin en C++. Veamos un
ejemplo de las funciones miembro de cout llamadas put y write.
//***********************************************
//
[Link]
//***********************************************
#include <iostream.h>
int main()
{
int letra;
char letras[]="Programacion en C++ por Virgilio"
"Gomez Negrete";
for(letra='A'; letra <= 'Z'; letra++)
{
cout << letra << " ";
}
cout << "\n\n";
for(letra='A'; letra <= 'Z'; letra++)
{
[Link]((char)letra);
cout << " ";
}
cout << "\n\n";
[Link](letras, 21);
cout << endl;
return 0;
}

El programa contiene dos bucles que demuestran la diferencia entre utilizar la


funcin miembro put versus el mecanismo tradicional cout <<. Observe que
hemos declarado una variable de tipo int llamadaletra, por sta razn el primer
bucle despliega las letras del alfabeto, slo que en sus respectivos equivalentes
decimales del cdigo ASCII. El segundo bucle es prcticamente igual al primero
excepto por el uso de la funcin miembro de la clase ostream llamada put que de
acuerdo a su definicin, su argumento debe ser de tipo char, por lo tanto debemos
moldear nuestra variable de tipo int para que sea ahora de tipo char y as poder
utilizarla en la funcin miembro put. Habr notado que para tener acceso a una
funcin miembro de una clase utilizamos el operador punto (.). Ya en la parte

final del programa encontramos un ejemplo del uso de la funcin miembro


llamada write, sta despliega el nmero indicado de carcteres, en ste caso 21,
empezando por el principio del arreglo de tipo char llamado letras. Estudiando el
archivo de cabecera ostream.h podemos determinar las funciones miembro de la
clase ostream y sus respectivos argumentos, comparando sta informacin con
los ejemplos aqu presentados nos ayudar a entender la manera en que se
relacionan las definiciones de las diferentes funciones con sus aplicaciones
reales, prctica que recomiendo ampliamente.
En el programa [Link] analizamos diferentes especificaciones de
banderas que establecimos mediante el uso del manipulador setiosflags(), pues
bien, podemos utilizar la funcin miembro setf()para realizar la misma funcin
que con el manipulador setiosflags() y en forma similar, podemos utilizar la
funcin unsetf() para los mismos propsitos que el manipulador resetiosflags(),
incluso es posible combinar diferentes especificaciones de bandera mediante el
uso del operador OR, ms interesante an es que podemos utilizar la funcin
miembro flags() para determinar el estado original de las banderas de flujo de
E/S, guardar el dato en una variable y posteriormente utilizarlo para restituir la
condicin original de operacin de las banderas de flujo, como lo demuestra el
siguiente programa, [Link]
//***********************************************
//
[Link]
//***********************************************
#include <iostream.h>
#include <iomanip.h>
int main()
{
long banderas_originales;
int numero=64;
banderas_originales=[Link]();
cout << "banderas originales es: " << [Link]() << endl;
[Link](ios::showbase|ios::uppercase|ios::hex);
cout << "banderas modificadas es: " << [Link]() << endl;
cout << "la variable numero en base 16 es: "
<< numero << endl;
[Link](banderas_originales);
cout << "restituidas las banderas originales, \nahora "
"la variable numero en base 10 es: " << numero << endl;
cout << "banderas originales es: " << [Link]() << endl;
}

return 0;

Se aprecia cmo el uso adecuado de las funciones miembro puede simplificar


un cdigo fuente y hacer el programa ms eficiente, sta es una buena razn para
tomarse un tiempo y examinar los diferentes archivos de cabecera incluidos con
nuestro compilador, de pasada respondemos a la pregunta Qu archivos de
cabecera debo utilizar en mi programa? Muy importante es familiarizarse con la
documentacin incluida en el compilador que utilicemos, adems es una buena
prctica como programador.
Volver al principio

Funciones de entrada
Para Usted no debe ser ya cosa extraa que en C++ utilizamos el operador de
extraccin (>>) en conjunto con el flujo cin para realizar operaciones de entrada.
El flujo de entrada cin tambien est definido como una clase y su declaracin la
encontramos en el archivo de cabecera istream.h junto con sus respectivas
funciones miembro, algunas de las cuales analizaremos en el siguiente programa,
[Link], sin duda alguna no tendr problema en comprender lo
expuesto en el siguiente cdigo:
//***********************************************
//
[Link]
//***********************************************
#include <iostream.h>
#include <ctype.h>
int contador;

// automticamente inicializada en cero

int main()
{
char texto[64], letra;
cout << "Teclee una linea de texto y presione enter\n\n";
[Link](texto, sizeof(texto));
cout << "\n\nEl texto introducido es:\n\n" << texto
<< "\n" << "el cual contiene " << [Link]()-1
<< " carcteres" << endl;
cout << "\n\nTeclee otra linea de texto que incluya una x\n";
do
{

letra=[Link]();
cout << (char)toupper(letra);
contador++;

while(letra!='x');
cout << "\n\nUsted escribio " << contador-1 << " carcteres "
"antes de la x" << endl;
}

return 0;

No est de ms recordar que una variable de tipo global es automticamente


inicializada a cero. El programa [Link] demuestra el uso de algunas
funciones miembro de la clase istream, empezando por la funcin
llamada getline() que lee una lnea de texto hasta encontrar un carcter de retorno
de carro ("\n"), similarmente se hace uso de la funcin miembro gcount() para
determinar el nmero de carcteres ledos, sta funcin incluye el carcter de
retorno de carro, por lo tanto restamos uno al valor retornado por la funcin para
que el resultado desplegado sea el correcto (lnea 17). En la segunda parte del
programa se utiliza la funcin miembro llamada get(), sta lee un solo carcter
borrndolo de la memoria de almacenamiento temporal, se convierte a mayscula
utilizando la funcin toupper() moldeando la salida de sta a tipo char y se
despliega el resultado en pantalla. ste proceso se repite merced de un bucle dowhile hasta encontrar un carcter 'x'. Compare el resultado obtenido de la cuenta
efectuada en el bucle do-while por la variable llamada contador con el resultado
obtenido al utilizar la funcin miembro gcount().
Es importante experimentar con lo expuesto en ste captulo, con frecuencia
aprendemos detalles que por alguna causa nos pasan inadvertidos con la simple
lectura del texto, adems cada compilador tiene sus detalles particulares que
conviene conocer para conseguir el mximo provecho del mismo.
Volver al principio

Leccin 2 :
Funciones en C++
C++ es un lenguaje que soporta totalmente el concepto llamado
"Programacin Orientada a Objetos" y por lo tanto centra su atencin en los
objetos, no obstante, las funciones siguen siendo un componente central de todo
programa y merecen atencin especial por las caractersticas nuevas agregadas
por C++. Para informacin adicional puede consultar el artculo referente a
las funciones en C.

Primero la definicin: Una funcin es una seccin de cdigo independiente,


con nombre, que ejecuta una tarea especfica y opcionalmente devuelve un valor
al programa que la llam. Ahora veamos las partes de la definicin:
Una funcin tiene un nico nombre, al utilizar ste nombre en otras partes
del programa se pueden ejecutar los enunciados contenidos en la funcin.
A esto se le conoce como llamar a la funcin. Una funcin puede ser
llamada desde otra funcin.
Una funcin es independiente. Una funcin puede ejecutar sus tareas sin
interferencia en de otras partes del programa.
Una funcin ejecuta una tarea especfica. Esta es la parte fcil de la
definicin. Una tarea es un trabajo discreto que su programa debe ejecutar
como parte de su desempeo general, por ejemplo mandar una lnea de
texto a impresin, ordenar una lista hacer un clculo matemtico.
Una funcin opcionalmente devuelve un valor al programa que la llam.
Cuando un programa llama a una funcin se ejecutan los enunciados
contenidos en sta, si si programa lo requiere, stos enunciados pueden
devolver un valor al programa que llam a la funcin.
Cuando un programa llama a una funcin, la ejecucin del cdigo salta a la
posicin inicial definida por el nombre de la funcin, el programa ejecuta los
enunciados contenidos en sta y posteriormente el programa que llam a la
funcin contina en la lnea de cdigo siguiente. Una funcin bin diseada
ejecuta una tarea especfica y fcil de entender. Es recomendable ante una tarea
complicada, dividirla en mltiples funciones y entonces llamarlas a su debido
momento.
Volver al principio

Declaracin y definicin de funciones


Para utilizar una funcin en un programa se requiere en primer lugar
declararla y despus definirla. La declaracin de la funcin le indica al
compilador el nombre, el tipo de dato devuelto por la funcin y los parmetros
pasados a la funcin. A la declaracin de una funcin se le llama tambin
el prototipo de la funcin. Cuando un programa llama a una funcin, el programa
puede enviar hacia la funcin informacin en la forma de uno o ms argumentos.

Los argumentos son datos que la funcin puede necesitar para realizar su trabajo.
Cuando la funcin termina su trabajo, la ejecucin del programa regresa a la lnea
siguiente a la llamada a la funcin. Las funciones pueden enviar informacin al
programa en la forma de un valor devuelto.
El prototipo de una funcin provee al compilador con informacin de una
funcin que ser definida posteriormente en el programa. El prototipo incluye, en
este orden, el tipo de valor que la funcin devolver, el nombre de la funcin, el
cual debe ser significativo del trabajo realizado por la funcin, y el tipo de
variables utilizadas como argumentos que sern pasados a la funcin.
Opcionalmente se puede incluir el nombre de las variables utilizadas como
argumentos. El prototipo de una funcin, como todo enunciado ejecutable en un
programa C++ debe terminarse con un smbolo de punto y coma.
La definicin de una funcin es en s la funcin misma, est compuesta en su
primer lnea de cdigo por el encabezado que debe ser idntico al prototipo de la
funcin pero en ste caso no se utiliza el punto y coma, adems, al contrario del
prototipo, donde es opcional incluir el nombre de las variables utilizadas como
argumentos, en el encabezado de la funcin se debe incluir el nombre de las
variables. Enseguida del encabezado est el cuerpo de la funcin que contiene,
encerrados entre llaves, los enunciados ejecutables propios del trabajo a ejecutar
por la funcin. Si la funcin devuelve un tipo de valor, ste se debe especificar al
final del cuerpo de la funcin.
Con toda la informacin reunida hasta este punto, estamos en condicin de
escribir un programa que demuestre el prototipo y definicin de una funcin.
Personalmente, primero escribo la definicin de la funcin y despus copio el
encabezado de la misma para formar el prototipo, agregandole un punto y coma
al final del enunciado.
//*********************************************************
// [Link]
// Demuestra el prototipo y definicin de una funcin
// (c)1999, Virgilio Gmez Negrete
//*********************************************************
#include <iostream.h>
// Prototipo de funciones
void resta(int valor1, int valor2);
int multiplica(int, int);
// Funcin principal
int main()
{

int numero1, numero2, resultado;


cout << "Introduzca dos numeros" << endl;
cin >> numero1 >> numero2;
resta(numero1, numero2); // llama a la funcin "resta"
resta(numero2, numero1);
resultado = multiplica(numero1, numero2);
cout << "La multiplicacion de los dos valores es: "
<< resultado << endl;
return 0;
}
// Funcin resta
void resta(int valor1, int valor2)
{
int sustraccion; // variable local
sustraccion = valor1 - valor2;
cout << "La resta de los dos valores es: "
<< sustraccion << endl;
}
// Funcin multiplica
int multiplica(int valor1, int valor2)
{
int local; // variable local
local = valor1 * valor2;
return local;
}

En el cdigo [Link] se demuestra el uso bsico de las funciones en un


programa C++, se aprecia en primer lugar el prototipo de dos funciones, una
llamada resta y la otra propiamente llamadamultiplica, utilizando nombres
significativos para las funciones evitamos hacer comentarios redundantes y
facilitamos la lectura del cdigo. En el prototipo de la funcin resta est
especificada la palabra clave void lo que nos indica que la funcin resta no
devuelve valor alguno al programa que la llame, adems especifica dos variables
de tipo int llamadas valor1 y valor2 para ser utilizadas como argumentos de la
misma. Recuerde que en el prototipo de la funcin no es necesario incluir los
nombres de las variables utilizadas como argumentos, esto se demuestra el el
prototipo de la funcin llamada multiplica que como est indicado, devuelve un
valor de tipo int y requiere dos variables de tipo int como argumentos.
Ya en el cuerpo de la funcin principal, main( ) el programa empieza
declarando tres variables llamadas numero1, numero2 y resultado, le solicita

introducir dos nmeros que son almacenados en las


variables numero1 y numero2 y entonces llama en primer lugar a la funcin
llamada resta( ) en la lnea 21 pasandole como argumentos las variables
llamadas numero1 y numero2. El programa entonces brinca a la parte del cdigo
donde se encuentra la funcin llamada resta( ), en el encabezado de sta funcin
vemos que se especifican para los argumentos de la funcin los nombres de dos
variables, valor1 yvalor2, en el encabezado de la funcin s es obligatorio
especificar el nombre de las variables utilizadas como argumentos, se trata en
efecto, de la declaracin de dos variables de tipo int que sern utilizadas en forma
local por la funcin. Dentro del cuerpo de la funcin resta se declara una
variable int llamada sustraccion en donde se almacena el resultado de restar los
valores pasados como argumentos a la funcin, ste resultado se despliega en
pantalla como parte de los enunciados ejecutables de la funcin.
La funcin resta( ) no devuelve un valor al programa, as que una vez
terminados los enunciados ejecutables de la misma la ejecucin del programa
contina en la lnea 22, pero entonces el programa vuelve a llamar a la
funcin resta( ), sin embargo observe que los argumentos estn invertidos con
respecto a la llamada anterior, sto demuestra que los valores se pasan a la
funcin en el orden en que son colocados en la llamada, de tal manera que en la
segunda llamada a la funcin resta( ), valor1 toma el valor almacenado en la
variable llamada numero2 y valor2 toma el valor almacenado en numero1.
Despus de ejecutar por segunda vez la funcin resta( ) el programa contina en
la lnea 24 en donde se asigna a la variable llamada resultado el valor devuelto
por la funcin llamada multiplica( ) a la que nuevamente le pasamos como
argumentos los valores almacenados en las variables
llamadas numero1 y numero2, esto es, el programa llama a la
funcin multiplica( ) y ya en el cuerpo de sta funcin se declara una variable
local de tipo int llamada local en donde se almacena el resultado de multiplicar
los valores pasados a la funcin como argumentos, despus la funcin devuelve
el valor almacenado en la variable llamada local. Finalmente el programa
despliega el valor almacenado en resultado y termina devolviendo al sistema el
valor de 0.
Volver al principio

Variables locales y globales


En C++ est permitido declarar variables en cualquier parte del cdigo fuente.
Adems de pasar variables como parte del argumento de una funcin, tambin es

posible declarar variables dentro del cuerpo de una funcin, a este tipo de
variables se les llama locales ya que slo son tiles dentro del cuerpo de la
funcin. Los parmetros utilizados en una funcin se consideran como variables
de tipo local y se utilizan exactamente de la misma manera, como lo demuestra el
fragmento de cdigo siguiente tomado del programa [Link].
int multiplica(int valor1, int valor2)
{
int local; // variable local
local = valor1 * valor2;
return local;
}

Los parmetros de la funcin, ambos de tipo int, llamados valor1 y valor2 son
en efecto variables de alcance local al igual que la variable declarada como de
tipo int llamada local dentro del cuarpo de la funcin multiplica( ). El alcance de
una variable es simplemente el espacio dentro del cdigo fuente donde la variable
puede ser utilizada, generalmente ste espacio est limitado por el par de llaves
que sirven para encerrar las lneas de cdigo que conforman una funcin,
generalmente, porque existen excepciones en C++ como es el caso de las
variables utilizadas en el encabezado de un bucle for, sin embargo ste asunto
puede tener variantes de acuerdo al nuevo estndar ANSI-C++ y por lo tanto
algunos compiladores pueden limitar la existencia de stas variables
estrictamente al cdigo contenido dentro del bucle for.
A las variables que declaramos fuera del cuerpo de cualquier funcin se dice
que tienen un alcance global y por lo tanto estas funciones estn disponibles para
cualquier funcin del programa, incluyendo amain( ). Las variables locales que
tienen el mismo nombre que las variables globales no cambian el valor de las
globales, sin embargo una variable local con el mismo nombre que una variable
global oculta a la variable global. Los conceptos discutidos hasta este momento
quedan demostrados en el siguiente programa:
//*********************************************************
// [Link]
// Demuestra el alcance de las variables en C++
// (c)1999, Virgilio Gmez Negrete
//*********************************************************
#include <iostream.h>
int global;

// se inicializa automaticamente en cero

void funcion1(int parametro);


int main()
{
int local1, i, global=30;
cout << local1 << endl << endl;
cout << "Introduzca un numero:" << endl;
cin >> local1;
cout << "Su numero es: " << local1 << endl;
cout << endl;
for(i=0; i<5; i++)
{
int local2; // vlida solo dentro del bucle

local2 = i;
cout << local1 << "\t";
cout << local2 << endl;

funcion1(local1);
cout
<<
cout
<<

<< "La variable \"global\" local vale: "


global << endl;
<< "La variable \"global\" global vale: "
::global << endl;

global=45;
cout
<<
cout
<<

<< "La variable \"global\" local ahora vale: "


global << endl;
<< "La variable \"global\" global vale: "
::global << endl;

//cout << local2 << endl;


}

return 0;

void funcion1(int parametro)


{
global = global + parametro;
}

Estudiamos en primer lugar lo concerniente a las variables de alcance local


llamadas local1 y local2, al igual que en C, las variables locales no son
automticamente inicializadas con un valor igual a cero, por ste motivo el
resultado desplegado en la lnea 17 es incierto, sin embargo al introducir un valor
y almacenarlo en local1 tenemos la certeza de utilizar correctamente sta
variable. Mas adelante, dentro del bucle for se declara otra variable de alcance
local llamada local2 en la lnea 25, sta variable slo es til para los enunciados
contenidos dentro del bucle, para demostrarlo puede quitar el comentario del

enunciado de la lnea 44 y entonces el compilador generar un mensaje de error


indicando que la variable local2 no ha sido declarada. Despus del
bucle for llamamos a la funcin llamada funcion1( )pasndole como parmetro a
la variable llamada local1, al hacer sto, el compilador en realidad crea una copia
de la variable local1 y asigna el valor contenido en sta a la variable de alcance
local llamdaparametro, a ste proceso se le conoce como pasar un parmetro
por valor. Ya dentro de la funcin, se suma el valor de parametro al de la
variable de alcance global llamada global cambiando de sta forma el valor
contenido en la variable de alcance global llamada global. Como habr
observado, la funcin principal contiene a su vez una variable llamada global,
sta por supuesto de alcance local. En las lneas 34 a la 44 se demuestra cmo
una variable de alcance local oculta a una variable de alcance global que tienen el
mismo nombre, adems se demuestra cmo utilizar el operador de alcance
global (::) para tener acceso a una variable de alcance global oculta por una
variable homnima de alcance local. Tambin se demuestra que una variable
local no cambia el valor contenido en una variable de alcance global homnima.
Volver al principio

Parmetros por defecto


Para cada parmetro declarado en el prototipo de la funcin y en su
definicin, una llamada a la funcin debe pasar un valor del tipo especfico, si la
definicin de la funcin difiere si Usted comete un error al pasar un valor
equivocado a la funcin, entonces el compilador generar un mensaje de error, la
nica excepcin a la regla es si el prototipo de la funcin declara un valor por
defecto para el parmetro. Un valor por defecto es el valor a utilizar en caso de
que ninguno sea especificado, as, una declaracin de una funcin podra ser esta:
char una_funcion(int defecto=120);

En ste ejemplo se declara una funcin llamada una_funcion que toma un


parmetro de tipo int, pero en caso de que no se incluya el parmetro necesario,
entonces se utilizar el valor de 120 para ser utilizado por la funcin. Como no es
absolutamente necesario utilizar nombres para los parmetros en el prototipo de
una funcin, tambin podemos escribir la declaracin de una funcin de la
siguiente manera:
char una_funcion(int = 120);

Es posible asignarle valores por defecto a todos los parmetros de una


funcin, pero con una condicin, si cualquiera de los parmetros no lleva un
valor por defecto, entonces los parmetros previos no podrn llevar un valor por
defecto, por ejemplo, si el prototipo de una funcin es parecido a esto:
char una_funcion(int parametro1, int parametro2, int parametro3);

Usted puede asignar un valor por defecto a parametro2 solo si se le ha


asignado un valor por defecto a parametro3. Usted solo podr asignar un valor
por defecto a parametro1 solo si se le ha asignado valores por defecto
a parametro2 y a parametro3. El siguiente programa demuestra lo dicho:
//*********************************************************
// [Link]
// Demuestra parametros con valores por defecto
// (c)1999, Virgilio Gmez Negrete
//*********************************************************
#include <iostream.h>
int area_de_un_cubo(int longitud, int ancho = 50, int alto = 2);
int main()
{
int longitud = 100;
int ancho = 25;
int alto = 1;
int area;
area = area_de_un_cubo(longitud, ancho, alto);
cout << "Area del primer cubo: " << area << endl;
area = area_de_un_cubo(longitud, ancho);
cout << "Area del segundo cubo: " << area << endl;
area = area_de_un_cubo(longitud);
cout << "Area del tercer cubo: " << area << endl;
return 0;
}
area_de_un_cubo(int longitud, int ancho, int alto)
{
return (longitud * ancho * alto);
}

Volver al principio

Nmero variable de argumentos


Una de las caractersticas atractivas de C++ es la manera estricta en que
verifica el tipo de parmetros utilizados en las funciones, sin embargo habr
ocasiones en las que necesitemos una funcin con un nmero variable de
parmetros, un ejemplo es la funcin C printf( ). El ANSI-C dispone de una serie
de macros para determinar el nmero de argumentos utilizados en una funcin,
stas macros estn definidas en el archivo de cabecera stdarg.h y tambin estn
disponibles para C++ pero necesitamos una manera de evitar que el compilador
C++ haga un chequeo estricto de los argumentos pasados a una funcin, esto se
consigue utilizando tres puntos como se indica en la lnea 11 del siguiente
programa:
//*********************************************************
// [Link]
// Demuestra el uso de un nmero variable de argumentos
// (c)1999, Virgilio Gmez Negrete
//*********************************************************
#include <iostream.h>
#include <stdarg.h>
// Declara una funcin con un parmetro obligatorio
void varios_argumentos(int numero, ...);
int main()
{
int indice = 5;
int uno = 1, dos = 2;
varios_argumentos(uno, indice);
varios_argumentos(3, indice, indice + dos, indice + uno);
varios_argumentos(dos, 7, 3);
}

return 0;

void varios_argumentos(int numero, ...)


{
va_list parametros;
int indice2;
// llama a la macro inicial
va_start(parametros, numero);
cout << "Los parametros son ";
for (indice2 = 0 ; indice2 < numero ; indice2++)
{
// Determina el numero de parametros
cout << va_arg(parametros, int) << " ";
}

cout << endl;


// concluye la macro
va_end(parametros);
}

El prototipo indicado en la lnea 11 dice que se requiere un parmetro de


tipo int y a partir de ste el compilador no checar el tipo y nmero de
argumentos pasados a la funcin llamadavarios_argumentos( ). Observar que el
programa consiste en tres llamadas a la
funcin varios_argumentos( ) precisamente con diferente nmero de argumentos
en cada llamada, Usted puede poner el nmero que desee de parmetros en la
llamada a la funcin siempre y cuando el primer parmetro sea uno de tipo int,
despus de sto es responsabilidad suya utilizar con cuidado el tipo y nmero de
argumentos pasados a la funcin, se debe evitar escribir cdigo que resulte difcil
de interpretar.
Volver al principio

Sobrecarga de funciones
C++ permite crear ms de una funcin con el mismo nombre las cuales se
diferenciarn por el nmero de parmetros utilizados en el tipo de stos o en
mbos. El valor regresado por las funciones puede ser igual diferente sin
embargo dos o ms funciones con el mismo nombre y parmetros pero con valor
de retorno diferente generar un mensaje de error por parte del compilador. Al
proceso de llamar a ms de una funcin con el mismo nombre se le
llama sobrecarga de funciones. El siguiente programa demuestra la sobrecarga
de la funcin llamada polimorfo:
//*********************************************************
// [Link]
// Demuestra la sobrecarga de funciones
// (c)1999, Virgilio Gmez Negrete
//*********************************************************
#include <iostream.h>
void polimorfo(float numero);
void polimorfo(int numero);
float polimorfo(char *texto, int numero);
int main()
{

float valor;
int valor2;
char cadena[]="El nuevo valor es: ";
cout << "Introduzca un valor flotante" << endl;
cin >> valor;
polimorfo(valor);
valor2 = valor;
polimorfo(valor2);
valor2 = valor2 * 25;
valor = polimorfo(cadena, valor2);
polimorfo(valor);
return 0;
}
void polimorfo(float numero)
{
cout <<"El valor introducido es: " << numero << endl;
}
void polimorfo(int numero)
{
cout <<"La parte entera es: " << numero << endl;
}
float polimorfo(char *texto, int numero)
{
cout << texto << numero << endl;
return (numero * 3.1416);
}

Este programa demuestra adems lo estricto que es C++ con respecto a checar
el tipo de parmetros pasados a una funcin. En la lnea 24 asignamos a una
variable de tipo int llamada valor2 el contenido de la variable de
tipo float llamada valor. Truncar la parte fraccionaria de la variable
llamada valor introducir un nmero entero no es suficiente para llamar a la
funcin polimorfo(int numero), es necesario utilizar las variables de tipo
adecuado, es decir, los parmetros formales declarados en el prototipo de las
funciones.
Volver al principio

Recursividad

Una funcin se puede llamar a s misma, a este proceso se le


llama recursividad y puede ser directa e indirecta. Es directa cuando una funcin
se llama a s misma. Ocurre recursividad indirecta cuando una funcin llama a
otra funcin y sta ltima llama a la primera. Ambos tipos de recursividad se dan
en dos formas, aquellas que eventualmente terminan y producen un resultado y el
caso en que la recursividad nunca termina produciendo un bucle infinito y de
aqu una falla en tiempo de ejecucin por falta de memoria. Algunos
programadores piensan que este ltimo caso es divertido, sobre todo cuando le
pasa a otra persona. :-)
Es importante notar que cuando una funcin se llama a s misma, una nueva
copia de sta funcin es la que se ejecuta. Las variables locales de la segunda
funcin no interfieren con las variables locales de la primera, as mismo, las
variables locales no se pueden afectar mutuamente. Tomemos como ejemplo un
programa que calcule el factorial de un numero entero introducido por el usuario.
El factorial est definido como el producto del nmero en cuestion por todos los
numeros enteros menores que l, de tal manera que el factorial de 5 = 5*4*3*2*1
= 120. El cdigo puede ser as:
//*********************************************************
// [Link]
// Demuestra recursividad
// (c)1999, Virgilio Gmez Negrete
//*********************************************************
#include <iostream.h>
double factorial(int valor);
int j=1;
int main()
{
int numero;
cout << "Introduzca un numero" << endl;
cin >> numero;
cout << endl;
cout << numero << "! es igual a: "
<< factorial(numero) << endl;
cout << "Se llamo a la funcion factorial "
<< j << " veces" << endl;
return 0;
}
double factorial(int valor)

double resultado;
if(valor<=1)
return 1;
else
{
resultado = (valor*factorial(valor-1));
j = j+1;
}
return resultado;

Como el factorial de un nmero suele dar como resultado un valor muy


grande necesitamos utilizar una funcin de tipo double que tome como parmetro
un valor de tipo int, dicha funcin la hemos declarado con el nombre de factorial.
Utilizamos una variable de alcance global llamada j para llevar un registro del
nmero de veces en que la funcin factorial( ) es llamada. El programa empieza
solicitndole un nmero entero y despus llama por primera vez a la
funcin factorial( ). La recursividad necesita una condicin para que en el
momento oportuno detener la accin, por sta razn, la
funcinfactorial( ) determina en primer lugar si el valor pasado como parmetro
de la funcin es igual a 1, en cuyo caso la funcin retorna 1. Si el valor del
parmetro es mayor que 1, entonces la funcin factorial( )se llama a s misma
tomando como parmetro el valor original menos uno, multiplicando ste valor
por el valor del parmetro original y almacenando el resultado en la variable
llamada resultado, como se aprecia en la lnea 38 del programa. Cada vez que la
funcin factorial( ) sea llamada con un parmetro mayor que 1 se incrementa la
variable global llamada j, sta variable debe tener mbito global porque
necesitamos compartir el valor acumulado en la variable entre todas las copias
que en determinado momento se hagan de la funcin factorial( ), como resultado
del fenmeno de recursividad. Un ejemplo adicional de recursividad lo
encontrar en el programa llamado [Link] que est incluido en el archivo
comprimido [Link] y que puede descargar al final de ste artculo.
Volver al principio

Leccin 3
Clases y encapsulado

La Programacin Orientada a Objetos trae consigo una serie de trminos


nuevos, familiarizarnos y aprender a manejar stos conceptos es de suma
importancia para el futuro del programador moderno. Empezamos ste artculo
dando una definicin: nos referimos al encapsulado como el proceso de
formar objetos. Un objeto encapsulado tambin es a menudo llamado un tipo de
dato abstracto que es uno de los temas principales de la Programacin Orientada
a Objetos, sin el encapsulado, lo cual involucra el uso de una ms clases no
existira la Programacin Orientada a Objetos (POO para abreviar). En la
programacin por procedimientos tradicional, digamos utilizando C, es normal
declarar una serie de variables con nombres representativos de un tipo especfico
para el dato en cuestin, as, si declaramos algunas variables de tipo int sabemos
que podemos asignarles valores numricos dentro de un rango especfico,
tambin podemos realizar ciertas operaciones con stas variables, como sumar,
restar otros clculos y adems podemos asignar los resultados a otra variable
del mismo tipo. El tipo de las variables indica:
El tamao en memoria de la variable.
El tipo de informacin que puede almacenar.
Las acciones que se pueden ejecutar en ellas.
En trminos generales podemos decir que un tipo es una categora. Tipos que
nos resultan familiares pueden ser, carro, casa, persona y forma entre muchas
ms. En C++, el programador puede crear el tipo que sea necesario con toda la
funcionalidad y potencia que aporta el lenguaje. La necesidad de crear tipos
nuevos est en el hecho de que programamos para resolver problemas de la vida
real, como por ejemplo simular el funcionamiento de un sistema de calefaccin.
Aunque es posible describirlo utilizando valores numricos y cadenas de
caracteres, si utilizamos representaciones de los objetos con los que estamos
trabajando, sobre todo tratndose de problemas complejos, resulta mucho ms
fcil lograr resultados satisfactorios al crear variables que representen por
ejemplo, sensores de calor, termostatos y calefactores. Cuanto ms cercanas se
correspondan las variables a la realidad, tanto ms fcil ser escribir el programa.
Pero, Para qu necesitamos encapsular datos?

Encapsulado
Como sabemos, una estructura es una coleccin de tipos de datos previamente
definidos y ordenados en una forma conveniente para el programa. En C++ la
estructura presenta una mejora con respecto a su prima del lenguaje C, permite

especificar funciones miembro lo que resulta muy prctico en trminos de


ordenar diversas partes del cdigo de acuerdo a su funcionalidad. Veamos el
primer cdigo de este artculo:
//***********************************************
// [Link]
// 1999, Virgilio Gmez Negrete
//***********************************************
#include <iostream.h>
struct ohm
{
float voltaje;
float resistencia;
float corriente;
};

float amperios(float voltios, float ohmios);

float ohm::amperios(float voltios, float ohmios)


{
return voltios / ohmios;
}
int main()
{
struct ohm calculo1;
ohm calculo2;
float resultado;

// En C++ no es indispensable
// especificar la palabra "struct"

[Link] = 127;
[Link] = 470;
[Link] = 0.75;
[Link] = 220;
[Link] = [Link]([Link],
[Link]);
resultado = [Link](135.25, 47);
[Link] = [Link] * [Link];
cout << "La corriente en el calculo 1 es de: "
<< [Link] << " amperios" << endl;
cout << "El voltaje en el calculo 2 es de: "
<< [Link] << " voltios" << endl;
cout << "La corriente en el calculo 3 es de: "
<< resultado << " amperios" << endl;
}

return 0;

Como puede ver, declaro una estructura llamada ohm que contiene tres
variables miembro de tipo float llamadas voltaje, resistencia y corriente, tambin
est contenida dentro de la estructura el prototipo de la funcin miembro
llamada amperios que toma dos parmetros de tipo float y devuelve un valor de
tipo float. En el cuerpo de la funcin principal, en primer lugar declaramos dos
variables de tipo ohmllamadas calculo1 y calculo2 adems de una variable
convencional de tipo float llamada resultado. En ANSI-C es obligatorio
especificar la palabra clave struct al declarar variables, no as en C++ como est
demostrado en las lneas 24 y 25. Al declarar variables de tipo ohm decimos que
son objetos de la estructura llamada ohm, por lo tanto calculo1 y calculo2 son
tambin conocidos como objetos de tipo ohm. En las lneas 28 a la 31 del
programa inicializamos las variables con algunos valores utilizando el operador
punto de la misma manera como se hace en C, la principal diferencia la tenemos
en la lnea 33 donde asignamos a la variable [Link] el valor devuelto
por la funcin miembro llamada [Link]( ), de manera similar, en la
lnea 35 asignamos a la variable de tipo float llamadaresultado el valor devuelto
por la funcin [Link]( ), finalmente se despliegan los resultados en
pantalla. Deducimos fcilmente que ste procedimiento para hacer un clculo
resulta riesgoso, sencillamente podemos cometer un error que resultara difcil de
corregir. Se supone que al declarar una funcin miembro de la estructura ohm es
para facilitar el manejo del programa al tener reunidos en una sola seccin los
elementos relacionados del cdigo, pero vemos una desventaja al acceder
libremente tanto a las variables como a la funcin de tipo ohm.
Volver al principio

Clases
C++ proporciona una alternativa muy interesante llamada clase, con sta
instruccin propia de C++ y de la POO podemos agrupar efectivamente una serie
de variables y funciones miembro, y al igual que con la estructura, la clase nos
sirve para construir nuevos tipos de datos. Una clase es una coleccin de
variables, a menudo de diferentes tipos, combinadas con funciones relacionadas.
Una clase nos permiteencapsular o agrupar una serie de variables y funciones en
una coleccin a la cul llamamos objeto. Similarmente a la estructura, llamamos
a las variables como variables miembro en tanto que a las funciones les
llamamos funciones miembro, tambin conocidas como mtodos. Para declarar
una clase utilizamos la palabra clave class. El siguiente programa demuestra el
encapsulado y la manera para declarar y utilizar una clase:

//***********************************************
// [Link]
// 1999, Virgilio Gmez Negrete
//***********************************************
#include <iostream.h>
class ohm
{
float voltaje;
float resistencia;
float corriente;

};

public:
void asigna(float, float);
void muestra(void);

void ohm::asigna(float volts, float amperios)


{
voltaje = volts;
corriente = amperios;
resistencia = volts / amperios;
}
void ohm::muestra(void)
{
cout << "El voltaje es: " << voltaje << endl;
cout << "La corriente es: " << corriente << endl;
cout << "La resistencia es: " << resistencia << endl;
}
int main()
{
ohm calculo1, calculo2;
float volt, ampere;
cout << "Valor de voltaje: " << endl;
cin >> volt;
cout << "Valor de la corriente: " << endl;
cin >> ampere;
cout << endl;
[Link](volt, ampere);
[Link](volt*4, ampere/2);
cout << "Resultados del objeto \"calculo1\"" << endl;
[Link]();
cout << endl;
cout << "Resultados del objeto \"calculo2\"" << endl;
[Link]();
}

return 0;

Veamos las partes nuevas que nos presenta el programa [Link] y


hagamos una comparacin funcional con respecto al programa [Link]. Al
principio tenemos la declaracin de una clase llamada ohm y entre las llaves que
delimitan a sta se encuentran las variables miembro
llamadas voltaje, resistencia y corriente todas de tipo float. Tambin tenemos a
las funciones miembro llamadasasigna( ) que toma dos parmetros de tipo float,
y muestra( ) que no lleva parmetros. Ambas funciones devuelven un valor
de void, es decir, no devuelven valor alguno. La declaracin de la clase termina
con un smbolo de punto y coma despus de la llave de cierre, nos indica que se
trata en efecto de una instruccin C++ vlida. Al declarar sta clase no se est
asignando memoria para ohm, sencillamente se le est indicando al compilador
que cosa es ohm, que tipo de datos contiene (voltaje, resistencia y corriente) y
que puede hacer(asigna( ) y muestra( )). Tambin le indica al compilador el
tamao que se requiere para cada ohm creado en el programa, como tenemos tres
variables de tipo float, cada una de 4 bytes, en total tenemos un tamao
para ohm de 12 bytes. Los mtodos no toman espacio porque no es necesario
reservar espacio en memoria para las funciones, stas son parte integral del
programa al ser compilado. En comparacin con la estructura definida en el
programa [Link] existen algunas diferencias mnimas que ms adelante
discutiremos.
Despus de la declaracin de la clase sigue la definicin de sus mtodos.
Como se trata de funciones se aplica lo visto en el captulo anterior, funciones en
C++ con una excepcin, en el encabezado utilizamos en primer lugar el tipo de
dato que el mtodo devuelve seguido del nombre de la clase a la que pertenece el
mtodo, el operador de resolucin global (::) y por ltimo el nombre del mtodo.
El primer mtodo, llamado asigna( ) toma dos parmetros de tipo float, uno para
asignar el valor de voltaje y otro para asignar el valor de la corriente, el mtodo
calcula internamente el correspondiente valor para la resistencia y asigna el
resultado a la variable miembro llamada resistencia, de sta manera, el
mtodo asigna( ) como su nombre lo indica, asigna a las variables miembro de la
clase ohm sus respectivos valores de acuerdo a la ley de Ohm. El segundo
mtodo, llamado muestra( ) simplemente despliega en pantalla el resultado de los
clculos efectuados basados en la ley de Ohm.
En la funcin principal main( ) en primer lugar declaramos dos objetos de la
clase ohm llamados calculo1 y calculo2 en la lnea 35. En la lnea 36 se declaran
de forma tradicional dos variables de tipofloat llamadas volt y ampere. El
programa empieza solicitndole que introduzca en primer lugar el valor
correspondiente al voltaje y lo almacena en la variable local llamada volt, lo
mismo ocurre para el valor de la corriente que se alamacena en la variable local
llamada ampere, despus de sto el programa efecta dos clculos, el primero en

la lnea 44. Para el objeto de la clase ohm llamado calculo1llamamos a la funcin


miembro llamada asigna( ) utilizando el operador punto (.) de la misma manera
que se hace al utilizar estructuras, utilizando como parmetros los valores
previamente almacenados en las variables volt y ampere. Para el objeto de la
clase ohm llamado calculo2 a su vez llamamos a su mtodo
llamado asigna( ) pero el valor correspondiente al primer parmetro lo
multiplicamos por 4 en tanto que el valor de la corriente lo dividimos entre 2,
sto simplemente para tener dos valores diferentes y as poder distinguir los
resultados obtenidos como se aprecia en la lnea 45. De sta manera hemos
asignado de manera efectiva los respectivos valores para el calculo1 y
el calculo2. En comparacin con el programa [Link] Usted podr observar
que es posible efectuar un clculo de corriente utilizando la funcin miembro
llamada amperios( ) pasando como parmetros los valores almacenados
en [Link] y [Link] dondo como resultado un obvio error.
Sin embargo ste error no se detecta al momento de compilar el programa,
Cmo entonces el programa [Link] resuelve ste conflicto?
Volver al principio

Miembros public y private


C++ define tanto para las estructuras como para las clases tres caractersticas
aplicables a los miembros de stas de tal manera que pueden
ser public, private protected, stas son palabras clave de C++. La palabra
clave public implica que es posible tener libre acceso tanto a las variables como a
las funciones miembro de un objeto utilizando el operador punto, como se hace
en el programa [Link]. Por el contrario, la palabra
clave private condiciona el acceso a los miembros de una clase solamente
utilizando los mtodos de la clase en s. La palabra clave protected la
estudiaremos ms adelante. De lo dicho sealar la primera diferencia entre una
estructura y una clase en C++, por defecto, los miembros de una estructura son de
caracter public en tanto que los miembros de una clase tienen la
propiedadprivate, con respecto a la clase ohm del programa [Link] las
variables miembro tienen todas el caracter de private, Usted puede verificar sto
tratando de asignar un valor de la siguiente manera:
[Link] = 127.85;

// ERROR, "voltaje" es private

En el programa [Link] solo es posible asignar valores a las variables


utilizando el mtodo llamado asigna( ) y justamente podemos utilizar ste
mtodo porque lo hemos declarado como public, est claramente sealado al
utilizar la palabra clave public en la lnea 14 del programa, sto significa que en
la clase llamada ohm todos los miembros declarados, sean variables mtodos en
seguida de la palabra clave public son de libre acceso utilizando el operador
punto. En la POO se dice que los miembros de caracter private constituyen datos
ocultos, por lo ya expuesto, las variables miembro de la clase ohmestn ocultas
para el resto del programa. Es prctica general en C++ declarar a las variables
miembro de una clase como private en tanto que a los mtodos les corresponde el
caracter de public, sin embargo sto depende de las necesidades propias del
programa. El programa [Link] demuestra claramente la importancia de
mantener ocultas a las variables miembro, de sta manera se evitan errores de
clculo atribuibles al diseo del programa. Bjarne Stroustrup, el inventor de C++
dijo "Los mecanismos de control de acceso de C++ proveen proteccin contra
accidentes, no contra fraudes" (ARM, 1990). En el archivo
comprimido [Link] que puede descargar al final de ste artculo encontrar
un programa adicional llamado [Link] que le permitir comparar la
funcionalidad del programa [Link] utilizando una estructura, ahora
bin, si es posible efectuar el mismo trabajo con dos palabras clave diferentes,
Cul es la razn de la existencia de stas dos entidades aparentemente iguales?
La respuesta a sta pregunta es de carcter histrico, C++ evolucion a partir de
C, de hecho, el nombre inicial de C++ era "C con clases". C++ aporta en todo
caso una estructura ms poderosa y adems agrega el uso de clases que como
veremos a continuacin tienen caractersticas adicionales no compartidas por las
estructuras.
Volver al principio

Constructores y destructores
Sabemos ya que al declarar variables de clase estamos construyendo objetos.
Con frecuencia es conveniente que las variables miembro de una clase sean
inicializadas a un valor especfico de acuerdo a las necesidades del programa,
ste proceso de inicializacin asegura que los datos del programa no contengan
valores inservibles. Para inicializar a las variables miembro de clase se utiliza una
funcin miembro especial llamada constructor. Un constructor puede tomar los
parmetros que sean necesarios pero no devuelve valor alguno, ni an de
tipo void, adems, un constructor lleva el mismo nombre que la clase a la que
pertenece. Un constructor ejecuta todas las instrucciones que sean requeridas

para el correcto funcionamiento del objeto creado. Naturalmente, si hablamos de


una funcin especial para inicializar los objetos de nuestro programa, natural es
que tambin exista una funcin especial que nos ayude a destruir los objetos
cuando no sean ya necesarios, dicha funcin se llama
apropiadamente, destructor. Una funcin destructor no toma parmetros y al
igual que el constructor, no devuelve valor alguno, adems, el destructor lleva el
mismo nombre de la clase a la que pertenece anteponindole una tilde (~). En el
programa [Link] se utiliz un mtodo llamado asigna( ) para inicializar las
variables miembro de caracter private. Una funcin constructora hace ste mismo
trabajo pero de una manera ms eficente ya que un constructor se ejecuta
automticamente cada vez que un objeto sea creado. Similarmente,
un destructor se ejecuta automticamente cada vez que un objeto sea destruido.
Estas caractersticas propias de los constructores y destructores son muy tiles
cuando los objetos hacen uso de los recursos del sistema (por ejemplo, la
asignacin dinmica de memoria) y se requiere que stos recursos sean liberados
para un posterior uso. El programa [Link] demuestra los puntos principales
a considerar para el uso de los constructores y destructores:
//***********************************************
// [Link]
// Demuestra constructores y destructores
// 1999, Jaime Virgilio Gmez Negrete
//***********************************************
#include <iostream.h>
class cubo
{
// variables miembro
float ancho, fondo, altura;
int id;
// mtodo privado
int contenido(float uno, float dos, float tres);
public:
// constructor
cubo (float ancho_inicial, float fondo_inicial,
float altura_inicial, int identificador);
// constructor sobrecargado
cubo(void);
// destructor (observe la tilde ~)
~cubo();
// mtodo para obtener el volumen
void volumen(float nuevo_ancho, float nuevo_fondo, float
nuevo_altura);
};
// definicin del constructor sin parmetros
cubo::cubo(void)

cout << "Constructor sin parametros..." << endl;


ancho = 2;
fondo = 2;
altura =2;
volumen(ancho, fondo, altura);

}
// definicin del constructor con parmetros
cubo::cubo(float ancho_inicial, float fondo_inicial,
float altura_inicial, int identificador)
{
ancho = ancho_inicial;
fondo = fondo_inicial;
altura = altura_inicial;
cout << "Constructor del objeto " << identificador << endl;
volumen(ancho, fondo, altura);
}
// definicin del destructor
cubo::~cubo()
{
cout << "Destructor..." << endl;
}
// mtodo "contenido" (private)
int cubo::contenido(float uno, float dos, float tres)
{
return uno + dos + tres;
}
// mtodo "volumen" (public)
void cubo::volumen(float nuevo_ancho, float nuevo_fondo, float
nuevo_altura)
{
float vol_cubo, elementos;
vol_cubo = nuevo_ancho*nuevo_fondo*nuevo_altura;
elementos = contenido(nuevo_ancho, nuevo_fondo, nuevo_altura);
cout << "El volumen es: " << vol_cubo << endl;
cout << "y contiene " << elementos << " piezas" << endl << endl;
}
cubo caja4(3, 3, 3, 4); // una caja global
// funcin principal
int main()
{
cubo caja1(10, 10, 10, 1), caja2(5, 5, 5, 2), caja3;
float ancho_local, fondo_local, altura_local;
cout << "Nuevo ancho para el cubo 1?" << endl;
cin >> ancho_local;
cout << "Nuevo fondo para el cubo 1?" << endl;
cin >> fondo_local;
cout << "Nueva altura para el cubo 1?" << endl;

cin >> altura_local;


cout << endl;
cout << "Nuevos valores del cubo 1:" << endl;
[Link](ancho_local, fondo_local, altura_local);
// otros valores para el cubo 2
cout << "Nuevos valores del cubo 2:" << endl;
[Link](ancho_local+10, fondo_local*3, altura_local+5);
return 0;
}

Un cuidadoso estudio del cdigo y los conceptos sern fcilmente asimilados.


En este caso tenemos una clase llamada cubo declarada en las lneas 9 a la 27,
contiene tres variables miembro de tipo float y de
caracter private llamadas ancho, fondo, altura y una ms de tipo int llamada id, la
funcin de sta ltima es dar a los objetos un elemento de identificacin tal que
al ejecutar el programa nos ayude a comprender su funcionamiento. Un mtodo
de caracter private llamado contenido( ) determina la cantidad de piezas que cada
caja contiene de acuerdo a los valores pasados como parmetros, el valor
obtenido es ficticio pero demuestra una caracterstica interesante como veremos
ms adelante. En la seccin public de la clase encontramos la declaracin de un
par de constructores, uno en la lnea 19 que toma cuatro parmetros y otro ms en
la lnea 22. Por lo estudiado en el captulo anterior, Funciones en C++, nos damos
cuenta que la funcin constructora llamada cubo est sobrecargada, el programa
llamar a la funcin constructora adecuada en base al nmero y tipo de
parmetros pasados a la funcin. En la lnea 24 est la declaracin de la
funcin destructora, observe que lleva una tilde (~) en el nombre. Por ltimo, en
la lnea 26 tenemos el prototipo del mtodo llamado volumen( ) que sirve para
determinar el volumen de los objetos de tipo cubo que el programa crea.
Como los constructores, el destructor y los mtodos son funciones de C++
tenemos en las lneas 30 a la 72 las respectivas definiciones que el estudiante no
tendr dificultad alguna en comprender. Observe que en ambos constructores se
llama a la funcin miembro llamada volumen( ), en las lneas 36 y 47, y que no se
hace uso del operador punto para tener acceso a la funcin. El destructor de
hecho no hace otra cosa que desplegar un mensaje en pantalla para indicarnos el
momento en que se ejecuta, es normal que una funcin destructora no lleve
instrucciones ejecutables, sin embargo debemos utilizar una funcin destructora
cada vez que utilizemos un constructor.
La funcin constructora se ejecuta cada vez que creamos un objeto de
tipo cubo, en la lnea 74 se declara un objeto de ste tipo llamado caja4, mas que
la declaracin de una variable parece la llamada a una funcin, y en efecto, la
funcin que estamos llamando es la funcin constructora de la clase cubo, como

se puede ver, tiene cuatro parmetros, los primeros tres corresponden de acuerdo
al prototipo dado para el constructor, el ancho, el fondo y la altura del cubo
llamado caja4, el cuarto parmetro tiene la funcin de identificador. por lo tanto,
al declarar al objeto llamado caja4 se ejecuta la funcin constructora que toma
cuatro parmetros, es decir, la ejecucin del programa salta de la lnea 74 a la
lnea 40. Dentro del constructor se asignan los respectivos valores para el ancho,
el fondo y la altura de la caja y se llama al mtodo volumen( ), lnea 47, o sea que
la ejecucin del programa brinca de la lnea 47 a la 63. En el
mtodo volumen( ) se calcula el volumen de la caja y despus se llama a la
funcincontenido( ) de caracter private para determinar la cantidad de piezas que
"contiene" la caja. Como ya se dijo, ste valor es ficticio, pero demuestra el
concepto de ocultar informacin. Observe que no existe mecanismo alguno que
nos permita conocer el contenido de las cajas cuando son stas creadas, tampoco
es posible llamar al mtodo contenido( ) desde ninguna otra parte del programa
que no sea desde el interior del mtodo volumen( ). El concepto de ocultar
informacin tiene gran valor en la POO. Observe adems que al crear el objeto
llamado caja4 el constructor se ejecuta incluso antes de la funcin
principal main( ).
Ya en la funcin principal creamos otras tres cajas
llamadas caja1, caja2 y caja3, al crear sta ltima se ejecuta el constructor
correspondiente de acuerdo a los parmetros incluidos, es decir, ninguno para
la caja3. El programa le solicita que introduzca nuevos valores para la caja1 y
llama al mtodo volumen( ) para calcular las nuevas dimensiones de la caja, dicho
en otras palabras, la caja1 cambiar de tamao y por tanto de contenido. Los
nuevos valores para la caja2 se obtienen de unas sencillas operaciones aritmticas
efectuadas con los valores dados para la caja1, lnea 94 del programa. Insisto, el
contenido de la caja constituye una verdadera sorpresa, en otras palabras, el
"contenido" de las cajas se trata como una "caja negra". Compile, ejecute y
experimente con ste programa, probablemente descubra caractersticas
adicionales con respecto al uso de los constructores y destructores.
Volver al principio

Mtodos const
Al declarar un mtodo de clase como de tipo const se d la promesa de que el
mtodo no cambiar el valor de ninguno de los miembros de la clase. Para
declarar un mtodo de clase como constante se coloca la palabra
clave const despus del parntesis pero antes del smbolo de punto y coma,

similarmente se incluye en el encabezado de la definicin del mtodo. En el


programa [Link] el mtodo llamado volumen( ) no puede ser declarado
como const porque ste mtodo asigna valores a las variables miembro, sin
embargo el mtodo contenido si puede ser declarado como const ya que su
funcin no implica cambiar los datos en la clase, por lo tanto el mtodo
contenido puede ser declarado as:
int contenido(float uno, float dos, float tres) const;

La definicin de ste mtodo ser ahora as:


// mtodo "contenido" (private)
int cubo::contenido(float uno, float dos, float tres) const
{
return uno + dos + tres;
}

Utilizar la palabra clave const es de ayuda para evitar errores en tiempo de


compilacin, se considera una buena prctica de programacin declarar
como const a todos aquellos mtodos que no afectan a los miembros de una clase,
al hacer sto se establece una especie de contrato con el compilador, aclaro ste
concepto. LLamamos clientes a aquellas partes de un programa que crean y
utilizan objetos de su clase, Usted puede pensar en la interfaz de la clase, es decir,
la declaracin de la clase, como un contrato con stos clientes, ste contrato
indica qu datos de su clase estn disponibles y cmo los manejar su clase. Al
declarar al mtodo contenido( ) como const se est estableciendo en el contrato
que ste mtodo no afectar el volumen de la caja, o sea, el contenido de la caja
no tiene nada que ver con el tamao de la misma.
Volver al principio

Implementacin en lnea
Como los mtodos de una clase son en realidad funciones, podemos entonces
indicarle al compilador que haga stas funciones en lnea. La palabra
clave inline se coloca antes del tipo de dato que la funcin devuelve, por
ejemplo, el mtodo contenido( ) podemos declararlo en lnea de la siguiente
manera:
// mtodo "contenido" (private)

inline int cubo::contenido(float uno, float dos, float tres) const


{
return uno + dos + tres;
}

En forma similar podemos hacer el mtodo en lnea incluyendo la definicin


dentro de la declaracin de la clase:
class cubo
{
// variables miembro
float ancho, fondo, altura;
int id;
// mtodo privado
int contenido(float uno, float dos, float tres)
{
return uno + dos + tres;
} // mtodo en lnea
public:
// constructor
cubo (float ancho_inicial, float fondo_inicial,
float altura_inicial, int identificador);
// constructor sobrecargado
cubo(void);
// destructor (observe la tilde ~)
~cubo();
// mtodo para obtener el volumen
void volumen(float nuevo_ancho, float nuevo_fondo, float
nuevo_altura);
};

Observe que para el mtodo llamado contenido( ) en realidad ya no existe


prototipo, se elimin el smbolo de punto y coma, adems se insert el cuerpo de
la funcin inmediatamente despus de la declaracin del mtodo.
Volver al principio

Empaquetado
Cada funcin que se declara en una clase debe tener una definicin. A la
definicin tambin se le llama implementacin de la funcin, como toda funcin,
la definicin de un mtodo de clase tiene un encabezado y un cuerpo de la
funcin. La definicin debe estar en un archivo que el compilador pueda
encontrar, ste archivo lleva por lo general la extensin *.cpp. Usted tiene la
libertad de poner la declaracin del mtodo (el prototipo) en ste archivo pero

sto no se considera como una buena prctica de programacin, lo que hacen la


mayora de los programadores es poner la declaracin del mtodo en un archivo
de cabecera que lleva la extensin *.h *.hpp. Por ejemplo, podemos colocar la
declaracin del la clase cubo en un archivo de cabecera llamado cubo.h y a las
implementaciones de las funciones miembro en un archivo llamado [Link],
despus indicamos al preprocesador que incluya el archivo de
cabecera cubo.h agregando sta lnea en el archivo [Link]:
#include "cubo.h"

La declaracin de una clase le indica al compilador qu es la clase, qu datos


almacena y qu funciones desempea. La declaracin de una clase es llamada su
interfaz porque le indica al usuario cmo interactuar con la clase. La interfaz
generalmente se almacena en un archivo de cabecera con la extensin *.h
*.hpp. La definicin de una funcin le indica al compilador cmo trabaja la
funcin. La definicin de una funcin es llamada la implementacin del mtodo
de clase y se guarda en un archivo con la extensin *.cpp. Los detalles de la
implementacin de una clase son de importancia para el desarrollador de la
misma. Los clientes de la clase, sto es, el programa que utiliza la clase, no
necesitan saber cmo se han implementado las funciones de la clase.
Con referencia al programa [Link] podemos reordenarlo de la siguiente
manera, en un archivo de cabecera incluimos la definicin de la clase
llamada cubo, el archivo se llamar entonces cubo.h:
//***********************************************
// cubo.h
// Declara la clase "cubo"
// 1999, Jaime Virgilio Gmez Negrete
//***********************************************
#include <iostream.h>
class cubo
{
// variables miembro
float ancho, fondo, altura;
int id;
// mtodo privado
int contenido(float uno, float dos, float tres)
{
return uno + dos + tres;
} // mtodo en lnea
public:
// constructor

cubo (float ancho_inicial, float fondo_inicial,


float altura_inicial, int identificador);
// constructor sobrecargado
cubo(void);
// destructor (observe la tilde ~)
~cubo();
// mtodo para obtener el volumen
void volumen(float nuevo_ancho, float nuevo_fondo, float
nuevo_altura);
};

La implementacin de la clase cubo ahora est en un archivo


llamado [Link], observe que incluye una llamada al preprocesador para indicar
que anexe el contenido del archivo llamado cubo.h, en la lnea 8.
//***********************************************
// [Link]
// Implementacin de la clase "cubo"
// 1999, Jaime Virgilio Gmez Negrete
//***********************************************
#include <iostream.h>
#include "cubo.h"
// definicin del constructor sin parmetros
cubo::cubo(void)
{
cout << "Constructor sin parametros..." << endl;
ancho = 2;
fondo = 2;
altura =2;
volumen(ancho, fondo, altura);
}
// definicin del constructor con parmetros
cubo::cubo(float ancho_inicial, float fondo_inicial,
float altura_inicial, int identificador)
{
ancho = ancho_inicial;
fondo = fondo_inicial;
altura = altura_inicial;
cout << "Constructor del objeto " << identificador << endl;
volumen(ancho, fondo, altura);
}
// definicin del destructor
cubo::~cubo()
{
cout << "Destructor..." << endl;
}
// mtodo "volumen" (public)
void cubo::volumen(float nuevo_ancho, float nuevo_fondo, float
nuevo_altura)

float vol_cubo, elementos;


vol_cubo = nuevo_ancho*nuevo_fondo*nuevo_altura;
elementos = contenido(nuevo_ancho, nuevo_fondo, nuevo_altura);
cout << "El volumen es: " << vol_cubo << endl;
cout << "y contiene " << elementos << " piezas" << endl << endl;

El programa que hace uso de la clase cubo est especificado en el cdigo


llamado [Link], observe que es posible crear varios programas diferentes
que utilicen ms de una clase, cada una con un propsito diferente. Interesante es
hacer notar que el archivo [Link] es posible distribuirlo en forma precompilada
en forma de librera esttica, posiblemente se llamara [Link], de tal manera que
los usuarios de la clase cubo jams se enteraran de cmo se implementaron los
mtodos de la clase. El programa [Link] es el siguiente:
//***********************************************
// [Link]
// Hace uso de la clase cubo
// 1999, Jaime Virgilio Gmez Negrete
//***********************************************
#include <iostream.h>
#include "cubo.h"
cubo caja4(3, 3, 3, 4); // una caja global
// funcin principal
int main()
{
cubo caja1(10, 10, 10, 1), caja2(5, 5, 5, 2), caja3;
float ancho_local, fondo_local, altura_local;
cout << "Nuevo ancho para el cubo 1?" << endl;
cin >> ancho_local;
cout << "Nuevo fondo para el cubo 1?" << endl;
cin >> fondo_local;
cout << "Nueva altura para el cubo 1?" << endl;
cin >> altura_local;
cout << endl;
cout << "Nuevos valores del cubo 1:" << endl;
[Link](ancho_local, fondo_local, altura_local);
// otros valores para el cubo 2
cout << "Nuevos valores del cubo 2:" << endl;
[Link](ancho_local+10, fondo_local*3, altura_local+5);
return 0;
}

El hecho de separar la declaracin de una clase en un archivo de cabecera y la


implementacin de sus mtodos en otro tiene tambin un motivo prctico, habr
observado que C++ no est hecho para programas sencillos pues para efectuar
tareas relativamente simples se utilizan una mayor cantidad de lneas de cdigo,
la gran ventaja de empaquetar objetos la encontraremos cuando se trate el tema
de la herencia, adems el empaquetado facilita la reutilizacin de cdigo y la
implementacin de bibliotecas de funciones que son dos puntos muy fuertes en la
programacin en C++.
Volver al principio

Leccin 4
Entrada/Salida de archivos
En el captulo 1 trabajamos con flujos de E/S hacia los dispositivos estndar
por defecto definidos en C++ que son el teclado para operaciones de entrada, y el
monitor para operaciones de salida. Ahora que tenemos una mejor perspectiva
acerca de qu son las clases, captulo 3, es conveniente dar una repasada
al captulo 1 y en ste artculo trataremos los principales aspectos de las
operaciones de E/S en archivos.

Operaciones de escritura en archivos


El archivo de cabecera fstream.h define las
clases ifstream, ostream y fstream para operaciones
de lectura, escritura y lectura/escritura en archivos respectivamente. Para
trabajar con archivos debemos crear objetos de stas clases de acuerdo a las
operaciones que deseamos efectuar. Empezamos con las operaciones de escritura,
para lo cual bsicamente declaramos un objeto de la clase ofstream, despus
utilizamos la funcin miembro open para abrir el archivo, escribimos en el
archivo los datos que sean necesarios utilizando el operador de insercin y por
ltimo cerramos el archivo por medio de la funcin miembro close, ste proceso
est ilustrado en nuestro primer programa, [Link].
//***********************************************
// [Link]
// Demuestra la escritura bsica en archivo
// 1999, Jaime Virgilio Gmez Negrete

//***********************************************
#include <fstream.h>
int main()
{
ofstream archivo;

// objeto de la clase ofstream

[Link]("[Link]");
archivo << "Primera lnea de texto" << endl;
archivo << "Segunda lnea de texto" << endl;
archivo << "ltima lnea de texto" << endl;
[Link]();
return 0;
}

En el programa se ha creado un objeto de la clase ofstream llamado archivo,


posteriormente se utiliza la funcin miembro open para abrir el arcivo
especificado en la cadena de texto que se encuentra dentro del parntesis de la
funcin. Por lo visto en el captulo 3 sabemos que podemos invocar a la funcin
constructora de clase de tal manera que el archivo tambin se puede abrir
utilizando la siguiente instruccin:
ofstream archivo("[Link]");

// constructora de ofstream

Naturalmente, al utilizar la funcin constructora ya no es necesario utilizar la


funcin miembro open, sta forma de abrir un archivo es preferida porque el
cdigo es ms compacto y fcil de leer. De la misma forma que se utilizan
manipuladores de salida para modificar la presentacin en pantalla de los datos
del programa, igual es posible utilizar stos manipuladores al escribir datos en un
archivo como lo demuestra el programa [Link], observe que se utiliza un
constructor para crear y abrir el archivo llamado [Link]:
//***********************************************
// [Link]
// Demuestra el uso de manipuladores
// 1999, Jaime Virgilio Gmez Negrete
//***********************************************
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
int main()
{
ofstream archivo("[Link]");
int numero;

// constructor de ofstream

cout << "Introduzca un numero:" << endl;


cin >> numero;
archivo << "El valor introducido en base 10 es: "
<< numero << endl;
archivo << resetiosflags(ios::dec);
archivo << setiosflags(ios::oct);
archivo << "en base octal es: " << numero << endl;
archivo << resetiosflags(ios::oct);
archivo << setiosflags(ios::hex);
archivo << "y en base hexadecimal es: " << numero << endl;
archivo << setiosflags(ios::uppercase|ios::showbase);
archivo << "utilizando los manipuladores uppercase y showbase"
" el valor es: " << numero << endl;
archivo << resetiosflags(ios::uppercase|ios::showbase);
archivo << resetiosflags(ios::hex);
archivo << setiosflags(ios::showpos|ios::showpoint|ios::fixed);
archivo << "Utilizando los manipuladores showpos,"
" showpoint y fixed: " << (float)numero << endl;
archivo << resetiosflags(ios::showpos|ios::showpoint|
ios::fixed);
archivo << "Finalmente el valor es " << numero << endl;
[Link]();
return 0;
}

Modos de apertura de archivo


Al especificar la apertura de un archivo como se ha mostrado en los
programas anteriores, el programa sobreescribe cualquier archivo existente
llamado [Link] en el directorio de trabajo del programa. Dependiendo del
propsito del programa es posible que sea necesario agregar datos a los ya
existentes en el archivo, o quiz sea necesario que las operaciones del programa
no se lleven a cabo en caso de que el archivo especificado exista en el disco, para
stos casos podemos especificar el modo de apertura del archivo incluyendo un
parmetro adicional en el constructor, cualquiera de los siguientes:
ios::app Operaciones de aadidura.
ios::ate Coloca el apuntador del archivo al final del mismo.
ios::in Operaciones de lectura. Esta es la opcin por defecto para objetos
de la clase ifstream.

ios::out Operaciones de escritura. Esta es la opcin por defecto para


objetos de la clase ofstream.
ios::nocreate Si el archivo no existe se suspende la operacin.
ios::noreplace Crea un archivo, si existe uno con el mismo nombre la
operacin se suspende.
ios::trunc Crea un archivo, si existe uno con el mismo nombre lo borra.
ios::binary Operaciones binarias.
De esta manera, podemos modificar el modo de apertura del
programa [Link] para que los datos del programa se concatenen en el
archivo [Link] simplemente escribiendo el constructor as: ofstream
archivo("[Link]", ios::app);. Si deseamos que el programa no sobreescriba
un archivo existente especificamos el constructor de sta manera: ofstream
archivo("[Link]", ios::noreplace);. Utilizando los especificadores de modo
de apertura se puede conseguir un mayor control en las operaciones de E/S en
archivos.
Volver al principio

Operaciones de lectura de archivos


Para abrir un archivo y realizar operaciones de lectura se crea un objeto de la
clase ifstream y se procede prcticamente de la misma forma que lo expuesto en
el apartado anterior. Despus de abrir el archivo se puede leer su contenido
utilizando las funciones miembro de la clase ifstream o bin el operador de
extraccin. Cuando se lee un archivo, por lo general se empieza al principio del
mismo y se leer su contenido hasta que se encuentre el final del archivo. Para
determinar si se ha llegado al final del archivo se puede utilizar la funcin
miembro eof como condicin de un bucle while. Adems se puede utilizar la
funcin miembro fail para detectar un error al abrir el archivo, esto se demuestra
en el siguiente programa, [Link]:
//***********************************************
// [Link]
// Demuestra operaciones de lectura de archivos
// 1999, Jaime Virgilio Gmez Negrete

//***********************************************
#include <fstream.h>
int main()
{
ifstream archivo("[Link]", ios::noreplace);
char linea[128];
long contador = 0L;

if([Link]())
cerr << "Error al abrir el archivo [Link]" << endl;
else
while(![Link]())
{
[Link](linea, sizeof(linea));
cout << linea << endl;
if((++contador % 24)==0)
{
cout << "CONTINUA...";
[Link]();
}
}
[Link]();
return 0;

El programa crea un objeto de la clase ifstream para abrir el archivo


llamado [Link] utilizando el constructor de clase y especificando la
bandera ios::noreplace que evita que el archivo sea sobreescrito. Si por algn
motivo ocurre un error al abrir el archivo se genera el mensaje de error
especificado en la lnea 16. En ausencia de errores el programa entra en un
bucle while el cual est evaluado por efecto de la funcin miembro eof( ) de tal
manera que el bucle se ejecuta hasta encontrar el final del archivo. Utlizando la
funcin miembro getline( ) se obtiene una lnea de texto y se exhibe en pantalla,
lnea 21, luego utilizamos una instruccin condicional if con el operador de
mdulo (%) para determinar si se han ledo 24 lneas de texto. Cada vez que el
contador de lneas dividido entre 24 d como resultado un resduo de cero el
programa se detiene permitiendo leer las 24 lneas de texto previas. Para
continuar se debe presionar la tecla enter y entonces el programa leer y mostrar
en pantalla las siguientes 24 lneas de texto, lneas 22 a la 26.
Analizando el xito de E/S de archivos
En el programa [Link] se utiliz la funcin miembro fail( ) para
determinar el xito de la operacin de apertura del archivo [Link]. La funcin
miembro fail( ) produce el valor de 1 si ocurre un error en la operacin de
archivo. Similarmente es recomendable utilizar otras funciones para verificar no

solo la apertura de archivo sino tambin las operaciones de lectura y escritura, las
funciones miembro que nos permiten stas pruebas son las siguientes:
good Produce un 1 si la operacin previa fu exitosa.
eof Produce un 1 si se encuentra el final del archivo.
fail Produce un 1 si ocurre un error.
bad Produce un 1 si se realiza una operacin invlida.
Tres de las cuatro funciones enlistadas quedan demostradas en el siguiente
programa llamado [Link] el cual copia el contenido del archivo
llamado [Link] en uno llamado [Link]. En primer lugar se crea un objeto de
la clase ifstream llamado origen que nos sirve para abrir el archivo [Link] para
operaciones de lectura, la funcin miembro [Link]( ) nos indica la existencia
de un error, en caso de que ste exista se despliega un mensaje en pantalla y el
programa termina. Si la apertura del archivo [Link] fu exitosa se procede
entonces a la siguiente parte del programa donde se crea un objeto de la
clase ofstream llamado destino para operaciones de escritura el cual especifica
que el archivo a crear se llamar [Link] y de acuerdo a la
bandera ios::noreplace, si existe un documento con el nombre de [Link] la
funcin constructora fallar, ste proceso es detectado por la funcin
miembro [Link]( ) desplegando un mensaje en pantalla y terminando el
programa. [Link] es un programa que sirve para copiar un archivo basado
en caracteres ASCII.
//*********************************************************
// [Link]
// Demuestra xito en operaciones de E/S de archivos
// 1999, Jaime Virgilio Gmez Negrete
//*********************************************************
#include <fstream.h>
#include <stdlib.h>
int main()
{
ifstream origen("[Link]");
char linea[128];
if([Link]())
cerr << "Error al abrir el archivo [Link]" << endl;
else
{
ofstream destino("[Link]", ios::noreplace);

if([Link]())
cerr << "Error al crear el archivo \"[Link]\""
<< endl;
else
{
while(![Link]())
{
[Link](linea, sizeof(linea));
if([Link]()) // si lectura ok y
if([Link]()) // si eof, -> termina
exit(1);
// el programa
else
destino << linea << endl;
if([Link]())
{
cerr << "Fallo de escritura en archivo"
<< endl;
exit(1);
}
}
}
[Link]();
}
[Link]();
return 0;
}

En caso que las operaciones de apertura de los archivos involucrados en el


programa [Link] sean exitosas, entonces se inicia un bucle en donde se lee
en primer lugar una lnea de texto, lnea 27 del programa, el xito de sta
operacin es monitoreado por la funcin miembro [Link]( ), si sta funcin
indica que la lectura del archivo fu exitosa entonces la funcin
miembro [Link]( ) verifica si la lnea en cuestin es el final del archivo, si no
es as, entonces la lnea leda se escribe en el archivo [Link], entonces le
corresponde a la funcin miembro [Link]( ) verificar que el proceso de
escritura tuvo xito, lnea 33 del programa. El bucle se repite hasta encontrar el
final del archivo, condicin que se verifica tanto en la linea 25 como en la 29 del
programa.
Volver al principio

Operaciones con archivos binarios


Las operaciones de flujos de archivos se ejecutan en forma predeterminada en
modo de texto, sin embargo hay ocasiones en donde se requiere realizar
operaciones en archivos binarios, como sucede con archivos de estructuras de

datos aquellos que contienen datos numricos de punto flotante. A manera de


prueba trate de relaizar una copia de un archivo ejecutable utilizando el
programa [Link], se dar cuenta que si bin, el programa no marca errores,
el resultado sencillamente no es el esperado. La prueba definitiva es comparar el
tamao en bytes del archivo original contra el tamao del archivo copiado.
El programa [Link] ejecuta operaciones de E/S en archivos utilizando el
modo binario (ios::binary), ste programa puede copiar efectivamente un archivo
ejecutable, en el ejemplo [Link], generando un nuevo archivo
llamado [Link], el nuevo cdigo, basado en [Link] es el siguiente:
//*********************************************************
// [Link]
// Demuestra operaciones con archivos binarios
// 1999, Jaime Virgilio Gmez Negrete
//*********************************************************
#include <fstream.h>
#include <stdlib.h>
int main()
{
ifstream origen("[Link]", ios::binary);
char linea[1];
if([Link]())
cerr << "Error al abrir el archivo [Link]" << endl;
else
{
ofstream destino("[Link]", ios::binary);
if([Link]())
cerr << "Error al crear el archivo \"[Link]\""
<< endl;
else
{
while(![Link]()&&![Link]())
{
[Link](linea, sizeof(linea));
if([Link]())
{
[Link](linea, sizeof(linea));
if([Link]())
{
cerr << "Error en el archivo \"[Link]\""
<< endl;
exit(1);
}
}
else if(![Link]())
{
cerr << "Error en el archivo \"[Link]\""
<< endl;

exit(1);

}
}
[Link]();

}
[Link]();
}

return 0;

Observar que se utiliza la funcin miembro [Link]( ) para leer un byte


del archivo especificado por el objeto de la clase ifstream llamado origen, lnea
27. En forma similar, se utiliza la funcin miembro [Link]( ) para escribir
un byte en el archivo especificado para el objeto de la
clase ofstream llamado [Link], lnea 30 del programa. La comprobacin de
las operaciones de E/S se realizan como se indic para el programa [Link].
Si se desea utilizar los operadores de insercin y extraccin para operaciones de
E/S en archivos binarios se requiere sobrecargar stos operadores, sto lo
trataremos ms adelante cuando se aborde el tema de la sobrecarga de operadores
en C++.
Volver al principio

Lectura y escritura en un archivo


Hasta este punto hemos efectuado operaciones, sea de escritura o bin de
lectura en un archivo, tanto en formato de texto como en formato binario pero
todava no se han efectuado mbas operaciones en un mismo archivo. En ciertas
aplicaciones es necesario efectuar operaciones de lectura/escritura en un archivo
como es el caso de una base de datos, para esto es necesario crear un objeto de la
clase fstream. Cuando un programa abre un archivo para operaciones de E/S ste
mantiene el registro de dos apuntadores de archivo, uno para operaciones de
lectura y otro para operaciones de escritura. Como en la mayora de los casos en
que se abre un archivo para operaciones de E/S se efecta acceso aleatorio,
analizaremos sta condicin.
Acceso aleatorio de archivos
En los programas presentados hasta este punto se han realizados
operaciones secuenciales en el archivo, ya sea para escritura lectura de datos,
empezando por el principio y continuando hasta el final del mismo. Las
operaciones aleatorias en un archivo no necesariamente inician por el principio

del archivo, en lugar de sto es posible desplazarse por el contenido del archivo
para realizar una operacin de E/S. Para mover los apuntadores de archivo a
posiciones especficas se utilizan dos funciones: seekg( ) coloca el apuntador de
escritura de archivo en un lugar especfico, y seekp( ) mueve el apuntador de
lectura a una posicin especfica en el archivo, la sintxis de las funciones es
sta:

seekp(desplazamiento, posicion)

seekg(desplazamiento, posicion)

El parmetro desplazamiento especifica la cantidad de bytes que se


mover el apuntador de archivo, puede ser un valor positivo negativo. El
parmetro posicion especifica el lugar del archivo a partir del cual se
mover el apuntador de archivo, de acuerdo a las siguientes banderas

ios::beg

Desde el principio del archivo

ios::cur

Desde la posicin actual del apuntador

ios::end

Desde el fin del archivo

Para demostrar las operaciones aleatorias conviene generar un breve


archivo de texto en donde poder efectuar algunas operaciones de E/S, use
el siguiente cdigo:
//***********************************************
// [Link]
// Genera un abecedario
// 1999, Jaime Virgilio Gmez Negrete
//***********************************************
#include <fstream.h>
int main()
{
ofstream archivo("[Link]");
for(char letra='A'; letra <='Z'; letra++)
archivo << letra;
[Link]();
return 0;
}

El cdigo genera un alfabeto en el archivo llamado [Link], ahora


utilizaremos el programa [Link] para "navegar" por el contenido del
archivo y generar una palabra amigable en pantalla:
//*********************************************************
// [Link]
// Demuestra lectura y escritura en un archivo
// 1999, Jaime Virgilio Gmez Negrete
//*********************************************************
#include <fstream.h>
int main()
{
char letra;
fstream letras("[Link]", ios::in|ios::out);
[Link](7, ios::beg);
// obtiene la letra H
letra=[Link]();
[Link](0, ios::end);
letras << letra; // coloca la letra al final
[Link](-13, ios::end); // obtiene la letra O
letra = [Link]();
[Link](0, ios::end);
letras << letra;
[Link](-17, ios::end); // obtiene la letra L
letra = [Link]();
[Link](0, ios::end);
letras << letra;
[Link](0, ios::beg);
letra = [Link]();
[Link](0, ios::end);
letras << letra;

// obtiene la letra A

[Link](-4, ios::end);
while(![Link]())
[Link]((char)[Link]());
[Link]();
}

return 0;

Observe que para posicionar el apuntador de lectura de archivo a partir


del fin del mismo se utiliza un nmero negativo y adems la lectura
avanza hacia el final del archivo. Por la naturaleza del
programa [Link] solo desplegar el mensaje HOLA en pantalla una
sola vez, esto es porque las letras que forman la palabra "HOLA" se leen
del archivo y a su vez se escriben al final del mismo, el cdigo toma en

cuenta las letras previamente escritas, lineas 19 a la 32. Para un mejor


entendimiento del funcionamiento del programa utilice el depurador de
errores de su compilador en la modalidad de paso por paso.
Volver al principio

Salida a impresora
De la misma manera en que es posible escribir la salida en un archivo,
habr ocasiones en las que es necesario producir constancia en papel
utilizando una impresora. En general es posible tratar a la impresora como
uno ms de los dispositivos disponibles para la salida de datos, se crea un
objeto de la clase ofstream especificando como nombre de archivo la
palabra PRN, tal y como lo demuestra el ltimo programa de ste
captulo, [Link]:
//***********************************************
// [Link]
// Demuestra la salida a impresora
// 1999, Jaime Virgilio Gmez Negrete
//***********************************************
#include <fstream.h>
#include <stdlib.h>
int main()
{
char texto[256];
ofstream impresora("PRN");
ifstream archivo("[Link]");
if ([Link]())
cerr << "Error al abrir el archivo \"[Link]\""
<< endl;
else
{
while (![Link]())
{
[Link](texto, sizeof(texto));
if ([Link]())
{
impresora << texto << endl;
if ([Link]())
{
cerr << "Error de escritura en impresora"
<< endl;
exit(1);

}
}
else if (![Link]())
{
cerr << "Error al leer el archivo \"[Link]\""
<< endl;
exit(1);
}

}
[Link]();
[Link]();

return 0;
}

Volver al principio

Leccin 5

Programando en C++
Encapsulado II

El encapsulado protege a los datos de daos accidentales y los constructores


garantizan una adecuada inicializacin, ambos previenen errores que todos
estamos expuestos a cometer ya que al escribir una clase pensamos slo en los
aspectos internos de la misma, posteriormente, al utilizarla no necesitamos
preocuparnos por los detalles de la clase, concentrandonos en resolver el
problema que enfrentamos al momento. Como podr adivinar, existen muchos
ms aspectos que debemos tratar respecto al uso y beneficios de las clases. El
propsito de ste captulo es ilustrar algunos de los aspectos de C C++ con las
clases y objetos. En orden de un estudio sistemtico, utilizaremos como punto de
partida el ltimo programa de ejemplo del captulo anterior.

Un array de objetos

En el primer cdigo de ejemplo de este captulo analizaremos el concepto de un


array de objetos, observe que hemos declarado un array de 4 cajas (grupo[4]) en
la lnea 39:
#include <iostream.h>
class caja
{
int longitud;
int ancho;
static int dato_extra; // Declaracion de dato_extra
public:
caja(void);
// Constructor
void coloca(int nuevo_longitud, int nuevo_ancho);
int area(void);
int extra(void) {return dato_extra++;}
};
int caja::dato_extra;

// Definicion de dato_extra

caja::caja(void)
{
longitud = 8;
ancho = 8;
dato_extra = 1;
}

// Implementacion del constructor

// Este metodo coloca un tamao de caja a los dos parametros de entrada


void caja::coloca(int nuevo_longitud, int nuevo_ancho)
{
longitud = nuevo_longitud;
ancho = nuevo_ancho;
}
// Este metodo calcula y retorna el area de una instancia de caja
int caja::area(void)
{
return (longitud * ancho);
}
int main()
{
caja chica, mediana, grande, grupo[4];
trabajar
[Link](5, 7);
[Link](15, 20);
for (int indice = 1 ; indice < 4 ; indice++)
default
grupo[indice].coloca(indice + 10, 10);

// Siete cajas para

//grupo[0] usa el

cout << "El area de caja chica es " << [Link]() << "\n";
cout << "El area de caja mediana es " << [Link]() << "\n";
cout << "El area de caja grande es " << [Link]() << "\n";

for (indice = 0 ; indice < 4 ; indice++)


cout << "El array area caja es " << grupo[indice].area() << "\n";
cout
cout
cout
cout
cout

<<
<<
<<
<<
<<

"El
"El
"El
"El
"El

valor
valor
valor
valor
valor

de
de
de
de
de

datos
datos
datos
datos
datos

extra
extra
extra
extra
extra

es
es
es
es
es

"
"
"
"
"

<<
<<
<<
<<
<<

[Link]() << "\n";


[Link]() << "\n";
[Link]() << "\n";
grupo[0].extra() << "\n";
grupo[3].extra() << "\n";

return 0;
}

Respecto al funcionamiento del constructor recordar que cada uno de los cuatro
objetos caja sern inicializados a los valores definidos dentro del constructor ya
que el constructor ser ejecutado para cada objeto caja definido. Para definir un
array de objetos debemos disponer de un constructor sin parmetros para dicho
objeto. (An no hemos ilustrado un constructor con parmetros de inicializacin
pero lo haremos en el prximo ejemplo). Esto es una consideracin de eficiencia
ya que probablemente sera un error inicializar todos los elementos de un array de
objetos al mismo valor.
En la lnea 43 tenemos un bucle for que empieza con 1, dejando que el primer
objeto llamado grupo[0], utilice el valor almacenado por default cuando se llam
al constructor. Observe que al enviar un mensaje a uno de los objetos se utiliza el
mismo constructor como con cualquier objeto, el nombre del array seguido de su
ndice entre corchetes se utiliza para enviar un mensaje a uno de los objetos del
array, como se demuestra en la lnea 44. Otro mtodo es llamado en los
enunciados de salida en la lnea 51 donde el area de las cuatro cajas en el
array grupo son enlistadas en el monitor.
Declaracin y definicin de una variable
A manera de ilustracin se ha incluido una variable adicional
llamada dato_extra en la lnea 7, como se ha utilizado la palabra
clave static para modificar sta variable, es por lo tanto una variable externa y
solo existir una copia de la misma. Los siete objetos de esta clase compartirn
una sola copia de la variable la cual es global para los objetos definidos en la
lnea 39. La variable ha sido declarada lo que nos dice que existe en algn lugar,
pero an no ha sido definida. Una declaracin nos indica la existencia de la
variable y le asigna un nombre, pero la definicin, valga la redundancia, define
un lugar para almacenarla dentro del espacio de memoria de la computadora. Por
definicin, una variable esttica puede ser declarada en el encabezado de una
clase pero no puede ser definida ah, por lo general se hace en el archivo de
implementacin. En este caso se ha definido en la lnea 15 y por lo tanto puede
utilizarse en toda la clase.

Volver al principio

Una cadena dentro de un objeto


En el siguiente programa veremos el primer ejemplo de un objeto con una cadena
incrustada, bueno, en realidad contiene un puntero incrustado, pero como ambos
funcionan de manera similar, estudiar uno nos lleva a comprender al otro, el
cdigo es el siguiente:
#include <iostream.h>
class caja
{
int longitud;
int ancho;
char *linea_de_texto;
public:
caja(char *linea_de_entrada);
// Constructor
void coloca(int nueva_longitud, int nuevo_ancho);
int obtiene_area(void);
};
caja::caja(char *linea_de_entrada)
constructor
{
longitud = 8;
ancho = 8;
linea_de_texto = linea_de_entrada;
}

// Implementacion del

// Este metodo determina el tamao de la caja segun los parametros de


entrada
void caja::coloca(int nueva_longitud, int nuevo_ancho)
{
longitud = nueva_longitud;
ancho = nuevo_ancho;
}
// Calcula y retorna el area de una instancia de caja
int caja::obtiene_area(void)
{
cout << linea_de_texto << "= ";
return (longitud * ancho);
}
int main()
{
caja chica("caja chica "), mediana("caja mediana "), grande("caja
grande ");

[Link](5, 7);
[Link](15, 20);
cout
cout
cout
cout
cout
cout

<<
<<
<<
<<
<<
<<

"El area de la ";


chica.obtiene_area() << "\n";
"El area de la ";
mediana.obtiene_area() << "\n";
"El area de la ";
grande.obtiene_area() << "\n";

return 0;
}

La lnea 7 contiene un puntero a un char llamado linea_de_texto. El constructor


lleva un parmetro de entrada llamado linea_de_entrada el cual es un puntero a
una cadena la cual ser copiada a la cadena llamada linea_de_texto dentro del
constructor. Usted puede observar que al momento de definir las tres cajas hemos
aadido una cadena constante como parmetro en cada declaracin la cual es
utilizada por el constructor como los datos a los cuales seala el puntero. Cuando
llamamos a obtiene_area( ) el las lneas 42 a 47, desplegamos el mensaje y el
area es retornada. Es prudente poner estas operaciones en mtodos diferentes ya
que no hay una aparente conexin entre desplegar el mensaje y calcular el area,
pero se ha escrito de sta manera con propsito de ilustracin. Lo que sto
significa es la posibilidad de tener un mtodo con un efecto lateral, el mensaje
desplegado en el monitor y el valor retornado, es decir, el area de la caja.
Complile y ejecute ste programa para un mejor entendimiento de su
funcionamiento.
Volver al principio

Un objeto con un puntero interno


Hagamos unas modificaciones a nuestro cdigo para presentar un ejemplo de un
puntero incrustado el cual ser utilizado para asignar datos dinmicamente, el
cdigo es ahora:
#include <iostream.h>
class caja
{
int longitud;
int ancho;
int *puntero;
public:

caja(void);
// Constructor
void coloca(int nueva_longitud, int nuevo_ancho, int
valor_almacenado);
int obtiene_area(void) {return longitud * ancho;}
Implementacion en linea
int obtiene_valor(void) {return *puntero;}
Implementacion en linea
~caja();
// Destructor
};
caja::caja(void)
{
longitud = 8;
ancho = 8;
puntero = new int;
*puntero = 112;
}

//
//

// Implementacion del constructor

// Este metodo determina el tamao de la caja segun los parametros de


entrada
void caja::coloca(int nueva_longitud, int nuevo_ancho, int
valor_almacenado)
{
longitud = nueva_longitud;
ancho = nuevo_ancho;
*puntero = valor_almacenado;
}
caja::~caja(void)
{
longitud = 0;
ancho = 0;
delete puntero;
}

// Destructor

int main()
{
caja chica, mediana, grande;
[Link](5, 7, 177);
[Link](15, 20, 999);
cout << "El area de la caja chica es " << chica.obtiene_area() <<
"\n";
cout << "El area de la caja mediana es " << mediana.obtiene_area() <<
"\n";
cout << "El area de la caja grande es " << grande.obtiene_area() <<
"\n";
cout << "El valor almacenado en caja chica es " <<
chica.obtiene_valor() << "\n";
cout << "El valor almacenado en caja mediana es " <<
mediana.obtiene_valor() << "\n";
cout << "El valor almacenado en caja grande es " <<
grande.obtiene_valor() << "\n";
}

return 0;

En la lnea 7 declaramos un puntero a una variable de tipo int, pero slo es un


puntero, no hay espacio para almacenamiento asociado a l. El constructor por
tanto ubica una variable de tipo entero en la pila (heap) para utilizarla con el
puntero en la lnea 20. debe quedarle claro que los tres objetos definidos en la
lnea 41 cada uno contiene un puntero el cual seala a tres diferentes ubicaciones
en la pila (heap), cada objeto tiene su propia variable ubicada dinmicamente
para su uso privado, ms an, cada una tiene almacenada el valor de 112 porque
la lnea 21 almacena ese valor en cada una de las tres ubicaciones, una por cada
llamada al constructor. En un programa tan pequeo no hay manera de desbordar
la pila as que no se requiere una prueba de disponibilidad de memoria.
El mtodo llamado coloca ( ) tiene asociado tres parmetros siendo el tercero el
utilizado para asignar el valor a la nueva variable dinmicamente ubicada. Las
tres areas se despliegan seguidas por los valores almacenados en las variablea
dinmicamente ubicadas. En ste programa es necesario el uso de un destructor
ya que sin ste, al terminar el programa principal dejaramos tres variables
dinmicamente ubicadas en la pila sin ningn puntero que seale a ellas, seran
inaccesibles y ocuparan espacio en memoria sin provecho, por esta razn
utilizamos el destructor para delete (borrar) la variable a la que se refiere el
puntero llamado puntero, en este caso, las lneas 34 y 35 asignan cero a las
variables que sern automticamente borradas, aunque no absolutamente
necesarias, son enunciados permitidos en C++.
Volver al principio

Un objeto ubicado dinmicamente


Nuevamente modificamos el cdigo de ejemplo para mostrar un objeto ubicado
dinmicamente, estudie el siguiente ejemplo:
#include <iostream.h>
class caja
{
int longitud;
int ancho;
public:
caja(void);
// Constructor
void coloca(int nueva_longitud, int nuevo_ancho);
int obtiene_area(void);
};
caja::caja(void)
{

// Implementacion del constructor

longitud = 8;
ancho = 8;

// Este metodo determina el tamao de la caja segun los parametros de


entrada
void caja::coloca(int nueva_longitud, int nuevo_ancho)
{
longitud = nueva_longitud;
ancho = nuevo_ancho;
}
// Este metodo calcula y retorna el area de una instancia de caja
int caja::obtiene_area(void)
{
return (longitud * ancho);
}
int main()
{
caja chica, mediana, grande;
caja *puntero;
[Link](5, 7);
[Link](15, 20);
puntero = new caja;
cout << "El area de la caja chica es " << chica.obtiene_area() <<
"\n";
cout << "El area de la caja mediana es " << mediana.obtiene_area() <<
"\n";
cout << "El area de la caja grande es " << grande.obtiene_area() <<
"\n";
cout << "La nueva area de caja es " << puntero->obtiene_area() <<
"\n";
puntero->coloca(12, 12);
cout << "La nueva area de caja es " << puntero->obtiene_area() <<
"\n";
delete puntero;
return 0;
}

En la lnea 35 definimos un puntero a un objeto de tipo caja y como slo es un


puntero con nada a qu sealar, ubicamos dinmicamente un objeto para este
puntero en la lnea 40, con el objeto creado en la pila (heap) como cualquier
variable ubicada dinmicamente. Cuando el objeto es creado en la lnea 40, el
constructor es llamado automticamente para asignar valores a las dos variables
de almacenamiento internas, observe que el constructor no es llamado durante la
definicin del puntero ya que no hay nada que inicializar, es llamado al ubicar el
objeto.

La referencia a los componentes del objeto son manejados de una manera similar
a como se hace en las estructuras, utilizando el operador de puntero como se
ilustra en las lneas 45 a 47. Finalmente, el objeto es borrado en la lnea 49 y el
programa termina. A estas alturas habr notado que el uso de objetos es similar a
las estructuras.
Volver al principio

Un objeto con un puntero a otro objeto


La siguiente modificacin a nuestro programa nos muestra un objeto con una
referencia interna a otro objeto de su propia clase:
#include <iostream.h>
class caja
{
int longitud;
int ancho;
caja *otra_caja;
public:
caja(void);
// Constructor
void coloca(int nueva_longitud, int nuevo_ancho);
int obtiene_area(void);
void apunta_al_siguiente(caja *donde_apuntar);
caja *obtiene_siguiente(void);
};
caja::caja(void)
{
longitud = 8;
ancho = 8;
otra_caja = NULL;
}

// Implementacion del constructor

// Este metodo determina el tamao de la caja segun los parametros de


entrada
void caja::coloca(int nueva_longitud, int nuevo_ancho)
{
longitud = nueva_longitud;
ancho = nuevo_ancho;
}
// Este metodo calcula y retorna el area de una instancia de caja
int caja::obtiene_area(void)
{
return (longitud * ancho);
}

// Este metodo obliga al puntero a sealar al parametro de entrada


void caja::apunta_al_siguiente(caja *donde_apuntar)
{
otra_caja = donde_apuntar;
}
// Este metodo retorna la caja sealada
caja *caja::obtiene_siguiente(void)
{
return otra_caja;
}
int main()
{
caja chica, mediana, grande;
caja *caja_puntero;
[Link](5, 7);
[Link](15, 20);
cout << "El area de la caja chica es " << chica.obtiene_area() <<
"\n";
cout << "El area de la caja mediana es " << mediana.obtiene_area() <<
"\n";
cout << "El area de la caja grande es " << grande.obtiene_area() <<
"\n";
chica.apunta_al_siguiente(&mediana);
mediana.apunta_al_siguiente(&grande);
caja_puntero = &chica;
caja_puntero = caja_puntero->obtiene_siguiente();
cout << "La caja senalada tiene una area de " << caja_puntero>obtiene_area() << "\n";
}

return 0;

El constructor contiene el enunciado que asigna al puntero el valor de NULL para


inicializarlo en la lnea 20. Es buena idea inicializar los punteros de sus
programas a algo. En las lneas 12 y 13 declaramos dos mtodos adicionales, el
de la lnea 13 no se ha mencionado an en este tutorial, ste mtodo regresa un
puntero a un objeto de la clase caja. Como Usted sabe, es posible regresar un
puntero a una estructura en C y el mtodo de la lnea 13 es la construccin
equivalente en C++. La implementacin en las lneas 42 a la 45 regresa el
puntero almacenado como una variable miembro dentro del objeto.
Un puntero adicional llamado caja_puntero est definido en el programa
principal para usarse posteriormente y en la lnea 59 hacemos el puntero
incrustado dentro de caja chica sealando a caja mediana. En la lnea 60
hacemos que el puntero incrustado en caja mediana seale a caja grande.
Hemos generado efectivamente una lista enlazada con tres elementos. En la lnea
61 hecemos que el puntero extra seale a la caja chica, continuando en la lnea
62 lo utilizamos para referirnos a la caja chica y actualizarla al valor contenido

en la caja chica el cual es la direccin de la caja mediana. De esta manera


hemos atravesado de un elemento de la lista a otro enviando un mensaje a uno de
los objetos.
La palabra clave this
La palabra this se defini para cualquier objeto como un puntero al objeto en el
cual est contenido, concretamente se define como
nombre_de_la_clase *this;

y es inicializada para sealar al objeto para el cual la funcin miembro es


invocada, esta instruccin es muy til cuando se trabaja con punteros,
especialmente con listas enlazadas cuando se requiere referenciar a un puntero a
un objeto que Usted insertar en la lista. El uso de la palabra clave this an no se
ha ilustrado pero lo haremos posteriormente en este tutorial.
Volver al principio

Una lista enlazada de objetos


El siguiente programa de ejemplo es una lista enlazada escrita en notacin
orientada a objetos:
#include <iostream.h>
class caja
{
int longitud;
int ancho;
caja *otra_caja;
public:
caja(void);
// Constructor
void coloca(int nueva_longitud, int nuevo_ancho);
int obtiene_area(void);
void apunta_al_siguiente(caja *donde_apunta);
caja *obtiene_siguiente(void);
};
caja::caja(void)
{
longitud = 8;
ancho = 8;
otra_caja = NULL;
}

// Implementacion del constructor

// El tamao de la caja de acuerdo a los parametros de entrada


void caja::coloca(int nueva_longitud, int nuevo_ancho)
{
longitud = nueva_longitud;
ancho = nuevo_ancho;
}
// Calcula y regresa el area de una instancia de caja
int caja::obtiene_area(void)
{
return (longitud * ancho);
}
// Obliga al puntero a sealar al parametro de entrada
void caja::apunta_al_siguiente(caja *donde_apunta)
{
otra_caja = donde_apunta;
}
// Regresa la caja sealada
caja *caja::obtiene_siguiente(void)
{
return otra_caja;
}
int main()
{
caja *inicio = NULL;
// Siempre seala el inicio de la lista
caja *temp;
// Puntero temporal
caja *caja_puntero;
// Utilizado para la creacion de caja
// Se genera la lista
for (int indice=0; indice<10; indice++)
{
caja_puntero = new caja;
caja_puntero->coloca(indice + 1, indice + 3);
if (inicio == NULL)
{
inicio = caja_puntero; // Primer elemento en la lista
}
else
{
temp->apunta_al_siguiente(caja_puntero);
// Elemento
adicional
}
temp = caja_puntero;
}
// Despliega la lista
temp = inicio;
do
{
cout << "El area es " << temp->obtiene_area() << "\n";
temp = temp->obtiene_siguiente();
}
while (temp != NULL);
// Borra la lista
temp = inicio;

do
{

temp = temp->obtiene_siguiente();
delete inicio;
inicio = temp;

}
while (temp != NULL);
return 0;
}

Este programa es muy similar al anterior, de hecho es idntico hasta que


entramos en el programa principal main ( ). Recordar que en el programa
anterior la nica manera que tenamos para utilizar el puntero incrustado era a
traves del uso de dos mtodos llamados apunta_al_siguiente
( ) y obtiene_siguiente los cuales estn enlistados en las lneas 37 a la 46 del
presente programa, las utilizaremos para construir nuestra lista enlazada, despus
la recorreremos y desplegaremos los resultados, finalmente borraremos la lista
completa (delete) para liberar el espacio de la pila (heap).
En las lneas 50 a la 52 definimos tres punteros para utilizarlos en el programa. El
puntero llamado inicio siempre sealar al principio de la lista, pero temp se
mover a lo largo de la lista conforme la vamos creando. El puntero
llamado caja_puntero ser utilizado para la creacin de cada objeto, executamos
un bucle en las lneas 54 a la 67 para generar la lista donde en la lnea 56 ubica
dinmicamente un nuevo objeto de la clase caja y la lnea 57 le asigna datos a
manera de ilustracin. Si este es el primer elemento en la lista, el
puntero inicio se coloca para sealar a este elemento, pero si el elemento y
existe, el ltimo elemento de la lista es asignado para sealar al nuevo elemento.
En cualquier caso, el puntero temp es asignado para sealar al ltimo elemento
de la lista en preparacin para agregar un nuevo elemento, si es que lo hay.
En la lnea 69, el puntero llamado temp seala al primer elemento de la lista
actualizandose en la lnea 73 en su recorrido por la lista en cada pasada del bucle,
cuando temp obtiene el valor NULL proveniente del ltimo elemento de la lista,
finaliza el recorrido por la misma. Por ltimo, borramos la lista completa un
elemento a la vez en cada pasada del bucle de las lneas 78 a la 84
Volver al principio

Leccin 6

Programando en C++
Encapsulado III

Objetos anidados
El siguiente programa muestra un ejemplo de clases anidadas lo que resulta en
objetos anidados. Un objeto anidado puede ilustrarse utilizando su computadora
como analoga, la computadora en s est compuesta de varios elementos que
trabajan juntos pero cada uno desempea una labor diferente, como el teclado, el
disco duro y la fuente de alimentacin. La computadora est compuesta de stos
y otros elementos muy diferentes entre s al grado que es deseable discutir por
separado lo concerniente al teclado y al disco duro. Una clase computadora puede
estar compuesta de varios objetos diferentes anidando las clases diferentes dentro
de la clase computadora
Por otra parte, si deseamos discutir respecto a las unidades de disco, podramos
desear examinar las caractersticas de las unidades de disco en general, despus
los detalles del disco duro y los diferentes discos flexibles. Esto involucrara el
uso de la herencia porque la mayora de los datos acerca de mbos tipos de discos
pueden ser caracterizados y aplicados a la unidad de disco genrica y utilizar la
informacin para explicar las caractersticas en comn. La herencia la
estudiaremos en las siguientes lecciones, por lo pronto nos concentraremos en la
clase anidada incrustada:
#include <iostream.h>
class correo
{
int remitente;
int franqueo;
public:
void coloca(int clase_interna, int franqueo_interno)
{remitente = clase_interna; franqueo = franqueo_interno;}
int obtiene_franqueo(void) {return franqueo;}
};
class caja
{
int longitud;
int ancho;
correo etiqueta;
public:
void coloca(int l, int w, int s, int p)
{longitud = l; ancho = w; [Link](s, p);}

int obtiene_area(void) {return longitud * ancho;}


};
int main()
{
caja chica, mediana, grande;
[Link](2, 4, 1, 35);
[Link](5, 6, 2, 72);
[Link](8, 10, 4, 98);
cout << "El area es " << chica.obtiene_area() << "\n";
cout << "El area es " << mediana.obtiene_area() << "\n";
cout << "El area es " << grande.obtiene_area() << "\n";
}

return 0;

Este ejemplo contiene una clase llamada caja que a su vez contiene un objeto
incrustado de otra clase en la lnea 17, la clase correo. Este objeto est disponible
para utilizarse slo dentro de la implementacin de caja por definicin. El
programa principal main ( ) tiene objetos definidos de la clase caja pero ningn
objeto de correo por lo que la clase correo no puede ser referenciada en el
programa principal. En ste caso los objetos de la clase correo estn destinados a
utilizarse dentro de la clase caja y un ejemplo est dado en la lnea 20 donde se
enva un mensaje al mtodo [Link] ( ) para inicializar las variables.
De primordial importancia es el hecho de que no hay un solo objeto de la
clase correo declarado directamente en el programa principal, stos son
inherentemente declarados cuando los objetos de la clasecaja son declarados. Por
supuesto que se pueden declarar objetos de la clase correo en el programa
principal si es necesario, pero no en el programa de ejemplo. Para estar completa,
la clase caja debe tener uno o ms mtodos para usar la informacin almacenada
en el objeto de la clase correo.
Volver al principio

Sobrecarga de operadores
El siguiente cdigo presenta un ejemplo de sobrecarga de operadores, esto le
permite definir una clase de objetos y redefinir el uso de los operadores normales,
el resultado final es que los objetos de la nueva clase pueden utilizarse de una
manera tan natural como con los tipos predefinidos, de hecho, parecen ser parte
del lenguaje en lugar de una adicin suya.

#include <iostream.h>
class caja
{
int longitud;
int ancho;
public:
void coloca(int l, int w) {longitud = l; ancho = w;}
int obtiene_area(void) {return longitud * ancho;}
friend caja operator+(caja a, caja b); // Suma dos cajas
friend caja operator+(int a, caja b);
// Suma una constante a una
caja
friend caja operator*(int a, caja b);
// Multiplica caja por una
constante
};
caja operator+(caja a, caja b) // Suma el ancho de dos cajas
{
caja temp;
[Link] = [Link];
[Link] = [Link] + [Link];
return temp;
}
caja operator+(int a, caja b)
// Suma una constante a caja
{
caja temp;
[Link] = [Link];
[Link] = a + [Link];
return temp;
}
caja operator*(int a, caja b)
// Multiplica caja por una constante
{
caja temp;
[Link] = a * [Link];
[Link] = a * [Link];
return temp;
}
int main()
{
caja chica, mediana, grande;
caja temp;
[Link](2, 4);
[Link](5, 6);
[Link](8, 10);
cout << "El area es " << chica.obtiene_area() << "\n";
cout << "El area es " << mediana.obtiene_area() << "\n";
cout << "El area es " << grande.obtiene_area() << "\n";
temp = chica + mediana;
cout << "La nueva area es " << temp.obtiene_area() << "\n";
temp = 10 + chica;

cout << "La nueva area es " << temp.obtiene_area() << "\n";
temp = 4 * grande;
cout << "La nueva area es " << temp.obtiene_area() << "\n";
return 0;
}

En este caso sobrecargamos los operadores de + y * con las declaraciones en las


lneas 10 a la 12, y en las definiciones en las lneas 15 a la 37. Los mtodos estn
declarados como funciones friend por lo que podemos utilizar la funcin de
doble parmetro como est indicado. Si no utilizamos la construccin friend la
funcin sera parte de uno de los objetos y tal objeto sera el receptor del
mensaje. Incluyendo la construccin friend nos permite separar ste mtodo del
objeto y llamar al mtodo con una notacin fija, utilizando sta tcnica puede
escribirse como objeto1 + objeto2 en lugar de [Link]+(objeto2).
Adems sin la construccin friend no podramos utilizar una sobrecarga con una
variable de tipo int para el primer parmetro porque no podemos enviar un
mensaje a una variable de tipoint como en [Link]+(objeto). Dos de los
tres operadores sobrecargados usan un int para el primer parmetro por lo que es
necesario declararlos como funciones friend. No existe un lmite superior en el
nmero de sobrecargas para un operador dado, cualquier nmero de sobrecargas
puede utilizarse siempre y cuando los parmetros sean diferentes para cada
sobrecarga particular.
El encabezado en la lnea 15 ilustra la primera sobrecarga donde el operador + es
sobrecargado dando el tipo retornado seguido por la palabra clave operator y el
operador que deseamos sobregargar. Los dos parmetros formales y sus
respectivos tipos son listados en parntesis y las operaciones normales son dadas
en la implementacin de la funcin en las lneas 17 a la 20. El estudiante
observador notar que la implementacin de las funciones friend no son parte de
la clase porque el nombre de la clase no est antes del nombre del mtodo en la
lnea 15.
La mayor diferencia la encontramos en la lnea 52 donde ste mtodo es llamado
utilizando la notacin infija en lugar del formato usual de enviar mensajes. Como
las variables chica y mediana son objetos de la clase caja, el sistema buscar una
manera de utilizar el operador + en los dos objetos de la clase caja y la
encontrar en el operador sobrecargado operator+ que ya hemos discutido. En la
lnea 54 pedimos al sistema que sume un int a un objeto de la clase caja por lo
que el sistema encontrar la otra sobrecarga del operador + que empieza en la
lnea 23 para ejecutar la operacin solicitada. Adems en la lnea 56 le pedimos al
sistema que utilice el operador * con una constante de tipo int y un objeto de la
clase caja lo que queda satisfecho en las lneas 31 a 37. Observe que sera ilegal
tratar de hacer la operacin inversa, grande*4 ya que no definimos para utilizar

los mtodos de sta manera. Observe adems que cuando usamos la sobrecarga
de operadores estamos a la vez utilizando sobrecarga de nombres de funcin ya
que algunos de los nombres son los mismos. El resultado de la ejecucin del
programa es ste:

Volver al principio

Sobrecargando funciones en una clase


El programa siguiente es un ejemplo del nombre de una funcin sobrecargado
dentro de una clase, en ste programa el constructor tambin es sobrecargado en
uno de los mtodos para ilustrar que sto es posible, estudie el siguiente cdigo:
#include <iostream.h>
class muchos_nombres
{
int longitud;
int ancho;
public:
muchos_nombres(void);// Constructors
muchos_nombres(int lon);
muchos_nombres(int lon, int anc);
void despliega(void);// Display functions

void despliega(int uno);


void despliega(int uno, int dos);
void despliega(float numero);
};
muchos_nombres::muchos_nombres(void)
{
longitud = 8;
ancho = 8;
}
muchos_nombres::muchos_nombres(int lon)
{
longitud = lon;
ancho = 8;
}
muchos_nombres::muchos_nombres(int lon, int anc)
{
longitud = lon;
ancho = anc;
}
void muchos_nombres::despliega(void)
{
cout << "De la funcion despliega(void) , area = " << longitud * ancho
<< "\n";
}
void muchos_nombres::despliega(int uno)
{
cout << "De la funcion despliega(int uno) area = " << longitud *
ancho << "\n";
}
void muchos_nombres::despliega(int uno, int dos)
{
cout << "De la funcion de dos int, area = " << longitud * ancho <<
"\n";
}
void muchos_nombres::despliega(float numero)
{
cout << "De la funcion despliega(float), area = " << longitud * ancho
<< "\n";
}
int main()
{
muchos_nombres chica, mediana(10), grande(12, 15);
int neto = 144;
float pi = 3.1415, nomina = 12.50;
[Link]();
[Link](100);
[Link](neto,100);
[Link](nomina);

[Link]();
[Link](pi);
return 0;
}

Tenemos tres constructores, el que es llamado en determinado momento es


seleccionado por el nmero y tipos de los parmetros en la definicin. En la lnea
57 del programa principal son declarados los tres objetos cada uno con diferente
nmero de parmetros y una inspeccin de los resultados indicar que el correcto
constructor fu llamado basado en el nmero de parmetros.
Respecto al comentario que sigue puede pensar que es un poco tonto, pero en
realidad se trata de un asunto importante, a lo largo de ste tutorial hemos estado
utilizando un operador sobrecargado el cual no le ha causado confusin alguna,
se trata del operador << que forma parte de la clase cout el cual opera como una
funcin sobrecargada ya que la manera en que despliega los datos est en funcin
del tipo de variable de entrada o del campo que deseamos desplegar.
Algunos mtodos por defecto
An en el caso en que Usted no incluya constructores u operadores
sobrecargados, Usted cuenta con algunos definidos automticamente por el
compilador, esto lo ilustramos en el siguiente cdigo de ejemplo y tambin
mostramos el por qu algunas veces es ms conveniente escribir sus propios
mtodos para hacer el trabajo que se supone deben hacer los mtodos dados por
el compilador, antes debemos indicar una lista de reglas que los programadores
deben seguir para una correcta implementacin en C++:
Si no hay constructores definidos por el escritor de la clase, el compilador
generar uno automticamente y un constructor copia, ambos
constructores los definiremos en breve.
Si el autor de la clase incluye cualquier constructor en la misma, el
compilador no generar constructor alguno.
Si el escritor de la clase no incluye un constructor copia, el compilador
generar uno, pero si el escritor incluye un constructor copia, el
compilador no lo generar automticamente.
Si el autor de la clase incluye un operador de asignacin, el compilador no
incluir uno automticamente, en caso contrario se generar un operador
de asignacin.

Cualquier clase declarada y utilizada en C++ debe tener una manera de crear un
objeto porque el compilador, por definicin, debe llamar a un constructor cuando
definimos un objeto. Si no proveemos un constructor , el compilador generar
uno que pueda llamar durante la creacin de un objeto, ste es el constructor por
defecto y lo hemos utilizado inconcientemente en una buena cantidad de
programas en ste tutorial. El constructor por defecto no inicializa ninguna de las
variables miembro, pero prepara todas las referencias internas necesarias y llama
al constructor base, si existe (Cuando estudiemos la herencia sabremos qu es un
constructor base). El cdigo de nuestro nuevo ejemplo es ste:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class defectos
{
int tamano;
// Un simple valor almacenado
char *cadena;
// Un nombre para el dato almacenado
public:
// Esto sobrecarga el constructor por defecto
defectos(void);
// Esto sobrecarga el constructor copia por defecto
defectos(defectos &en_objeto);
// Esto sobrecarga el operador de asignacion por defecto
defectos &operator=(defectos &en_objeto);
// Este destructor es necesario en caso de ubicacion dinamica
~defectos(void);
// Finalmente, un par de metodos
void coloca_dato(int en_tamano, char *en_cadena);
void obtiene_dato(char *fuera_cadena);
};
defectos::defectos(void)
{
tamano = 0;
cadena = new char[2];
strcpy(cadena, "");
}
defectos::defectos(defectos &en_objeto)
{
tamano = en_objeto.tamano;
cadena = new char[strlen(en_objeto.cadena) + 1];
strcpy(cadena, en_objeto.cadena);
}
defectos &defectos::operator=(defectos &en_objeto)
{
delete [] cadena;
tamano = en_objeto.tamano;
cadena = new char[strlen(en_objeto.cadena) + 1];
strcpy(cadena, en_objeto.cadena);

return *this;
}
defectos::~defectos(void)
{
delete [] cadena;
}
void defectos::coloca_dato(int en_tamano, char *en_cadena)
{
tamano = en_tamano;
delete [] cadena;
cadena = new char[strlen(en_cadena) + 1];
strcpy(cadena, en_cadena);
}
void defectos::obtiene_dato(char *fuera_cadena)
{
char temp[10];
strcpy(fuera_cadena, cadena);
strcat(fuera_cadena, " = ");
_itoa(tamano, temp, 10);
strcat(fuera_cadena, temp);
}
int main()
{
char buffer[80];
defectos mi_dato;
mi_dato.coloca_dato(8, "tamano de sombrero");
mi_dato.obtiene_dato(buffer);
cout << buffer << "\n\n";
defectos mas_dato(mi_dato);
mas_dato.coloca_dato(12, "tamano de zapato");
mi_dato.obtiene_dato(buffer);
cout << buffer << "\n";
mas_dato.obtiene_dato(buffer);
cout << buffer << "\n";
mi_dato = mas_dato;
mi_dato.obtiene_dato(buffer);
cout << buffer << "\n";
mas_dato.obtiene_dato(buffer);
cout << buffer << "\n";
}

return 0;

La lnea 11 declara un constructor por defecto el cual es llamado cuando Usted


define un objeto sin parmetros, en ste caso el constructor es necesario porque
tenemos una cadena incrustada en la clase que requiere una ubicacin dinmica y
una inicializacin de la cadena a nulo. Debemos pensar un poco para comprender
que nuestro constructor es mejor que el aportado por el compilador el cual nos

dejara con un puntero no inicializado. El constructor por defecto se utiliza en la


lnea 71 del programa.
El constructor copia
El constructor copia es generado automticamente por Usted por el compilador
en caso de que no haya sido definido, se utiliza para copiar el contenido de un
objeto a un nuevo objeto durante la construccin del susodicho. Si el compilador
lo genera simplemente copiar el contenido del original en un nuevo objeto como
en una copia byte por byte, lo que puede ser no deseable. Para clases sencillas sin
punteros esto por lo general es suficiente, pero en el presente ejemplo tenemos un
puntero como miembro de clase as que copiara el puntero byte por byte dando
como resultado dos punteros sealando al mismo sitio. Para este programa
declaramos nuestro propio constructor copia en la lnea 13 y se implementa en la
lneas 30 a la 35. Un estudio cuidadoso de la implementacin revelar que la
nueva clase es idntica a la original pero la nueva clase cuenta con su propia
cadena. Como ambos constructores contienen ubicacin dinmica, debemos
asegurarnos que el dato ubicado sea destruido cuando terminemos de utilizar los
objetos, por lo que es necesario un destructor cuya implementacin la vemos en
las lnea 46 a la 49. El constructor copia es utilizado en la lnea 77.
El operador de asignacin
Aunque no es demasiado obvio, pero ste programa requiere de un operador de
asignacin porque el provisto por el compilador simplemente copia el objeto
fuente al objeto de destino byte por byte, esto conducira a un problema similar al
discutido con el constructor copia. El operador de asignacin es declarado en la
lnea 15 y definido en las lneas 37 a la 44 donde desubicamos la vieja cadena en
el objeto existente antes de ubicar espacio para el nuevo texto y copiar el texto
del objeto fuente en el nuevo objeto, el operador de asignacin se utiliza en la
lnea 84. Debe quedar claro para el estudiante que cuando en una clase es
definida para incluir cualquier cantidad de ubicacin dinmica, los tres mtodos
mostrados en el ejemplo deben utilizarse junto con el correspondiente destructor,
de omitirlos el programa tendr un comportamiento errtico e impredecible.
Compile y ejecute el programa, el resultado es ste:

Volver al principio
[Link]
search_term=c&books_category=libros_programacion&books_criteria=post_da
te_DESC&lang=all&since=all

También podría gustarte