introducci on a los computadores arreglos en...
TRANSCRIPT
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Introduccion a los ComputadoresArreglos en C
Alejandro Piedrahita H.
Instituto de MatematicasFacultad de Ciencias Exactas y Naturales
Universidad de Antioquia
Copyleft «2013. Reproduccion permitida bajo losterminos de la licencia de documentacion libre GNU.
Documento bajo construccion, reportar errores al
correo electronico [email protected]
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Contenido
1 Introduccion
2 Operaciones con arreglos unidimensionales
3 Paso de arreglos a funciones
4 Arreglos bidimensionales (matrices)
5 Operaciones con arreglos bidimensionales
6 Referencias
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Arreglos (arrays)
Arreglo: concepto en programacion analogo a los conceptosmatematicos de vector, matriz y tensor
Arreglo unidimensional: estructura de datos formada por una coleccionfinita de elementos homogeneos y ordenados que se que se referenciancon un nombre comun
Homogeneos: todos los elementos son del mismo tipo de dato (int,float, etc.)
Ordenados: el arreglo tiene un primer elemento, un segundo elemento,etc.
Finito: el arreglo tiene un ultimo elemento
Los elementos de un arreglo se almacenan en posiciones consecutivasde memoria
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Declaracion de arreglos
Declaracion de un arreglo unidimensional:
tipo nombre arreglo[tama~no]
tipo: tipo de dato de los elementos del arreglo (int, float, etc.)
nombre arreglo: identificador que representa la coleccion de elementos
tamano: constante entera positiva que representa la cantidad deelementos de la coleccion
Ejemplos:
double x[30];
float notas[8];
int posiciones[100];
char apellidos[15];
Los 30 elementos de x son:
x[0] , x[1] , x[2] , . . . , x[28] , x[29]
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Formato de inicializacion de arreglos
nombre arreglo[i] = valor;
double y[3];
y[0] = 7;y[1] = 0.5;y[2] = -2.7183;
// Hace lo mismo que la asignacion anterior
double y[3] = {7, 0.5, -2.7183 };
/* Si no se precisa el tama~no del arreglo,
C lo asigna dado el numero de elementos */
double y[] = {7, 0.5, -2.7183};
/* Si el tama~no del arreglo supera al num-
mero de elementos, C asigna 0.0 al resto */
double y[7] = {7, 0.5, -2.7183};
int z[4];
z[0] = 12, z[1] = 4;z[2] = z[0] + 2*z[1];z[3] = z[2]++;
char mensaje[] = "Todo bien";
char mensaje[10] = {’T’, ’o’, ’d’,
’o’, ’ ’, ’b’, ’i’, ’e’, ’n’, ’\O’ };
double mensaje[10];
mensaje[0] = ’T’;
mensaje[0] = ’o’;
mensaje[0] = ’d’;
.
.
.
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Operaciones frecuentes
Recorriendo un arreglo x[i] de tamano n:
El recorrido se realiza por medio de un ındice
El ındice puede ir desde el primero hasta el ultimo elemento
Recorrido del primero al ultimo
for (i=0; i<n; i++) {// proceso que involucra a x[i]
<proceso>
}
El ındice puede ir desde el ultimo hasta el primer elemento
Recorrido del ultimo al primero
for (i=n-1; i>=0; i--) {// proceso que involucra a x[i]
<proceso>
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 2.1 (Notas)
Escriba un programa en C que almacene en un vector (arreglounidimensional) las notas finales de los alumnos de un curso formado por10 estudiantes. El programa debe visualizar por pantalla las notas.
Solucionnotas vector.c
#include<stdio.h>
main(){float notas[10];int i;
// Recorrido para leer datos en el arreglo
for (i=0; i<10; i++) {printf("Ingrese nota = ");
scanf("%f", ¬as[i]);
}
// Recorrido para escribir datos en pantalla
for (i=0; i<10; i++) {printf("Nota %d = %f \n", i, notas[i]);
}}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 2.2 (Notas)
Modifique el programa del ejemplo anterior (5.1) para que muestre porpantalla el promedio del curso.
Solucion
notas promedio.c
#include<stdio.h>
main(){float notas[10], suma = 0.0, promedio;int i;
// Recorrido para leer datos en el arreglo
for (i=0; i<10; i++) {printf("Ingrese nota = ");
scanf("%f", ¬as[i]);
}
// Recorrido para sumar las 10 notas
for (i=0; i<10; i++) suma += notas[i];
promedio = suma/10.0;
printf("Promedio = %f", promedio);}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 2.3 (Fibonacci)
Escriba un programa en C que genere los primeros n terminos de lasucesion de Fibonacci, los almacene en un vector y los muestre por pantalla.
Solucion
fib vector.c
#include<stdio.h>
main(){int i, n;
printf("Ingrese numero de terminos: ");
scanf("%d", &n);
/* Declara vector de tama~no n e inicializa los dosprimeros elementos */
int fib[n];fib[0]=0, fib[1]=1;
// Almacena Fibonaccifor (i=2; i<n; i++) fib[i] = fib[i-1] + fib[i-2];
// Imprime terminos de la sucesionfor (i=0; i<n; i++) printf(" %d \t", fib[i]);
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 2.4 (Intercambiar)
Escriba un programa en C que intercambie los elementos de un vector de lasiguiente manera: el de la primera posicion pasa a la ultima posicion, el dela segunda a la penultima, etc.
Solucion
intercambia vector.c
#include<stdio.h>
main(){int i, n;
printf("Ingrese tama~no del vector: ");
scanf("%d", &n);
float x[n], temp;
// Escribe datos en el arreglofor (i=0; i<n; i++) {
printf("Elemento %d: ", i);
scanf("%g", &x[i]);
}
// continua en la columna derecha
// Intercambia elementos del arreglofor (i=0; i<n/2; i++) {
temp = x[i];
x[i] = x[n-i-1];
x[n-i-1] = temp;
}
// Imprime los elementos del vectorfor (i=0; i<n; i++)
printf(" %g \t", x[i]);
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 2.5 (Intercambiar funcion)
Escriba el programa del ejemplo anterior (2.4) utilizando funciones.
Solucion
intercambiafun vector.c
#include<stdio.h>
// declaracion de la funcion intercambiavoid intercambia(float *a, float *b);
main(){int i, n;
printf("Ingrese tama~no del vector: ");
scanf("%d", &n);
float x[n];
// Escribe datos en el arreglofor (i=0; i<n; i++) {
printf("Elemento %d: ", i);
scanf("%g", &x[i]);
}
// continua en la columna derecha
// Intercambia elementos del arreglofor (i=0; i<n/2; i++)
intercambia(&x[i], &x[n-i-1]);
// Imprime los elementos del vectorfor (i=0; i<n; i++)
printf(" %g \t", x[i]);
}
// declaracion de la funcion intercambiavoid intercambia(float *a, float *b) {
float temp;
temp = *a;
*a = *b;
*b = temp;
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Paso de un arreglo unidimensional (vector) como parametro
Cuando un argumento (parametro) de una funcion es un arreglo, elparametro (arreglo) se pasa por referencia
tipo funcion(..., tipo x[], ...) {// cuerpo de la funcion
.
.
.
}
La forma mas usual de pasar un arreglo como parametro a una funciones por medio de punteros:
tipo funcion(..., tipo *x, ...) {// cuerpo de la funcion
.
.
.
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 3.1 (Imprime arreglo)
Escriba una funcion en C llamada imprimir que reciba como argumento unvector formado por 0, 1, 2, . . . , 9 y los muestre por pantalla.
Solucion
pasar arreglo.c
#include<stdio.h>#define n 10 // define n=10
/* declaracion de la funcion imprimirde dos maneras */
void imprimir1(int x[]);void imprimir2(int *x);
main(){int x[n], i;
// Inicializa arreglofor (i=0; i<n; i++)
x[i] = i;
imprimir1(x); // Imprime arreglo// imprimir2(x);
}
// continua en la columna derecha
// Definicion de la funcion imprimir1
void imprimir1(int x[]) {int i;
for (i=0; i<n; i++)
printf(" %d \t", x[i]);
}
// Definicion de la funcion imprimir2
void imprimir2(int *x) {int i;
for (i=0; i<n; i++)
printf(" %d \t", x[i]);
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 3.2
Ejemplo 3.2 (promedio arreglo)
Escriba un programa en C que calcule el promedio de los elementos de unvector de tamano n. El programa debe constar de tres funciones, una quelea el vector (leer vector), otra que imprima el vector por pantalla(escribir vector) y otra que calcule el promedio (promedio).
Solucion
Datos de entrada:
n: tamano del vector
x[n]: vector
Funciones:
void leer vector(double x[], int n)
void escribir vector(double x[], int n)
double promedio(double x[], int n)
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
promedio arreglo.c
#include<stdio.h>
// Declaracion de las funcionesvoid leer vector(double x[], int n);void escribir vector(double x[], int n);double promedio(double x[], int n);
main(){int n;
printf("Ingrese numero de elementos: ");
scanf("%d", &n);
double x[n];
leer vector(x, n);
escribir vector(x, n);
printf("\nPromedio = %lf", promedio(x,n));
}
void leer vector(double x[], int n) {int i;
for (i=0; i<n; i++) {printf("x( %d) = ", i+1);
scanf("%lf", &x[i]);
}}// continua en la columna derecha
// Definicion de las funciones
void escribir vector(double x[], int n) {int i;
for (i=0; i<n; i++)
printf(" %5.8lf \t", x[i]);
}
double promedio(double x[], int n) {int i;double suma = 0.0;
for (i=0; i<n; i++) suma += x[i];
return suma/n;
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 3.3
Ejemplo 3.3 (Busca elemento)
Escriba una funcion en C que determine si un elemento dado esta en unvector.
Solucion
Datos de entrada:
n: tamano del vector
x[n]: vector
v: elemento a buscar
Funciones:
void leer vector(double x[], int n)
void escribir vector(double x[], int n)
int pertenece(double x[], double v, int n)
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
buscar.c
#include<stdio.h>
// Declaracion de las funcionesvoid leer vector(double x[], int n);void escribir vector(double x[], int n);int pertenece(double v, double x[], int n);
main(){int n;
printf("Ingrese numero de elementos: ");
scanf("%d", &n);
double x[n], v;
leer vector(x, n);
escribir vector(x, n);
printf("\nIngrese elemento a buscar: ");
scanf("%lf", &v);
if (pertenece(v,x,n))
printf(" %lf sı esta", v);
else
printf(" %lf no esta", v);
}
// continua en la columna derecha
// Definicion de las funcionesvoid leer vector(double x[], int n) {
int i;
for (i=0; i<n; i++) {printf("x( %d) = ", i+1);
scanf("%lf", &x[i]);
}}
void escribir vector(double x[], int n) {int i;
for (i=0; i<n; i++)
printf(" %5.8lf \t", x[i]);
}
int pertenece(double v, double x[], int n) {int s = 0, k = 0;
while (s==0 && k<n) {if (v==x[k]) s=1;
k++;
}return s;
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Arreglos bidimensionales (matrices)
Arreglo bidimensional: concepto en programacion analogo al conceptomatematico de matriz
La definicion de arreglo bidimensional [] puede hacerse desde dosenfoques:
Enfoque recursivo: se trata de un arreglo unidimensional en el que cadaelemento es a su vez un arreglo unidimensional
Enfoque directo: estructura de datos formada por una coleccion finita deelementos homogeneos, ordenados cada uno de ellos en dos dimensionesy referenciados con un nombre comun
El acceso a un elemento del arreglo bidimensional se realiza medianteel nombre del arreglo (identificador) y un par de ındices que indican la“posicion” del elemento
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Representacion grafica de un arreglo bidimensional
Arreglo bidimensional con m filas (horizontales) y n columnas
(verticales)
∗ ∗ · · · · · ·· · · · · · ∗
∗ · · · · · ·
......
∗
......
∗ · · · ∗
∗ : elemento [0][0]
∗ : elemento [0][2]
∗ : elemento [1][n-2]
∗ : elemento [2][1]
∗ : elemento [i][j]
∗ : elemento [m-1][2]
∗ : elemento [m-1][n-1]
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Declaracion de arreglos
Declaracion de un arreglo bidimensional:
tipo nombre arreglo[filas][columnas]
tipo: tipo de dato de los elementos del arreglo (int, float, etc.)
nombre arreglo: identificador que representa la coleccion de elementos
filas: constante entera positiva que representa la cantidad de filas
columnas: constante entera positiva que representa la cantidad decolumnas
Ejemplos:
double a[3][4];
float matriz[12][8];
int pos[18][24];
char lista[7][8];
Los 12 elementos de a son:
a[0][0] , a[0][1] , x[0][2] , . . . , a[2][2] , a[2][3]
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Formato de inicializacion de arreglos bidimensionales
nombre arreglo[i][j] = valor;
double m[2][3];
m[0][0] = 1.1;m[0][1] = 1.2;m[0][2] = 1.3;m[1][0] = 1.4;m[1][1] = 1.5;m[1][2] = 1.6;
// Hace lo mismo que la asignacion anterior
double m[2][3] = {1.1, 1.2, 1.3, 1.4,
1.5, 1.6 };
// Hace lo mismo que la asignacion anterior
double m[][3] = {1.1, 1.2, 1.3, 1.4,
1.5, 1.6 };
/* En el siguiente ejemplo se asignan
ceros hasta completar las filas */
double m[][3] = {1.1, 1.2, 1.3, 1.4}
double m[2][3];
m[0][0] = 1.1;m[0][1] = 1.2;m[0][2] = 1.3;m[1][0] = 1.4;m[1][1] = 0.0;m[1][2] = 0.0;
/* Las siguientes inicializaciones son
INCORRECTAS */
double x[][] = {1.1, 1.2, 1.3, 1.4}double y[2][] = {1.1, 1.2, 1.3, 1.4}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Operaciones frecuentes
Procesar fila i
Procesa fila
for (j=0; j<n; j++) {// proceso que involucra a a[i][j]
<proceso a[i][j]>
}
Procesar columna j:
Procesa columna
for (i=0; i<n; i++) {// proceso que involucra a a[i][j]
<proceso a[i][j]>
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Operaciones frecuentes
Recorrido de un arreglo a[i][j] de tamano m×n:
Recorrido por filas
for (i=0; i<n; i++) {for (j=0; j<n; j++) {
// proceso que involucra a a[i][j]
<proceso a[i][j]>
}}
Recorrido por columnas
for (j=0; j<n; j++) {for (i=0; i<n; i++) {
// proceso que involucra a a[i][j]
<proceso a[i][j]>
}}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Ejemplo 5.1
Ejemplo 5.1 (Cine)
Escriba un programa en C que almacene en una matriz (arreglobidimensional) el numero de personas que ingresan a una sala de cine Xdurante cada uno de los dıas de la semana. La matriz debe constar de doscolumnas, la primera para los dıas de la semana y la segunda para elnumero de personas, y siete filas para cada uno de los dıas de la semana. Elprograma debe calcular el promedio de personas que ingresan a la sala.
Solucion
Matriz:
int asistencia[2][7]
asistencia[i][1]: numero de personas que asisten el dıa i
Salida:
promedio = (asistencia[0][1] + · · · + asistencia[6][1])/7
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
cine.c
#include<stdio.h>
main(){int i, j, total = 0, asistencia[7][2];
float promedio;
// Inicializa arreglo a cero
for (i=0; i<7; i++) {for (j=0; j<2; j++) {
asistencia[i][j] = 0;
}}
// Muestra arreglo inicializado a cero
for (i=0; i<7; i++) {for (j=0; j<2; j++) {
printf(" %d ", asistencia[i][j]);
}printf("\n"); // cambia de fila
}
// continua en la columna derecha
/* Almacena los dıas en la primeracolumna */
for (i=0; i<7; i++)
asistencia[i][0] = i+1;
/* Almacena el numero de personas en lasegunda columna */
for (i=0; i<2; i++) {printf("Personas dıa %d: ", i+1);
scanf("%d", &asistencia[i][1]);
}
// Muestra informacion del arreglo
for (i=0; i<7; i++) {printf("El dıa %d asisten %d \n",
asistencia[i][0], asistencia[i][1]);
}
// Calculo del promedio
for (i=0; i<7; i++)
total += asistencia[i][1];
promedio = (float)total/7.0;
printf("Promedio = %f", promedio);
}
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Bibliografıa I
O. CairoMetodologıa de la programacionSegunda edicion. Alfaomega Grupo Editor, S.A., 2005
M.A. CriadoProgramacion en lenguajes estructuradosAlfaomega Grupo Editor, S.A. de C.V. Primera Edicion, 2006
B.W. Kernighan, D. RitchieThe C Programming LanguagePrentice Hall, 2th Edition, 1988
S. LipschutzSchaum’s Outline of Essential Computer MathematicsMcGraw-Hill, 1th edition, 1982
H.M. Mora EscobarIntroduccion a C y a metodos numericosUniversidad Nacional de Colombia (Sede Bogota), 2004
Introduccion Vectores Paso de arreglos a funciones Arreglos bidimensionales Matrices Referencias
Bibliografıa II
M.J. PaezC y C++ de afanUniversidad de Antioquia, 2004
R. SeroulProgramming for MathematiciansSpringer, 2000
E. ScheinermanC++ for Mathematicians: An Introduction for Students andProfessionalsTaylor & Francis Group, LLC, 2006
A. ShenAlgorithms and ProgrammingSpringer Undergraduate Texts in Mathematics and Technology, 2010
P. TymannSchaum’s Outline of Principles of Computer ScienceMcGraw-Hill, 1th edition, 2008