Está en la página 1de 26

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Introducci on a los Computadores Arreglos en C


CNM-130 Departamento de Matem aticas Facultad de Ciencias Exactas y Naturales Universidad de Antioquia
Copyleft 2009. Reproducci on permitida bajo los t erminos de la licencia de documentaci on libre GNU.

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Contenido

Introducci on

Operaciones con arreglos unidimensionales

Paso de arreglos a funciones

Arreglos bidimensionales (matrices)

Operaciones con arreglos bidimensionales

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Arreglos (arrays )
Arreglo: concepto en programaci on an alogo a los conceptos matem aticos de vector, matriz y tensor Arreglo unidimensional: estructura de datos formada por una colecci on nita de elementos homog eneos y ordenados que se que se referencian con un nombre com un
Homog eneos: 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 u ltimo elemento

Los elementos de un arreglo se almacenan en posiciones consecutivas de memoria

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Declaraci on de arreglos
Declaraci on de un arreglo unidimensional: tipo nombre arreglo[tama~ no]
tipo: tipo de dato de los elementos del arreglo (int, float, etc.) nombre arreglo: identicador que representa la colecci on de elementos tama no: constante entera positiva que representa la cantidad de elementos de la colecci on

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]

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Formato de inicializaci on de arreglos


nombre arreglo[i] = valor;
double y[3]; y[0] = 7; y[1] = 0.5; y[2] = -2.7183; int z[4]; z[0] = 12, z[1] = 4; z[2] = z[0] + 2*z[1]; z[3] = z[2]++;

// Hace lo mismo que la asignaci on anterior

char mensaje[] = "Todo bien";

double y[3] = {7, 0.5, -2.7183 }; char mensaje[10] = {T, o, d,


/* Si no se precisa el tama~ no del arreglo, C lo asigna dado el n umero de elementos */

o, , b, i, e, n, \O };

double y[] = {7, 0.5, -2.7183};

double mensaje[10]; mensaje[0] = T; mensaje[0] = o; mensaje[0] = d; . . .

/* Si el tama~ no del arreglo supera al n ummero de elementos, C asigna 0.0 al resto */

double y[7] = {7, 0.5, -2.7183};

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Operaciones frecuentes
Recorriendo un arreglo x[i] de tama no n:
El recorrido se realiza por medio de un ndice El ndice puede ir desde el primero hasta el u ltimo elemento Recorrido del primero al u ltimo for (i=0; i<n; i++) { // proceso que involucra a x[i] <proceso> }

El ndice puede ir desde el u ltimo hasta el primer elemento Recorrido del u ltimo al primero for (i=n-1; i>=0; i--) { // proceso que involucra a x[i] <proceso> }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 2.1 (Notas) Escriba un programa en C que almacene en un vector (arreglo unidimensional) las notas nales de los alumnos de un curso formado por 10 estudiantes. El programa debe visualizar por pantalla las notas. Soluci on
notas 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", &notas[i]); } // Recorrido para escribir datos en pantalla for (i=0; i<10; i++) { printf("Nota %d = %f \n", i, notas[i]); } }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 2.2 (Notas) Modique el programa del ejemplo anterior (5.1) para que muestre por pantalla el promedio del curso. Soluci on
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", &notas[i]); } // Recorrido para sumar las 10 notas for (i=0; i<10; i++) suma += notas[i]; promedio = suma/10.0; printf("Promedio = %f", promedio); }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 2.3 (Fibonacci) Escriba un programa en C que genere los primeros n t erminos de la sucesi on de Fibonacci, los almacene en un vector y los muestre por pantalla. Soluci on
b vector.c

#include<stdio.h> main(){ int i, n; printf("Ingrese n umero de t erminos: "); scanf("%d", &n); /* Declara vector de tama~ no n e inicializa los dos primeros elementos */ int fib[n]; fib[0]=0, fib[1]=1; // Almacena Fibonacci for (i=2; i<n; i++) fib[i] = fib[i-1] + fib[i-2]; // Imprime t erminos de la sucesi on for (i=0; i<n; i++) printf(" %d \t", fib[i]); }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 2.4 (Intercambiar) Escriba un programa en C que intercambie los elementos de un vector de la siguiente manera: el de la primera posici on pasa a la u ltima posici on, el de la segunda a la pen ultima, etc. Soluci on
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 arreglo for (i=0; i<n; i++) { printf("Elemento %d: ", i); scanf("%g", &x[i]); } // continua en la columna derecha } // Imprime los elementos del vector for (i=0; i<n; i++) printf(" %g \t", x[i]); } // Intercambia elementos del arreglo for (i=0; i<n/2; i++) { temp = x[i]; x[i] = x[n-i-1]; x[n-i-1] = temp;

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 2.5 (Intercambiar funci on) Escriba el programa del ejemplo anterior (2.4) utilizando funciones. Soluci on
intercambiafun vector.c

#include<stdio.h> // declaracion de la funcion intercambia void 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 arreglo for (i=0; i<n; i++) { printf("Elemento %d: ", i); scanf("%g", &x[i]); } // continua en la columna derecha } }

// Intercambia elementos del arreglo for (i=0; i<n/2; i++) intercambia(&x[i], &x[n-i-1]); // Imprime los elementos del vector for (i=0; i<n; i++) printf(" %g \t", x[i]);

// declaracion de la funcion intercambia void intercambia(float *a, float *b) { float temp; temp = *a; *a = *b; *b = temp;

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Paso de un arreglo unidimensional (vector) como par ametro


Cuando un argumento (par ametro) de una funci on es un arreglo, el par ametro (arreglo ) se pasa por referencia
tipo funcion(..., tipo x[], ...) { // cuerpo de la funci on . . . }

La forma m as usual de pasar un arreglo como par ametro a una funci on es por medio de punteros:

tipo funcion(..., tipo *x, ...) { // cuerpo de la funci on . . . }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 3.1 (Imprime arreglo) Escriba una funci on en C llamada imprimir que reciba como argumento un vector formado por 0, 1, 2, . . . , 9 y los muestre por pantalla. Soluci on
pasar arreglo.c

#include<stdio.h> #define n 10 // define n=10 /* declaracion de la funcion imprimir de dos maneras */ void imprimir1(int x[]); void imprimir2(int *x); main(){ int x[n], i; // Inicializa arreglo for (i=0; i<n; i++) x[i] = i; imprimir1(x); // Imprime arreglo // imprimir2(x); } // continua en la columna derecha

// Definici on de la funcion imprimir1 void imprimir1(int x[]) { int i; for (i=0; i<n; i++) printf(" %d \t", x[i]); } // Definici on de la funcion imprimir2 void imprimir2(int *x) { int i; for (i=0; i<n; i++) printf(" %d \t", x[i]); }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 3.2
Ejemplo 3.2 (promedio arreglo) Escriba un programa en C que calcule el promedio de los elementos de un vector de tama no n. El programa debe constar de tres funciones, una que lea el vector (leer vector), otra que imprima el vector por pantalla (escribir vector) y otra que calcule el promedio (promedio). Soluci on Datos de entrada:
n: tama no 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)

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

promedio arreglo.c

#include<stdio.h> // Declaracion de las funciones void leer vector(double x[], int n); void escribir vector(double x[], int n); double promedio(double x[], int n); main(){ int n; printf("Ingrese n umero 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

// Definici on 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; }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 3.3
Ejemplo 3.3 (Busca elemento) Escriba una funci on en C que determine si un elemento dado est a en un vector. Soluci on Datos de entrada:
n: tama no 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)

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

buscar.c

#include<stdio.h> // Declaracion de las funciones void 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 n umero 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 est a", v); else printf(" %lf no est a", v); } // continua en la columna derecha

// Definici on de las funciones void 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; }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Arreglos bidimensionales (matrices)


Arreglo bidimensional: concepto en programaci on an alogo al concepto matem atico de matriz

La denici on de arreglo bidimensional [Criado, 2006] puede hacerse desde dos enfoques:
Enfoque recursivo: se trata de un arreglo unidimensional en el que cada elemento es a su vez un arreglo unidimensional Enfoque directo: estructura de datos formada por una colecci on nita de elementos homog eneos, ordenados cada uno de ellos en dos dimensiones y referenciados con un nombre com un

El acceso a un elemento del arreglo bidimensional se realiza mediante el nombre del arreglo (identicador ) y un par de ndices que indican la posici on del elemento

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Representaci on gr aca 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]

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Declaraci on de arreglos
Declaraci on de un arreglo bidimensional: tipo nombre arreglo[filas][columnas]
tipo: tipo de dato de los elementos del arreglo (int, float, etc.) nombre arreglo: identicador que representa la colecci on de elementos las: constante entera positiva que representa la cantidad de las columnas: constante entera positiva que representa la cantidad de columnas

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]

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Formato de inicializaci on de arreglos bidimensionales


nombre arreglo[i][j] = valor;
double m[2][3]; m[0][0] m[0][1] m[0][2] m[1][0] m[1][1] m[1][2] = = = = = = 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] m[0][1] m[0][2] m[1][0] m[1][1] m[1][2] = = = = = = 1.1; 1.2; 1.3; 1.4; 0.0; 0.0;

// Hace lo mismo que la asignaci on anterior

double m[2][3] = {1.1, 1.2, 1.3, 1.4, 1.5, 1.6 };

// Hace lo mismo que la asignaci on anterior

/* Las siguientes inicializaciones son INCORRECTAS */

double m[][3] = {1.1, 1.2, 1.3, 1.4, 1.5, 1.6 };

double x[][] = {1.1, 1.2, 1.3, 1.4} double y[2][] = {1.1, 1.2, 1.3, 1.4}

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Operaciones frecuentes
Procesar la i
Procesa la 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]> }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Operaciones frecuentes
Recorrido de un arreglo a[i][j] de tama no mn:
Recorrido por las 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]> } }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Ejemplo 5.1
Ejemplo 5.1 (Cine) Escriba un programa en C que almacene en una matriz (arreglo bidimensional) el n umero de personas que ingresan a una sala de cine X durante cada uno de los d as de la semana. La matriz debe constar de dos columnas, la primera para los d as de la semana y la segunda para el n umero de personas, y siete las para cada uno de los d as de la semana. El programa debe calcular el promedio de personas que ingresan a la sala. Soluci on Matriz:
int asistencia[2][7] asistencia[i][1]: n umero de personas que asisten el d a i

Salida:
promedio = (asistencia[0][1] + + asistencia[6][1])/7

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

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 primera columna */ for (i=0; i<7; i++) asistencia[i][0] = i+1; /* Almacena el n umero de personas en la segunda columna */ for (i=0; i<2; i++) { printf("Personas d a %d: ", i+1); scanf("%d", &asistencia[i][1]); } // Muestra informaci on del arreglo for (i=0; i<7; i++) { printf("El d a %d asisten %d \n", asistencia[i][0], asistencia[i][1]); } // C alculo del promedio for (i=0; i<7; i++) total += asistencia[i][1]; promedio = (float)total/7.0; printf("Promedio = %f", promedio); }

Introducci on

Vectores

Paso de arreglos a funciones

Arreglos bidimensionales

Matrices

Referencias

M.A. Criado Programaci on en lenguajes estructurados Alfaomega Grupo Editor, S.A. de C.V. Primera Edici on, 2006

H.M. Mora Escobar Introducci on a C y a m etodos num ericos Universidad Nacional de Colombia (Sede Bogot a), 2004

M.J. P aez C y C ++ de af an Segunda edici on. Editorial Universidad de Antioquia, 2004

E. Scheinerman C ++ for Mathematicians Taylor & Francis Group, LCC., 2005

También podría gustarte