introducción a la estructura de datos

Anuncio
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
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
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
LISTADO DE TABLAS
Tabla 1………………………………………………………………………………….30
Tabla 2………………………………………………………………………………….31
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
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
5
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
6
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
7
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
8
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
9
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
10
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
11
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
12
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
13
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
14
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
15
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
16
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
17
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
18
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
19
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++

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
20
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
Byte
Kilobyte
Megabyte
Gigabyte
Terabyte
Simbolo
B
Kb
Mb
Gb
Tb
Valor
8 bits
1.024 bytes
1.024 kilobytes
1.024 megabytes
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
unsignedchar
Char
short int
unsignedint
Int
unsignedlong
Enum
Long
Espacio memoria
8 bits
8 bits
16 bits
32 bits
32 bits
32 bits
16 bits
32 bits
Rango permitido
0 a 255
-128 a 127
-32,768 a 32,767
0 a 4,294,967,295
-2,147,483,648 a 2,147,483,647
0 a 4,294,967,295
-2,147,483,648 a 2,147,483,647
-2,147,483,648 a 2,147,483,647
21
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
Float
Doublé
long doublé
Void
32 bits
64 bits
80 bits
sin valor
3.4 x 10-38 a 3.4 x 10+38(6 dec)
1.7 x 10-308 a 1.7*10+308(15 dec)
3.4 x 10-4932 a 1.1 x 10+4932
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
Char
Short int
Float
Varchar
Datos
La letra X
El número 100
El número 125.12
La frase Aprenda usted mismo
Bytes requeridos
1
2
4
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.
22
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
23
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
24
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
25
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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 (*).
26
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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;
char *y;
double *r, *s;
x es un apuntador de tipo entero.
y es un apuntador de tipo carácter.
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.
27
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
28
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
29
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
30
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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<< " !!";
31
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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()
{
32
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
33
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
34
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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();
}
35
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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;
36
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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 = " << *≈
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
37
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
38
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
39
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
40
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
41
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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++
42
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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];
43
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
}*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 : ";
44
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
45
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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
int P = 10;
int *x, *y;
y = &P;
x = y;
cout<< “El resultado de x es :” << x ;
No. de Líneas de código
// 1
// 2
// 3
// 4
// 5
46
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
Enunciado 2
Intpunt;
punt = punt + 1;
punt = punt – 2;
punt++;
punt--;
// 1
// 2
// 3
// 4
// 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 ;
clrscr();
h =&m ;
*h = 80 ;
s = &h ;
**s += *h ;
q = &s ;
***q += **s + *h ;
cout<< " *h=" << *h << " \n" ;
cout<< " **s=" << **s << " \n" ;
cout<< "***q=" << ***q << " \n" ;
getch();
}
// 1
// 2
// 3
// 4
// 5
// 6
// 7
//8
//9
//10
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.
47
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
48
INTRODUCCIÓN A LA ESTRUCTURA DE DATOS
Aplicación de los entornos de desarrollo C++
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.
49
Descargar