Cuando un programa se "carga en la memoria" (es decir, cuando "abrimos un programa" desde el menú inicio o desde la linea de comandos) el sistema operativo le asigna un sector de la memoria de forma exclusiva. Ese sector de la memoria permite que el programa pueda ejecutarse y hacer lo que el usuario espera de él. Ahora bien, ese sector suele estar divido en tres sectores, estos son el sector de "texto", el de "datos" y el de "pila" (stack). Normalmente queda un espacio "libre" entre el sector de pila y el de datos dado que el programa (proceso) puede necesitar memoria adicional. El sistema operativo "conoce", al iniciarse el programa, la cantidad de memoria requierida, pero esto no siempre es así. A veces se dearrollan programas que no se sabe de antemano la cantidad de memoria requerida. Es aquí donde se necesita gestionar la memoria del "monton" que se encuentra fuera del área asignada a un programa específico. Este sector de la memoria está disponible para cualquier proceso (programa en ejecución) por eso se necesita manejarlo con sumo cuidado. Cuando se utiliza una parte de esta memoria es necesario liberarlos ni bien se deje de utilizarlos, de lo contrario pronto nos quedaremos sin ella. Imagine que cada programa utilice una parte de esta memoria y que no la libere después de cerrarse, esa memoria no va a estar disponible para otros procesos y, si todos los programas proceden de esta forma, la maquina indefectiblemente se "colgará".
Veamos un pequeño programa que utiliza la memoria dinámica. Se trata de encontrar la o las modas en una serie de datos.
En una serie de datos, hay valores que se repiten. El número de veces que aparece un determinado valor, es decir su frecuencia, en una serie de datos se llama modo o moda. En una determinada población (o espacio muestral) a veces sucede que hay más de un modo o moda.
De los tres parámetros de tendencia central, media aritmética, mediana y moda, la que presenta mayor dificultad para encontrarlos mediante programación, es la moda.
//buscaMultiModa.cpp
/*************************************
Armando B. VERA
Prof. de Matemática e Informática
*************************************/
#include <iostream>
using namespace std;
int main() {
int * a;
bool * id_a;
int *tmp;
int *tmpFrec;
int * moda;
int * frecuencia;
int tam=0;
int tamArray=0;
int f, m, t;
int cantModa=1;
cout << "\n\n\tIndique la Cantidad de datos a analizar: ";
cin >> tamArray;
a=new int[tamArray];
id_a=new bool[tamArray];
cout << "\n\n\tCarga de datos \n";
for(int i=0; i<tamArray;i++){
cout << "\n\tIngrese el " << i+1 <<"° número: ";
if(cin >> a[i]){
id_a[i]=true;
}
}
// --busca Moda
frecuencia=new int[1];
frecuencia[0]=0;
moda=new int[1];
for(int i=0;i<tamArray;i++){
if(id_a[i]==true){
m=a[i];
f=0;
}
// ------busco iguales y pongo como contabilizado
for(int j=0;j<tamArray;j++){
if(a[j]==m && id_a[j]==true){
id_a[j]=false;
f++;
}
}
// ------fin busco iguales
if(frecuencia[0]==f){
tam=0;
while(frecuencia[tam]==f && moda[tam]!=m){
tam++;
}
tmp=new int[tam];
tmpFrec=new int[tam];
for(int j=0;j<tam;j++){
tmp[j]=moda[j];
tmpFrec[j]=frecuencia[j];
}
delete [] moda;
delete [] frecuencia;
tam=tam+1;
moda=new int[tam];
frecuencia=new int[tam];
for(int j=0; j<tam-1;j++){
moda[j]=tmp[j];
frecuencia[j]=tmpFrec[j];
}
delete [] tmp;
delete [] tmpFrec;
moda[tam-1]=m;
frecuencia[tam-1]=f;
cantModa=tam;
} else {
if(frecuencia[0]<f){
delete [] moda;
delete [] frecuencia;
tam=1;
moda=new int[tam];
frecuencia=new int[tam];
moda[0]=m;
frecuencia[0]=f;
cantModa=1;
}
}
}
// --Fin busca moda
// Muestra el array en 5 columnas.
cout << "\n";
t=0;
for(int i=0;i<tamArray;i++){
if(t==5){
cout << "\n";
t=0;
}
cout << "\t" << a[i];// << id_a[i];
t++;
}
// ------Muestra la o las moda/s
cout << "\n\n";
cout << "\n\tModa \t Frecuencia";
cout << "\n\t---- \t ----------";
for(int i=0; i<cantModa;i++){
cout << "\n\t" << moda[i]<< " \t " <<frecuencia[i];
}
return 0;
}
En este caso, como no se sabe de antemano la cantidad de datos que se analizarán, indefectiblemente nos queda trabajar con memoria dinámica.
La captura de pantalla muestra una distribución multimodal.