Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
(CI2125/CI2127)
Teoría
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
6
Ejemplo
int list[5]; list[0]
list[1]
list[2]
list[3]
list[4]
7
Inicialización
Pueden inicilaizarse cuando son declarados.
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.
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;
15
Copiar arreglo1 en arreglo2 en
orden inverso
0 1 2 3 4 5
arreglo1 6 3 1 9 7 2
16
Arreglos y funciones
Los elementos individuales de un arreglo
pueden pasarse como variables a una función.
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;
22
media()
/* Sumatoria. */
sum = x[0];
for (k=1; k<=n-1; k++)
sum = sum + x[k];
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;
} }
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
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
en memoria 36
Elementos de una matriz
int matriz[3][4];
matriz tiene 12 elementos enteros
columna.
matriz[2][3] elemento en última fila última
columna.
matriz es la dirección del primer elemento.
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
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
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
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