Si requerimos almacenar N datos, uno podría declarar variables llamadas x1, x2, …, xN. Sin embargo, esto suele ser impráctico, ya que no es posible generalizar ciertas tareas para que se apliquen a todas las variables.
Considere, por ejemplo, el problema de estimar el histograma de serie de tiros de dado: en cada tiro el valor obtenido está entre 1 y 6. Después de N tiros, deseamos saber cuántas veces cayó 1, 2, 3, etc.
Histograma: solución ingenua int main() { int h1, h2, h3, h4, h5, h6; int i, x, N = 1000; h1 = h2 = h3 = h4 = h5 = h6 = 0; for (i = 0; i < N; i++) { x = rand() % 6 + 1; switch (x) { case 1: h1++; break; case 2: h2++; break; case 3: h3++; break; case 4: h4++; break; case 5: h5++; break; case 6: h6++; break; } }
cout << “Tabla de frecuencias:” << endl; cout << “h(1) = “ << h1 << endl; cout << “h(2) = “ << h1 << endl; cout << “h(3) = “ << h1 << endl; cout << “h(4) = “ << h1 << endl; cout << “h(5) = “ << h1 << endl; cout << “h(6) = “ << h1 << endl; return 0; }
Arreglos Una mejor solución consiste en declarar un arreglo, el cual consiste en un grupo de variables del mismo tipo y con el mismo nombre, pero que se distinguen mediante un subíndice entero.
La forma de declarar un arreglo en C/C++ es:
tipo_datos nombre_arreglo[numero_elementos];
Arreglos En C/C++, los elementos de un arreglo de tamaño N están indexados a partir de cero hasta N-1.
Para acceder a los elementos individuales de un arreglo, se escribe el nombre del arreglo seguido de el subíndice del elemento entre corchetes.
Ejemplo:int a[3];a[0] = 5;a[1] = 8;a[2] = a[0] * a[1];
Histograma: solución con arreglos int main() { int h[6]; int i, x, N = 1000; for (i = 0; i < 6; i++) { h[i] = 0; } for (i = 0; i < N; i++) { x = rand() % 6 + 1; h[x – 1]++; }
cout << “Tabla de frecuencias” << endl; for (i = 0; i < 6; i++) { cout << “h(“ << i+1 << “) = “ << h[i] << endl; } return 0; }
Precaución El compilador de C/C++ no verifica que los subíndices de los elementos de un arreglo estén dentro de los límites correspondientes.
El programador debe tener cuidado de no sobrepasar estos límites. De lo contrario, es posible que sobreescriba la memoria asignada a otras variables. Ejemplo: int main() { int a[10], x[10]; a[0] = 1; x[10] = 2; cout << a[0] << endl; return 0;}
Arreglos como argumentos de funciones Es posible pasar un arreglo como argumento de una función.
En la mayoría de los casos, es necesario también pasar como argumento el tamaño del arreglo.
Ejemplo:float promedio(float x[], int n);
Histograma: solución general void histo(float x[], int nx, int h[], float a, float b, int nbins) { int i, j; float binsize = (b – a) / nbins; for (i = 0; i < nbins; i++) { h[i] = 0; } for (i = 0; i < nx; i++) { j = (int)((x[i] – a) / binsize); if ((j >= 0) && (j < nbins)) h[j]++; } }
int main() { const int N = 1000; float x[N]; int i, h[6]; for (i = 0; i < N; i++) { x[i] = rand() % 6 + 1; } histo(x, N, h, 1, 6.1, 6); for (i = 0; i < 6; i++) { cout << “h(“ << i << “) = “ << h[i] << endl; return 0; }
Práctica Escriba una función llamada minmax() que tome como parámetros un arreglo de floats y su tamaño, así como cuatro variables por referencia: min, nmin, max, nmax. La función deberá encontrar el valor mínimo y máximo en el arreglo y guardarlos en min y max, respectivamente, así como los subíndices correspondientes en nmin y nmax.
Utilizando la función anterior, escriba otra función para normalizar los datos de un arreglo al rango [0,1] mediante la siguiente transformación:
Escriba un programa para probar las dos funciones anteriores, utilizando como datos de ejemplo un arreglo de números aleatorios entre -10 y 10.
Ejercicios Escriba una función que tome tres arreglos como entrada: x[], h[], y[], junto con sus respectivos tamaños nx, nh, ny. La función debe calcular la convolución de x y h, definida como:asumiendo que h[] vale cero fuera de sus límites. Escriba un programa de prueba que calcule la convolución de las señales [3, -1, 2, 4] y [-3, 1, 3, -1], considerando ny = nx + nh – 1. Verifique la conmutatividad de la convolución.
Escriba una función que tome como parámetros un arreglo de enteros y su tamaño. La función debe ordenar el arreglo de manera ascendente. Luego escriba otra función que utilice la anterior para encontrar la mediana de un arreglo de enteros. Escriba un programa para probar ambas funciones.
La entropía de un arreglo X[] se puede definir como:donde pi = hi / N, hi es el i-ésimo bin de un histograma de X, n es el número de bins, y N es el tamaño de X. Escriba una función que tome como argumentos un arreglo, su tamaño, y el número de bins, y devuelva la entropía del arreglo. Utilice las funciones histo() y minmax() vistas en clase. Escriba un programa de prueba.
Página siguiente |