Sei sulla pagina 1di 52

Computación I

(CI2125/CI2127)

Teoría

Profesor: Alfonso Reinoza


C
ARREGLOS
Agenda
 Arreglos unidimensionales
 Arreglos multidimensionales – Matrices

3
Arreglos unidimencionales
 Supongamos que usted necesita almacenar 100 números
para calcularles su promedio y su varianza.
 Declararía 100 variables?
int x1, x2,…, x100;
 Un arreglo o vector, representa una colección finita de
datos del mismo tipo dispuestos en memoria de manera
consecutiva.

x[0] x[1] x[2] … x[i-1] x[i] x[i+1] … x[98] x[99]


4
Arreglos unidimencionales
 Para hacer referencia a un elemento en particular se utiliza
un índice que indica la posición del elemento. : x[i], el
cual puede ser usado como variable
 En C los subindices comienzan con 0 x se incrementan 1 a 1,
asi x[5] es el sexto elemento.
 El nombre del arreglo es un apuntador a la dirección del
primer elemento y el subindice es la posición dentro del
arreglo.

x

x[0] x[1] x[2] … x[i-1] x[i] x[i+1] … x[98] x[99]


5
Definición e inicialización
 Un arreglo se define usando una instrucción
declarativa:

tipo_dato nombre_arreglo [tamaño];

 Asigna memoria para tamaño elementos


 El subindice del primer elemento es 0

 El subindice del último elemento es tamaño -1

 tamaño es una constante entera

6
Ejemplo
int list[5]; list[0]
list[1]
list[2]
list[3]
list[4]

 Asigna memoria para 5 variables enteras


 Subindice del primer elemento es 0
 Subindice del último elemento es 4
 C no chequea limites en los arreglos.
 list[6] =5; /* puede dar un error por violar el tamaño
del arreglo */

7
Inicialización
 Pueden inicilaizarse cuando son declarados.

 double t[3] ={0.15, 0.25, 0.3};


 char list[5] = {‘h’, ’e’, ’l’, ’l’,
’o’};
 double vector[100] = {0.0}; /*
asigna cero a los 100 elementos */
 int s[] = {5,0,-5}; /*el tamaño de
s es 3 */

8
Asignando valores a un arreglo
Los lazos for son usados a menudo para asignar valores a un
arreglo. list[0]
list[1]
Ejemplo: list[2]
list[3]
int list[5], i; list[4]
for(i=0; i<5; i++){
list[i] = i;
} 0 list[0]
1 list[1]
2 list[2]
3 list[3]
4 list[4] 9
Asignando valores a un arreglo
Escribir un lazo for para asignar los siguientes
valores a un arreglo.

4 list[0]
int list[5], i;
3 list[1] for(i=0; i<5; i++){
2 list[2]
list[i] = 4-i;
1 list[3]
0 list[4]
}

10
Arreglos unidimencionales
 Supongamos que usted necesita almacenar 100 números para
calcularles su promedio y su varianza.

x[0] x[1] x[2] … x[i-1] x[i] x[i+1] … x[98] x[99]

int x[100]; for(i=0; i<100; i++)


float media=0.0, varianza=0.0; media += x[i];
for(i=0; i<100; i++){ media /= 100;
printf(“introduzca el elemento for(i=0; i<100;i++)
%d del arreglo”, i+1); varianza += pow(media - x[i],2);
scanf(“%d”, &x[i]); varianza /= 100;
11
}
Ejemplos
 Hallar el valor máximo en un arreglo.

x[0] x[1] yx2] … x[k-1] x[k] x[k+1] … x[98] x[99]

max = x[0];
for (i=1; i<100; i++){
if (x[i] > max)
max = x[i];
}
printf("Max = %d\n",max);
12
Ejemplos
 Calcular el promedio de los valores en un arreglo.

sum = 0;
for (i=0; i<100; i++){
sum = sum + x[i];
}
avg = (double)sum/100;
printf(“Avg = %lf\n", avg);

13
Ejemplos
 Calcular la suma de cada par en data y ecribirla en el
arreglo par.

data[0]=5
data[1]=7 } par[0]=12

}
data[2]=15 par[1]=20
data[3]=5 . …
… .
par[49]=15
… .

}
data[98]=3
data[99]=12 14
solución
int data[100], par[50], i;

for (i=0; i<100; i++)


data[i] = rand_int(0,100);

for (i=0; i<50; i++){


par[i]= data[2*i] + data[2*i+1];
}

15
Copiar arreglo1 en arreglo2 en
orden inverso
0 1 2 3 4 5
arreglo1 6 3 1 9 7 2

for(i=0; i< n; i++)


arreglo2[i] = arreglo1[n-1-i];
arreglo2 2 7 9 1 3 6

16
Arreglos y funciones
 Los elementos individuales de un arreglo
pueden pasarse como variables a una función.

void haga_nada(int a, int b)


{

}
int main(void)
{
int array[5] = {1,2,3,4,5};
haga_nada(array[2], array[4]);
}

Invoca haga_nada(3, 5);


17
Pase de arreglos a funciones
 Los arreglos siempre se pasan por referencia.
 Modificaciones al arreglo se reflejan en el programa principal (o el
que llama).

 El nombre del arreglo es la dirección del primer elemento.


 El tamaño máximo del arreglo debe ser especificado en el
momento de su declaración.
 Una función puede recibir arreglos de diferentes tamaños,
así que usualmente se pasa a la función el tamaño del
arreglo como otro argumento.

18
Pase de arreglos a funciones
sum_arr(int *, int n) /*Prototipo*/
main()
{
int a[2]={3, 5}; a[0]=3
int c; a[1]=5
c = sum_arr(a, 2) /*Llamado*/
} c=? 8
/*Definición*/
int sum_arr(int b[], int n)
{
b=
int i, sum=0; n=2
for(i=0; i < n; i++)
sum = sum + b[i];
i=0 1 2
return(sum); sum=0 3 8
} 19
Pase de arreglos a funciones
sum_arr(int *, int n) /*Prototipo*/
main()
{
int a[2]={3, 5};
a[0]=3 20
int c;
c = sum_arr(a, 2) /*Llamado*/ a[1]=5
}
c=? 8
/*Definición*/
int sum_arr(int b[], int n)
{ b=
int i, sum=0;
for(i=0; i < n; i++) n=2
sum = sum + b[i]; i=0 1 2
b[0] = 20;
return(sum);
sum=0 3 8
20
}
Ejemplo
¿Cuál es la salida del siguiente programa?
escriba(int [], int n); void escriba(int pdata[], int n)
modif(int [], int n); {
int main() int i;
{ for (i=0; i<n; i++)
printf("data[%d]=%d\n",
int data[10];
i,pdata[i]);
return;
for (i=0; i<10; i++) }
data[i] = i; void modif (int fdata[], int n)
{
escriba(data,10); int i;
modif (data,10); for (i=0; i<n; i++)
escriba(data,10); fdata[i] = 1;
return;
return(0);
}
} 21
max() y min()
double max(double x[], int n) double min(double x[], int n)
{ {
/* variables. */ /* Declare variables. */
int k; int k;
double max_x; double min_x;

/* Halle el valor máximo en /* Halle el valor mínimo


el arreglo */ en el arreglo. */
max_x = x[0]; min_x = x[0];
for (k=1; k <= n-1; k++) for (k=1; k < n; k++)
if (x[k] > max_x) if (x[k] < min_x)
max_x = x[k]; min_x = x[k];

/* Retorne el valor máximo /* Retorne el valor mínimo


.*/ .*/
return max_x; return min_x;
} }

22
media()

double media(double x[], int n)


{
/* variables. */
int k;
double sum;

/* Sumatoria. */
sum = x[0];
for (k=1; k<=n-1; k++)
sum = sum + x[k];

/* Retorne el valor medio.*/


return(sum/n);
}

23
Ordenar un arreglo - Burbuja
K 0 1 2 3 4 5
j 6 3 1 9 7 2

1 3 6 9 7 2

1 2 6 9 7 3

1 2 3 9 7 6

1 2 3 6 7 9

1 2 3 6 7 9
24
Sort de selección Solución 1
void burbuja(double x[], int n)
{
int k,j,m;
double temp;
for(k=0; k<=n-2; k++) {
m = k;
for(j=m+1; j<=n-1; j++)
if(x[j] < x[m]) m = find_min_pos(x, n, k);
m = j;
temp = x[k];
x[k] = x[m]; swap(x, k, m);
x[m] = temp
}
}
25
Sort de selección Solución 2
void burbuja(double x[], int n) void swap(double x[], int k,
{ int m)
int k, m; {
double temp;
for(k=0; k<=n-2; k++){ temp = x[k];
m = find_min_pos(x, n, k); x[k] = x[m];
swap(x, k, m); xm] = temp;
} return;
} }

int find_min_pos(double x[], int n, int k)


{
int j;
int m=k;
for (j=m+1; i<=n-1; j++)
if (x[j] < x[m])
m = j;
return(m);
}
26
Ejercicio – reverse un arreglo

0 1 2 3 4 5
6 3 1 9 7 2

2 7 9 1 3 6

27
Reverse un arreglo
void reverse(double x[], int n)
{
int i=0, j=n-1;
0 1 2 3 4 5
while (i<j)
6 3 1 9 7 2
{
swap(x,i,j);
i = i + 1;
j = j - 1; 2 7 9 1 3 6
}
return;
} 28
Busqueda lineal – lista desordenada
int buscar1(int x[], int n, int valor)
{
int i;
for(i=0; i < n; i++) {
if (x[i]== valor)
return (i);
}
return(-1);
}

29
Busqueda lineal – lista ordenada
int buscar2(int x[], int n, int valor)
{
int i;
for(i=0; i < n; i++) {
if (x[i]== valor)
return(i);
else if (x[i] > valor)
break;
}
return(-1);
}
x ordenado ascendentemente.
30
Busqueda lineal – lista ordenada
int buscar2(int x[], int n, int valor)
{
int i=0, pos=-1;
while(i<n && pos=-1 && x[i]<=valor)
{
if (x[i]== valor) pos=i;
i += 1;
}
return(pos);
}
x ordenado ascendentemente.
31
Intersección de conjuntos
 Supongamos que tenemos dos conjuntos A y B.
 Hallar el conjunto C de los elementos comunes a
A y B i.e. C es la intersección de A y B.

 A = {6, 3, 1, 9, 7, 2}
 B = {4, 2, 5, 6, 1, 8}
 C = {1, 2, 6}
3 6 4
9 1 5
7 2 8
32
Intersección de conjuntos
Usar arreglos para representar conjuntos

A 6 3 1 9 7 2 B 4 2 5 6 1 8

i=0 j=0 j=1 j=2 j=3


i=1
i=2 j=0 j=1 j=2 j=3 j=4 j=5 j=6
i=3 i=4 i=5 i=6 j=0 j=1 j=2 j=3 j=4

k=0 k=1 k=2 k=3

6 1 2
C
33
Intersección de conjuntos
int interseccion(int A[],int B[],
int C[], int n)
{
int i, j, k=0;
for(i=0; i < n; i++) {
for(j=0; j < n; j++) {
if (A[i]==B[j]){
C[k]=A[i];
k++;
break;
}
} 6 3 1 9 7 2
}
return(k);
} 4 2 5 6 1 8

6 1 2 34
Intersección de conjuntos
int interseccion(int A[],int B[],
int C[], int n)
{
int i, j, k=0, sw;
for(i=0; i < n; i++) {
j = 0;
sw = 1;
while(j<n && sw=1){
if (A[i]==B[j]){
C[k]=A[i];
k++;
sw = 0; 6 3 1 9 7 2
}
j++
} 4 2 5 6 1 8
}
return(k); 6 1 2 35
Matrices – arreglos bidimensionales
 Una matriz es un conjunto de elementos dispuestos en una cuadrícula de filas
y columnas.
 Se define mediante una instrucción de declaración de tipo.
tipo-dato nombre [filas][columnas]; 4
1
 int matrix[3][4];
0

fila 0 4 1 0 2 2
-1

fila 1 -1 2 4 3 2
4

fila 2 0 -1 3 1 3
0
-1
3

Columna 0 Columna 1 Columna 2 Columna 3 1

en memoria 36
Elementos de una matriz
int matriz[3][4];
 matriz tiene 12 elementos enteros

 matriz[0][0] elemento en primera fila primera

columna.
 matriz[2][3] elemento en última fila última

columna.
 matriz es la dirección del primer elemento.

 matriz[1] es ladirección de la fila 1

 matriz[1] es un arreglo unidimensional

37
Inicialización
int x[4][4] = { {2, 3, 7, 2},
{7, 4, 5, 9},
{5, 1, 6, -3},
{2, 5, -1, 3}};
int x[][4] = { {2, 3, 7, 2},
{7, 4, 5, 9},
{5, 1, 6, -3},
{2, 5, -1, 3}};

38
Inicialización
int i, j, matriz[3][4];
for (i=0; i<3; i++)
for (j=0; j<4; j++)
matriz[i][j] = i; matriz[i][j] = j;
j j
0 1 2 3
0 1 2 3
0 0 0 0 0
0 0 1 2 3
i 1 1 1 1
1
i 1 0 1 2 3
2 2 2 2 2 0 1 2 3
2
39
Ejemplo
 Escribir el bucle anidado para inicializar
una matriz como sigue

0 1 2 int i, j, A[4][3];
1 2 3 for(i=0; i<4; i++)
2 3 4 for(j=0; j<3; j++)
3 4 5 A[i][j] = i+j;

40
Matrices como argumentos de funciones
/*Prototipo*/
void print_m(int [][4], int , int)

/*Definición*/
/*Llamado*/ void print_m(int m[][],
int i, j, matriz[3][4]; int f, int c)
{
for (i=0; i<3; i++) int i,j;
for (j=0; j<4; j++) for (i=0; i < f; i++) {
matriz[i][j] = i; for (j=0; j < c; j++)
printf("%d ",m[i][j]);
print_m(matrix, 3, 4); printf("\n");
}
printf("\n");
return;
}
41
Máximo en matrices
 Hallar el máximo en int matriz[3][4]

0 1 2 3
int max = matriz[0][0];
0 0 1 0 2
for (i=0; i<3; i++)
1 -1 2 4 3
for (j=0; j<4; j++)
2 0 -1 3 1
if (matriz[i][j] > max)
max = matriz[i][j];

42
Hallar un valor en una matriz

 Encuentra el número de veces que un valor x aparece


en int matriz[3][4]

0 1 2 3
int count = 0;
0 0 1 0 2
for (i=0; i<3; i++)
1 -1 2 4 3
for (j=0; j<4; j++)
2 0 -1 3 1
if (matriz[i][j] == x)
count = count + 1;

43
Suma de matrices

0 1 2 3 0 1 2 3 0 1 2 3
0 3 0 3 3 0 1 0 2 0 3 -1 3 1
0
=
1 0 6 6 3
1 -1 2 4 3 + 1 1 4 2 0

2 2 0 4 4 0 -1 3 1 2 2 1 1 3
2

44
Suma de matrices

const int m =3;


const int n =4;
int A[m][n],
B[m][n],
S[m][n];
// initializar A y B

for (i=0; i<m; i++)


for (j=0; j<n; j++)
S[i][j]= A[i][j] + B[i][j];
45
Intercambiar dos filas

4 6 2 4 6 2
0 5 3 2 1 4
0 8 1 0 8 1
2 1 4 0 5 3
int i1 = 1, i2 = 3, temp;
for (j=0; i<3; i++){
temp = matriz[i1][j];
matriz[i1][j] = matriz[i2,j];
matriz[i2][j] = temp;}
46
Transpuesta
void trans(int A[][],int B[][]),
int m, int n)
A {
/* Variables. */
1 5 3 int i, j;
4 2 6
B[j][i] = A[i][j]
/* Construir la transpuesta*/
for(i=0; i<m; i++) {
B for(j=0; j<n; j++) {
1 4 B[j][i] = A[i][j];
}
}
5 2 return;
}
3 6
47
Multiplicación de matrices
double A[3][2], B[2][4], C[3][4];
 Calcular C = A * B;

3 4 22 29 45 35
2 3 7 1
5 2 x = 18 40 47 21
4 5 6 8
1 6 26 33 43 49
3*2 + 4*4=22 3*3 + 4*5=29 3*7 + 4*6=45 3*1 + 4*8=35

5*2 + 2*4=18 5*3 + 2*5=40 5*7 + 2*6=47 5*1 + 2*8=21


1*2 + 6*4=26 1*3 + 6*5=33 1*7 + 6*6=43 1*1 + 6*8=49
48
Multiplicación de matrices

j
j 0 1 2 3
0 1 2 3
0 3 4 0 22 29 45 35
2 3 7 1
1 5 2 x = 1 18 40 47 21
4 5 6 8 2
2 1 6 26 33 43 49
i i
j=0
C[i][j] =
2
i=0 3 4 x k = A[i][k=0]*B[k=0][j] +
4 A[i][k=1]*B[k=1][j]
k
49
Multiplicación de matrices
#define m 3
#define n 2
#define l 4
void matrix_mul(int A[m][n], int B[n][l], int C[m][l])
{
int i, j, k;
for(i=0; i < m; i++) {
for(j=0; j < l; j++) {
C[i][j] = 0;
for(k=0; k < n; k++) {
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
}
return;
}

50
Ejercicio
Halle posibles valores para la celda s[i][j] en el Sudoku

4 1 7 6 8

8 4 3 7

5 3 4

7 4 1

3 1 9 [i][j] 7 4 6

6 8 9

3 5 7

8 2 6 9

4 5 1 8 3
51
Ejercicios: Caminatas en matrices

x x x x x

x x x x

x x x x
52

Potrebbero piacerti anche