Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SEPARATA Nro 01
Memoria Dinámica
Hasta ahora hemos trabajado con variables estáticas, las cuales no varian su tamaño
hasta la culminación del programa, desperdiciando espacio de memoria, en cambio
trabajar con memoria dinámica nos ofrece las siguientes ventajas:
Se crean las variables conforme se requieran y se liberan cuando ya no se
necesitan.
Optimiza el uso de la memoria.
Más rápido, dado que trabajamos con direcciones de memoria directamente.
Para trabajar con memoria dinámica es necesario comprender un nuevo tipo de dato
llamado puntero o apuntador.
Apuntadores o Punteros
entero
real
Datos Simples caracter
Dirección lógico
Un puntero ocupa 2 bytes de memoria en los tipos de memoria: Small y Tiny y 4 bytes
en los tipos de memoria: Large y Huge.
-1-
Estructura de Datos IV Ciclo
Sintaxis:
<tipo> * <nom_punt>
entero * px
En C/C++:
int *px;
3.- Representación:
a. Perdido: Estado del puntero cuando recien se declara. Tiene una dirección
aleatoria.
int * px;
px
b. Tierra: Estado del puntero al ser inicializado. Tiene una dirección Cero.
int * px;
px = NULL; (NULL es una constante que existe en C/C+)
px
px x
px es un puntero asignado a una variable estática llamada x.
int *px;
px = new int;
px
px es un puntero asignado a una variable dinámica anónima.
-2-
Estructura de Datos IV Ciclo
4. Operaciones:
int x;
int * px;
px = x;
*px = 10;
Creación
Para crear una variable dinámica se utiliza el operador new, la ventaja de este tipo de
variable es que se puede crear en el momento que se requiera y liberar (que significa
liberar el espacio de memoria que ocupaba la variable creada) cuando ya no se la
necesite.
Sintaxis:
Ejemplo:
int *px;
px
px está asignado a una variable creada dinámicamente, la cual no tiene nombre es por
ello que se le conoce como variable anónima y la única forma de acceder a ella es a
través del puntero px.
Se está creando una variable dinámica de tipo entero, esta variable ocupa 2 bytes en
memoria, por ser de tipo entero.
-3-
Estructura de Datos IV Ciclo
Liberación
Liberar una variable significa dejar libre el espacio de memoria que ocupa, la cual
puede ser usada por otra aplicación u otra variable, de esta forma se optimiza el uso de
la memoria y permite el desarrollo de aplicaciones más eficientes y rápidas.
Sintaxis:
delete <puntero>;
Ejemplo:
delete px;
6. Aclarando conceptos
px
puntero variable
o dato
dinámico
En memoria tanto puntero como variable asignada tienen una dirección y ocupan un
espacio de memoria.
Dirección de
memoria
05F0
px 09F2
09F2 valor
Variable
20
dinámica
dirección
-4-
Estructura de Datos IV Ciclo
Puntero
Valor : 09F2 px
Dirección : 09F2 px
Variable o Dato
Valor : 20 *px
int *px;
px = new int;
*px = 20;
scanf(“%d”, px);
En este caso colocamos directamente px, como segundo argumento dado que la
sintaxis de la función scanf requiere de la dirección de la variable, mas no
directamente la variable.
-5-
Estructura de Datos IV Ciclo
-6-
Estructura de Datos IV Ciclo
int *pA;
pA = new int[5];
int i;
1° forma:
2º forma:
for(i = 0; i < 5; i++)
{
printf(“\npA[%d]: ”, i+1);
scanf(“%d”, &pA[i]);
}
-7-
Estructura de Datos IV Ciclo
int i;
1° forma:
for(i = 0; i < 5; i++)
printf(“\npA[%d]: %d”, i+1, *(pA+i));
2º forma:
for(i = 0; i < 5; i++)
printf(“\npA[%d]: %d”, i+1, pA[i]);
-8-
Estructura de Datos IV Ciclo
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#define MAX 10
void main()
{
clrscr();
// Menú de Opciones
do{
clrscr();
cout<<"\n\n\t\t\MENU DE OPCIONES\n\n";
do{
cout<<"\n\n\t\t ¨QUE OPERACION DESEA REALIZAR\n";
cout<<"\n\n\t\t\t OPCIÓN: ";
cin>>Resp;
}while(! (Resp > 0 && Resp <= 10) );
-9-
Estructura de Datos IV Ciclo
switch(Resp){
do{
cout<<"\n\t Ingrese el número de elementos:";
cin>>N;
}while(!(N > 0 && N <= MAX));
getch();break;
Men = pa[0];
getch(); break;
- 10 -
Estructura de Datos IV Ciclo
if(Sw == 0)
cout<<" \n El número NO existe";
getch();break;
- 11 -
Estructura de Datos IV Ciclo
case 7: clrscr();cout<<"\n\t\t\t***Insertar***\n\n";
do
{
cout<<"Ingrese valor a insertar: ";
cin>>X;
}while(!(X > 0));
pa[Pos - 1] = X;
N++;
cout<<”\nNuevo arreglo\n”;
for(i = 0; i < N; i++)
cout<<"\n Elemento"<<”[”<<i+1<<”]: ”<<pa[i];
getch();
}
else
{
cout<<"\n No hay espacio ";
getch();
}
break;
case 8: clrscr();cout<<"\n\t\t\t***Eliminar***\n\n";
if(N > 0)
{
do
{
cout<<"\n Ingresar la posición a eliminar: ";
cin>>Pos;
}while(! (Pos > 0 && Pos <= N) );
N--;
- 12 -
Estructura de Datos IV Ciclo
cout<<”\nNuevo arreglo\n”;
for(i = 0; i < N; i++)
cout<<"\n Elemento"<<”[”<<i+1<<”]: ”<<pa[i];
getch();
}
else
{
cout<<" \n No hay elementos a eliminar ";
getch();
}
break;
- 13 -
Estructura de Datos IV Ciclo
struct Alumno
{ char Codigo [MAXCOD];
char Nombre [LIM];
int Edad;
int Notas [MAXNO];
};
Luego creamos el puntero que debe ser de tipo Alumno, para después crear con el
operador new el registro dinámico Alumno.
Diagrama de Datos
Código[ ] Edad
pA
Nombre[ ] Notas[ ]
- 14 -
Estructura de Datos IV Ciclo
1º forma:
( * pA) . Edad = 20;
valor
2º forma:
pA Edad = 20;
dirección
Ejemplos:
pA Edad = 18;
b. Copiando cadenas
printf("Ingrese nombre:");
scanf (“%s”, pA Nombre);
cout<<”Ingrese Nombre:”;
cin>>pANombre;
Operaciones Básicas
pACodigo[0] = NULL;
pANombre[0] = NULL;
pAEdad = 0;
for(int i = 0; i < MAXNO; i++)
pANotas[i] = 0;
- 15 -
Estructura de Datos IV Ciclo
delete pA;
- 16 -
Estructura de Datos IV Ciclo
#include<conio.h>
#include<iostream.h>
#include<dos.h>
#include<ctype.h>
#include<stdio.h>
#define MAXCOD 11
#define LIM 50
#define MAXSEX 2
struct Alumno
{
char Codigo[MAXCOD];
char Nombre[LIM];
int Edad;
char Telefono [8];
char Direccion[LIM];
int Sexo; //Campo Categorizado
};
char Sexo[MAXSEX][10]={"Femenino","Masculino"};
void main()
{
clrscr();
Alumno*pA;
pA=new Alumno;
pA->Codigo[0]=NULL;
pA->Nombre[0]=NULL;
pA->Edad=0;
pA->Telefono[0]=NULL;
pA->Direccion[0]=NULL;
pA->Sexo=0;
//Lectura de Datos
cout<<"\n\tBIENVENIDOS A LA UNIVERSIDAD SANTO TORIBIO DE MOGROVEJO"<<"\n";
getch();
- 17 -
Estructura de Datos IV Ciclo
do{
gotoxy(22,13);cout<<" Edad : "; clreol();
cin>>pA->Edad;
}while( !(pA->Edad >= 19 && pA->Edad <= 30));
do{
gotoxy(22,16);cout<<" Sexo[0:Femenino 1:Masculino]: "; clreol();
cin>>pA->Sexo;
}while(!(pA->Sexo == 0 || pA->Sexo == 1));
clrscr();
getch();
delete pA;
- 18 -
Estructura de Datos IV Ciclo
Diagrama de Datos
[]
Código[ ] Edad
pA
Primer Alumno
Nombre[ ] Notas[ ]
0
Código[ ] Edad
Código[ ] Edad
Nombre[ ] Notas[ ]
2 Tercer Alumno
...
- 19 -
Estructura de Datos IV Ciclo
cout<<”Nombre: “<<pA[0].Nombre;
Operaciones Básicas
- 20 -
Estructura de Datos IV Ciclo
delete [ ] pA;
- 21 -
Estructura de Datos IV Ciclo
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<ctype.h>
#define MAX 10
#define MAXCOD 11
#define LIM 50
#define MAXSEX 2
struct Alumno
{
char Codigo[MAXCOD];
char Nombre[LIM];
int Edad;
int Sexo; //Campo categorizado
char Direccion[LIM];
char Telefono[8];
};
void main()
{
clrscr();
int Rpta;
int May=0,i,j,N=0,c=0,v=0,Suma=0;
float Prom;
- 22 -
Estructura de Datos IV Ciclo
for(i=0;i<MAX;i++)
{
pA[i].Codigo[0]=NULL;
pA[i].Nombre[0]=NULL;
pA[i].Edad=0;
pA[i].Sexo=0;
pA[i].Direccion[0]=NULL;
pA[i].Telefono[0]=NULL;
}
//Menú de Opciones
do
{
clrscr();
cout<<"\n\n\t\t\MENU DE OPCIONES\n\n";
cout<<"\n\t1.-Leer datos \n";
cout<<"\n\t2.-Promedio de las Edades \n";
cout<<"\n\t3.-Mayor Edad \n";
cout<<"\n\t4.-Cuántos alumnos hombres y mujeres hay \n";
cout<<"\n\t5.-Ordenar por el campo Nombre en forma ascendente\n";
cout<<"\n\t6.-Mostrar Alumnos\n";
cout<<"\n\t7.-Salir del Programa \n";
do{
cout<<"\n\n\t\t ¨¿QUE OPERACION DESEA REALIZAR? \n";
cout<<"\n\n\t\t\t OPCION: ";
cin>>Rpta;
}while(! (Rpta > 0 && Rpta <= 7) );
switch(Rpta)
{
case 1:clrscr();cout<<"\n\t\t\t***Lectura de datos***\n\n";
do{
cout<<"\n\t Ingrese el número de alumnos: ";
cin>>N;
}while(!(N > 0 && N <= MAX));
- 23 -
Estructura de Datos IV Ciclo
for(i=0;i<N;i++)
{
cout<<"\n\n\t alumno"<<i+1;
cout<<"\n Codigo: ";
cin>>pA[i].Codigo;
cout<<"\n Nombre: ";
gets (pA[i].Nombre);
do
{
cout<<"\n**Edad(Entre 16 a 59): ";
cout<<"\n Edad: ";
cin>>pA[i].Edad;
}while(!(pA[i].Edad>15 && pA[i].Edad<60));
do
{
cout<<"\n Sexo[0:Femenino 1:Masculino]: ";
cin>>pA[i].Sexo;
}while(!(pA[i].Sexo==0 || pA[i].Sexo== 1));
cout<<"\n Direccion: ";
gets(pA[i].Direccion);
cout<<"\n Telefono: ";
cin>>pA[i].Telefono;
}
break;
for(i=0;i<N;i++)
if(pA[i].Edad == May)
cout<<"\n\n Alumno: "<<pA[i].Nombre;
getch();break;
- 24 -
Estructura de Datos IV Ciclo
for(i=0;i<N;i++)
{
if(pA[i].Sexo == 0)
c++;
else
v++;
}
cout<<"\n\n\t**El número de alumnos hombres es:"<<v;
cout<<"\n\n\t**El número de alumnos mujeres es:"<<c;
getch();break;
case 6: clrscr();cout<<"\n\t\t\t***Mostrar***\n\n";
for(i = 0; i < N; i++)
{
cout<<"\n\n***Alumno "<<i+1<<"***\n";
cout<<"\n Codigo: "<<pA[i].Codigo;
cout<<"\n Nombre: "<<pA[i].Nombre;
cout<<"\n Edad: "<<pA[i].Edad;
cout<<"\n Sexo: "<<Sexo[pA[i].Sexo];
cout<<"\n Direccion: "<<pA[i].Direccion;
cout<<"\n Telefono: "<<pA[i].Telefono;
}
getch();break;
- 25 -
Estructura de Datos IV Ciclo
} while(Rpta != 7);
- 26 -