UNIDAD 5: ARREGLOS
Arreglos
Definición Un arreglo es una colección de elementos del mismo tipo que se reconocen por un solo identificador. Para acceder a los elementos individuales de un arreglo se utiliza un subíndice que debe ser un número entero.
Arreglo con nombre a
Número de la posición de cada elemento
a[0 ]a[1 ]a[2 ]a[3 ]a[4 ]a[5 ]a[6 ]a[7 ]
56 56 91 0 -3224 100 62 12
Ejemplo int main(){ int n[ 10 ]; // n es un arreglo de 10 enteros // inicializa los elementos del arreglo n en 0 for ( int i = 0; i < 10; i++ ) //establece el elemento de la ubicaci贸n i en 0 n[ i ] = 0; cout << "Elemento" << setw(13)<< "Valor" << endl; //despliega el contenido de un arreglo n //en formato tabular for ( int j = 0; j < 10; j++ ) cout <<setw(7)<<j<<setw(13)<<n[j] << endl; return 0; // indica terminaci贸n exitosa } // fin de main
Inicializaci贸n de un arreglo #include <iostream> using std::cout; using std::endl; #include <iomanip> using std::setw; int main() {//utiliza una lista de inicializaci贸n para //inicializar el arreglo n int n[10]={32,27,64,18,95,14,90,70,60,37}; cout <<"Elemento"<<setw(13) << "Valor" << endl; //salida del contenido del arreglo n en formato tabular for ( int i = 0; i < 10; i++ ) cout<<setw(7)<<i<<setw(13)<<n[i]<<endl; return 0; // indica terminaci贸n exitosa } // fin de main
Otra inicializaci贸n Variable constante
int main() { // la variable constante se puede utilizar para //especificar el tama帽o del arreglo const int tamanoArreglo = 10; int s[tamanoArreglo];//el arreglo s tiene 10 elementos for (int i=0;i<tamanoArreglo;i++)//establece los valores s[ i ] = 2 + 2 * i; cout << "Elemento" << setw( 13 ) << "Valor" << endl; // muestra el contenido del arreglo s en formato tabular for ( int j = 0; j < tamanoArreglo; j++ ) cout << setw( 7 ) << j << setw( 13 ) << s[ j ] << endl; return 0; // indica terminaci贸n exitosa } // fin de main
Suma de un arreglo Suma los elementos de un arreglo
int main() { const int tamanoArreglo = 10; int a[tamanoArreglo] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int total = 0; // suma el contenido del arreglo a for ( int i = 0; i < tamanoArreglo; i++ ) total += a[ i ]; cout <<"El total de los elementos del arreglo es "<< total << endl; return 0; // indica terminaci贸n exitosa } // fin de main
Histograma int main() { const int tamanoArreglo = 10; int n[tamanoArreglo] = {19,3,15,7,11,9,13,5,17,1}; cout << "Elemento" << setw( 13 ) << "Valor" << setw( 17 ) << "Histograma" << endl; //para cada elemento del arreglo n, muestra una barra //en el histograma for ( int i = 0; i < tamanoArreglo; i++ ) { cout << setw( 7 ) << i << setw( 13 ) << n[ i ] << setw( 9 ); //despliega una barra for ( int j = 0; j < n[ i ]; j++ ) cout << '*'; cout << endl; // inicia la siguiente l铆nea de salida } // fin de la estructura for externa return 0; // indica terminaci贸n exitosa } // fin de main
La criba de Erat贸stenes int main(){ int N = 10000,i,j; int primo[N]; for(i = 0; i<N; i++) primo[i] = 1; for(i = 2; i<=N/2; i++){ for(j = 2; j<=N/i; j++) if(i*j<N) primo[i*j] = 0; } for(i = 0; i<N; i++) if(primo[i]) cout << " " << i; getch(); return 0; }
Tarea Haga un programa que calcule la desviaciòn estandar de un arreglo de valores. n
xi i 1
n 1 n
xI x
i 1
n
x
2
Paso de arreglos a funciones Para pasar un arreglo a una función debemos conocer su tamaño para poder saber cuantos elementos se van a procesar. Para esto declare la función con un parámetro extra para pasar el número de elementos a la función
Ejemplo #include <iostream.h> #include <conio.h> double promedio(double a[], int tamanio){ double suma = 0; for(int i=0; i<tamanio; i++) suma += a[i]; return suma/tamanio; } int main(){ double x[] = {3.5, 6.3, 4.5, 7.5, 5.4}; cout << promedio(x,5) << endl; getch(); return 0; }
Modificaci贸n de elementos mediante funciones En C los arreglos siempre se pasan por referencia de tal manera que siempre es posible modificar los elementos dentro de una funci贸n. Ejemplo, inicia un arreglo con valores aleatorios entre 0 y 99.
void inicia(double a[], int tamanio){ for(int i=0; i<tamanio; i++) a[i] = rand()%100; }
Ordenaciรณn La operaciรณn de ordenaciรณn es de las mรกs comunes en computaciรณn.
#include <iostream.h> #include <conio.h> void Burbuja(int a[],int tam){ for(int i = 0; i< tam - 1 ; i++) for(int j = i; j< tam;j++) if(a[i]>a[j]){ int temp = a[i]; a[i]=a[j]; a[j]=temp; }}
int main(){ int b[20] = {1,2,3,2,4,3, 5,6,3,7,8,9, 4,5,3,5,3,4,5,6}; Burbuja(b,20); for(int i =0; i<20; i++) cout << b[i] << endl; getch(); return 0; }
BĂşsqueda Otra operaciĂłn importante es la bĂşsqueda de el valor de un elemento dentro de un arreglo.
int BusquedaLineal(int a[],int b,int tam){ for(int i = 0; i< tam; i++) if(a[i]==b) return n; return -1; }
Arreglos de dos dimensiones Los arreglos de dos dimensiones se declaran de acuerdo al esquema tipo variable[renglones][columnas]; Ejemplo int a [5][4];
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
a[3][0]
a[3][1]
a[3][2]
a[3][3]
a[4][0]
a[4][1]
a[4][2]
a[4][3]
inicializaci贸n int a[5][4] = {{2,3,4,2},{2,0,6,1}, {3,5,5,0},{2,2,1,1},{3,2,5,6}};
2
3
4
2
2
0
6
1
3
5
5
0
2
2
1
1
3
2
5
6
inicializaci贸n (cont.) int a[5][4] = {{2,3},{1}, {3,5,5,0},{2},{3}};
2
3
0
0
1
0
0
0
3
5
5
0
2
0
0
0
3
0
0
0
ejemplo Debe especificarse void despliegaArreglo( int a[][ 3 ] ){ for ( int i = 0; i < 2; i++ ) {// for para cada fila for ( int j = 0; j < 3; j++ )//despliega los valores de columnas cout << a[ i ][ j ] << ' '; cout << endl; // inicia una nueva l铆nea de salida } // fin de la estructura for externa } // fin de la funci贸n despliegaArreglo int main(){ int arreglo1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } }; int arreglo2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 }; int arreglo3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } }; cout << "Los valores del arreglo1 por fila son:" << endl; despliegaArreglo( arreglo1 ); cout << "Los valores del arreglo2 por fila son:" << endl; despliegaArreglo( arreglo2 ); cout << "Los valores del arreglo3 por fila son:" << endl; despliegaArreglo( arreglo3 ); return 0; // indica terminaci贸n exitosa } // fin de main
Operaciones con matrices Se puede utilizar la técnica vista anteriormente para matrices de tamaño fijo. Si las matrices que se van a manipular son de 3x3 la función para sumar podría ser
void Suma(double a[][3],double b[][3],double c[][3]){ for(int i = 0; i< 3 ; i++) for(int j = 0; j< 3 ; j++) c[i][j] = a[i][j] + b[i][j]; }
Otras operaciones de matrices void Resta(double a[][3],double b[][3],double c[][3]){ for(int i = 0; i< 3 ; i++) for(int j = 0; j< 3 ; j++) c[i][j] = a[i][j] - b[i][j]; }
void Multiplica(double a[][3],double b[][3],double c[][3]){ for(int i = 0; i< 3 ; i++) for(int j = 0; j< 3 ; j++){ c[i][j] = 0; for(int k = 0; k< 3 ; k++) c[i][j] += a[i][k]*b[k][j]; } }
Otras operaciones de matrices impresi贸n de una matriz de 3x3
void print(double a[][3]){ for(int i = 0; i< 3 ; i++){ for(int j = 0; j< 3 ; j++) cout << a[i][j] << " "; cout << endl; } cout << endl; }
Tarea #1 Escriba una funci贸n para obtener la traspuesta de una matriz de 3x3.
Escriba una funci贸n que calcule la suma de todos los elementos de una matriz de 3x3 Escriba una funci贸n que calcule la traza de una matriz de 3x3
Calcule con esta tarea y lo anterior lo siguiente: a + b, a - b, a * b, traspuesta(a), traspuesta(b), traza(a), traza(b), sumatotal(a), sumatotal(b),
a
b
4 5.6 6.5 7.5 12 4
8.7 6.3 2.3 3.4 8.7 5.4 0 9 5
6 2.3 0
Matrices de cualquier tamaño Es conveniente manejar las matrices de tamaño arbitrario mediante un vector de una sola dimensión. La matriz que se pasa como parámetro se pasa como un apuntador. Las funciones para manipular matrices se definen para un tamaño máximo de elementos.
Ejemplo suma Tamaño real de las matrices
Debe especificarse máximo tamaño
void sumaMat(int nrRow,int nrCol, int maxCol, float *mat1, float *mat2, float *mat3) { int i, j; for( i=0; i<nrRow; i++ ) for( j=0; j<nrCol; j++ ) mat3[i*maxCol + j] = mat1[i*maxCol + j] + mat2[i*maxCol + j]; // o: mat3[i*maxCol + j] = *(mat1 + i*maxCol + j) // + *(mat2 + i*maxCol + j) }
producto
void prodMat(int nrRow,int nrCol, int maxCol,float *mat1, float *mat2, float *mat3) { int i, j, k; for( i=0; i<nrRow; i++ ) for( j=0; j<nrCol; j++ ){ mat3[i*maxCol + j] = 0; for( k=0; k<nrCol; k++ ) mat3[i*maxCol + j] += mat1[i*maxCol + k] * mat2[k*maxCol + j]; } }
Impresi贸n
void printMat(int nrRow,int nrCol, int maxCol,float *mat) { int i, j; for( i=0; i<nrRow; i++ ){ for( j=0; j<nrCol; j++ ) cout << mat[i*maxCol + j] << " "; cout << endl; } cout << endl; }
Ejemplo de programa principal int main(void) { int row=4, col=4; float add, maxRow; float a[MAXROW][MAXCOL] = {{1,2,3,4},{3,2,1,1},{4,3,7,6},{4,5,5,6}}; float b[MAXROW][MAXCOL] = {{4,5,7,1},{2,4,8,9},{3,3,0,0},{2,1,1,1}}; float c[MAXROW][MAXCOL]; printMat(row,col,MAXCOL,(float *) a); printMat(row,col,MAXCOL,(float *) b); sumaMat(row,col,MAXCOL,(float *) a,(float *) b,(float *) c); printMat(row,col,MAXCOL,(float *) c); getch(); return 0; }
ยกGracias!