Está en la página 1de 69

REPUBLICA BOLIVARIANA DE VENEZUELA INTRODUCCION A LA PROGRAMACIN EN C++ SINOPSIS DE CONTENIDO

Introduccin a la programacin: Uso del lenguaje de programacin Tipos de Datos: Variables, Tipos de datos, expresiones y asignaciones. Estructuras de control: condicionales secuenciales e iterativas. Datos compuestos: arreglos unidimensionales y multidimensionales, cadenas numricas y de caracteres. Apuntadores y Referencias. Procedimientos y Funciones. Estructuras, Clases y Objetos. Archivos.

Un lenguaje de programacin es un conjunto de smbolos y reglas sintcticas y semnticas que definen su estructura y el significado de sus elementos y expresiones. Es utilizado para controlar el comportamiento fsico y lgico de una mquina. Un lenguaje de programacin" es un lenguaje diseado para describir el conjunto de acciones que un equipo debe ejecutar. Por lo tanto, un lenguaje de programacin es un modo prctico para que los seres humanos puedan dar instrucciones a un equipo. El lenguaje utilizado por el procesador se denomina lenguaje mquina. Se trata de datos tal como llegan al procesador, que consisten en una serie de 0 y 1. El lenguaje mquina, por lo tanto, no es comprensible para los seres humanos, razn por la cual se han desarrollado lenguajes intermediarios comprensibles para el hombre. El cdigo escrito en este tipo de lenguaje se transforma en cdigo mquina para que el procesador pueda procesarlo. El ensamblador fue el primer lenguaje de programacin utilizado. Es muy similar al lenguaje mquina, pero los desarrolladores pueden comprenderlo. No obstante, este lenguaje se parece tanto al lenguaje mquina que depende estrictamente del tipo de procesador utilizado (cada tipo de procesador puede tener su propio lenguaje mquina). As, un programa desarrollado para un equipo no puede ser portado a otro tipo de equipo. El trmino "portabilidad" describe la capacidad de usar un programa de software en diferentes tipos de equipos. Para poder utilizar un programa de software escrito en un cdigo ensamblador en otro tipo de equipo, a veces ser necesario volver a escribir todo el programa! Todo programa escrito en otro lenguaje diferente al leguaje de maquina puede ser ejecutado de dos maneras: o Mediante un programa que va adaptando las instrucciones conforme son encontradas. A este proceso se lo llama interpretar y a los programas que lo hacen se los conoce como intrpretes.

o Traduciendo este programa, al programa equivalente escrito en lenguaje de mquina. A ese proceso se lo llama compilar y al programa traductor se le denomina compilador. Los lenguajes de programacin tienen varias ventajas: o Son mucho ms fcil de comprender que un lenguaje mquina. o Permiten mayor portabilidad, es decir que puede adaptarse fcilmente para ejecutarse en diferentes tipos de equipos.

Un traductor (compilador o intrprete) es un software que lee un programa escrito en un lenguaje (lenguaje fuente) y lo traduce a un programa equivalente en otro lenguaje (lenguaje objeto). Como parte importante de este proceso de traduccin, el traductor informa a su usuario de la presencia de errores en el programa fuente.

El proceso de traduccin se divide en dos fases o etapas:


o o Fase de anlisis.- La parte del anlisis divide al programa fuente en sus elementos componentes y crea una representacin intermedia del programa fuente. Fase de sntesis.- La parte de la sntesis construye el programa objeto deseado a partir de la representacin intermedia.

De las dos partes, la sntesis es la que requiere las tcnicas ms especializadas. Adems de un traductor, se pueden necesitar otros programas para crear un programa objeto ejecutable. Un programa fuente se puede dividir en mdulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confa a un programa distinto, llamado preprocesador. El preprocesador tambin puede expandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente. Etapas del proceso El proceso de traduccin se compone internamente de varias etapas o fases, que realizan distintas operaciones lgicas. Es til pensar en estas fases como en piezas separadas dentro del traductor, y pueden en realidad escribirse como operaciones codificadas separadamente aunque en la prctica a menudo se integren juntas.

Fase de anlisis Anlisis lxico El anlisis lxico constituye la primera fase, aqu se lee el programa fuente de izquierda a derecha y se agrupa en componentes lxicos (tokens), que son secuencias de caracteres que tienen un significado. Adems, todos los espacios en blanco, lneas en blanco, comentarios y dems informacin innecesaria se elimina del programa fuente. Tambin se comprueba que los smbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente. Como la tarea que realiza el analizador lxico es un caso especial de coincidencia de patrones, se necesitan los mtodos de especificacin y reconocimiento de patrones, y estos mtodos son principalmente las expresiones regulares y los autmatas finitos. Sin embargo, un analizador lxico tambin es la parte del traductor que maneja la entrada del cdigo fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador lxico debe funcionar de manera tan eficiente como sea posible. Anlisis sintctico En esta fase los caracteres o componentes lxicos se agrupan jerrquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintcticamente correcto (obedece a la gramtica del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un rbol de anlisis sintctico. La estructura jerrquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definicin de expresiones:
1. 2. 3. Cualquier identificador es una expresin. Cualquier nmero es una expresin. Si expresin1 y expresin2 son expresiones, entonces tambin lo son: o expresin1 + expresin2 o expresin1 * expresin2 o ( expresin1 )

Las reglas 1 y 2 son reglas bsicas (no recursivas), en tanto que la regla 3 define expresiones en funcin de operadores aplicados a otras expresiones. La divisin entre anlisis lxico y anlisis sintctico es algo arbitraria. Un factor para determinar la divisin es si una construccin del lenguaje fuente es inherentemente recursiva o no. Las construcciones lxicas no requieren recursin, mientras que las construcciones sintcticas suelen requerirla. No se requiere recursin para reconocer los identificadores, que suelen ser cadenas de letras y dgitos que comienzan con una letra. Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carcter que no sea ni letra ni dgito, y agrupando despus todas las letras y dgitos encontrados hasta ese punto en un componente lxico llamado identificador. Por otra parte, esta clase de anlisis no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los parntesis de las expresiones, o las palabras begin y

end en proposiciones sin imponer alguna clase de estructura jerrquica o de anidamiento a la entrada. Anlisis semntico La fase de anlisis semntico revisa el programa fuente para tratar de encontrar errores semnticos y rene la informacin sobre los tipos para la fase posterior de generacin de cdigo. En ella se utiliza la estructura jerrquica determinada por la fase de anlisis sintctico para identificar los operadores y operandos de expresiones y proposiciones. Un componente importante del anlisis semntico es la verificacin de tipos. Aqu, el compilador verifica si cada operador tiene operandos permitidos por la especificacin del lenguaje fuente. Por ejemplo, las definiciones de muchos lenguajes de programacin requieren que el compilador indique un error cada vez que se use un nmero real como ndice de una matriz. Sin embargo, la especificacin del lenguaje puede imponer restricciones a los operandos, por ejemplo, cuando un operador aritmtico binario se aplica a un nmero entero y a un nmero real. Fase de sntesis Consiste en generar el cdigo objeto equivalente al programa fuente. Slo se genera cdigo objeto cuando el programa fuente est libre de errores de anlisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el cdigo objeto es cdigo de mquina relocalizable o cdigo ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Despus, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de mquina que ejecuta la misma tarea. Un aspecto decisivo es la asignacin de variables a registros. Generacin de cdigo intermedio Despus de los anlisis sintctico y semntico, algunos compiladores generan una representacin intermedia explcita del programa fuente. Se puede considerar esta representacin intermedia como un programa para una mquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes; debe ser fcil de producir y fcil de traducir al programa objeto. La representacin intermedia puede tener diversas formas. Existe una forma intermedia llamada "cdigo de tres direcciones" que es como el lenguaje ensamblador de una mquina en la que cada posicin de memoria puede actuar como un registro. El cdigo de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como mximo tres operandos. Esta representacin intermedia tiene varias propiedades:
o o Primera.- Cada instruccin de tres direcciones tiene a lo sumo un operador, adems de la asignacin, por tanto, cuando se generan estas instrucciones, el traductor tiene que decidir el orden en que deben efectuarse las operaciones. Segunda.- El traductor debe generar un nombre temporal para guardar los valores calculados por cada instruccin.

Tercera.- Algunas instrucciones de "tres direcciones" tienen menos de tres operandos, por ejemplo, la asignacin.

Optimizacin de cdigo La fase de optimizacin de cdigo consiste en mejorar el cdigo intermedio, de modo que resulte un cdigo mquina ms rpido de ejecutar. Esta fase de la etapa de sntesis es posible sobre todo si el traductor es un compilador (difcilmente un interprete puede optimizar el cdigo objeto). Hay mucha variacin en la cantidad de optimizacin de cdigo que ejecutan los distintos compiladores. En los que hacen mucha optimizacin, llamados "compiladores optimizadores", una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecucin del programa objeto sin retardar demasiado la compilacin.

Intrprete
Un intrprete es un programa informtico capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel. Los intrpretes se diferencian de los compiladores en que mientras estos traducen un programa desde su descripcin en un lenguaje de programacin al cdigo mquina del sistema destino, los primeros (los interpretes) slo realizan la traduccin a medida que sea necesario, tpicamente, instruccin por instruccin, y normalmente no guardan el resultado de dicha traduccin. Los programas interpretados suelen ser ms lentos que los compilados debido a la necesidad de traducir el programa mientras se ejecuta, pero a cambio son ms flexibles como entornos de programacin y depuracin (lo que se traduce, por ejemplo, en una mayor facilidad para reemplazar partes enteras del programa o aadir mdulos completamente nuevos), y permiten ofrecer al programa interpretado un entorno no dependiente de la mquina donde se ejecuta el intrprete, sino del propio intrprete (lo que se conoce comnmente como mquina virtual). Comparando su actuacin con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intrprete corresponde al intrprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito. En la actualidad, uno de los entornos ms comunes de uso de los intrpretes informticos es Internet, debido a la posibilidad que estos tienen de ejecutarse independientemente de la plataforma.

Compilador

Un compilador es un programa informtico que traduce un programa escrito en un lenguaje de programacin a otro lenguaje de programacin, generando un programa equivalente que la mquina ser capaz de interpretar. Usualmente el segundo lenguaje es cdigo mquina, pero tambin puede ser simplemente texto. Este proceso de traduccin se conoce como compilacin. Un compilador es un programa que permite traducir el cdigo fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (tpicamente lenguaje mquina). De esta manera un programador puede disear un programa en un lenguaje mucho ms cercano a como piensa un ser humano, para luego compilarlo a un programa ms manejable por una computadora.

Partes de un compilador Normalmente los compiladores estn divididos en dos partes:


o o Front End: es la parte que analiza el cdigo fuente, comprueba su validez, genera el rbol de derivacin y rellena los valores de la tabla de smbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. Back End: es la parte que genera el cdigo mquina, especfico de una plataforma, a partir de los resultados de la fase de anlisis, realizada por el Front End.

Esta divisin permite que el mismo Back End se utilice para generar el cdigo mquina de varios lenguajes de programacin distintos y que el mismo Front End que sirve para analizar el cdigo fuente de un lenguaje de programacin concreto sirva para generar cdigo mquina en varias plataformas distintas. El cdigo que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker)

Introduccin a la programacin:
Desde principios de la era computacional se crearon diversas tcnicas de programacin que a medida han evolucionado para poder adaptarse a nuevos retos y poder crear soluciones ms realistas que se amolden a el entorno real. Podemos notar que a inicios la programacin era no estructurada. Este estilo de Programacin No Estructurada, consista en un solo programa principal, el cual se establece como una secuencia de comandos o instrucciones que modifican datos que son a su vez globales en el transcurso de todo el programa. Esta tcnica de programacin no estructurada ofrece tremendas desventajas una vez que el programa se hace suficientemente grande. Por ejemplo, si la misma secuencia de instrucciones se necesita en diferentes situaciones dentro del programa, la secuencia debe ser repetida. Esto ha llevado a la idea de extraer estas secuencias, dando origen a nuevas tcnicas como lo son la programacin procedimental y modular, conducindonos a un estilo de programacin estructurada. La Programacin Estructurada es un mtodo de programacin basado sobre el concepto de la unidad y del alcance. La programacin estructurada ofrece muchas ventajas sobre la programacin secuencial, es ms fcil de leer y ms conservable; siendo muy flexible, facilitando el buen diseo de programas. La programacin estructurada, es un estilo de programacin con el cual el programador elabora programas, cuya estructura es la ms clara posible, mediante el uso de tres estructuras bsicas de control lgico: secuencia, seleccin e iteracin. Los programas son ms fciles de entender. Un programa estructurado puede ser ledo en secuencia, de arriba hacia abajo, sin necesidad de estar saltando de un sitio a otro en la lgica, lo cual es tpico de otros estilos de programacin. La estructura del programa es ms clara puesto que las instrucciones estn ms ligadas o relacionadas entre si, por lo que es ms fcil comprender lo que hace cada funcin. Reduccin del esfuerzo en las pruebas. El programa se puede tener listo para produccin normal en un tiempo menor del tradicional; por otro lado, el seguimiento de las fallas o depuracin se facilita debido a la lgica ms visible, de tal forma que los errores se pueden detectar y corregir ms fcilmente. Los programas quedan mejor documentados internamente. A pesar de las mltiples ventajas que ofrecen la programacin estructurada, surge necesidades y problemas complejos los cuales necesitan recrear o representar mundos reales, lo cual, se dificulta con la tcnicas de programacin estructurada. La Programacin Orientada a Objetos (POO) aporta un nuevo enfoque a los retos que se plantean en la programacin estructurada cuando los problemas a resolver son complejos. Al contrario que la programacin procedimental que enfatiza en los

algoritmos, la POO enfatiza en los datos. En lugar de intentar ajustar un problema al enfoque procedimental de un lenguaje, POO intenta ajustar el lenguaje al problema. La idea es disear formatos de datos que se correspondan con las caractersticas esenciales de un problema. Los lenguajes orientados combinan en una nica unidad o mdulo, tanto los datos como las funciones que operan sobre esos datos. Tal unidad se llama objeto. Si se desea modificar los datos de un objeto, hay que realizarlo mediante las funciones miembro del objeto. Ninguna otra funcin puede acceder a los datos. Esto simplifica la escritura, depuracin y mantenimiento del programa. La tecnologa orientada a objetos se define como una metodologa de diseo de software que modela las caractersticas de objetos reales o abstractos por medio del uso de clases y objetos. Hoy en da, la orientacin a objetos es fundamental en el desarrollo de software, sin embargo, esta tecnologa no es nueva, sus orgenes se remontan a la dcada de los aos sesenta (Simula, uno de los lenguajes de programacin orientados a objetos ms antiguos, fue desarrollado en 1967). L La Programacin Orientada a Objetos, la podemos definir como una tcnica o estilo de programacin que utiliza objetos como bloque esencial de construccin. AROS ASCUI El objeto, es el concepto principal sobre el cual se fundamenta la programacin orientada a objetos, el cual puede ser visto como una entidad que posee atributos y efecta acciones. En el mundo real podemos encontrar cientos de ejemplos que cumplen con sta definicin, algunos de ellos son: una bicicleta, un automvil, una persona, una computadora, etc. Los programas creados con la POO, se organizan como un conjunto finito de objetos que contienen datos y operaciones (funciones miembro en C++) que llaman a esos datos y que se comunican entre s mediante mensajes.

Un programa orientado a objetos es una coleccin de clases. Necesita de una funcin principal que cree objetos y comience la ejecucin mediante la invocacin de sus funciones o mtodos. En primer lugar, se crean los objetos. Segundo, los mensajes se envan desde unos objetos y se reciben en otros a medida que el programa se ejecuta. Y tercero, se borran los objetos cuando ya no son necesarios y se recupera la memoria ocupada por ellos. Los objetos son tipos de datos abstractos definidos por el programador. En realidad son unidades que contienen datos y funciones que operan sobre esos datos.

A los objetos tambin se les conoce como instancias de clase. A los elementos de un objeto se les conoce como miembros (datos miembros y funciones miembro).

Caractersticas de la POO
Las caractersticas ms importantes que debe soportar un lenguaje que lo definen como "orientado a objetos", son: o Abstraccin: Denota las caractersticas esenciales de un objeto, donde se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cmo se implementan estas caractersticas. Los procesos, las funciones o los mtodos pueden tambin ser abstrados y cuando lo estn, una variedad de tcnicas son requeridas para ampliar una abstraccin. Ejemplo: un automvil. Caractersticas: Color, ao de fabricacin, modelo, etc. Mtodos o Funciones: Frenar, encender, etc. o Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar la cohesin de los componentes del sistema. La encapsulacin es un mecanismo que consiste en organizar datos y mtodos de una estructura, conciliando el modo en que el objeto se implementa, es decir, evitando el acceso a datos por cualquier otro medio distinto a los especificados. Por lo tanto, la encapsulacin garantiza la integridad de los datos que contiene un objeto. El encapsulamiento nos permite considerar a los objetos como cajas negras: como objetos que podemos utilizar sin enfocarnos en la forma en que trabajan. Ejemplo: en un automvil, un mecnico debe saber como trabaja el motor, la transmisin, etc., pero un conductor, puede usar estos componentes sin preocuparse por estos detalles, el automvil encapsula todos los detalles de las partes que lo constituyen, por lo que un conductor tan solo necesita conocer su interfaz: el acelerador, el freno y el volante. o Principio de ocultacin: Cada objeto est aislado del exterior, es un mdulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especfica cmo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder a ellas, solamente los propios mtodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstraccin. La aplicacin entera se reduce a un agregado o rompecabezas de objetos.

El usuario de una clase en particular no necesita saber cmo estn estructurados los datos dentro de ese objeto, es decir, un usuario no necesita conocer la implementacin Al evitar que el usuario modifique los atributos directamente y forzndolo a utilizar funciones definidas para modificarlos (llamadas interfaces), se garantiza la integridad de los datos (por ejemplo, uno puede asegurarse de que el tipo de datos suministrados cumple con nuestras expectativas bien que los se encuentran dentro del periodo de tiempo esperado). La encapsulacin define los niveles de acceso para elementos de esa clase. Estos niveles de acceso definen los derechos de acceso para los datos, permitindonos el acceso a datos a travs de un mtodo de esa clase en particular, desde una clase heredada o incluso desde cualquier otra clase. Existen tres niveles de acceso:

pblico: funciones de toda clase pueden acceder a los datos o mtodos de una clase que se define con el nivel de acceso pblico. Este es el nivel de proteccin de datos ms bajo protegido: el acceso a los datos est restringido a las funciones de clases heredadas, es decir, las funciones miembro de esa clase y todas las subclases privado: el acceso a los datos est restringido a los mtodos de esa clase en particular. Este es nivel ms alto de proteccin de datos

o Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecucin", esta ltima caracterstica se llama asignacin tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms estticos (en "tiempo de compilacin") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++. Polimorfismo de sobrecarga. El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra (stas no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener la funcin "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es verlo en la pantalla. Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varan de acuerdo a los parmetros que se les aplican. As es posible, por ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando est haciendo referencia a una operacin entre dos nmeros enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenacin). Polimorfismo paramtrico (tambin llamado polimorfismo de plantillas). El polimorfismo paramtrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parmetros diferentes (nombre y/o

tipo). El polimorfismo paramtrico selecciona automticamente el mtodo correcto a aplicar en funcin del tipo de datos pasados en el parmetro. Por lo tanto, podemos por ejemplo, definir varios mtodos homnimos de addition() efectuando una suma de valores.
El mtodo int addition(int, int) devolvera la suma de dos enteros. float addition(float, float) devolvera la suma de dos flotantes. char addition(char, char) dara por resultado la suma de dos caracteres.

Polimorfismo de inclusin (tambin llamado redefinicin o subtipado). La habilidad para redefinir un mtodo en clases que se hereda de una clase base se llama especializacin. Por lo tanto, se puede llamar un mtodo de objeto sin tener que conocer su tipo intrnseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarndolos con una interfaz comn (siendo esta la clase bsica). Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y pen, cada uno heredando el objeto pieza. El mtodo movimiento podra, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento de pieza sin tener que verse conectado con cada tipo de pieza en particular. o Herencia: Por herencia se entiende la capacidad de poder crear nuevas clases a partir de alguna anterior, de forma que las nuevas "heredan" las caractersticas de sus ancestros (propiedades y mtodos). Se trata por tanto de la capacidad de crear nuevos tipos de datos a partir de los anteriores. Una caracterstica especial de la herencia es que si se cambia el comportamiento de la clase antecesora (tambin llamada padre, base o super), tambin cambiar el comportamiento de las clases derivadas de ella (descendientes). Como puede deducirse fcilmente, la herencia establece lo que se llama una jerarqua de clases del mismo aspecto que el rbol genealgico de una familia. Se entiende tambin que estos conceptos representan niveles de abstraccin que permiten acercar la programacin a la realidad del mundo fsico tal como lo concebimos. Por ejemplo, todas las guitarras, ya sean Elctricas, ElectroAcsticas o normales, cumplen con caractersticas similares como nmero de cuerdas (6), mtodo de afinacin, cambio de tono, cambio de postura y rasgueo entre otras. Si no se siguiera con una metodologa de herencia, por cada clase (Guitarra Electrica y ElectroAcstica) se tendra que repetir la definicin de todos los atributos y mtodos que pertenecen a la clase padre Guitarra, que corresponde a la abstraccin ms amplia del concepto "Guitarra". Mediante el uso de la herencia, se puede definir una clase "Guitarra" que cumpla con todas las caractersticas generales del concepto guitarra y sus evoluciones, con el fin de acotar el nmero de especificaciones de las clases "GuitarraElectrica" y "ElectroAcstica", y permitir la herencia a stas ltimas clases con las caractersticas del objeto padre. o Recoleccin de basura: la Recoleccin de basura o Garbage Collection es la tcnica por la cual el ambiente de Objetos se encarga de destruir automticamente, y por tanto desasignar de la memoria, los Objetos que hayan

quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignacin o liberacin de memoria, ya que el entorno la asignar al crear un nuevo Objeto y la liberar cuando nadie lo est usando. En la mayora de los lenguajes hbridos que se extendieron para soportar el Paradigma de Programacin Orientada a Objetos como C++ u Object Pascal, esta caracterstica no existe y la memoria debe desasignarse manualmente.

Uso de los lenguajes de POO Actualmente una de las reas ms candentes en la industria y en el mbito acadmico es la orientacin a objetos. La orientacin a objetos promete mejoras de amplio alcance en la forma de diseo, desarrollo y mantenimiento del software ofreciendo una solucin a largo plazo a los problemas y preocupaciones que han existido desde el comienzo en el desarrollo de software: la falta de portabilidad del cdigo y reusabilidad, cdigo que es difcil de modificar, ciclos de desarrollo largos y tcnicas de codificacin no intuitivas. La introduccin de tecnologa de objetos como una herramienta concepual para analizar, disear e implementar aplicaciones permite obtener aplicaciones ms modificables, fcilmente extendibles y a partir de componentes reusables. Esta reusabilidad del cdigo disminuye el tiempo que se utiliza en el desarrollo y hace que el desarrollo del software sea mas intuitivo porque se piensa naturalmente en trminos de objetos ms que en trminos de algoritmos de software. La Programacin Orientada a Objetos ofrece algunas de ventajas respecto a otros paradigmas de la programacin:
o o o o o o Fomenta la reutilizacin y extensin del cdigo. Facilita el mantenimiento del software. Permite crear sistemas ms complejos. Agiliza el desarrollo de software. Facilita la creacin de programas visuales. Facilita el trabajo en equipo relacionar el sistema al mundo real.

Estructura de un programa orientado a objetos.


La programacin orientada a objetos (POO) es una de las tcnicas ms modernas de desarrollo que trata de disminuir el coste del software, aumentando la eficiencia y reduciendo el tiempo de espera para la puesta en escena de una nueva aplicacin. Por eso, donde la POO toma verdadera ventaja es en poder compartir y reutilizar el cdigo. Existen varios lenguajes que permiten escribir un programa orientado a objetos y entre ellos se encuentra C++. Se trata de un lenguaje de programacin basado en el lenguaje C, estandarizado, ampliamente difundido, y con una biblioteca estndar C++ que lo ha convertido en un lenguaje universal, de propsito general, y ampliamente utilizado tanto en el mbito profesional como en el educativo. C++ es un lenguaje de programacin diseado a mediados de los aos 1980 por Bjarne Stroustrup. La intencin de su creacin fue el extender al exitoso lenguaje de

programacin C con mecanismos que permitan la manipulacin de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje hbrido. Posteriormente se aadieron facilidades de programacin genrica, que se sum a los otros dos paradigmas que ya estaban admitidos (programacin estructurada y la programacin orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programacin multiparadigma. Una particularidad del C++ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crear nuevos tipos que se comporten como tipos fundamentales. La meta de C++ es mejorar la productividad. sta viene por muchos caminos, pero el lenguaje est diseado para ayudarle todo lo posible, y al mismo tiempo dificultarle lo menos posible con reglas arbitrarias o algn requisito que use un conjunto particular de caractersticas. C++ est diseado para ser prctico; las decisiones de diseo del lenguaje C++ estaban basadas en proveer los beneficios mximos al programador. Estructura de un programa en C ++ Un programa en el lenguaje C++ estar compuesto por: Comentarios: Muestra informacin en cuanto a que realiza el programa, la utilidad de las funciones, variables y objetos, estos no sern procesados por el compilador. Encabezados: se realizan las llamadas y accesos a archivos de Biblioteca de funciones estndar y diseadas por los usuarios. Declaracin de prototipos: se definen las estructuras de nuevos tipos de datos como lo son las clases, estructuras, etc., adems se declaran las existencias de funciones si no han sido implementadas. Declaraciones globales: Se declaran variables, objetos, constantes, etc., el mbito de estas se extiende desde el punto en el que se definen hasta el final del programa, proporcionan un mecanismo de intercambio de informacin entre funciones sin necesidad de utilizar argumentos Declaracin de la funcin principal Main( ): La funcin main es imprescindible en cualquier programa C/C++ representa el punto de inicio de su ejecucin. Es la funcin de control principal de un programa, reflejndose como el cuerpo del mismo programa. Implementacin y cuerpo de funciones : Se define la forma o cuerpo de una funcin para resolver determinada tarea. Ejemplo: #include <iostream.h> // Esta biblioteca permite el uso de cout y de cin class Punto { public: // Declara un nuevo tipo de dato Punto

// Coordenadas del punto int x; int y; public: // Constructor Punto(int x, int y) {x=0; y=0;} // Inicializar las variables // funciones miembros int extraer_x( ) { return x; } int extraer_y( ) { return y; } }; void main( ) //Funcion de control principal { Punto punto; // creamos un objeto de la clase Punto llamado punto cout << "Coordenada X:" << punto.extraer_x( ) << endl; // mostramos el valor x cout << "Coordenada Y:" << punto.extraer_y( )<< endl; // mostramos el valor y } Un programa ser una secuencia de lneas que contendrn sentencias, directivas de compilacin y comentarios. Las sentencias simples se separan por punto y coma y las compuestas se agrupan en bloques mediante llaves. Cada sentencia compuesta se encierra con un par de llaves, {.....}. Las llaves pueden contener combinaciones de sentencias elementales (denominadas sentencias de expresin) y otras sentencias compuestas. As las sentencias compuestas pueden estar anidadas, una dentro de otra. Cada sentencia de expresin debe acabar en punto y coma (;). Las directivas sern instrucciones que le daremos al compilador para indicarle que realice alguna operacin antes de compilar nuestro programa, las directivas comienzan con el smbolo # y no llevan punto y coma. Los comentarios se introducirn en el programa separados por /* y */ o comenzndolos con //. Los comentarios entre /* y */ pueden tener la longitud que queramos, pero no se anidan, es decir, si escribimos /* hola /* amigo */ mo */, el compilador interpretar que el comentario termina antes de mo, y dar un error. Los comentarios que comienzan por // slo son vlidos hasta el final de la lnea en la que aparecen. Un programa simple puede ser el siguiente: /* Este es un programa mnimo en C++, escribe una frase en la pantalla */ #include <iostream.h> int main( ) { cout << "Hola mundo\n"; // imprime en la pantalla la frase "hola mundo" }

La primera parte separada entre /* y */ es un comentario. Es recomendable que se comenten los programas, explicando que es lo que estamos haciendo en cada caso, para que cuando se lean sean ms comprensibles. La lnea que empieza por # es una directiva. En este caso indica que se incluya el fichero "iostream.h", que contiene las definiciones para entrada/salida de datos en C++. En la declaracin de main() hemos incluido la palabra int, que indica que la funcin devuelve un entero. Este valor se le entrega al sistema operativo al terminar el programa. Si no se devuelve ningn valor el sistema recibe un valor aleatorio. La sentencia separada ente llaves indica que se escriba la frase "Hola mundo". El operador <<("poner en") escribe el segundo argumento en el primero. En este caso la cadena "Hola mundo\n" se escribe en la salida estndar (cout). El carcter \ seguido de otro carcter indica un solo carcter especial, en este caso el salto de lnea (\n). Por ltimo sealar que debemos seguir ciertas reglas al nombrar tipos de datos, variables, funciones, etc. Los identificadores vlidos del C++ son los formados a partir de los caracteres del alfabeto (el ingls, no podemos usar ni la ni palabras acentuadas), los dgitos (0..9) y el subrayado ( _ ), la nica restriccin es que no podemos comenzar un identificador con un dgito (es as porque se podran confundir con literales numricos). Hay que sealar que el C++ distingue entre maysculas y minsculas, por lo que Hola y hola representan dos cosas diferentes. Hay que evitar el uso de identificadores que slo difieran en letras maysculas y minsculas, porque inducen a error. Las palabras reservadas tiene un significado determinado para el compilador, de manera tal que cuando las encuentra en el programa sabe que hay que llevar a cabo una determinada accin. Las variables que se declaren a lo largo de todo el programa, as como las funciones y dems no pueden llevar el nombre de estas palabras reservadas, ya que son de uso por parte del compilador, ya que si se hace esto, se produciran errores, por lo que es importante tener una buena familiarizacin con las mismas, a fin de no cometer errores. La lista de algunas palabras reservadazas a continuacin: asm catch default enum for int operator return struct true unsigned while auto char delete explicit friend long private short switch try using bool class do extern goto mutable protected signed template typedef virtual break const double false if namespace public sizeof this typename void case continue else float inline new register static throw union volatile

asm. Medio definido por la puesta en prctica de utilizacin de lenguaje de ensamblaje a lo largo de C++ . break. La declaracin de pausa o descanso manda pasar el argumento al partidario de la declaracin, es utilizada en las llamadas a do, while, for o switch. case. Se define dentro de una estructura switch, case, y default. const. Variable contante cuyo valor no puede ser alterado. continue. Envo de los pasos a seguir sin detenerse como es caso siguiente. catch. Maneja una excepcin generado por un throw. class. Define una nueva clase. Pueden crearse objetos de esta clase. delete. Destruye un objeto de memoria creado con new. new. Asigna dinmicamente un objeto de memoria libre. Determina automticamente el tamao del objeto. friend. Declara una funcin o una clase que sea un friend (amigo) de otra clase. Los amigos pueden tener acceso a todos los miembros de datos y a todas las funciones miembro de una clase. operador. Declara un operador homnimo. private. Un miembro de clase accesible a funciones miembro y a funciones friend de la clase de miembros private. protected. Una forma extendida de acceso private; tambin se puede tener acceso a los miembros protected por funciones miembros de clases derivadas y amigos de clases derivadas. public. Un miembro de clase accesible a cualquier funcin. template. Declara como construir una clase o una funcin, usando una variedad de tipos. this. Un apuntador declarado en forma implcita en toda funcin de miembro no static de una clase. Seales al objeto al cual esta funcin miembro ha sido invocada. throw. Transfiere control a un manejador de excepcin o termina la ejecucin del programa si no puede ser localizado un manejador apropiado. virtual. Declara una funcin virtual.

Tipos de datos.
C++ no soporta un gran nmero de tipos de datos predefinidos, pero tiene la capacidad para crear sus propios tipos de datos. Posee un conjunto de tipos simples correspondientes a las unidades de almacenamiento tpicas de un computador y a las distintas maneras de utilizarlos. Todos los tipos de datos simples o bsicos de C/C++ son, esencialmente, nmeros. Los tres tipos de datos bsicos son: o Enteros: int, long int o Nmeros flotantes (reales): float, double o Caracteres: char Los tipos simples de datos admitidos son los siguientes: Denominacin Tipo de datos Tamao en bits Rango de valores

char int float double void

Carcter Nmero entero

8 16

de 0 a 255 de 32768 a 32767 de 3.4 x 10-38 a 3.4 x 1038 de 1.7 x 10-308 a 1.7 x 10308 sin valor

Nmero real de precisin simple 32 Nmero real de precisin doble 64 Tipo vaco 0

Los tamaos en bits pueden variar dependiendo del compilador empleado. Por ejemplo, gcc intepreta que el entero es de 32 bits, y para usar enteros de 16 bits hay que indicarlo expresamente. Por tanto, no debe usted presuponer ningn tamao concreto para los tipos si quiere escribir programas portables. El tipo char se usa normalmente para variables que guardan un nico carcter, aunque lo que en realidad guardan es un cdigo ASCII, es decir, un nmero entero de 8 bits sin signo (de 0 a 255). Los caracteres se escriben siempre entre comillas simples ( ). Por lo tanto, si suponemos que x es una variable de tipo char, estas dos asignaciones tienen exactamente el mismo efecto, ya que 65 es el cdigo ASCII de la letra A: x = 'A'; x = 65; A diferencia de las comillas simples de los caracteres sueltos cadenas de caracteres se escriben con comillas dobles (). El tipo int se usa para nmeros enteros, mientras que los tipos float y double sirven para nmeros reales. El segundo permite representar nmeros mayores, a costa de consumir ms espacio en memoria. Un tipo especial del C++ es el denominado void (vaco). Este tipo tiene caractersticas muy peculiares, ya que es sintcticamente igual a los tipos elementales pero slo se emplea junto a los derivados, es decir, no hay objetos del tipo void. Se emplea para especificar que una funcin no devuelve nada, para declarar funciones sin argumentos; o como base para punteros a objetos de tipo desconocido. Por ejemplo: void BorraPantalla (void); indica que la funcin BorraPantalla no tiene parmetros y no retorna nada.

Modificadores de tipo
Existen, adems, unos modificadores de tipo que pueden preceder a los tipos de datos char e int. Dichos modificadores son:
o o o o

signed: obliga a que los datos se almacenen con signo unsigned: los datos se almacenan sin signo long: los datos ocuparn el doble de espacio en bits del habitual, y, por lo tanto, aumentar su rango de valores short: los datos ocuparn la mitad del espacio habitual, y, por lo tanto, disminuir su rango de valores

De este modo, nos podemos encontrar, por ejemplo, con estos tipos de datos:
o

unsigned int: Nmero entero de 16 bits sin signo. Rango: de 0 a 65535.

signed int: Nmero entero de 16 bits con signo. No tiene sentido, porque el tipo int ya es con signo por definicin, pero es sintcticamente correcto. o signed char: Carcter (8 bits) con signo. Rango: de 128 a 127 o long int: Nmero entero de 32 bits. Rango: de 2147483648 a 2147483647 Incluso podemos encontrar combinaciones de varios modificadores. Por ejemplo:
o o

unsigned long int: Nmero entero de 32 bits sin signo. Rango: de 0 a 4294967295

Tipos enumerados Un tipo especial de tipos enteros son los tipos enumerados. Estos tipos sirven para definir un tipo que slo puede tomar valores dentro de un conjunto limitado de valores. Estos valores tienen nombre, luego se da una lista de constantes asociadas a este tipo. La sintaxis es: enum booleano {FALSE, TRUE}; // definimos el tipo booleano Aqu hemos definido el tipo booleano que puede tomar los valores FALSE o TRUE. En realidad hemos asociado la constante FALSE con el nmero 0, la constante TRUE con 1, y si hubiera ms constantes seguiramos con 2, 3, etc. Si por alguna razn nos interesa dar un nmero concreto a cada valor podemos hacerlo en la declaracin: enum colores {rojo = 4, azul, verde = 3, negro = 1}; El azul tomar el valor 5 (4+1), ya que no hemos puesto nada. Tambin se pueden usar nmeros negativos o constantes ya definidas. Si al definir un tipo enumerado no se le da nombre al tipo declaramos una serie de constantes: enum { CERO, UNO, DOS }; Hemos definido las constantes CERO, UNO y DOS con los valores 0, 1 y 2. Tipos derivados De los tipos fundamentales podemos derivar otros mediante el uso de los siguientes operadores de declaracin: Puntero: Para cualquier tipo T, el puntero a ese tipo es T*. Una variable de tipo T* contendr la direccin de un valor de tipo T. o & Referencia: Una referencia es un nombre alternativo a un objeto, se emplea para el paso de argumentos y el retorno de funciones por referencia. T& significa referencia a tipo T. o [] Arreglos: Para un tipo T, T[n] indica un tipo arreglo con n elementos. Los ndices del arreglo empiezan en 0, luego llegan hasta n-1. Podemos definir arreglos multidimensionales como arreglos de arreglos. o () Funcin: La declaracin de una funcin nos da el nombre de la funcin, el tipo del valor que retorna y el nmero y tipo de parmetros que deben pasrsele.
o

Ejemplos: int *n; // puntero a un entero int v[20]; // arreglo de 20 enteros int *c[20]; // arreglo de 20 punteros a entero void f(int j); // funcin con un parmetro entero . Tipos compuestos Los tipos de datos compuestos en C++ son: o Estructuras Las estructuras son el tipo equivalente a los registros de otros lenguajes, se definen poniendo la palabra struct delante del nombre del tipo y colocando entre llaves los tipos y nombres de sus campos. Si despus de cerrar la llave ponemos una lista de variables las declaramos a la vez que definimos la estructura. o Uniones. Las uniones son idnticas a las estructuras en su declaracin, con la particularidad de que todos sus campos comparten la misma memoria (el tamao de la unin ser el del campo con un tipo mayor). o Clases. Las clases son estructuras con una serie de caractersticas especiales.

Variables y constantes.
En C/C++ una variable es una posicin con nombre en memoria donde se almacena un valor de un cierto tipo de dato y puede ser modificado. Las variables pueden almacenar todo tipo de datos: Cadenas, nmeros y estructuras. Una constante, por el contrario, es una variable cuyo valor no puede ser modificado.
Declaracin de las variables

Una variable tpicamente tiene un nombre (un identificador) que describe su propsito. Toda variable utilizada en un programa debe ser declarada previamente. La definicin utilizada en un programa en cualquier parte del programa. Una definicin reserva un espacio de almacenamiento en memoria. El procedimiento para definir (crear) una variable es escribir el tipo de dato, el identificador o nombre de la variable y, en ocasiones, el valor inicial que tomar. La declaracin de variables puede considerarse como una sentencia. Desde este punto de vista, la declaracin terminar con un ";". Sintaxis de declaracin: tipodato nombrevariable; Ejemplo: int a; float d, char e; tipodato nomvar1, nomvar2, , nomvarn-1, nomvarn;

Ejemplo: int a, b, c; Tambin es posible inicializar las variables dentro de la misma declaracin. tipodato nombrevariable = inicializacin; Ejemplo: int a = 5; tipodato nomvar1= inicial1, nomvar2 = inicial2, , nomvarn = inicialn; Ejemplo: int a = 2, b = 4, c = 6; Las variables no inicializadas tienen un valor indeterminado, contienen lo que normalmente se denomina "basura". Las variables no pueden tener el mismo nombre que una palabra reservada del lenguaje. No se les pueden colocar espacios en blanco. Los nombres de variables solo pueden tener letras, dgitos y el guin bajo subguin (_). Los nombres de variables no pueden llevar caracteres especiales, ejemplo: caracteres acentuados, , *, /, -, etc. Deben comenzar por un carcter (letra no numero) o tambin pueden comenzar con un guin bajo (_), ejemplo: _costo.
mbito de las variables

Dependiendo de dnde se declaren las variables, podrn o no ser accesibles desde distintas partes del programa. Las variables declaradas dentro de un bucle, sern accesibles slo desde el propio bucle, sern de mbito local del bucle. Las variables declaradas dentro de una funcin, slo sern accesibles desde esa funcin. Esas variables son variables locales o de mbito local de esa funcin. Las variables declaradas fuera de las funciones, normalmente antes de definir las funciones, en la zona donde se declaran los prototipos, sern accesibles desde todas las funciones. Estas variables sern globales o de mbito global.
Variables Locales

Las variables locales son aquellas definidas en el interior de una funcin y son visibles slo en esta funcin especfica. Las reglas por las que se rigen las variables locales son: o En el interior de una funcin, una variable local no puede ser modificada por ninguna sentencia externa a la funcin. o Los nombres de las variables locales no han de ser nicos. Dos, tres o ms funciones - por ejemplo: pueden definir variables de nombre Interruptor. Cada variable es distinta y pertenece a la funcin en que est declarada. o Las variables locales de las funciones no existen en memoria hasta que se ejecuta la funcin. Esta propiedad permite ahorrar memoria, ya que permite que

varias funciones compartan la misma memoria para sus variables locales (pero no a la vez). #include <iostream.h> #include <conio.h> void main() { //declaracin de variables locales de la funcin main() int x, y; //variables locales x, y } void suma() { //declaracin de variables locales de la funcin suma() int a, b; //variable locales a, b }
Variables Globales

Las Variables Globales son variables que se declaran fuera de la funcin y por defecto (omisin) son visibles a cualquier funcin incluyendo main(). Ejemplo: #include <iostream.h> #include <conio.h> int a, c, b, x; //declaracin de variables globales main() { //declaracin de variables locales }
Tipos de Almacenamientos

Las variables por su parte pueden tener distinto tipo de almacenamiento, dependiendo ste de las partes del cdigo en el que van a ser utilizadas.
o Static

Una variable esttica existe desde que el programa comienza su ejecucin y dura hasta que el programa termina. Esta caracterstica permite retener el valor de una variable incluso aunque la ejecucin del programa salga fuera del mbito en el que ha sido declarada. Se declara anteponiendo la palabra reservada static a la declaracin de la variable. Considere el siguiente fragmento de cdigo: ejemplo( ) { static int x=0; x++; ... }

En este caso, static modifica la declaracin de la variable x, que por defecto es local a la funcin, de manera que si bien el mbito de x sigue siendo la funcin (no se puede utilizar fuera de ella), sta no se destruye una vez ejecutada la funcin, sino que sigue en memoria conservando su valor, y si la funcin es llamada por segunda vez, el valor de la variable x ya no ser 0 sino 1. Las variables globales que se declaran en cada archivo son por defecto static.
o Extern

La palabra reservada extern sirve para declarar un nombre de funcin o variable como externa, y permite referencia una declaracin que se encuentra en otro archivo. Esta caracterstica fue diseada originalmente para facilitar la compilacin separada de archivos, en este curso, no la utilizaremos de momento.
o Auto

Es la declaracin de una variable local. Se usa para definir el mbito temporal de una variable local, es utilizada por defecto en las funciones.
o Register

Cuando a la declaracin de una variable le antecede la palabra reservada register se indica al compilador que la variable se almacenar en uno de los registros del hardware del microprocesador. La palabra clave register, en una sugerencia, no un mandato, al compilador. Una variable register debe ser local a una funcin. La razn de utilizar variables register reside en que las operaciones sobre los valores situadas en los registros son normalmente ms rpidas que las realizadas sobre valores situados en memoria, por lo que se aumente la eficacia y velocidad del programa. Una aplicacin tpica es el uso de una variable register como variable de control de un bucle; de este modo se reduce el tiempo en el la CPU requiere para buscar el valor de la variable en memoria. Por ejemplo: register int i; for (i=1; i<10000; i++) {...}
Conversin explcita de tipos de datos

En C++ est permitida una conversin explcita del tipo de una expresin mediante una construccin que tiene la forma nombre_del_tipo (expresin). La expresin es convertida al tipo especificado. Por ejemplo la funcin raz cuadrada (sqrt) devuelve un resultado de tipo double. Para poder asignar este resultado a una variable de otro tipo, por ejemplo de tipo int, tendremos que escribir: int a; a = int (sqrt ( 2 ));

Una variable de un determinado tipo no siempre puede ser convertida explcitamente a otro tipo. Constantes Las constantes son tipos de datos (con valores numricos o de cadena) que permanecen invariables, sin posibilidad de cambiar el valor que tienen durante el curso del programa. Una constante corresponde a una longitud fija de un rea reservada en la memoria principal del ordenador, donde el programa almacena valores fijos. Por ejemplo: El valor de pi = 3.141592
Constantes definidas.

Las constantes pueden recibir nombres simblicos mediante la directiva #define, esto significa que esa constante tendr el mismo valor a lo largo de todo el programa. El identificador de una constante as definida ser una cadena de caracteres que deber cumplir los mismos requisitos que el de una variable (sin espacios en blanco, no empezar por un dgito numrico, etc.). Ejemplo: #include <stdio.h> #define PI 3.1415926 int main() { printf("Pi vale %f", PI); return 0; } Lo cual mostrar por pantalla: Pi vale 3.1415926 Es decir, PI es una constante a la que le hemos asignado el valor 3.1415926 mediante la directiva #define. La directiva #define tambin se puede utilizar para definir expresiones ms elaboradas con operadores (suma, resta, multiplicacin, etc.) y otras constantes que hayan sido definidas previamente, por ejemplo: #define X 2.4 #define Y 9.2 #define Z X + Y Ejemplo de uso de las constantes definidas: #include <stdio.h> #define escribe printf main()

{ int r; escribe("Ingrese un numero: "); scanf("%d",&r); escribe("El cuadrado del numero es: %d",r*r); }
Constantes de enumeracin.

Se caracterizan por poder adoptar valores entre una seleccin de constantes enteras denominadas enumeradores; estos valores son establecidos en el momento de la declaracin del nuevo tipo. Como se ha sealado, son enteros y (una vez establecidos) de valor constante. Ejemplo: enum { MALO, BUENO, REGULAR }; Hemos definido las constantes MALO, BUENO y REGULAR con los valores 0, 1 y 2. enum { PRIMERO=1, SEGUNDO, TERCERO= 5 }; Hemos definido las constantes PRIMERO, SEGUNDO y TERCERO con los valores 1, 2 (si no se establece asume el siguiente valor numrico) y 5.
Constantes declaradas

El especificador constante (const), permite crear o declarar entidades cuyo valor no se puede modificar. Una vez que una constante se declara no se puede modificar dentro del programa. Las constantes deben ser inicializadas cuando se declaran. La palabra clave const se utiliza para hacer que un objeto-dato, sealado por un identificador, no pueda ser modificado a lo largo del programa (sea constante). El especificador const se puede aplicar a cualquier objeto de cualquier tipo, dando lugar a un nuevo tipo con idnticas propiedades que el original pero que no puede ser cambiado despus de su inicializacin (se trata pues de un verdadero especificador de tipo). Cuando se utiliza en la definicin de parmetros de funciones o con miembros de clases, tiene significados adicionales especiales. Sintaxis: const [<tipo-de-variable>] <nombre-de-variable> [ = <valor> ]; Ejemplo: const int longitud = 20; char array[longitud]; La palabra clave const declara que un valor no es modificable por el programa. Puesto que no puede hacerse ninguna asignacin posterior a un identificador especificado como

const, esta debe hacerse inevitablemente en el momento de la declaracin, a menos que se trate de una declaracin extern. Las constantes se pueden utilizar para sustituir a #define. Ejemplo const PI = 3.141592 const long = 128 // sustituye a #define PI 3.141592 // sustituye a #define long 128

Operadores y operaciones aritmticas, relacionales, lgicas, asignaciones, condicionales e incrementales.


Un operador es un carcter o grupo de caracteres que acta sobre una, dos o mas variables para realizar una determinada operacin con un determinado resultado. Ejemplo tpicos de operadores son la suma (+), la diferencia (-), el producto (*), etc. Los operadores pueden ser unarios, binarios y terciarios, segn acten sobre uno, dos o tres operandos, respectivamente. Hay varios tipos de operadores, clasificados segn el tipo de objetos sobre los que actan. Operadores aritmticos Son usados para crear expresiones matemticas. Existen dos operadores aritmticos unitarios, '+' y '-' que tienen la siguiente sintaxis: + <expresin> - <expresin> Asignan valores positivos o negativos a la expresin a la que se aplican. En cuanto a los operadores binarios existen varios. '+', '-', '*' y '/', tienen un comportamiento anlogo, en cuanto a los operandos, ya que admiten enteros y de coma flotante. Se trata de las conocidsimas operaciones aritmticas de suma, resta, multiplicacin y divisin. Sintaxis: <expresin> + <expresin> <expresin> - <expresin> <expresin> * <expresin> <expresin> / <expresin> <expresin> % <expresin> El operador de mdulo '%', devuelve el resto de la divisin entera del primer operando entre el segundo. Por esta razn no puede ser aplicado a operandos en coma flotante.

Cuando las expresiones que intervienen en una de estas operaciones sean enteras, el resultado tambin ser entero. Por otro lado si las expresiones son en punto flotantes, con decimales, el resultado ser en punto flotante. Operadores incrementales Son dos operadores unitarios, se trata de operadores un tanto especiales, ya que slo pueden trabajar sobre variables, pues implican una asignacin. Se trata de los operadores '++' y '--'. El primero incrementa el valor del operando y el segundo lo decrementa, ambos en una unidad. Existen dos modalidades, dependiendo de que se use el operador en la forma de prefijo o de sufijo. Sintaxis: <variable> ++ (post-incremento) ++ <variable> (pre-incremento) <variable>-- (post-decremento) -- <variable> (pre-decremento) En su forma de prefijo, el operador es aplicado antes de que se evale el resto de la expresin; en la forma de sufijo, se aplica despus de que se evale el resto de la expresin. Veamos un ejemplo, en las siguientes expresiones "a" vale 100 y "b" vale 10: c = a + ++b; En este primer ejemplo primero se aplica el pre-incremento, y b valdr 11 a continuacin se evala la expresin "a+b", que dar como resultado 111, y por ltimo se asignar este valor a c, que valdr 111. c = a + b++; En este segundo ejemplo primero se avala la expresin "a+b", que dar como resultado 110, y se asignar este valor a c, que valdr 110. Finalmente se aplica en postincremento, y b valdr 11. Los operadores unitarios sufijos (post-incremento y post-decremento) se evalan despus de que se han evaluado el resto de las expresiones. En el primer ejemplo primero se evala ++b, despus a+b y finalmente c =<resultado>. En el segundo ejemplo, primero se evala a+b, despus c = <resultado> y finalmente b++. Operadores de asignacin Los operadores de asignacin atribuyen a una variable, es decir, depositan en la zona de memoria correspondiente a dicha variable, el resultado de una expresin o valor de otra variable. Existen varios operadores de asignacin, el ms evidente y el ms usado es el "=", pero no es el nico. Entre los operadores de asignacin tenemos: "=", "*=", "/=", "%=", "+=", "-=". Y la sintaxis es: <variable> <operador de asignacin> <expresin>

En general, para todos los operadores mixtos la expresin Expresion1 op= Expresion2 Tiene el mismo efecto que la expresin Expresion1 = Expresion1 op Expresion2 El funcionamiento es siempre el mismo, primero se evala la expresin de la derecha, se aplica el operador mixto, si existe y se asigna el valor obtenido a la variable de la izquierda. Tabla de Equivalencia de Operadores de Asignacin Sentencia Sentencia Operador Abreviada Abreviada += -= *= /= %= Operador coma La coma tiene una doble funcin, por una parte separa elementos de una lista de argumentos de una funcin. Por otra, puede ser usado como separador en expresiones "de coma". Ambas funciones pueden ser mezcladas, pero hay que aadir parntesis para resolver las ambigedades. Sintaxis: E1, E2, ..., En En una expresin "de coma", cada operando es evaluado como una expresin, pero los resultados obtenidos anteriormente se tienen en cuenta en las subsiguientes evaluaciones. Por ejemplo: func(i, (j = 1, j + 4), k); Llamar a la funcin con tres argumentos: (i, 5, k). La expresin de coma (j = 1, j+4), se evala de izquierda a derecha, y el resultado se pasar como argumento a la funcin. Operadores relacionales Los operadores relacionales comprueban la igualdad o desigualdad entre dos valores o expresiones. Sintaxis: <expresin1> > <expresin2> <expresin1> < <expresin2> <expresin1> <= <expresin2> m=+n m-=n m*=n m/=n m=%n m = m + n; m = m - n; m = m * n; m = m / n; m=m%n

no

<expresin1> >= <expresin2> <expresin1> == <expresin2> <expresin1> != <expresin2> El resultado de cualquier evaluacin de este tipo, es un valor verdadero ( true) o falso (false). Siendo verdadero cualquier valor distinto de 0, aunque por lo general se usa el valor 1 y falso representado por el valor 0. El significado de cada operador es evidente: > mayor que < menor que >= mayor o igual que <= menor o igual que == igual a != distinto a Todos los operadores relacionales son operadores binarios (tienen 2 operandos), y su forma general es: Expresin1 op Expresin2 Operadores lgicos Los operadores "&&", "||" y "!" relacionan expresiones lgicas, formando a su vez nuevas expresiones lgicas. Sintaxis: <expresin1> && <expresin2> <expresin1> || <expresin2> !<expresin> El operador "&&" equivale al "AND" o "Y"; devuelve "true" slo si las dos expresiones evaluadas son "true" o distintas de cero, en caso contrario devuelve "false" o cero. Si la primera expresin evaluada es "false", la segunda no se evala. Generalizando, con expresiones AND con ms de dos expresiones, la primera expresin falsa interrumpe el proceso e impide que se contine la evaluacin del resto de las expresiones. Esto es lo que se conoce como "cortocircuito", y es muy importante. A continuacin se muestra la tabla de verdad del operador &&: Expresin1 Expresin2 false true true ignorada false true Expresin1 && Expresin2 false false true

El operador "||" equivale al "OR" u "O inclusivo"; devuelve "true" si cualquiera de las expresiones evaluadas es "true" o distinta de cero, en caso contrario devuelve "false" o cero. Si la primera expresin evaluada es "true", la segunda no se evala.

Expresin1 Expresin2 Expresin1 || Expresin2 false false true false true ignorada false true true

El operador "!" es equivalente al "NOT", o "NO", y devuelve "true" slo si la expresin evaluada es "false" o cero, en caso contrario devuelve "false". La expresin "!E" es equivalente a (0 == E). Expresin false true Operador "sizeof" Este operador tiene dos usos diferentes. Sintaxis: sizeof (<expresin>) sizeof (nombre_de_tipo) En ambos casos el resultado es una constante entera que da el tamao en bytes del espacio de memoria usada por el operando, que es determinado por su tipo. El espacio reservado por cada tipo depende de la plataforma. En el primer caso, el tipo del operando es determinado sin evaluar la expresin, y por lo tanto sin efectos secundarios. Si el operando es de tipo "char", el resultado es 1. A pesar de su apariencia, sizeof() NO es una funcin, sino un OPERADOR. Operadores a nivel de bit enteros Los operadores a nivel de bit operan independientemente sobre cada uno de los bits de un valor.
NOT: El operador NOT unario, ~, invierte todos los bits de su operando. Por ejemplo,

!Expresin true false

en nmero 42, que tiene el siguiente patrn de bits 00101010 se convierte en 11010101 despus de aplicar el operador NOT.
AND: El operador AND, &, combina los bits de manera que se obtiene un 1 si ambos

operandos son 1, obteniendo 0 en cualquier otro caso. 00101010 (representacin en byte del numero 42) & 00001111 (representacin en byte del numero 15) = 00001010 (representacin en byte del numero 10)

OR: El operador OR, |, combina los bits de manera que se obtiene un 1 si cualquiera de

los operandos es un 1. 00101010 (representacin en byte del numero 42) | 00001111 (representacin en byte del numero 15) = 00101111 (representacin en byte del numero 47)
XOR: El operador XOR, ^, combina los bits de manera que se obtiene un 1 si cualquiera

de los operandos es un 1, pero no ambos, y cero en caso contrario. 00101010 (representacin en byte del numero 42) ^ 00001111 (representacin en byte del numero 15) = 00100101 (representacin en byte del numero 37) La tabla siguiente muestra cmo acta cada operador a nivel de bit sobre cada combinacin de bits de operando.
A 0 1 0 1 B 0 0 1 1 OR 0 1 1 1 AND 0 0 0 1 XOR 0 1 1 0 NOT 1 1 1 0

Desplazamiento a la izquierda: El operador desplazamiento a la izquierda, <<, mueve

hacia la izquierda todos los bits del operando de la izquierda un nmero de posiciones de bit especificado en el operando de la derecha. Al realizarse el desplazamiento se pierden por el extremo izquierdo del operando el nmero de bits desplazados y se rellena el operando con ceros por la derecha el mismo nmero de bits.
Desplazamiento a la derecha: El operador desplazamiento a la derecha, >>, mueve

hacia la derecha todos los bits del operando de la izquierda un nmero de posiciones de bit especificado por el operando de la derecha. Ejemplo: Si se desplaza el valor 35 a la derecha dos posiciones de bit, se obtiene como resultado que el valor 8. int a = 35; a = a >> 2; Cuando un valor tiene bits que se desplazan fuera por la parte izquierda o derecha de una palabra, esos bits se pierden. Si se estudian en binario estas operaciones se observa con mayor claridad. 00100011 (representacin en byte del numero 35) >> 2 = 00001000 (representacin en byte del numero 8)

Operador condicional ternario ?: El operador condicional ( ?: ) el cual es conocido por su estructura como ternario. Este operador permite controlar el flujo de ejecucin del programa. Permite evaluar situaciones tales como: Si se cumple tal condicin entonces haz esto, de lo contrario haz esto otro. Sintaxis: ( (condicin) ? proceso1 : proceso2 ) En donde, condicin es la expresin que se evala, proceso1 es la tarea a realizar en el caso de que la evaluacin resulte verdadera, y proceso2 es la tarea a realizar en el caso de que la evaluacin resulte falsa. Ejemplo 1: int edad; cout << "Cual es tu edad: "; cin >> edad; cout << ( (edad < 18) ? "Eres joven aun" : "Ya tienes la mayora de edad" );

Expresiones.
Una expresin es una combinacin de operadores y operandos de cuya evaluacin se obtiene un valor. Los operandos pueden ser nombres que denoten objetos variables o constantes, funciones, literales de cualquier tipo adecuado de acuerdo con los operadores u otras expresiones ms simples. La evaluacin de una expresin da lugar a un valor de algn tipo, una expresin se dice que es del tipo de su resultado. Ejemplos de expresiones: a + 5*b (a >= 0) && ((b+5) > 10) a -a * 2 + b --b + (- 4*a*c) Las expresiones se evalan de acuerdo con la precedencia de los operadores. Ante una secuencia de operadores de igual precedencia, la evaluacin se realiza segn el orden de escritura, de izquierda a derecha. El orden de evaluacin puede modificarse usando operadores que denoten precedencia como los parntesis. Reglas de precedencias El resultado de una expresin depende del orden en que se ejecutan las operaciones. Por ejemplo considere la siguiente expresin: 3 + 4 * 2. Si se resuelve primero la suma y luego la multiplicacin el resultado ser 14. Pero si se realiza primero la multiplicacin

y luego la suma el resultado es 11. Con el objeto de que el resultado de una expresin sea claro e inequvoco, es necesario crear reglas que definan el orden de ejecucin. La interpretacin de cualquier expresin en C++ est determinada por la precedencia y asociatividad de los operadores en dicha expresin. Cada operador tiene una precedencia, y los operadores en una expresin se evalan en orden de mayor a menor precedencia. La evaluacin de operadores con la misma precedencia viene determinada por su asociatividad. Los parntesis anulan las reglas de precedencia. En la siguiente tabla se listan los operadores en C++, su precedencia y su asociatividad. Los operadores se listan en orden de prioridad decreciente (los situados ms arriba tienen mayor prioridad). Los operadores en la misma lnea horizontal tienen la misma precedencia.

Operador () sizeof ++ -!~+* / % + << >> < > <= >= == != & ^ | && || ?: = *= /= += -= &= ^= |= %= <<= ++ -,

Propsito
Denota precedencia en una expresin Tamao de un objeto Incremento y decremento prefijo Operadores Unario Operaciones aritmticas multiplicacin, divisin y modulo Operaciones aritmticas adiccin y sustraccin Desplazamiento binario Operadores de relacin Operadores de igualdad Y binario O exclusivo binario O inclusivo binario Y lgico O lgico Operador condicional Operadores de asignacin

Asociatividad
De izquierda a derecha De derecha a izquierda De derecha a izquierda De derecha a izquierda De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De izquierda a derecha De derecha a izquierda

Incremento y decremento sufijo Separador coma

De derecha a izquierda De izquierda a derecha

Ejemplos de expresiones: Ejemplo 1: Se tiene la siguiente expresin y=2*5*5+3*5+7, se desea evaluarla y encontrar el resultado. Solucin: Se resuelve tomando encuentra la precedencia de los operadores y su asociatividad. y = 2 * 5 * 5 + 3 * 5 + 7; 2 * 5 = 10 (multiplicacin ms a la izquierda primero) y = 10 * 5 + 3 * 5 + 7; 10 * 5 = 50 (Multiplicacin ms a la izquierda) y = 50 + 3 * 5 + 7; 3 * 5 = 15 (Multiplicacin antes de la suma) y = 50 + 15 + 7; 50 + 15 = 65 (Suma ms a la izquierda) y = 65 + 7; 65 + 7 = 72 (Se resuelve la ultima operacin aritmtica) y = 72 (por ultimo se realiza la asignacin a la variable y) Ejemplo 2: Dados a=1, b=2 y c=3 efecte la siguiente expresin: d = 10 * a > c * 10 + b Se resuelve tomando encuentra la precedencia de los operadores y su asociatividad. d = 10 * 1 > 3 * 10 + 2 (Se realiza primero la operacin aritmtica de mayor precedencia ms a la izquierda 10*1 y luego 3*10) d = 10 > 30 + 2 (Se realiza primero la operacin aritmtica 30 + 2) d = 10 > 32 (Se resuelve la operacin relacional 10>32 dando como resultado un valor falso. Todo valor falso es igual a 0) d = 0 (por ultimo se realiza la asignacin a la variable d)

Ejemplo 3: Efecte la siguiente expresin: d = 10 > 5 && 3 * 10

Se resuelve tomando encuentra la precedencia de los operadores y su asociatividad. A pesar de que el operador lgico && tiene menor prioridad obliga a resolver la expresin mas a la izquierda 10 > 5, aunque el operador aritmtico * tenga mayor prioridad. d = 10 > 5 && 3 * 10 (Se separa la expresin debido a la presencia del operador lgico y se resuelve la primera expresin 10 > 5, siendo su resultado verdadero, todo valor verdadero ser representado por el valor 1) d = 1 && 3 * 10 (Dado un resultado verdadero en la primera expresin se resuelve la siguiente 3 * 10, de haber resultado falso toda la expresin seria falsa y no realizara dicha operacin. Al resolver la operacin 3 * 10 el resultado es 30, donde todo valor diferente a cero es un valor verdadero.) d = 1 && 1 (El resultado final de la expresin ser un valor verdadero) d = 1 (por ultimo se realiza la asignacin a la variable d) Ejemplo 4: Dado a = 1, b = 2 efecte la siguiente expresin: d = a++ > 5 / 2 || 3 * --b < ( 3 + a) Se resuelve tomando encuentra la precedencia de los operadores y su asociatividad. A pesar de que el operador lgico || tiene menor prioridad obliga a resolver la expresin mas a la izquierda a++ > 5 / 2, aunque el las operacin decremento prefijo tenga mayor prioridad. d = a++ > 5 / 2 || 3 * --b < (3 + a) (Resolvemos la expresin a++ > 5 / 2) a++ > 5 / 2 (La operacin incremento sufijo por tener menor prioridad se resuelve despus de todas las operaciones siendo resuelta despus de finalizar toda la expresin a++ > 5 / 2, se asigna el valor de la variable a) 1>5/2 (se resulte la operacin aritmtica de mayor precedencia 5 / 2 y luego la operacin relacional 1 > 2, siendo falsa) d = 0 || 3 * --b < (3 + a) (Antes de resolver la prxima expresin primero se realiza el incremento de sufijo, dando como resultado el valor a en 2) (Resolvemos la expresin a++ > 5 / 2) 3 * --b < (3 + a) (El parntesis denota prioridad en la expresin por lo cual se deber resolver la operacin 3 + a antes, sustituyendo la variable por su valor 2 el resultado es 5) 3 * --b < 5 (Se resuelve la operacin de mayor prioridad b el cual decrementar en memoria inmediatamente el valor de la variable b) 3*1<5

(Resolvemos la operacin aritmtica y luego la operacin relacional dando como resultado un valor verdadero) d = 0 || 1 (El resultado final de la expresin ser un valor verdadero) d = 1 (por ultimo se realiza la asignacin a la variable d)

Sentencias Las sentencias son unidades completas, ejecutables en si mismas. Existen muchos tipos de sentencias que incorporan expresiones aritmeticas, logicas o generales como componentes de dichas sentencias. Las sentencias simples se separan por punto y coma y las compuestas se agrupan en bloques mediante llaves.
Sentencias Simple

Una sentencia simple es una expresion de algun tipo terminada por un carcter (;). Por ejemplo las declaraciones o las sentencias aritmeticas. flota real; area = base * altura;
Sentencia vaca o nula

En algunas ocasiones es necesario introducir en el programa una sentencia que ocupe un lugar, pero que no realice ninguna tarea. A esta sentencia se le denomina sentencia vacia y consta de un simple carcter (;). Por ejemplo: ;
Sentencia compuesta

Es un conjunto de declaraciones y de sentencias agrupadas dentro de llaves {}. Tambien conocido como bloques. Una sentencia compuesta puede incluir otras sentencias, simples y compuestas. Ejemplo: { int i = 1, j = 2; double peso; peso = 5.5; j = i + j; }

Operaciones de entrada y salida estndar.

Cuando nos referimos a entrada/salida estndar (E/S estndar) queremos decir que los datos o bien se estn leyendo del teclado, bien se estn escribiendo en el monitor de video. Como se utilizan muy frecuentemente se consideran como los dispositivos de E/S por defecto y no necesitan ser nombrados en las instrucciones de E/S. En el lenguaje c++ tenemos varias alternativas para ingresar y/o mostrar datos, dependiendo de la librera que vamos a utilizar para desarrollar el programa, entre estas estn: iostream.h, stdio.h, conio.h.
< IOSTREAM.H>

Las operaciones de entrada y salida no forman parte del conjunto de sentencias de C++, sino que pertenecen al conjunto de funciones y clases de la biblioteca estndar de C++. Ellas se incluyen en los archivos de cabecera iostream.h por lo que siempre que queramos utilizarlas deberemos introducir la lnea de cdigo: #include <iostream.h> Esta biblioteca es una implementacin orientada a objetos y est basada en el concepto de flujos. A nivel abstracto un flujo es un medio de describir la secuencia de datos de una fuente a un destino o sumidero. As, por ejemplo, cuando se introducen caracteres desde el teclado, se puede pensar en caracteres que fluyen o se trasladan desde el teclado a las estructuras de datos del programa. Los objetos de flujo que vienen predefinidos sern: cin, que toma caracteres de la entrada estndar (teclado); cout, pone caracteres en la salida estndar (pantalla); cerr y clog, ponen mensajes de error en la salida estndar. Estos objetos se utilizan mediante los operadores << y >>. Salida estandar (cout) La salida estandar en C++ es la pantalla de nuestro ordenador. El objeto asociado con dicha salida estandar es cout. El objeto cout emplea al operador de insercin "<<" y apunta al objeto donde tiene que enviar la informacin. Por lo tanto la sintaxis de cout ser: cout<<variable1<<variable2<<...<<variablen; Las cadenas de texto son variables y se ponen entre " " (comillas dobles). cout << "Hola"; cout << 489; cout << 13.69; cout << x; cout << "El valor de pi es = " << 3.1416; Si queremos incluir saltos de linea podemos emplear el cdigo de escape '\n' o bien el manipulador "endl".

cout << "Una linea.\n "; cout << "segunda linea.\n"; cout << "tercera linea." << endl; cout << "cuarta linea." << endl; Entrada estadar (cin) El dispositivo de entrada estandar como podemos suponer es el teclado de nuestro ordenador. Para extraer datos desde el teclado empleamos el objeto "cin", que se utiliza en conjuncin con el operador de extraccin representado como ">>", lee informacin del flujo cin (a la izquierda del operador) y las almacena en las variables indicadas a la derecha). La sintaxis sera la siguiente: cin>>variable1>>...>>variablen; Un ejemplo de cdigo utilizando ambos objetos podra ser el siguiente: #include <iostream.h> ... main () { int i; cout<<"Introduce un nmero"; cin>>i; ... } ... Muestra por pantalla la frase "Introduce un nmero" y posteriormente almacenara el valor introducido por teclado en la variable i.
<STDIO.H>

Esta librera incorpora las sentencias de entrada y salida basicas como son la sentencia scanf y la sentencia printf, denominadas sentencias de entra y salida con formato. Salida estandar (printf) La rutina printf permite la aparicin de valores numricos, caracteres y cadenas de texto por pantalla. El prototipo de la sentencia printf es el siguiente: printf (control, arg1,arg2...); En la cadena de control indicamos la forma en que se mostraran los argumentos posteriores, tambin podemos introducir una cadena de texto (sin necesidad de argumentos) o combinar ambas posibilidades, as como secuencia de escape. En el caso de que utilicemos argumentos deberemos indicar en la cadena de control tanto

modificadores como argumentos se vayan indicar. El modificador esta compuesto por el carcter % seguido por un carcter de conversin indica de que tipo de dato se trata. Ejemplo:
printf("Color %s, num1 %d, num2 %5d, real %5.2f.\n", "rojo", 123, 89, 3.14);

Imprimir la siguiente lnea (incluyendo el caracter de nueva lnea \n):


Color rojo, num1 123, num2 00089, real 3.14.

Las letras de control de formato mas usadas son:


Esto imprime un nmero como un carcter ASCII. Por lo que, `printf c "%c", 65' imprimira la letra A. La salida para un valor cadena es el primer carcter de la cadena. d Esto imprime un entero decimal. i Esto tambin imprime un entero decimal. Esto imprime un nmero en notacin cientfica (exponencial). Por ejemplo, printf "%4.3e", 1950 e imprime 1.950e+03, con un total de 4 cifras significativas de las cuales 3 siguen al punto decimal. Los modificadores 4.3 son descritos ms abajo. f Esto imprime un nmero en notacin punto flotante. Esto imprime en notacin cientfica o en notacin punto flotante, la que g quiera que sea ms corta. o Esto imprime un entero octal sin signo. s Esto imprime una cadena. x Esto imprime un entero hexadecimal sin signo. Esto imprime un entero hexadecimal sin signo. Sin embargo, para los X valores entre 10 y 15, utiliza las letras desde la A a la F en lugar de esas mismas letras pero en minsculas. Esta no es realmente una letra de control de formato. Pero tiene un significado especial cuando se usa despus de un %: la secuencia % % % imprime el carcter %. No consume ni necesita ningn item o argumento correspondiente.

El formato completo de los modificadores es el siguiente: % [signo][longitud][.][precisin] carcter de conversin. Signo: indicamos si el valor se ajustara a la izquierda, en cuyo caso utilizaremos el signo menos, o a la derecha (por defecto). Longitud: Especifica la longitud mxima del valor que aparece en por pantalla. Si la longitud mxima del valor que aparece por pantalla. Si la longitud es menos que el nmero de dgitos del valor, este aparecern ajustado a la izquierda. Precisin: Indicamos el numero mximo de decimales que tendr el valor. La sentencia printf puede incluir caracteres especiales o secuencias de escape que permitan modificar la impresin de los datos.

Caracteres especiales ms utilizados: \n // salto de lnea \t // tabulador horizontal \v // tabulador vertical \b // retroceso \r // retorno de carro \f // salto de pgina \a // alerta (campana) \\ // carcter \ \? // interrogante \' // comilla simple \" // comilla doble \ooo // carcter ASCII dado por tres dgitos octales (ooo sern dgitos) \xhh // carcter ASCII dado por dos dgitos hexadecimales (hh sern dgitos) \0 // carcter nulo Los argumentos de la sentncia de entrada pueden estar representados por operaciones o sentencias. La sentencia printf resulte estas operaciones antes de ejecutar la etapa de control. Se resolveran los argumentos de derecha a izquierda unas vez finalizados se resuelve la etapa de control de izquierda a derecha.
int edad = 5; printf ("edad 2: %d, edad 1: %d, edad inicial: %d", edad, ++edad, edad++);

Muestra por salida: edad 2: 7, edad 1: 7, edad inicial: 5 Entrada estadar (scanf) La rutina scanf permite entrar datos en la memoria del ordenador a travs del teclado. El prototipo de la sentencia scanf es el siguiente: scanf(control, arg1, arg2, ...); En la cadena de control indicaremos por regla general, los modificadores que harn referencia al tipo de dato de los argumentos. Al igual que en la sentencia printf los modificadores, estarn formado por el carcter % seguido de un carcter de conversin. Los argumentos indicados sern, nuevamente las variables. La principal caracterstica de la sentencia scanf es que necesita saber la posicin de la memoria del ordenador en que se encuentra la variable para poder almacenar la informacin obtenida, para indicarle est posicin utilizamos el smbolo ampersand (&), aunque colocaremos delante del nombre de cada variable (esto no es necesario en las cadenas de caracteres o punteros). Ejemplo:

include<stdio.h> main( ) /*solicita dos datos*/ { char nombre[10]; int edad; printf ("introduce tu edad:"); scanf("%d", &edad); printf ("introduce tu nombre:"); scanf("%s", nombre); // nombre no lleva & por ser una referencia }

<CONIO.H> Esta librera incorpora las sentencias de entrada y salida simples como lo son: getch, getche, getchar, gets, putchar, puts.
Sentencias de salida puts

Esta sentencia muestra por la salida estandar una cadena de caracteres y salta a la proxima linea, su sintaxis: char cadena[25]=Casa; // se declara una cadena de caracteres {C,a,s,a,\0} puts(cadena); // Muestra los caracteres de cadena hasta encontra el fin de cadena puts(100); // Muestra los caracteres desde la posicin de memoria 100 hasta
// encontrar el carcter de fin de cadena

puts(cadena);
putchar

// Muestra la palabra: cadena por pantalla

Esta sentencia muestra por la salida estandar un caracteres, su sintaxis: char car = 65; putchar (car); // Muestra por pantalla el carcter A putchar (65); // Muestra por pantalla el carcter A Sentencias de Entrada
gets

Esta sentencia lee y guarda una cadena introducida por la entrada estandar, su sintaxis: char cadena[25 puts(Ingrese un nombre:); gets(cadena); // Envia los caracteres a partir de la posicin de memoria de la cadena
// y transforma el carcter intro en un carcter fin de cadena

puts(cadena);
getchar

// Muestra lo que se ingreso por la entrada en pantalla

Esta sentencia lee y retorna cuando se presione la tecla intro, un nico caracter introducido mediante el teclado y salta a la proxima linea. Muestra el caracter por la pantalla. Su sintaxis: char letra; letra=getchar( );
getch
// atrapa un carcter y lo retorna despus desl carcter intro

Lee y retorna un nico caracter al presionar una tecla. No muestra el caracter por pantalla. Su sintaxis: char letra; letra=getch( );
getche
// atrapa un carcter al momento de presionarlo y no lo muestra

Esta sentencia lee y retorna un nico caracter introducido mediante el teclado por el usuario al igual que la sentencia getch pero a diferencia esta si muesta el carcter por pantalla. Su sintaxis: char letra; letra=getche( );
// atrapa un carcter al momento de presionarlo y lo muestra

Tipos de estructuras de control


El C++, como todo lenguaje de programacin basado en la algortmica, posee una serie de estructuras de control para gobernar el flujo de los programas. Debemos recordar que la evaluacin de una condicin producir como resultado un cero si es falsa y un nmero cualquiera distinto de cero si es cierta, este hecho es importante a la hora de leer los programas, ya que una operacin matemtica, por ejemplo, es una condicin vlida en una estructura de control. Las estructuras de control basicas las podemos dividir en: sentencias de control selectivas y las sentencias de control iterativo o ciclos.

Estructuras de control selectivas: if, if-else, switch

Las sentencias de control selectivas son estructuras de control que funciona de esta manera: Las instrucciones comienzan a ejecutarse de forma secuencial (en orden) y cuando se llega a una estructura condicional, la cual esta asociada a una condicion, se decide que camino tomar dependiendo siempre del resultado de la condicion siendo esta falsa o verdadera. Cuando se termina de ejecutar este bloque de instrucciones se reanuda la ejecucin en la instruccin siguiente a la de la condicional. Dentro de las estructuras de seleccin encontramos en el C++, las de condicin simple (sentencia if y sentencia if-else) y las de condicin mltiple (switch). La sentencia if o condicional simple Es una sentencia condicional simplea cuya traduccin es: si la expresion a evaluar es verdadera realiza las instrucciones que controle dicha sentencia. Si el resultado de la expresin es falso el flujo del programa continuar con las sentencias debajo del if. Su sintaxis es: if(expresin) { //sentencias } Si solo controla una sentencia no es necesario usar los operadores de bloque { }. if(expresin) sentencia_unica;

Podemos representar esta sentencia con el siguiente diagrama, donde se muestra que solo se realizara la sentenca 1 si el resultado logico de la expresion es verdadera de no serlo continua el flujo del progama. Ejemplo 1: int x=6; if(x>6) k++; Como se ve x tiene un valor y el if evalua su estatus, como el resultado es verdadero k incrementara su valor una sola vez y el flujo de programa continuar.

Ejemplo 2: Determine si un numero es igual mayor o menor que cero #include <iostream.h> void main() { int numero; cout<<"Ingrese un numero:"; cin>>numero; if(numero == 0) //La condicion indica que tiene que ser igual a Cero { cout<<"El Numero Ingresado es Igual a Cero"; } if(numero > 0) // la condicion indica que tiene que ser mayor a Cero { cout<<"El Numero Ingresado es Mayor a Cero"; } if(numero < 0) // la condicion indica que tiene que ser menor a Cero { cout<<"El Numero Ingresado es Menor a Cero"; } } La sentencia ifelse o bicondiciona Esta estructura cumple las mismas caracterisiticas de la sentencia if, cuando la condicion es verdadera realizara una sentencia o conjuto de sentencias, pero si esta es falsa realizara realizaracondicion o condicones. if (expresin) { //sentencias } else { // sentencias } Si solo controla una sentencia no es necesario usar los operadores de bloque { }. if(expresin) sentencia_unica1; else sentencia_unica2; Podemos representar esta sentencia con el siguiente diagrama,

donde se muestra que solo se realizara la sentenca 1 si el resultado logico de la expresion es verdadera, pero si esta no se cumple realiza la sentencia 2, una vez realice alguna de las sentencias dado el resultado de la expresion de no serlo contina el flujo del progama. De esta manera podemos mostrar el siguiente ejemplo: x=0; if( x ==5) {k++;} else {k--;} Como la evaluacin de x es falsa, k decrementar en uno su valor y continuar con el flujo del programa. Las sentencias pueden controlar otras sentencias de control secuencial permitiendo evaluar los procesos solo cuando sean necesarios. Por ejemplo si queremos deteminar si un nmero es igual mayor o menor que cero, usando sentencias anidadas ifelse resulta: #include <iostream.h> void main() { int numero; cout<<"Ingrese un numero:"; cin>>numero; if(numero == 0) //La condicion indica que tiene que ser igual a Cero { cout<<"El Numero Ingresado es Igual a Cero"; } else if(numero > 0) // la condicion indica que tiene que ser mayor a Cero { cout<<"El Numero Ingresado es Mayor a Cero"; } else // la condicion indica que sino es igual o mayor tiene que ser menor { cout<<"El Numero Ingresado es Menor a Cero"; } }

La sentencia switch Sirve para seleccionar una de entre mltiples alternativas de acuerdo al valor de una expresin. La sentencia switch es especificamente til cuando la seleccin se basa en el valor de una variable simple o de una expresin simple denominada expresin de control o selector. Su sintaxis: swicth (expresion) { case valor_expresion_1: //sentencias 1 break; case valor_expresion_2: //sentencias 2 break; .... case valor_expresion_n: //sentencias n break; default: //sentencias x } Podemos representar esta sentencia mediante el diagrama siguiente,

donde dado el valor de la expresion realizara las operaciones y continuara con el flujo del programa. Esta sentencia la podemos representar usando sentencias anidadas ifelse, si la sentencia break no fuese utilizada entonces se representaria por un conjunto de sentencias if una tras otra. Como vern dependiendo de valor se selecciona el caso por ejemplo: x=3; switch (x){ case 1: k= 20*2; break; case 2: k=20/2; break; case 3: k=20+2; break; }

Como x es igual a 3 el case efectuar la operacin k=20+2, el uso de default es opcional. Ejemplo: Escribir un programa que lea por teclado las notas desde la A-H, y muestre por pantalla el rendimiento academico del alumno. #include <conio.h> #include <iostream.h> main() { char letra; cout<<"Ingrese la Calificacin y presione Enter: ";cin>>letra; switch (letra) { case 'A': { cout<<"Excelente"; break; } case 'B': { cout<<"Notable"; break; } case 'C': { cout<<"Aprobado"; break; } case 'D': case 'E': case 'F': { cout<<"Desaprobado"; break; } default: { cout<<"No esposible esta nota"; } } } La sentencia break es opcional. Cuando se encuentra, provoca la salida de switch. En caso contrario continua la siguiente secuencia case o default aunque no se cumpla la condicin. Para aclarar esto, tomemos el siguiente ejemplo: int c; ...

... scanf ("%d", &c); switch (c) { case 1: case 2: Funcion2 (); case 3: Funcion3 (); break; case 4: Funcion4_1 (); Funcion4_2 (); break; case 5: Funcion_5 (); default: FuncionX (); } La siguiente tabla indica qu funcin se ejecuta dependiendo del valor de c. Si se pulsa
1 2 3 4 5 Otra cosa

Se ejecuta las funciones


Funcion2() y Funcion3() Funcion2() y Funcion3() Funcion3() Funcion4_1() y Funcion4_2() Funcion5() y FuncionX() FuncionX()

Estructuras de control iterativas: for, while, dowhile.


Las Sentencias de Iteracin o Ciclos son estructuras de control que repiten la ejecucin de un grupo de instrucciones. Bsicamente, una sentencia de iteracin es una estructura de control condicional, ya que dentro de la misma se repite la ejecucin de una o ms instrucciones mientras o hasta que una a condicin especifica se cumpla. Muchas veces tenemos que repetir un nmero definido o indefinido de veces un grupo de instrucciones por lo que en estos casos utilizamos este tipo de sentencias. en C++ los ciclos o bucles se construyen por medio de las sentencias for, while y do - while. La sentencia for es til para los casos en donde se conoce de antemano el nmero de veces que una o ms sentencias han de repetirse. Por otro lado, la sentencia while es til en aquellos casos en donde no se conoce de antemano el nmero de veces que una o ms sentencias se tienen que repetir.

Sentencia for Es un bucle o sentencia repetitiva que: i. Ejecuta la sentencia de inicio ii. Verifica la expresin booleana de condicion trmino.

a. si es cierta, ejecuta la sentencia entre llaves y la sentencia de iteracin para volver a verificar la expresin booleana de condicion de trmino b. si es falsa, sale del bucle. Podemos representar el flujo de la sentencia en el siguiente diagrama:

Sintaxis: for (inicio; condicion; iteracion) sentencia; o si se desean repetir varias sentencias: for (inicio; condicion; iteracion) { sentencia_1; sentencia_2; sentencia_n; } Vemos que la sentencia for tiene tres secciones: inicio, en dnde se da un valor inicial a una variable o variables de control del bucle; condicin, que es una expresin que devuelve un valor verdadero o falso, y hace que el bucle se repita mientras sea cierta y salga de este solo cuando la condicion sea falsa; e iteracion, en dnde se determina el cantidad del incremento o decremento de la variable o variables de control. Las tres secciones estn separadas por punto y coma. El cuerpo del bucle puede estar formado por una o por varias sentencias. En este ltimo caso deben encerrarse entre llaves {}. Las llaves slo son necesarias si se quieren repetir varias sentencias, aunque se recomienda su uso porque facilita la lectura del cdigo fuente y ayuda a evitar errores al modificarlo. Habitualmente, en la expresin lgica de condicion de trmino se verifica que la variable de control alcance un determinado valor. Por ejemplo:

for (i = valor_inicial; i <= valor_final; i++) { sentencia; } Algunos ejemplos de la sentencia for: En la siguiente secuencia se muestran en pantallalos nmeros del 1 al 10 y sus cuadrados. int i; ... ... for (i = 1; i <= 10; i++) { printf ("\nValor de i: %d", i); printf ("\nValor de i2: %d", i * i); } En estasecuencia, se muestran en pantalla las letras maysculas de la A a la Z. char letra; ... ... for (letra = 'A'; letra <= 'Z'; letra++) cout<< letra<<endl; El valor de incremento/decremento de las variables de control puede ser diferente de 1. El siguiente ejemplo muestra en pantalla los nmeros pares comprendidos entre 1 y 100, descendentemente: int i; ... ... for (i = 100; i >= 1; i = i - 2) cout << i <<"\t "; Es posible tener ms de una variable de control del bucle: En el bucle for las secciones de inicializacin e incremento pueden tener, a su vez, subsecciones, en cuyo caso van separadas por el operador secuencial (,). Un ejemplo es: int i, j; ... ... for (i = 0, j = 1; i + j < N; i++, j++) cout<< i + j<<endl; que visualiza los N primeros nmeros impares. No debe confundirse esta sentencia con un anidamiento de bucles for.

Un anidamiento tiene el siguiente aspecto: int i, j; ... ... for (i = 0; i <= 100; i++) { ... for (j = 0; j <= 100; j++) { cuerpo_del_bucle; } ... } La condicin de salida del bucle no tiene por qu referirse a la variable de control: Esto queda ilustrado en el siguiente ejemplo: char a; int i; ... ... for (i = 1; a != 's'; i++) { printf ("\n%d", i); a = getch (); } En este ejemplo se van mostrando en pantalla los nmeros 1, 2,... hasta que se teclee el carcter s. El bucle for puede no tener cuerpo. Esta caracterstica permite crear retardos en un programa. int i; ... ... for (i = 0; i < 100; i++); El bucle provoca un retardo de 100 ciclos, saldra del bucle cuando la variable sea mayor o igual a100. El bucle for puede tener vaca cualquier seccin: En un bucle for puede faltar una, dos o las tres secciones. Por ejemplo, es correcto escribir register int i; ... ... for (i = 0; i != 10; ) { /* Falta la 3 seccin (incremento) */

scanf ("%d", &i); printf ("\n%d", i); } que va mostrando en pantalla los valores que se tecleen, finalizando al teclear el nmero 10 (que tambin se visualiza). Tambin es correcto un bucle como for ( ; ; ) { cuerpo_del_bucle; } que es un bucle sin fin, debe haber en el cuerpo del bucle una sentencia que rompa el ciclo del programa como lo es una sentencia break. Ejemplo: void main () { int n; for ( ; ; ) { printf ("\nTeclee un nmero: "); scanf ("%d", &n); if (!n) break; printf ("\nEl cuadrado es %d", n * n); } } Sentencia while La sentencia while tiene una condicin del bucle (una expresin lgica) que controla la secuencia de repeticin. La sentencia evalua la condicin antes de que se ejecute el cuerpo del bucle si se cumple la condicion realiza los procesos que controla la sentencia sino sale y continua con el flujo del programa.

El cuerpo del bucle no se ejecutar nunca si la primera vez no se cumple la condicin. El bucle puede ser infinito si no se modifican adecuadamente las variables de la condicin dentro del bucle.

Sintaxis: while ( condicin ) { sentencias .......... ; } Veamos algunos ejemplos. En esta sentencia se solicita un carcter del teclado mientras no se teclee el carcter n ni el carcter s. Cuando se teclea alguno de estos caracteres, se almacena en c y se abandona el bucle. char c; ... ... while (c != 's' && c != 'n') c = getche (); El siguiente ejemplo es un caso de bucle while sin cuerpo. Se mantendra en el ciclo hasta que se teclea el carcter s. while (getch () !=s); El siguiente programa utiliza un bucle while para solicitar del usuario que adivine un nmero. Realizar un programa que muestre los numero del 1 al 100. #include <conio.h> #include <iostream.h> main() { clrscr(); //limpia la pantalla int contador=0; while ( contador < 100 ) { contador++; cout<<"\t "<<contador; } cout<<"Presione Enter para salir"; getch();// espera una tecla para continuar con la siguiente linea } Las sentencias for y while son equivalentes: Equivalente a la sentencia while: for ( ; condicion ; ) { sentencias; }

Equivalente a la sentencia for: inicio; while ( condicin ) { sentencias; iteraciones; } Ejemplo 1: Determine si un numero es capicuo (se lee igual en ambos sentidos). Usando la sentencia while
#include <conio.h> #include <iostream.h> main() { clrscr(); //limpia la pantalla int num, inv, aux; cout<<Ingrese un numero:; cin>>num; aux = num; inv = 0; while ( aux > 0 ) { / / se separan los digitos y se invierten inv = inv * 10 + aux % 10; aux = aux / 10; } if(num == inv) cout<<"El numero es capicuo; else cout<<"El numero no es capicuo; getch(); }

Usando la sentencia for


#include <conio.h> #include <iostream.h> main() { clrscr(); //limpia la pantalla int num, inv, aux; cout<<Ingrese un numero:; cin>>num; for(aux=num, inv=0; aux>0; aux=aux/10) { / / se separan los digitos y se invierten inv = inv * 10 + aux % 10; } if(num == inv) cout<<"El numero es capicuo; else cout<<"El numero no es capicuo; getch(); }

Ejemplo 2: Muestre un cuadro usando el carcter x y una dimension n. Sera necesario usar sentencia anidadas para dezplar el cursor de manera horizontal y vertical.

Usando la sentencia while


#include <conio.h> #include <iostream.h> main() { clrscr(); int i, j, n; cout<<Ingrese la dimension:; cin>>num; i = 0; while(i < n ) { j=0; while( j < n) { if(i==0 || i==n-1|| j==0|| j==n-1) cout<<"x; else cout<< ;

Usando la sentencia for


#include <conio.h> #include <iostream.h> main() { clrscr(); //limpia la pantalla int i, j, n; cout<<Ingrese la dimension:; cin>>num; for(i = 0; i < n ; i++) { / / recorre las filas for(j = 0; j < n; j++) { / / recorre las columnas if(i==0 || i==n-1|| j==0|| j==n-1) cout<<"x; else cout<< ; }

j++; } cout<<endl; i++; } getch(); }

cout<<endl; } getch(); }

Sentencia do-while La sentencia do - while se utiliza para especificar un bucle condicional que se ejecuta al menos una vez. Esta situacin se suele dar en algunas circunstancias en las que se ha de tener la seguridad de que una determina accin se ejecutara una o varias veces, pero al menos un vez. El flujo de ejecucin es el siguiente:

En esta sentencia a diferencia de la sentencia for y while, primero realizara las sentencias que controle una vez realizada evaluara la condicion, si esta es verdadera volvera a realizar las sentencias hasta que la condicion en algun momento sea falsa. Las sentencias se ejecuta al menos una vez, incluso aunque expresin se evale como falsa, puesto que la evaluacin se hace al final, a diferencia de la sentencia while y for, en el que la evaluacin de la condicion se hace al principio. Sintaxis: do{ sentencias; }while(condicin);

Ejemplo: Realizar un programa que convalide el ingreso de dos notas con rango [0 20] y halle el promedio de ambas notas. #include <conio.h> #include <iostream.h> main()

{ clrscr(); int nota1, nota2; do{ cout << "Ingrese las Notas: "; cin>>nota1>> nota2; }while(((nota1<=20)&&(nota1>=0))&&((nota2<=20)&&(nota2>=0))); cout<<"El promedio de las nontas es:"<<(nota1+nota2)/2; getch(); } En el siguiente ejemplo se solicita un carcter del teclado hasta que se pulse cualquiera de los caracteres 'S' o 'N'. #include <iostream.h> void main () { char tecla; do { cout<<Pulse S o N: "<<endl; tecla = getch (); } while (tecla != 'S' && tecla != 'N'); }

La sentencia break

Es una sentencia de ruptura de secuencia, permite cortar ciclos de programas. La sentencia break se puede colocar dentro de un bucle o bucles anidados. Cuando se ejecuta la sentencia break se abandona el bucle ms interno. A todos los efectos la sentencia break acta como un salto a la instruccin siguiente al bucle en el que se ejecuta.
La sentencia continue

La sentencia continue, no abandona el bucle si no hace que se ejecute la siguiente iteracin. En el bucle while la ejecucin del continue hace que el flujo del programa salte a la condicin. En el bucle for la ejecucin del continue hace que la expresin de incremento, para despus continuar normalmente con la condicin. Es decir, la ejecucin del continue evita que se ejecute el resto del cuerpo del bucle. Esta sentencia se utiliza en los bucles for, while y do/while. Cuando se ejecuta fuerza un nuevo ciclo del bucle, saltndose cualquier sentencia posterior. Por ejemplo, el bucle int i, n; ... ... for (i = 1; i <= 100; i++) { n = i / 2;

if (i == 2 * n) continue; printf ("\n%d", i); } muestra en pantalla slo los nmeros impares, puesto que para los nmeros pares la expresin i == 2 * n se evala como cierta, ejecutndose la sentencia continue que fuerza de inmediato un nuevo ciclo del bucle.

Arreglos: definicin, clasificacin.


datos en la memoria, por ejemplo, los datos almacenados en un disco suelen leerse y ponerse dentro de un arreglo con el objetivo de facilitar la manipulacin de dichos datos, ya que los datos en memoria pueden ser modificados, clasificados, marcados para su eliminacion, etc. para luego ser reescritos al disco.
Los arreglos son usados extensamente por los programadores para contener listas de

Un arreglo (array) es una coleccin de datos del mismo tipo, que se almacenan en posiciones consecutivas de memoria y reciben un nombre comn. Para diferenciar cada elemento de un arreglo se utiliza un indice, que especifique su posicin relativa en el arreglo. Los ndices son nmeros que se utilizan para identificar a cada uno de los componentes de un arreglo. Por ejemplo podemos pensar en los casilleros, asi que si deseamos guardar o retirar un paquete nos dirijimos al casillero el cual sera el arreglo; y dado el nmero especfico el cual representa el ndice para identificar el lugar del casillero en donde qued guardado el paquete. Un arreglo es una coleccin finita, homognea y ordenada de elementos. Finita: Todo arreglo tiene un lmite; es decir, debe determinarse cul ser el nmero mximo de elementos que podrn formar parte del arreglo. Homognea: Todos los elementos del arreglo deben ser del mismo tipo. Ordenada: Se puede determinar cul es el primer elemento, el segundo, el tercero,.... y el n-simo elmento.

Declaracin de arreglos

Para declarar un arreglo se emplea la sintaxis: tipo identificador[ [tamao] ] [ = { lista de inicializacin } ] ; donde,

tipo se refiere al tipo de datos que contendr el arreglo. El tipo puede ser cualquiera de los tipos estndar (char, int, float, etc.) o un tipo definido por el usuario. Es ms, el tipo del arreglo puede ser de una estructura creada con: struct, class. identificador se refiere al nombre que le daremos al arreglo. tamao es opcional e indica el nmero de elementos que contendr el arreglo. Si un arreglo se declara sin tamao, el mismo no podr contener elemento alguno a menos que en la declaracin se emplee una lista de inicializacin. lista de inicializacin es opcional y se usa para establecer valores para cada uno de los componentes del arreglo. Si el arreglo es declarado con un tamao especifco el nmero de valores inicializados no podr ser mayor a dicho tamao.

Ejemplos: int int_A[5]; long long-A[5] = { 1, 2, 3, 4, 5 }; char char_A[] = { 'a', 'b', 'c' ); int bidim_A[4][4]={{1,1},{2,3}}; Clasificacion de los arreglos Los arreglos los podemos clasifican de acuerdo con el nmero de dimensiones que tienen. As se tienen los: o Unidimensionales (vectores): representados por una coleccin de elementos con un mismo nombre y diferenciados por un indice. o Multidimensionales: Bidimensionales (tablas o matrices) y Tidimensionales. Representados por colecciones de arreglos unidimensionales (matrices) o multiples matrices. Arreglos unidimensionales, multidimensionales. Arreglos unidimensionales Los arreglos unidimensionales pueden ser apreciados en la vida cotidiana como por ejemplo un armario el cual esta dividido por gavetas, una cola de personas que realizan un mismo proceso como la compra de un mismo articulo, etc. Los arreglos unidimensionales son una coleccin de variables del mismo tipo, con un mismo nombre y diferenciadas a traves de un indice.

El formato para declarar un arreglo unidimensional es: tipo nomb_arr [tamao] [ = { lista de inicializacin } ]; //La lista es opcional donde, el tamao representa la dimension o cantidad de elementos o variables del mismo tipo que componen al arreglo. Por ejemplo, para declarar un arreglo de enteros llamado listanum con diez elementos se hace de la siguiente forma: int listanum[10]; El ejemplo declara un arreglo de enteros con diez elementos o variables enteras desde listanum[0] hasta listanum[9]. Cada una de las variables declaradas puede ser utilizadas referenciando su indice. La forma como pueden ser accesados los elementos de un arreglo, es de la siguiente forma: listanum[2] = 15; num = listanum[2];
/* Asigna 15 al 3er elemento del arreglo */ /* Asigna el contenido del 3er elemento a la variable num */

Para evaluar, leer, modificar un arreglo de elementos es necesario realizar recorridos atraves de este, es decir si se quiere realizar alguna operacin sobre el arreglo es necesario utilizar sentencias iterativas que permitan recorrer el arreglo desde una posicin a otra. Sea la declaracion de los arreglos A y B: int A[10], B[10]; Si se desea leer o asignar a los 10 elementos del arreglo, es necesario desplarzarnos por cada una de las variables desde la posicin 0 hasta la posicin 9. // leer los 10 elementos del arreglo A int i; for (i = 0; i < 10; i++) { cout<<Ingrese el elemento A[<<i<<]:; cin>>A[i]; } // asignar a los 10 elementos del arreglo B el mismo valor del arreglo A int i; for (i = 0; i < 10; i++) { B[i] = A[i]; } Si se desea buscar un elemento en el arreglo A, es necesario comparar el valor buscado con cada elemento del arreglo.

int i, encontrado; for (encontrado=0, i = 0; encontrado==0 && i < 10; i++) { if ( buscado == A[i]) encontrado = 1; } if ( encontrado==1) cout<<El elemento buscado fue encontrado; else cout<<El elemento no fue localizado; Si se desea ordenar los elementos del arreglo A, es necesario comparar cada valor del arreglo y ubicarlo en la posicin correspondiente, en la siguiente sentencia se utilizara el metodo de la burbuja el cual conciste en comparar un elemento con el siguiente y dependiendo del criterio de comparacin y valor de peso este sera cambiado o no. int i, cambio, aux, n=10; do{ // la sentencia do nos indica la cantidad de veces necesarias para ordenar cambio = 0; //si su valor se mantiene en cero el arreglo estara ordenado for (i = 0; i < n-1; i++) // el ultimo elemento no sera comparado { if ( A[i] <criterio> A[i+1]) // criterio (>) ordena de menor a mayor cambio = 1; // criterio (<) ordena de mayor a menor aux = A[i]; // intercambia los valores A[i] con A[i+1] A[i] = A[i+1]; A[i+1] = aux; } }while( cambio!=0); Si desea mostrar los elementos del arreglo A: int i; cout<<Los elementos del arreglo:<<endl; for ( i = 0; i < 10; i++) { cout<<A[i]<<\t; } Ejemplo: Programa para determinar el mayor y menor de n numeros enteros. #include <conio.h> #include <iostream.h> #define max 100 main() { clrscr(); //limpia la pantalla int num[max]; int i, n, mayor, menor; do { cout<<Ingrese la cantidad de numeros a ingresar:; cin>>n; }while( n<1 || n>100);

for(i = 0; i < n ; i++) // ingresa los n numeros { cout<<Ingrese el numero[<<i+1<<]:; cin>>num[i]; } for(i = 1, mayor= num[0], menor=num[0]; i < n; i++) { // compara los numeros y los guarda sea el resultado if(mayor < num[i]) mayor = num[i]; if(menor > num[i]) menor = num[i]; } cout<<"El numero mayor: <<mayor<< y el menor: <<menor<<endl; getch(); } Arreglos multidimensionales Se podran definir arreglos de mayor dimension, arreglos bidimensionales y declaracin tridimensionales como sigue: tipo_de_dato identificador[tamao1][tamao2]; dnde: tipo_de_dato: Es el tipo de datos que contendr la matriz. Hasta ahora slo conocemos los tipos bsicos de datos; int, float, double, char. Posteriormente veremos como definir nuestros propios tipos de datos. identificador: Es el nombre que le damos a la variable matriz y po el cual la referenciaremos en nuestro programa. [tamao] : Indica el nmero de elementos de tipo tipo_de_datos contendr la matriz identificador. Si se definen 2 dimensiones (arreglo bidimensional), la cantidad total sera igual al producto de ambas dimensiones. Arreglo bi-dimensional Una arreglo bi-dimensional es aquel en donde los componentes son accesados por medio de una pareja de ndices que apunten a la fila y columna del componente requerido. Los arreglos de este tipo son conocidos tambin con el nombre de matrices. Conceptualmente, podemos pensar en un arreglo bidimensional como en una lista compuesta de filas y columnas, en donde para referinos a una de ellas emplearemos un nmero para indicar la posicin de fila y otro nmero para indicar la posicin de la columna del componente deseado.

Se le conocen comnmente como matrices o tablas. La primera dimensin establece la cantidad de filas. La segunda dimensin establece la cantidad de columnas. Al igual que en los arreglos de una dimensin, todos los datos seran del mismo tipo y nombre y diferenciada por dos indices. Arreglo tri-dimensional Los arreglos tridimensionales estan compuestos por tres dimensiones donde la primera dimension representa la cantidad de arreglos bidimensionales, la segunda dimension representa la cantidad de arreglos unidimensionales y la tercera dimension representa la cantidad de elementos que contiene cada arreglo unidimensional. Permite realizar representaciones en tres planos.

Para declarar un arreglo bidimensional, matriz o tabla: tipo_de_dato nomb_matriz[fila][columnas]; Para declarar un arreglo trididimensional: tipo_de_dato nomb_arreglo[fila][columnas][elementos]; Ejemplo: Algunas declaraciones de matrices y arreglos tridimensionales seran: /* Matriz de nmeros reales de 10x10 */ float matriz[10][10]; /* Matriz tridimensional de nmeros enteros 20x20x10 */ int Tridimensional[20][20][10]; Como ya se supondr el acceso a cada elemento de la matriz se realiza especificando su posicin, pero sta comienza a contarse desde el valor 0, es decir, la primera

matriz que hemos definido (matriz) tendr elementos desde el [0][0] al [9][9]. Esto puede causar algunos mal entendidos cuando se trabaja con matrices estticas. Por ejemplo: a = matriz [2][1]; /* A toma el valor del elemeto (2,1) comenzando a contar desde 0 o del (3,2) si consideramos que el primer valor de la matriz es el (1,1) */ tridimensional [5][16][1] = 67; /* Introduce el valor 67 en la entrada de la matriz especificada */ Las variables de tipo matriz como el resto de las declaraciones, se pueden inicializar en el momento de su declaracin, ayudndose de las llaves ({}) para la inclusin de inicializaciones mltiples. int matriz[2][3] = { { 1,2,3 }, { 4,5,6 } }; Estas lneas nos declararan una matriz llamada "matriz" de 2x3 elementos inicializada con los valores indicados. Las matrices son extremadamente tiles para trabajar con multitud de problemas matemticos que se formulan de esta forma o para mantener tablas de datos a los que se accede con frecuencia y por tanto su referencia tiene que ser muy rpida. A igual que los arreglos unidimensionales, los arreglos multidimensionales utilizaran sentencias iteractivas anidadas para cada una de las dimensiones. Ejemplo: Realice un programa que lea una matriz de n * n elementos enteros y muestre cuantos de estos elementos son primos. #include <conio.h> #include <iostream.h> #define max 100 main() { clrscr(); //limpia la pantalla int num[max][max]; int i, j, n, div, contprimos; do { cout<<Ingrese la cantidad de numeros a ingresar:; cin>>n; }while( n<1 || n>100); for(i = 0; i < n ; i++) // recorre las filas for(j = 0; j < n ; j++) // recorre las columnas { cout<<Ingrese el numero[<<i+1<<][<<j+1<<]:; cin>>num[i][j]; }

for(contprimos=0, i = 0; i < n ; i++) // recorre las filas for(j = 0; j < n ; j++) // recorre las columnas { for(div=2;div<num[i][j] && num[i][j]%div!=0; div++); if(div==num[i][j]) contprimos++; } cout<<"En la matriz hay : <<contprimos<< numeros primos<<endl; getch(); } Se permite la inicializacin de arreglos, debiendo seguir el siguiente formato: tipo nombre_arr[ tam1 ][ tam2 ] ... [ tamN] = {lista-valores}; Por ejemplo: int i[10] = {1,2,3,4,5,6,7,8,9,10}; int num[3][4]= { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }; int num[2][2][2]={{{0,1}, {2,3}}, {{4,5}, {6,7}}};

Cadenas de caracteres. Una cadena es un conjunto de caracteres, o valores de tipo "char", terminados con el carcter nulo, es decir el valor numrico 0. Internamente se almacenan en posiciones consecutivas de memoria. Este tipo de estructuras recibe un tratamiento especial, y es de gran utilidad y de uso continuo. Lo que distingue a una cadena de caracteres, con respecto a un arreglo de caracteres cualesquiera, es que la cadena de caracteres tiene como ltimo carcter al carcter nulo \ 0. La manera de definir una cadena es la siguiente: char <identificador> [<longitud mxima>]; Por ejemplo, si se declara el arreglo: char cadena[8]; podemos asignar los siguientes valores a cada uno de sus elementos: cadena[0] = 'A' ; cadena[1] = 'R' ; cadena[2] = 'R' ; cadena[3] = 'E' ; cadena[4] = 'G' ;

cadena[5] = 'L' ; cadena[6] = 'O' ; cadena[7] = '\0'; Al contener el carcter nulo, el arreglo cadena ser reconocido por las funciones y objetos diseados para manipular cadenas de caracteres. Para manejar y realizar operaciones con las cadenas de caracteres es necesario realizar sentencias de recorido hasta encontrar el carcter fin de cadena. Lo que lo diferencia de los arreglos numericos que es necesario conocer la cantidad de elementos a evaluar. Un arreglo es necesario lee y mostrar cada elemento uno a uno en el caso de las cadenas solo es necesario usar una funcion que atrape cadenas de caracteres, ejemplo: char cadena[10]; get ( cadena); cin>>cadena; scanf(%s, cadena); cout<<cadena;
// Lee una cadena de caracteres // Lee una cadena y tranforma el carcter espacio en\0 // Lee una cadena y tranforma el carcter espacio en\0 // muestra todos los caracteres hasta el carcter final

Realice un programa que lea una frase y cambie un carcter de la frase por un nuevo carcter. #include <conio.h> #include <iostream.h> #define max 100 main() { clrscr(); char frase[max]; char carV, carN; cout<<Ingrese una frase: gets(frase); cout<<Ingrese el carcter a modificar: carV = getch(); cout<<Ingrese el nuevo nuevo caracter: carN = getch(); for(i = 0; frase[i] !=\0 ; i++) if( frase[i] ==carV) frase[i] = carN ; cout<<"La nueva frase es : <<frase<<endl; getch(); } Para manejar un arreglo de cadenas de caracteres se debe declarar como un arreglo bidimensional de elementos de tipo char, como por ejemplo: #include <iostream.h> #include <conio.h> void main() {

unsigned short int calif[10]; char nombre[10][20]; // Se declara un arreglo bidimensional


// para 10 nombres de 20 caracteres por // nombre mas un caracter para el nulo.

clrscr(); for( int x=0 ; x < 10 ; x++) { gotoxy(10,x+1); // posicionan el cursor en la posicion (x, y) cout << "NOMBRE [" << x << "] = " ; cin >> nombre[x]; gotoxy(45,x+1); cout << "CALIFICACION [" << x << "] = " ; cin >> calif[x]; } } Cuando se tiene un arreglo de cadenas de caracteres, se puede utilizar para asignar valores en la declaracions constantes de cadena. Por Ejemplo: char nombres[][5] = { "HUGO", "PACO", "LUIS" } ; es equivalente a: char nombres[3][5]; nombres[0] = "HUGO" ; nombres[1] = "PACO" ; nombres[2] = "LUIS" ; Esto tambin puede manejarse a nivel de caracteres, as: char nombres[][5] = { 'H','U','G','O','\0', 'P','A','C','O','\0', 'L','U','I','S','\0' }; o as: char nombres[3][5]; nombres[0][0] = 'H' ; nombres[0][1] = 'U' ; nombres[0][2] = 'G' ; nombres[0][3] = 'O' ; nombres[0][4] = '\0' ; nombres[1][0] = 'P' ; nombres[1][1] = 'A' ; nombres[1][2] = 'C' ; nombres[1][3] = 'O' ; nombres[1][4] = '\0' ; nombres[2][0] = 'L' ;

nombres[2][1] = 'U' ; nombres[2][2] = 'I' ; nombres[2][3] = 'S' ; nombres[2][4] = '\0' ; Al manejar arreglos bidimensionales de cadenas, no es necesario escribir el valor de la primera dimensin de los arreglos cuando, en su declaracin, se asignan valores constantes a los elementos. La ventaja que tiene es que, al no especificar una de las dimensiones, la cantidad de cadenas a manejar puede variarse con slo agregarlas a la lista o eliminarlas de ella.
Adems de las funciones gets() y puts(), existe otro grupo de funciones para el manejo de cadenas de caracteres, como strlen() y strupr() . Los rototipos de estas funciones se encuentran declarados en el archivo STRING.H En la tabla 5.1 se describen brevemente algunas de las funciones para el manejo de cadenas de caracteres en el C++ de Borland, cuyos prototipos se encuentran declarados en el archivo STRING.H .

FUNCION stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup strerror stricmp strlen strlwr strncat Aade una cadena de caracteres a otra.

DESCRIPCION Copia una cadena de caracteres en otra.Se detiene cuando encuentra el terminador nulo. Busca, en una cadena, un caracter dado. Compara dos cadenas. Macro que compara dos cadenas sin distinguir entre maysculas y minsculas. Copia una cadena. Busca segmentos que no contienen un subconjunto de un conjunto especificado de caracteres. Copia una cadena a una nueva localidad. Retorna el apuntador al mensaje asociado con el valor del error. Compara dos cadenas sin diferenciar entre maysculas y minsculas Determina la longitud de una cadena. Convierte las maysculas de una cadena en minsculas. Aade el contenido de una cadena al final de otra.

_strerror Genera un mensaje de error definido por el programador.

strncmp Compara parte de una cadena con parte de otra. strncmpi Compara parte de una cadena con parte de otra, sin distinguir entre maysculas y minsculas. strncpy strnset strpbrk strrchr strrev Copia un un nmero de bytes dados, desde una cadena hacia otra. Hace que un grupo de elementos de una cadena tengan un valor dado. Busca la primera aparicin, en una cadena, de cualquier caracter de un conjunto dado. Busca la ltima aparicin de un caracter en una cadena. Invierte el orden de los caracteres de una cadena. strnicmp Compara parte de una cadena con parte de otra, sin distinguir entre maysculas y minsculas.

strset strspn strstr strtod strtol strtoul strupr

Hace que los elementos de una cadena tengan un valor dado. Busca en una cadena el primer segmento que es un subconjunto de un conjunto de caracteres dado. Busca en una cadena la aparicin de una subcadena dada. Convierte una cadena a un valor double long double. Convierte una cadena a un valor long. Convierte una cadena a un valor unsigned long. Convierte las minsculas de una cadena a maysculas. Funciones para el manejo de cadenas de caracteres.

_strtime Convierte la hora actual a una cadena.

Referencias de memoria.
Las referencias. Las referencias son novedades absolutas del C++ (no se encuentran disponibles en C). Una referencia es un nuevo tipo de datos que nos va a permitir utilizar las caractersticas de los punteros pero tratndolos como variables ordinarias. Podis imaginaros una referencia como un "alias" de una variable o, mejor dicho, como la misma variable disponible pero con un nombre distinto. Vaya lo no? ;). Pasemos a explicar cmo se utilizan las referencias para no armarnos tanto "bollo" en nuestra cabeza "programadora"... La inicializacin de una referencia es bien fcil ya que slo tendremos que asociar la referencia que deseemos a otra variable que ya est creada por nosotros. Una vez que hemos realizado tal inicializacin, la referencia va a estar continuamente asociada con su variable correspondiente. Cabe aadir que, si quisiramos hacer que nuestra referencia fuese el "alias" de otra variable o lo que es lo mismo que referenciase a otra variable no podramos, tendramos un error de compilacin. La declaracin de una referencia es bien sencilla: // dato es una variable definida por // nosotros y es de tipo entero. int dato; // referenciaDato es la referencia que hemos creado. int& referenciaDato = dato; Como podis observar para crear una referencia no necesitamos ms que la variable a la que queremos referenciar, que en el ejemplo es dato, junto la referencia en s que se va a definir con el smbolo &. De este modo, referenciaDato es la referencia o alias de la variable dato. Una vez hechas las dos operaciones anteriores cualquier cambio que hagamos sobre dato se ver reflejado en referenciaDato y viceversa, es decir, si realizamos una modificacin en referenciaDato, esta tambin se va a ver reflejada en la variable dato.

Pongamos un ejemplo de todo esto!. #include <iostream.h>


void main() { int dato = 50; int& refDato = dato; cout << \n; cout << "La variable dato vale " << dato << \n; cout << "La variable refDato vale " << refDato << \n; // multiplicamos la variable // dato por 2, ahora dato = 100 dato *= 2; cout << "La variable dato vale " << dato << /n; cout << "La variable refDato vale " << refDato << \n; // incrementamos el valor de la // referenicia, ahora refDato = 101; refDato ++; cout << "La variable dato vale " << dato << \n; cout << "La variable refDato vale " << refDato; }

Si ejecutis este programita veris que la salida que se obtiene sera:

50 50 100 100 101 101

Con lo que deducimos que los cambios efectuados en dato y refDato se ven involucrados. Debis de saber que tanto dato como refDato comparten la misma direccin de memoria y por eso, cualquier cambio que efectuemos sobre dato afectar a refDato del mismo modo que si lo hiciramos al revs.

Para cercioraros de que tanto la variable como la referencia poseen la misma direccin tan slo tenis que ejecutar este listado que os muestro a continuacin y comprobar que la direccin de dato y refDato es la misma.

void main() { int dato = 50; int& refDato = dato; cout << \n << "La direccin de la variable dato es " << &dato << /n; cout << \n << "La direccin de la referencia refDato es " << &refDato << \n; } Si lo ejecutis veris que salen los mismos valores. Una de las cosas que tenemos que tener bien claro es la utilizacin del operador unario & con una variable y con una referencia. Cuando declaramos una referencia estamos definiendo un tipo de datos que es exclusivo del C++, en este caso, el operador & va junto al tipo de datos que estamos definiendo como referencia as, si nosotros queremos crear una referencia que va a referenciar a una variable de tipo entero pondremos algo como int& referencia. Otro uso bien distinto es cuando lo que queremos obtener es la direccin en memoria de cierta variable o dato. En este caso tanto en C como en C++ el operador unario & se comporta de igual modo dndonos la direccin en memoria de tal variable o dato. Tan slo tenis que ejecutar el ltimo de los listados expuestos el cual nos mostrar, por pantalla, la direccin en memoria de una variable de tipo entero y la de una referencia que tiene con alias precisamente tal variable de tipo entero.

También podría gustarte