entornos de programacion c

49
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++ INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo para C++ Hermes Mosquera Angulo Octubre de 2013

Upload: sergioospitiarojas

Post on 15-Dec-2015

6 views

Category:

Documents


0 download

DESCRIPTION

c++

TRANSCRIPT

Page 1: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS

Aplicación de los entornos de desarrollo para C++

Hermes Mosquera Angulo

Octubre de 2013

Page 2: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

CONTENIDO

1. ENTORNO DE PROGRAMACIÓN C++ ........................................................... 5

1.1 Conceptos Básicos de los Compiladores ...................................................... 5

1.2 Entorno de desarrollo del compilador Borland C++5.5 ................................... 7

1.4 Entorno de desarrollo del compilador DevC++4.9.9.2 .................................. 16

1.5 Programas de Aplicación ............................................................................. 19

2.1 Conceptos Básicos de Memoria................................................................... 20

2.3 Conceptos básicos de apuntadores ............................................................. 26

2.4 Más acerca de apuntadores ......................................................................... 29

2.5 Apuntadores a Apuntadores ........................................................................ 35

3. OPERADORES DE C++ PARA LA GESTIÓN DINÁMICA DE MEMORIA ..... 38

3.1 Operadores New y Delete ............................................................................ 38

3.2 Entorno de desarrollo IDE Falcon c++ ........................................................ 41

Actividades de Autoevaluación .......................................................................... 46

Fuentes Bibliográficas ........................................................................................ 48

Page 3: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

LISTADO DE TABLAS

Tabla 1………………………………………………………………………………….30

Tabla 2………………………………………………………………………………….31

Page 4: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

LISTADO DE GRÁFICOS Y FIGURAS

Figura 1 Salida en pantalla de progra3.cpp ........................................................... 31

Figura 2 Salida en pantalla de progra4.cpp ........................................................... 32

Figura 3 Salida en pantalla de progra5.cpp ........................................................... 33

Figura 4 Salida en pantalla de progra7.cpp ........................................................... 35

Figura 5 Salida en pantalla de progra9.cpp ........................................................... 36

Figura 6 Salida en pantalla de progra10.cpp ......................................................... 37

Figura 8 Salida en pantalla de progra15.cpp ......................................................... 40

Figura 9 Salida en pantalla de progra16.cpp ......................................................... 41

Page 5: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

5

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS

1. ENTORNO DE PROGRAMACIÓN C++

Introducción

El presente apartado aborda la temática de algunos de los entornos de desarrollo más comunes para la programación de C++ y la aplicabilidad que tienen en el campo de la programación estructurada. Finalmente se presentan actividades de aplicación para ser desarrolladas y códigos fuentes de C++ para que el estudiante los edite en cada uno de los compiladores y genere así la habilidad y competencia para desarrollar programas en C++ independiente del compilador que utilice. 1.1 Conceptos Básicos de los Compiladores

Son muchas las definiciones que se encuentran en diferentes fuentes a cerca de los compiladores, entre ellas se comparte la definición que hace Laborda (1985) en tal sentido que un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser un código intermedio (bytecode), o simplemente texto. Este proceso de traducción se conoce como compilación.

Para el lenguaje de programación que nos ocupa, el compilador de C++ es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel de C++ escrito por el programador a otro lenguaje de nivel inferior conocido como lenguaje de máquina. De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a como piensa un ser humano, a través de el editor de C++ o un editor de texto que puede ser el Bloc de notas para luego compilarlo a un programa de fácil manejo por una computadora.

El objetivo del compilador es traducir un programa escrito en un código fuente,que llamaremos programa fuente, en un equivalente en otro código denominado

Page 6: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

6

objeto, al quellamaremos código objeto o ejecutable. En el proceso de compilación si el programa fuente es correcto, es decir no presenta errores de sintaxis del lenguaje se produce la traducción; en caso contrario se obtiene unoo varios mensajes de error que permita determinar lo más claramente posible los orígenes de laincorrección. Dependiendo del compilador, la traducción podrá hacerse en dos formas: Interpretación y compilación. En la interpretación la traducción se hace frase a frase, mientras que en la compilación la traducción se hace del texto completo.

Fases de un compilador. Imagen 1. Estructura de las Fases de un compilador

Fuente: http://www.infor.uva.es/~mluisa/talf/docs/aula/A7.pdf

Según, AHO, Alfred y Otros (1998) los compiladores están conformados en seis fases que se describen a continuación: Análisis léxico:La cadena de entrada se recibe como una sucesión de caracteres. El análisis léxico agrupa loscaracteres en secuencias con significado colectivo y mínimo en el lenguaje, llamadas componentesléxicos. Análisis sintáctico:Los componentes léxicos se agrupan para formar frases. El valor léxico de los componentes es en este momento irrelevante. Normalmente las frases se representan mediante una estructura de árbol sintáctico, siguiendo reglas que describen el lenguaje.

Page 7: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

7

Análisis semántico:En esta etapa se revisa el resultado del análisis sintáctico, recopilando por ejemplo información de tipos y construyendo una representación aún más abstracta. Generación de código intermedio:Después de los análisis sintáctico y Semántico algunos compiladores generan en esta fase un código intermedio para una máquina abstracta, y es posible que sea explícita del programa fuente. Esta representación se caracteriza por ser fácil de producir y fácil de traducir al programa objeto. Optimación de código:Se trata en esta fase de mejorar el código, en el sentido de reducir la cantidad de recursos de tiempoy memoria necesarios. Algunas optimaciones son triviales, como por ejemplo hacer algunastransformaciones directamente en la compilación, en lugar de dejarlo para la ejecución. Otras pueden requerir un trabajo mucho mayor, pero mejorar significativamente la eficiencia, normalmente a costa de alejarse bastante del código original, como eliminar código inactivo, eliminar variables intermedias o resituar sentencias independientes deun bucle fuera de éste. Generación de código objeto:En esta fase final se genera por fin el código objeto, normalmente código fuente, de máquina. Se seleccionan posiciones de memoria relativas o registros para las variables y cada sentencia del código intermedio se traduce a una secuencia de instrucciones que ejecutan la tarea.

1.2 Entorno de desarrollo del compilador Borland C++5.5 El compilador Borland C++5.5 es un compilador de uso libre disponible en la web Se presentan algunas ventajas significativas de este compilador comparado con Turbo C++ 3.0. El editor de Borland C++5.5 es mucho más flexible, ya que desde su editor permite copiar y pegar el código como se hace con cualquier aplicación de windows, los caracteres especiales responden de acuerdo a la configuración del idioma de su teclado, basta con compilar el programa para que se genere el código objeto o código ejecutable con extensión (.exe), que es el archivo a visualizar como salida en pantalla. Es importante saber que el ejecutable se crea en la misma ruta donde tiene guardado el código fuente, es decir, el archivo con extensión .cpp. Una vez que haya descargado e instalado el compilador, puede acceder al entorno del editor tal como se muestra en la imagen 2. El panel superior resaltada en el circulo de color rojo el área de edición; mientras que el panel inferior donde se visualiza el circulo de color azul es el área de compilación y ejecución del programa.

Page 8: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

8

Imagen 2. Entorno de desarrollo de Borland C++5.5

Después de haber editado el código fuente se procede a guardar el archivo en la ruta que prefiera, por defecto el editor guarda el código en C:\Borland\BCC55\Bin, recuerde que el ejecutable también se guarda por defecto en esa misma ruta. Proceso de compilación:Para compilar el programa solo tiene que ubicar en la barra de menú del compilador la opción Tools y dar clic en la opción Compile o presione las teclas Ctrl + F7. Recuerde que la opción de compilar figurará activa siempre y cuando haya guardado el archivo fuente con su respectiva extención (.cpp), en caso contrario la opción compilar estará inactiva en el Menú Tools. Si el código fuente no presenta errores de sintaxis el resultado de la compilación arroja como resultado la expresión:Exitcode = 0 tal como se visualiza en la imagen 2, en el circulo resaltado en color azul. En caso contrario, es decir si hay errores de sintaxis o errores lógicos de compilación da como resultado Exitcode = 1a demás el compilador indica los posibles causas del error tal como se visualiza en la siguiente imagen 3.

Page 9: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

9

Imagen 3. Entorno de compilación de Borland C++5.5

Generalmente el error se localiza en la línea anterior del mensaje de error que indica el compilador; en este caso el compilador indica en la línea de color amarillo que hay un error de sintaxis en la línea 5; analizando el código se observa que falta un punto y coma en la terminación de la línea 4. Se procede a hacer la corrección y guardar los cambios como si fuera una aplicación de Windows. Se compila nuevamente hasta obtener Exitcode = 0. Proceso de ejecución: Hay dos opciones básicas de ejecutar el programa particularmente prefiero la segunda opción. La primera opción de ejecución con Borlan C++5.5 se realiza después de haber compilado el programa, se procede ingresando a la opción Tools de la barra de menús y seleccionar la opción Go. Se muestra la ejecución del programa en el panel inferior del editor; en el ejemplo se pide que ingrese su nombre tal como se visualiza en la imagen 4 siguiente.

Page 10: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

10

Imagen 4. Entorno de ejecución de Borland C++5.5

La segunda Opción de ejecución del programa con Borlan C++5.5 se realiza ejecutando el archivo ejecutable que se crea en el momento de la compilación, este archivo lleva el mismo nombre del programa fuente y queda guardado en la misma ruta y este se guarda por defecto con la extensión (.exe). Para ejecutar solo tiene que dar doble clic en este archivo y se inicia la ejecución del programa tal como se muestra a continuación. Imagen 5. Programa en ejecución con Borland C++5.5

Page 11: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

11

Aplicación del compilador Borland C++5.5 Como ejercicio de aplicación se propone el siguiente código para que lo edite a través del compilador, posteriormente lo guarda con el nombre introducción.cpp en la ruta que prefiera y proceda a ejecutarlo de las dos formas indicadas en la sección anterior. Análisis del código fuente. En el código se presentan la función principal main() y dos funciones más, una llamada portada que muestra datos de la portada y la otra llamada cálculo, que realiza un calculo matemático y muestra el resultado. En la línea 1 se incluye la librería iostream utilizada para los operadores de entrada y salida de datos. En las líneas 2 y 3 se declaran las funciones portada y calculo las cuales no retornan ningún valor por esa razón son declaradas de tipo void. En la línea 4 se declaran las variables globales de tipo entero utilizadas por la función calculo. De la línea 5 a la línea 12 se define la función principal main. De la línea 13 a la 19 se define la función portada, en sus instrucciones solo muestra mensajes en pantalla. De la línea 20 a la 31 se define la función cálculo, sus instrucciones realizan un cálculo matemático y muestra el resultado. Imagen 6.Código fuente del programa introducción.cpp presentado en el editor de Borland C++5.5

Page 12: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

12

1.3 Entorno de desarrollo del compilador Turbo C++3.0 El compilador Turbo C++3.0 es un entorno de desarrollo integrado y compilador desarrollado por Borland para programar en lenguaje C y C++. Es uno de los compiladores básicos más utilizado, es de uso libre, disponible en varios sitios de la web para su descarga.

Una vez instalado el compilador se crea un ícono en su escritorio solo debe ejecutarlo para abrir el editor. Si desea ejecutarlo manualmente debe ir a la carpeta: C:\TCPP\BIN y ejecutar el archivo: tc.exe, aparecerá la siguiente interfaz: Imagen 7. Inicio del compilador Turbo C++3.0

El mensaje que se muestra en la imagen 7, indica que el sistema no soporta el modo de pantalla completa cuando se instala el compilador en plataforma Windows 7, es un mensaje que no impide su ejecución, solo debe dar clic en el botón omitir y de inmediato se habilita el editor de C++ tal como se muestra en la imagen 8: Imagen 8. Barra de menús del compilador Turbo C++3.0

Solo debe seleccionar del menú File la opción New y obtiene el editor para iniciar la edición de un nuevo programa. Después de la edición se debe guardar el programa en la ruta que desee siempre con la extensión .cpp antes de proceder a compilar.

Page 13: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

13

Imagen 9. Editor del compilador Turbo C++3.0

Opción para compilar el programa Una vez haya editado el código se procede a realizar la compilación para determinar y corregir posibles errores de sintaxis que puedan presentarse. Imagen 10. Opción de compilar en Turbo C++3.0

Opción para ejecutar el programa La ejecución del programa se lleva a cabo después de que en el proceso de la compilación indique que el código está depurado libre de errores de sintaxis y lógicos. Imagen 11. Opción de ejecutar en Turbo C++3.0

Page 14: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

14

Imagen 12. Código fuente del programa introduc.cpp presentado en el editor Turbo C++ 3.0

Imagen 13. Salida en pantalla del programa introduc.cpp con Turbo C++3.0

Page 15: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

15

Análisis del resultado Para tener una idea de la diferencia que puede presentarse con el código fuente entre los diversos compiladores, se realiza la comparación del código fuente del programa introducción.cpp que se presentó con borland C++5.5 y el mismo programa presentado con turbo C++3.0. Se tomó el código introducción.cpp que se compiló en Borland C++5.5 y llevarlo al editor de Turbo C++3.0 se guardó con el nombre introduc.cpp, posteriormente se compiló y se generó el siguiente mensaje de error el cual indica que la función system no tiene un prototipo, esto significa que esta función system requiere una librería y esa librería es stdlib.h; librería que no requiere el compilador borlan C++5.5 porque cuando se compiló el programa en ese compilador no generó el mensaje de error. Finalmente para solucionar el error solo se incluye en la segunda línea del código la instrucción #include<stdlib.h> y listo, se guardan los cambios y se compila nuevamente. Imagen 14. Mensaje de error al compilar introduc.cpp en Turbo C++3.0

Una de las ventajas que ofrece este compilador es que através de la opción de ayuda Helpde la barra de menús, se puede determinar cual es el prototipo o librería que falta incluir en el código, es de esa manera que se identificó que la función system requiere la librería stdio.h. Veamos como hacer uso del menú de ayudas de Turbo C++3.0. Teniendo en el editor el programa introducción.cpp que se utilizó con Borland C++5.5. Solo debe ingresar a la opción del menú Help y seleccionar del menú contextual la opción Index le muestra algo similar a la imagen 15.

Page 16: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

16

Sobre esa interfaz solo escribe la palabra system que es una palabra reservada del lenguaje C++ la que generó el error y cuando aparezca resaltada tal como se muestra en la imagen siguiente presiona la tecla Enter. Imagen 15. Opción Index del menú de ayudas de turbo C++3.0

Muestra entonces las ayudas asociadas a esa función, en la imagen siguiente se observa que son necesarias las librerías stdlib.h o process.h; cualquiera de las dos librerías soluciona el error mostrado en la compilación. Para cerrar esta ventana de ayudas solo presiona la tecla de escape esc. Imagen 16. Información de ayudas de la función system() en turbo C++3.0

Hay muchas más ventajas significativas de este compilador, otra de ellas es realizar seguimiento paso a paso de la ejecución del programa y conocer el valor que van almacenando las variables, esto se hace con la opción Watches que figura en el menú contextual de la opción de la barra de menú Debug. Es importante que la realice como actividad complementaria. 1.4 Entorno de desarrollo del compilador DevC++4.9.9.2

DevC++4.9.9.2es un completo entorno de desarrollo integrado para programación en C/C++. De uso libre que permite trabajar con varios tipos de proyecto incluyendo tanto aplicaciones visuales como aplicaciones de consola. Presenta un kit de herramientas que ayudarán al usuario a desarrollar su código desde cero

Page 17: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

17

hasta un producto final completamente depurado. DevC++4.9.9.2cuenta con un sistema de ventanas organizadas por pestañas que permite escribir el código directamente en el editor, una ventana de exploración para las clases y elementos del proyecto y un sistema de corrección del código integrado. Este compilador por ser de uso libre está disponible en la web en sus diferentes versiones, después de su instalación requiere configurar algunas propiedades, la configuración de este compilador puede consultarla en la web. Imagen 17. Código fuente del programa introduccion.cpp presentado en el compilador DevC++4.9.9.2

El procedimiento de la edición es similar al utilizado para Borland C++5.5, el entorno de desarrollo es amigable, permite copiar y pegar código en el editor. Al realizar la comparación del código del programa introducción.cpp que se trabajó como ejemplo en los anteriores compiladores solo requiere agregarle la instrucción Usingmamespacestd; inmeditamente después de los archivos de cabecera o librerías tal como se muestra en la imagen anterior.

Page 18: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

18

Opciones de compilación y ejecución Las opciones de compilación y ejecución se identifican elel área cubierta de color rojo en la siguiente imagen. Imagen 18. Área de compilación y ejecución en DevC++4.9.9.2

Otra forma de compilar y ejecutar el programa haciendo uso de la barra de menús seleccionando la opción Ejecutar. Imagen 19. Compilar y ejecutar desde la barra de menús de DevC++4.9.9.2

Sin embargo es importante mencionar que se han identificado algunas

características especiales de este compilador, no trae la librería conio.h porque

esta no es estándar del lenguaje, por esa razón marca como error la funciones

gotoxy(),clrscr(), getch() entre otras. Sin embargo esta librería puede ser

configurada desde las opciones update del compilador.

La función getch()utilizada en varios programas se puede remplazar con la función

getchar() o por la función system (“PAUSE”) tal como se muestra en el código del

ejemplo.

La función gotoxy() es utilizada para dar posición al texto en la pantalla.la función

clrscr() utilizada para limpiar pantalla, El compilador DevC++ no permite que la

Page 19: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

19

función principal main() sea declarada de tipo void, así: voidmain() declaración

que si la permite Borland C++5.5 y Turbo C++3.0 en su código fuente; en este

caso se remplaza el tipo voidporintquedando la función principal como intmain() y

al final del código debe adicionársele la instrucción return 0.

Imagen 20. Programa introcuccion.cpp en ejecución con DevC++4.9.9.2

1.5 Programas de Aplicación Esta lección tiene como objetivo dar aplicabilidad al uso de los compiladores que se han presentado en las lecciones anteriores y otros compiladores de C++ que usted esté familiarizado o que desee utilizar. En tal sentido se proponen los siguientes programas para que usted y su grupo colaborativo los implementen en cada uno de los tres compiladores que se han presentado y de esta mera puedan identificar y establecer las diferencias entre ellos, esta práctica le permitirá familiarizarse con los compiladores, de tal manera que usted tenga su propia percepción y pueda elegir con cual o cuales de ellos iniciará el desarrollo del curso. Para iniciar se propone recordar a través de la codificación de programas algunas temáticas que se tratan en el curso Introducción a la programación que se espera haya aprobado. Aplicación a funciones.

Implemente un programa codificado en C++ que permita leer dos números y a través de un menú de opciones muestre las cuatro operaciones básicas de suma, resta, multiplicación y división; de tal manera que si se selecciona la opción suma el programa muestre en pantalla el resultado de la suma de los dos números leídos al inicio. En caso de seleccionar la resta se espera que el resultado a mostrar en pantalla sea la diferencia entre los números y de igual manera para las otras dos opciones.

Page 20: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

20

Implemente un programa codificado en C++ que permita realizar la conversión de monedas a través de un menú de opciones muestre la conversión de pesos a dólares y a euros así: si se selecciona la opción dólar el programa muestra en pantalla el resultado de la conversión de un valor dado en pesos a dólares. Y seguir el mismo procedimiento para convertir pesos a euros.

2. GESTIÓN DE MEMORIADINÁMICA

Introducción

La gestión dinámica de memoria hace referencia a la forma enque se almacenan

los datos en la computadora. Tiene relación directa con las varibles, los tipos de

datos que maneja el lenguaje C++ y el número de bytes requeridos para

almacenar cada tipo de dato en la memoria del computador, aunque este tema es

transparente para el usuario normal de un sistema computacional, si debe ser

motivo de preocupación para los programadores, que están llamados a hacer

buen uso de los recursos tanto físicos como lógicos.

En la memoria del computador se guardan no solo las constantes y variables sinó también lasinstrucciones del programa.Cada objeto y cada instrucción en la memoria tienen previamente asignada una dirección única.Sólo se carga el programa principal en la memoriainicialmente. El resto de subprogramas, algoritmos yfunciones se va cargando según se van requiriendo. 2.1 Conceptos Básicos de Memoria En la computadora se identifican tres tipos de memoria: la memoria auxiliar, representada por los discos duros, las memorias conocidas como usb entre otros. La memoria (ROM) conocida como memoria de solo lectura, la cual es usada para almacenar aplicaciones y datos de forma permanente.La información generalmente es colocada desde su fabricación en el chip de almacenamiento de tal manera que su contenido no puede ser alterado por un programa de usuario. Por ese motivo es una memoria sólo de lectura. Otro tipo de memoria es la (RAM) memoria de acceso aleatorio,utilizada para almacenar información mientras está en funcionamiento. La RAM se encuentra en circuitos integrados o chips en el interior de la computadora. Es volátil, lo que significa que es borrada y reemplazada con nueva información tan pronto como se necesita. La volatilidad también significa que la RAM “recuerda” solamente

Page 21: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

21

mientras la computadora está encendida, y pierde su información cuando se apaga o se reinicia la computadora.

Cada computadora tiene una determinada cantidad de RAM instalada que va directamente relacionada con la capacidad y rendimiento del equipo, hace unos pocos años la cantidad de memoria RAM en un sistema se especificaba por lo general en Megabytes (Mb) por ejemplo 256 Mb, 512 Mb, hoy por hoy debido a los avances tecnológicos, el uso de la Internet y la masificación de la información en multiples formatos ha hecho que los equipos de esta nueva generación estén dotados de de mayores recursos tantyo físicos como lógicos, es por ello que la memoria de los equipos de está época se especifica en Gigas y seguramente seguirá creciendo con el paso de los años. En ese orden de ideas se dice que un byte es la unidad fundamental de medida que consta de 8 bits en procesamiento de información digital delos datos que maneja la computadora, que de acuerdo a su tamaño o su peso entre los más comunes se tiene los Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes. Tabla 1. Tabla de equivalencias entre unidades de medida de almacenamiento

Nombre Simbolo Valor

Byte B 8 bits

Kilobyte Kb 1.024 bytes

Megabyte Mb 1.024 kilobytes

Gigabyte Gb 1.024 megabytes

Terabyte Tb 1.024 gigabytes

Tipos de datos comunes

En la tabla 2 se muestran los tipos de datos comunes y el espacio en memoria de cada dato en bitsutilizados frecuentemente en C++. Tabla 2:Tipos de datos comunes y su espacio en memoria en bits

Tipo de dato Espacio memoria Rango permitido

unsignedchar 8 bits 0 a 255

Char 8 bits -128 a 127

short int 16 bits -32,768 a 32,767

unsignedint 32 bits 0 a 4,294,967,295

Int 32 bits -2,147,483,648 a 2,147,483,647

unsignedlong 32 bits 0 a 4,294,967,295

Enum 16 bits -2,147,483,648 a 2,147,483,647

Long 32 bits -2,147,483,648 a 2,147,483,647

Page 22: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

22

Float 32 bits 3.4 x 10-38 a 3.4 x 10+38(6 dec)

Doublé 64 bits 1.7 x 10-308 a 1.7*10+308(15 dec)

long doublé 80 bits 3.4 x 10-4932 a 1.1 x 10+4932

Void sin valor Fuente: http://www.wikilearning.com/tutorial/tutorial_de_c++-tipos_de_datos/9773-4

Para darse una idea de cuantos bytes se requieren para almacenar datos de diferentes tipos medido en términos de bytes se presenta la siguiente tabla: Tabla 3: cantidad de Bytes requeridos para los tipos de datos comunes

Tipo de dato Datos Bytes requeridos

Char La letra X 1

Short int El número 100 2

Float El número 125.12 4

Varchar La frase Aprenda usted mismo 21

Es posible realizar una representación de la Tabla 2 en términos de programación para visualizar el espacio requerido en memoria de cada tipo de datos presentado en bits como medida del sistema binario, haciendo uso del operador sizeof que permite determinar el tamaño de un tipo de dato como parámetro.Veámosuna aplicación del operador sizeof en el siguiente programa. Imagen 21. Programa1.cpp

Ya se tiene el código fuente grabado en el compilador DevC++4.9.9.2 con el nombre de programa1.cpp, ahora solo resta compilar y ejecutar el código para obtener el siguiente resultado como salida en pantalla.

Page 23: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

23

Imagen 22. Salida en pantalla de programa1.cpp

2.2 Asignación de memoria La asignación de memoria consiste en el proceso de asignar memoria para

propósitos espécificos, ya sea en tiempo de compilación o de ejecución. Si es en

tiempo de compilación la asignación es estática, pero si es en tiempo de ejecución

la asignación es dinámica y si son variables locales a un grupo de sentencias se

denomina asignación automática.

La cantidad de memoria asignada a almacenar en las variables no se conoce de antemano, lo cual lleva a difrenciar dos tipos de reserva de memoria:

Asignación estática de memoria: Implica predeterminar la cantidad de memoria que se asignará a la variable. Hay que tener en cuenta que al agotar la zona de memoria previamente asignada no se podrían almacenar nuevos elementos. La asignación estática de memoria consiste en el proceso de asignar memoria en tiempo de compilación antes de que el programa asociado sea ejecutado.

Aplicación de las variables estáticas A continuación se presenta el código fuente del pograma2 que hace uso de las variables estáticas como aplicación. Imagen 23. Programa2.cpp

Page 24: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

24

Análisis de Programa2.cpp En el código del programa se declaran tres variables estáticas de tipo entero, ellas son: suma que se declara en la línea 3, numero1 que se declara con el valor 136 en la línea 7 y numero2 se declara con el valor 369 en la línea 8, en la línea 9 la variable suma almacena la sumatoria de las variables numero1 y numero2. Veámosla salida en pantalla.

Imagen 24. Salida en pantalla de programa2.cpp

Las Estructuras

Las estructuras tienen como finalidad agrupar una o más variables generalmente de diferentes tipos, bajo un mismo nombre, propiedad que facilita su manejo y la interacción entre tipos de datos. Un ejemplo típico de una estructura puede ser una ficha de datos básicos de una persona como, el nombre, apallido, edad, teléfono, etc. Si se tratara de bases de datos se podría hablar de registros.

Para crear una estructura se debe definir los elementos que la componen, con ello se definen las variables y el tipo de datos de cada una. Una estructura está compuesta por el nombre de la estructura, los elementos de la estructura que reciben el nombre de miembros y las instancias que son variables que

Page 25: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

25

generalmente son del mismo tipo de la estructura utilizadas para acceder a los miembros. La sintaxis es la siguiente

struct tipo_estructura { tipo miembro_1; tipo miembro_2; // … tipomiembro_n; } lista de variable llamadas instancias;

La palabra reservada struct indica al compilador que se está definiendo una estructura tipo_estructura; y cada miembro puede ser de un tipo primitivo (char, int, float, etc.) o un tipo derivado como un puntero, una estructura o función.

Las variables de instancias pueden ser variables definidas del mismo tipo de la estructura, se incluyen los apuntadores, utilizados en las estructuras dinámicas.

Imagen 25. Definición de una estructura

En la línea 1 se define la estructura de tipo persona

Entre las linesa 3 y 5 se declaran las variables conocidas como miembros de la estructura, son ellos nombre y apellido que son un arreglo de tipo char que almacena 15 caracteres, y edad que es de tipo entero.

En la línea 5 despues de la llave que cierra el bloque de miembros se declaran las instancias de la estructura, que pueden ser variables normales o apuntadores, en el ejemplo se declara la variable apuntador que en este caso recibe el mismo nombre y se identifica por que le precede el símbolo asterisco (*) a la variable apuntador.

Page 26: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

26

Asignación dinámica de memoria

Las variables dinámicas deben su nombre al hecho de que pueden ser creadas y destruidas durante el tiempo de ejecución de un módulo o de un programa. Para el manejo de variables dinámicas se hace indispensable la utilización de apuntadores, así como de funciones especiales para la asignación y liberación de la memoria correspondiente a dichas variables.

Se dedica una zona de memoria, pudiendo ser de un tamaño predeterminado o no, y en caso de sobrepasarse dicha zona de memoria se vuelve a asignar otra zona, contigua o no, para permitir el almacenamiento de más datos, siendo esta una de las ventajas de la asignación de memoria dinámica. De estamanera se optimiza y se distribuyen los recursos de memoria especialmente cuando esta es limitada entre muchas líneas de código y gran cantidad de datos.

2.3 Conceptos básicos de apuntadores Un apuntador es una variable, que almacena como contenido una dirección de memoria, de otra variable a la que apunta, dicha dirección representa el lugar donde se almacena un dato. Los apuntadores tienen un tipo de dato específico y solo pueden apuntar a espacios de memoria con datos del mismo tipo. Por supuesto, a partir de esa dirección de memoria puede haber cualquier tipo de objeto: un char, un int, un float, un array, una estructura, una función u otro puntero. Serán los programadores los responsables de decidir ese contenido. Con los apuntadores es posible manipular estructuras de datos o asignar memoria dinámica. Los apuntadores son una de las herramientas más poderosas con que cuenta el Lenguaje C++.

Declaración de apuntadores

Los apuntadores son variables dinámicas cuyos valores representan direcciones de memoria correspondientes a otras variables del mismo tipo a las que apuntan. La sintaxis para la declaración de una variable de tipo apuntador es la siguiente: tipo * identificador ; Donde, tipo hace referencia al tipo de datos de C++ como int, char, float, entre otros e identificador, hace referencia al nombre de la variable apuntador que está precedida por un asterisco (*).

Page 27: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

27

Ejemplo:int *apunt; se declara el apuntador apunt de tipo entero. Se dice que: "apunt va a apuntar avariables de tipo int"donde apunt es el nombre del apuntador y (*) es el operador de indirección que indica que apunt es un apuntador.

En el ejemplo anterior, puede decirse que:

*apunt se refiere al objeto apuntado por apunt. apunt es un apuntador a objetos de tipo int Observe que el operador de indirección utiliza el mismo símbolo que el operador de multiplicación. En este caso el asterisco le indica al sistema que se define una variable apuntador. Ejemplos: int *x; x es un apuntador de tipo entero. char *y; y es un apuntador de tipo carácter. double *r, *s; r y s son apuntadores de tipo real doble precisión.

Operadores para trabajar apuntadores

Los operadores utilizados para trabajar variables apuntadores son el (* ) asterisco llamado operador de indirección, y el ( & ) ampersand, llamado operador de dirección.

* toma su operando como una dirección de memoria y retorna la

información almacenada en ese lugar.

& devuelve la dirección de memoria de su operando. Aplicación práctica del uso de apuntadores Imagen 25. Código del programa3.cpp y la salida en pantalla.

Page 28: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

28

Veámos otro ejemplo en la implementación de apuntadores

Imagen 26. Código del programa3.cpp

Análisis de Programa4.cpp En la línea 1 se incluye la librería o archivo de cabecera necesario para el buen funcionamiento del programa y soportar la sintaxis del lenguaje, se pueden incluir otras según se requieran.

Page 29: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

29

En la línea 3, se define la función principal main() de tipo int, lo que indica que puede retornarun valor de tipo entero valor. En la línea 5, se declaran las variablesllamadas automática y apunt que son de tipo entero. En la línea 6,se asigna el valor 100 a la variable automatica. En la línea 7, se asigna a apunt la dirección de memoria de la variable automática En la línea 8, se muestra la salida en pantalla del valor de la variable automática que es 100. En la línea 9, se asigna el valor 200 al objeto apuntado por apunt. Es decir a la variable automática. En la línea 10, se muestra en pantalla el nuevo valor que tomó la variable automática que para este caso es 200. En la línea 11, se muestra un mensaje indicando la dirección de memoria de la variable apunt. En la línea 12, se muestra un mensaje indicando el valor de la variable apunt. En la línea 13, se muestra la instrucción para que el programa haga una espera hasta que se presione una tecla. En la línea 14, se hace un retorno o salida de la función principal. Finalmente en la línea 15 se cierra la llave indicando que terminan las instrucciones de la función principal. El resultado del Programa4.cpp se puede observar en la imagen que se muestra a continuación.

Imagen 27. Salida en pantalla de programa4.cpp

2.4 Más acerca de apuntadores Un apuntador es una variable que solo puede contener un valor a la vez, por lo que solo puede apuntar a un objeto al mismo tiempo. Por otro lado, una variable cualquiera puede ser apuntada(referenciada) por varios

Page 30: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

30

apuntadores, ya que su dirección de memoria puede ser almacenada en distintas variables a la vez. Al declarar un apuntador, se está especificando el tipo de variable al que va a apuntar. Por ejemplo, no podrá declararse un apuntador a objetos de tipo int y después intentar utilizarlo para apuntar a objetos de tipo float. Cuando se desee manejar un apuntador a cualquier tipo de objeto, se puede declarar de tipo void, como en: void *apuntadores ; Aplicación de apuntadores de tipo void

En el siguiente listado se muestra un ejemplo de aplicación de un apuntador de tipo void.

Progra3.cpp #include <iostream.h> #include <conio.h> int main() { int entero=1 ; float decimal=1.1 ; void *apvarios=&entero; // apvarios APUNTA A entero *(int *)apvarios="1" // ASIGNA 1 AL OBJETO APUNTADO POR apvarios cout<< "El valor de entero es: "<<entero<<"\n" ; apvarios=&decimal ; // apvarios APUNTA A decimal *(float *)apvarios="1.1" // ASIGNA 1.1 AL OBJETO APUNTADO POR apvarios cout<< "El valor de decimal es: "<<decimal ; getch(); } Análisis de Progra3.cpp Analicemos la siguiente instrucción:

*(int *)apvarios = 1 ; En donde: Apvarios, es un apuntador de tipo void. (int *)apvarios está forzando a que apvarios apunte a objetos de tipo int. *(int *)apvarios se refiere a un objeto de tipo entero apuntadopor apvarios. En la grafica 1.1 se obtiene la salida en pantalla de Progr3.cpp.

Page 31: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

31

Figura 1 Salida en pantalla de progra3.cpp

Apuntadores acadenas

Una cadena se puede declarar como un arreglo de caracteres cuyo último elemento es el caracter nulo. Utilizando la nomenclatura de arreglos, podemos declarar un arreglo llamado nombre[] de tipo carácter asignándole la frase COMERCIO:

char nombre[ ] = "COMERCIO" ;

La misma asignación puede realizarse por medio de apuntadores, como se observa en el siguiente enunciado.

char *nombre = "COMERCIO" ; En este caso se define a nombre como un apuntador que apunta a datos de tipo char, al que se le asigna la frase COMERCIO. Aplicación de apuntadores a cadenas Progra4.cpp

#include <iostream.h> #include <conio.h> #include <stdio.h> int main() { char *nombre = "COMERCIO" ; gotoxy(30,12); cout<< "!! HOLA, " ; puts(nombre); gotoxy(43,12); cout<< " !!";

Page 32: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

32

getch(); } En la figura 4, se visualiza la salida en pantalla de progra4.cpp, se presentan dos funciones objeto de análisis.

La función gotoxy() posiciona el mensaje o la salida en pantalla “!! HOLA” en las coordenadas x=30 y y=12.

La función puts() es propia para el manejo de cadena de caracteres, muestra en pantalla el contenido de la variable nombre.

Figura 2 Salida en pantalla de progra4.cpp

Apuntadores a arreglos

Los apuntadores pueden manejarse en un arreglo, de tal forma que:

char nombres[ ][5] = { "HUGO", "PACO", "LUIS" } ;es la declaración de un arreglo de cadenas, con asignación de valores iniciales. Su equivalente en notación de apuntadores es: char *nombres[ ] = { "HUGO", "PACO", "LUIS" } ;

En el que se declara un arreglo de apuntadores con tres valores asignados. El programa completo para el manejo de este ejemplo se presenta en el Progra5.cpp. Implementación de arreglos de apuntadores

Progra5.cpp #include <iostream.h> #include <conio.h> #include <string.h> using namespace std; int main() {

Page 33: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

33

char *nombres[ ] = { "HUGO", "PACO", "LUIS" } ; char invitado[11]; int bandera; clrscr(); gotoxy(20,5); cout<< "CUAL ES SU NOMBRE ?:" ; gotoxy(50,10); cin>>invitado ; gotoxy(20,7); for(int x = 0 ; x <3 ; x++ ) if(strcmp(invitado, nombres[x])== 0) bandera=0; if(bandera== 0) cout<< "!! SIGA AMIGO ES BIENVENIDO " << invitado <<" !!"; elsecout<< "!! USTED NO ES BIENVENIDO, " << invitado <<" !!"; getch(); }

En la figura 5, se visualiza el resultado de la salida en pantalla de Progra5.cpp, en el que se incluye la librería <string.h> necesaria para el manejo de cadena de caracteres con las funciones de comparar cadena (strcmp); la cual compara el nombre solicitado por teclado con los nombres asignados al arreglo previamente, en caso de que coincida muestra el primer mensaje de bienvenida, de lo contrario muestra el segundo mensaje.

Figura 3 Salida en pantalla de progra5.cpp

Page 34: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

34

Implementación de la función valor() con apuntadores como parámetros En el siguiente listado se muestra el manejo de la función valor(), por medio de apuntadores. Progra7.cpp #include <iostream.h> #include <conio.h> #include <stdio.h> #include <string.h> voidvalor(char *); int main() {

char cadena[81]; gotoxy(10,5); cout<< "ESCRIBA UNA CADENA: "; gets(cadena); gotoxy(10,7); valor(cadena); getch();

} void valor(char *apuntador) {

while(*apuntador) cout<< *apuntador++ ;

}

Analizando este listado y comparándolo con el progra6.cpp se observa que la diferencia radica en el parámetro de la función llamada valor() que par este caso es un apuntador de tipo char que guarda una cadena y para el progra6.cpp es un arreglo de caracteres, que igualmente almacena una cadena y posteriormente despliega el resultado, tal como se puede evidenciar en la figura 7, que se muestra a continuación.

Page 35: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

35

Figura 4 Salida en pantalla de progra7.cpp

2.5 Apuntadores a Apuntadores Tal como se trató al inicio de capítulo, un apuntador también es una variable. Su dirección puede ser almacenada por otra variable apuntador del mismo tipo, por lo que puede hablarse de un apuntador a un apuntador. Esto puede difundirse para dos o más variables, como se observa en el ejemplo siguiente de apuntadores a apuntadores.

Implementación de apuntadores a apuntadores

Progra9.cpp

#include <iostream.h> #include <conio.h> int main() { int x, *a, **b, ***c ; // 1 clrscr(); a =&x ; // 2 *a = 100 ; // 3 b = &a ; // 4 **b += *a ; // 5 c = &b ; // 6 ***c += **b + *a ; // 7 cout<< " *a=" << *a << " \n" ; cout<< " **b=" << **b << " \n" ; cout<< "***c=" << ***c << " \n" ; getch(); }

Page 36: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

36

En el listado se analizan tres variables de tipo apuntador que apuntan a objetos de tipo entero, es decir que *a es un apuntador, **b es un apuntador a apuntador y ***c es un apuntador a apuntador a apuntador.

Análisis de Progra9.cpp En el listado del progra9.cpp se declaran tres variables de tipo apuntador que apuntan a datos de tipo entero, ellas son, *a, **b y **c. El apuntador a almacena la dirección de la variable x, luego a al apuntador a se le asigna el valor de 100, lo que indica que x vale 100, mientras que **b precedida de dos asteriscos indica que es una variable que apunta a un apuntador, para este caso b guarda la dirección de el puntero a, y ***c es un apuntador a apuntador a apuntador, lo cual puede simplificarse en que c guarda la dirección de b. El resultado del listado Progra9.cpp se puede visualizar en la Figura.

Figura 5 Salida en pantalla de progra9.cpp

Operaciones aritméticas con apuntadores

Se pueden realizar asignaciones entre punteros. int a = 15; int *p, *q; q = &a; p = q; /* se asigna la dirección que contiene q a p */ cout<<p; /* imprime la dirección almacenad en p. */

Se pueden operar solamente el +, el -, el ++ y el --. Int p; p = p + 1; p avanza un entero. p = p – 2; p retrocede dos enteros. p++; p apunta al siguiente entero. p--; p apunta al entero anterior.

Los punteros se pueden comparar. int a; int *b, *c; if (b + n > c) b = b +2;

Page 37: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

37

Como aplicación a las operaciones que se pueden realizar con apuntadores, se presenta el siguiente código en un programa que emplea los operadores (& y *). Progra10.cpp #include <iostream.h> #include <conio.h> int main() { clrscr(); int a; //a es un puntero int * ap; //ap es un apuntador a un puntero a = 7; ap= & a; //ap toma la dirección de a cout<<"la dirección de a es " <<&a; cout<<" \n el Valor de ap es " <<ap; cout<<"\n el valor de a es" <<a; cout<<"\n el valor de *ap es " << *ap; cout<<"\n\n\n Mostrando los valores de * y &" ; cout<<"\n &* ap = " <<&*ap; cout<<"\n *&ap = " << *&ap; getch(); return 0; }

Análisis de Progra10.cpp

Tal como se observa en la imagen es la salida en pantalla del programa en el que se aprecia la diferencia entre el valor de la variable a que devuelve un valor numérico igual a 7; mientras que la variable ap devuelve la dirección de memoria de a. Figura 6 Salida en pantalla de progra10.cpp

Page 38: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

38

3. OPERADORES DE C++ PARA LA GESTIÓN DINÁMICA DE MEMORIA

3.1 Operadores New y Delete

El lenguaje C++ cuenta con dos operadores preconstruidos, ellos son: New y Delete, por esta razón no se requiere incluir ninguna librería o archivo de cabecera para utilizarlos.

El operador New: Realiza una labor parecida a la de la función malloc() utlilizada en lenguaje C, asignando un bloque de memoria según sea requerido. El operador Delete: Libera un bloque de memoria asignada por New en tiempo de ejecución, de manera semejante a como lo hace la función free().

La sintaxis para el uso del operador new es: Apuntador = new tipo_de_dato;

Donde Apuntador es el nombre de la variable apuntador que va almacenar la

información para el cual se reserva la memoria, mientras que new es el operador

de C++ encargado de reservar un bloque de memoria, y tipo_de_dato es el tipo

de dato de la variable apuntador llamada Apuntador.

Este operador hace una petición al sistema operativo para que se le asigne un espacio en memoria, con el tamaño acorde al tipo de datos (vale la pena recordar la función sizeof), si este espacio está disponible, la operación regresa la dirección real que se otorga, en caso de no haber espacio regresa el valor de NULL (0), La sintaxis para liberar la memoria previamente asignada por new es através del operador delete asi: Delete Apuntador; La ejecución de este operador provoca que se libere espacio, dejando como valor indefinido, es decir el sistema operativo lo considera como memoria disponible. Hay una regla de oro utilizada por algunos autores, se refiere a que cuando se usa memoria dinámica, toda la memoria que se reserve durante el programa hay que liberarla antes de salir del programa. No seguir esta regla es una actitud muy irresponsable, y en la mayor parte de los casos tiene consecuencias desastrosas que atentan con la estabilidad de su sistema. No es bueno fiarse de lo que diga el

Page 39: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

39

compilador, de que estas variables se liberan solas al terminar la ejecución del programa, no siempre puede ser así.

Aplicación de los operadores New y Delete Se presenta un ejemplo como aplicación de los operadores de C++, utilizados para asignar y liberar memoria dinámicamente. El siguiente muestra un ejemplo de aplicación de los operadores new y delete. Progra15.cpp #include <iostream.h>//1 #include <conio.h> //2 using namespace std; int main() //3 { //4 int *numero; //6 numero = new int ; //7 *numero = 10 ; //8 cout<<"VALOR DE NUMERO\n\n"; //9 cout<<"El resultado de numero es:" <<*numero ; //10 delete numero ; //11 getch(); //12 } //13

En el listado llamado Progra15.cpp, se supone que la reservación será exitosa porque existe espacio suficiente en el montículo.

Del listado se puede analizar lo siguiente:

En las líneas 1 y 2 se incluyen las librerías requeridas para la ejecución del programa sin errores de compilación y ejecución. En la línea 3 se incluye la función principal main() la cual no retorna ningún valor por estar declarada como tipo void. La línea 4 se incluye la llave que da apertura a la función principal. En la línea 6 se declara un puntero llamado número y es de tipo entero. En la línea 7 se reserva un bloque de memoria dinámicade 2 bytes para manejarlo por medio de número. En la línea 8 Asigna el valor 10 al objeto apuntado por numero. En la línea 9 se despliega un mensaje en pantalla. En la línea 10 se despliega el contenido del objeto apuntado por numero. La línea 11, libera el espacio de memoria asignado o manejado por numero. En la línea 12 se incluye la función getch(), la cual hace una parada del programa a la espera que se presione una tecla para finalizar la ejecución del programa.

Page 40: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

40

Finalmente la línea 13, se incluye la llave que cierra las instrucciones que hacen parte de la función principal.

El resultado de la salida en pantalla se puede visualizar en la Figura8.

Figura 7 Salida en pantalla de progra15.cpp

Pero ¿quién asegura que el espacio requerido por new está disponible?. Para controlar esta situación y evitar un mensaje de error por parte del sistema en tiempo de ejecución, en el listado siguiente se propone una nueva versión del programa. Implementación de New para verificación de memoria

Progra16.cpp

#include <iostream.h> #include <stdlib.h> #include <conio.h> int main() { int *numero; if((numero = new int)==NULL) { cout<< "NO hay espacio suficiente\n"; exit(1); } *numero=20 ; cout<<"Resultado\n\n"; cout<< "El resultado de numero es:"<<*numero ; delete numero ; getch(); }

El resultado en pantalla de Progra16.cpp se puede visualizar en la Figura 9.

Page 41: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

41

Figura 8 Salida en pantalla de progra16.cpp

Cuando se utiliza new para reservar memoria para un vector, el tamaño del vector se sitúa entre corchetes, siguiendo al tipo:

int *intvector; intvector = new int [20]; y se libera: delete [ ] intvector;

Otro caso a considerar es la reserva de memoria con el operador new para un arreglo, un ejemplo sería la reserva de memoria para crear un arreglo de 25 elementos de tipo double, en el montículo, puede declararse como: Double *numero; numero = new double[25];

De igual manera en su forma equivalente se tiene:

double *numero = new double[25]; En este ejemplo, se está declarando a número como un apuntador a variables dinámicas de tipo doble; al tiempo que se le asigna el valor retornado por new. El valor retornado por new es la dirección del inicio de un bloque de memoria del tamaño requerido para almacenar 25 elementos de tipo double. En caso de que el montículo no disponga del espacio requerido, new retorna el valor NULL (nulo). 3.2 Entorno de desarrollo IDE Falcon c++ Falconc++ es un IDE muy sencillo, moderno, diseñado para estudiantes, y no por

ello menos potentes que cualquier otro IDE profesional, practico e intuitivo y fácil

de manejar, corre en Pc’s bajo Windows de 32 y 64 bits, cosa que no ocurre con

algunas versiones del Borland y DevC++.

Este IDE tiene una interfaz muy sencilla, pero muy potente, el editor esta actualizado con las últimas novedades, permite insertar las palabras instrucciones en la medida que uno escribe, trae incorporado el compilador Mingw, y no hay necesidad de crear proyectos si no se requiere. También es portable, lo único que

Page 42: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

42

hay que hacer es copiar la carpeta Falcon C++ de archivos de programas(x86) a la memoria y el actualiza todas las rutas. En conclusión es un IDE para estudiantes, También tiene un controlador de paquetes para librerías no oficiales como la conio. Para mirar cómo se descarga e instala puede acceder alvídeotutorial en el siguiente link: https://www.youtube.com/watch?v=vbnXr75bXmA Lo pueden descargar en http://falconcpp.sourceforge.net

Figura 10 Pagina de descarga dei IDE Falcon C++

Figura 11 Interfaz de edición de Falcon C++

Page 43: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

43

Figura 12 Opciones de Compilación y ejecución

Vemos al compilador Falcon C++ en funcionamiento con una aplicación de la

memoria dinámica con un programa que permite el registro del nombre y el código

de un curso donde utilizamos una estructura llamada curso, el apuntador cred

como instancia de la estructura y funciones de insertar y visualizar manejadas a

través de un menú de opciones.

Progra17.cpp

/*

Tema: Gestión dinamica de memoria

Curso: 301305 Estructura de datos

Compilador: Falcon C++

Autor: Hermes Mosquera

*/

#include <stdlib.h>

#include <iostream>

using namespace std; // usa espacios de nombre estandar

// estructura curso

struct curso

{

char nombre[20];

char codigo[6];

Page 44: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

44

}*cred=NULL; // apuntador de tipo curso inicializado a NULL

// prototipo de las funciónes

void insertar();

void visualizar();

//Función principal

int main()

{

int opcion;

do{

system ("cls");

cout<<"ADMINISTRAR CURSOS\n\n";

cout<<"\n1.Registrar cursos ";

cout<< "\n2.Listar cursos ";

cout<< "\n3. Salir";

cout<<"\n\nIngrese la opcion:";

cin>>opcion;

switch (opcion)

{

case 1: insertar();

break;

case 2: visualizar(); // llamado de la función visualizar

break;

case 3: delete cred; // liberación de memoria

break;

default: cout<<"Opcion incorrecta";

break;

}

}while (opcion != 3);

system("PAUSE");

return EXIT_SUCCESS;

}

// definicion de la función que inserta los datos

void insertar()

{

cred = new curso;

cout<<"\nRegistrar el curso ";

cout<<"\n Nombre del curso : ";

Page 45: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

45

cin>> cred->nombre;

cout<<"Codigo del curso : ";

cin>> cred->codigo;

}

//definición de la función visualizar

void visualizar()

{

cout<<"\nCURSO REGISTRADO ";

cout<<"\nNombe : " << cred->nombre;

cout<<"\nCodigo : "<< cred->codigo;

cout<<endl;

system("pause");

}

El resultado en pantalla de Progra17.cpp se puede visualizar en la Figura 13

Figura 13 Salida en pantalla del progra17.cpp menú de opciones

Figura 14 Salida en pantalla del progra17.cpp Opcione1 Registrar cursos

Page 46: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

46

Figura 15 Salida en pantalla del progra17.cpp Opcion2 Listar cursos

Actividades de Autoevaluación

Ejercicio 1. Teniendo en cuenta la conceptualización y la aplicabilidad en el campo de la programación frente al uso de las variables estáticas y las variables dinámicas, realice un cuadro comparativo de las características, ventajas y desventajas. Ejercicio 2. Se requiere gestionar cadenas de caracteres, a través de variables de tipo char, establezca diferencias para la declaración y definición de variables estáticas y las variables dinámicas (Apuntadores) para este tipo de datos. Ejercicio 3. Determinar las reglas del funcionamiento de los operadores new y delete e identifique las principales diferencias entre la utilización de new y delete, frente a la utilización de malloc() y free(). Ejercicio 4. Aplicación de operaciones con apuntadores. Teniendo en cuenta los fundamentos teóricos a cerca de las operaciones que se pueden realizar con apuntadores, documente cada línea de código de los siguientes enunciados. Enunciado 1 No. de Líneas de código int P = 10; // 1 int *x, *y; // 2 y = &P; // 3 x = y; // 4 cout<< “El resultado de x es :” << x ; // 5

Page 47: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

47

Enunciado 2 Intpunt; // 1 punt = punt + 1; // 2 punt = punt – 2; // 3 punt++; // 4 punt--; // 5 Ejercicio 5. Analice el siguiente código que es una aplicación de apuntadores a apuntadores, documente cada una de las 10 líneas de código y exprese el resultado de cada una de las variables. Enunciado 3 No. de Líneas de código int main() { int m, *h, **s, ***q ; // 1 clrscr(); h =&m ; // 2 *h = 80 ; // 3 s = &h ; // 4 **s += *h ; // 5 q = &s ; // 6 ***q += **s + *h ; // 7 cout<< " *h=" << *h << " \n" ; //8 cout<< " **s=" << **s << " \n" ; //9 cout<< "***q=" << ***q << " \n" ; //10 getch(); } Ejercicio 6. Implementar un programa que asigne memoria con new y delete, para un arreglo de estructuras, el cual desea llevar los registros básicos de 5 mascotas, como: raza, nombre, color y edad Ingresados por teclado, además de determinar en tiempo de ejecución el tamaño del arreglo a utilizar.

Ejercicio 7. Implemente un programa que imprima los datos básicos de un automóvil (Marca, modelo, color, cilindraje) usando una estructura llamada automóvil, incluya variables de tipo apuntador, aplique los operadores New y Delete para la gestión dinámica de memoria.

Page 48: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

48

Fuentes Bibliográficas

AGUILAR, Luis (2003). Fundamentos de programación, algoritmos, estructura de datos y Objetos, Tercera edición. España:McGRAW-HILL. AGUILAR, Luis (200). Programación en C++, Algoritmos, estructura de datos y Objetos. España:McGRAW-HILL. AGUILAR, Luis (2003). Fundamentos de programación, algoritmos, estructura de datos y Objetos Tercera edición. España:McGRAW-HILL. AGUILAR Luis, ZAHONERO Martínez (2004). Algoritmos y Estructuras de Datos. Una perspectiva en C. Madrid-España: McGraw-Hill. BROOKSHEAR, J. Glenn (1995). Introducción a las ciencias de la Computación (Cuarta Edicón). Edición Española: Addison-Wesley Iberoamericana. DEYTEL Y DEYTEL(1999). Como programa C++. Segunda Edición. Mexico D.F: Prentice Hall. McGRAW-HILL. FARREL, Joyce (2000). Introducción a la programación lógica y diseño. Mexico D.F: Thomson. KENNETH C, Louden (2004). Lenguajes de programación. Segunda edición. MexicoD.F: Thomson. ESPINOZA, David (2004). Curso básico de Algoritmia. Consultado en Octubre, 24 de 2008 en http://www.geocities.com/david_ees/Algoritmia/curso.htm. MENDEZ, Justo (2004). Las tendencias en los lenguajes de programación. Consultado en Noviembre de 2008 en http://www.ilustrados.com/publicaciones/EpZVVEZpyEdFpAKxjH.php. CACERES, Abdiel (2005). Estructuras de datos en C++. Consultado en Febrero 25

de 2009 en http://computacion.cs.cinvestav.mx/~acaceres/courses/estDatosCPP/

ALGORITMIA.NET (2003). Grafos. Consultado en Noviembre de 2008 en http://www.algoritmia.net/articles.php?id=18. FUENTES, Arenas (1997). Reserva dinámica de Memoria. Consultado en Octubre 23 de 2008 en http://www.pablin.com.ar/computer/cursos/c1/allocate.html.

Page 49: Entornos de Programacion C

INTRODUCCIÓN A LA ESTRUCTURA DE DATOS Aplicación de los entornos de desarrollo C++

49

TEJADA, Hector (2005). Asignación dinámica de Memoria y estructuras dinámicas. Consultado en Octubre 23 de 2008 en http://www.fismat.umich.mx/mn1/manual/node10.html. DAVINSON, Steven (2001). Función CallocAnsi C. Consultado en Junio 23 de 2009 en http://www.conclase.net/c/librerias/funcion.php?fun=calloc. SOTO, Lauro (2005). Manejo de Memoria. Consultado en Junio 23 de 2009 en http://www.programacionfacil.com/estructura_de_datos/manejo_de_memoria.