Está en la página 1de 9

PRCTICA

ARREGLOS CON FUNCIONES


Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 1
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
Objetivos
El alumno ser capaz de programar algoritmos que incluyan el manejo de arreglos
utilizando funciones.
Al final de esta prctica el alumno podr:
1. Realizar exitosamente programas que hagan uso de arreglos como parmetros
de funciones.
Antecedentes
1. Conocer la utilizacin del ciclo for para guardar arreglos.
2. Conocer el manejo de funciones y el paso de valores a travs de funciones.
3. Saber como de declara y manipula un arreglo unidimensional.
Introduccin
En C se indica el nmero de elementos que tiene un arreglo unidimensional
poniendo, despus del nombre del arreglo, la dimensin del mismo entre corchetes:
nombre[N], donde N es el nmero de elementos. El ndice del primer elemento del arreglo
es 0 y el ltimo es N-1.
El paso de arreglos a funciones es una de las operaciones ms comunes en la
programacin. Para que una funcin pueda recibir un arreglo unidimensional simplemente
se especifica su tipo y se coloca despus de su identificador, un par de corchetes vacos. Por
ejemplo en el siguiente prototipo de funcin:
float Prom( float x[ ], int n);
El compilador reconoce que el primer argumento que la funcin va a recibir es un
arreglo por el par de corchetes vaco. El segundo argumento, que es una cantidad entera,
representa el nmero de elementos del arreglo que ser procesado. Tambin se puede
especificar, por ejemplo, si se va a pasar un arreglo de 10 elementos, la dimensin del
arreglo as:
float Prom(float x[10], int n);
pero como no es necesario, rara vez se utiliza.
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 2
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
Para invocar a Prom se coloca el identificador del arreglo como primer parmetro y
el nmero de datos que se desea procesar como segundo. Por ejemplo, a continuacin se
define a Prom de modo que regrese el promedio de una serie de nmeros reales:
float Prom(float x[], int n)
{
int i;
float r = 0;
for(i = 0;i < n; i++)
r += x[i]; /* se suman los elementos*/
return r / n;
}
int main(void)
{
float a[10] = {3.1, 4.6, 8.0, 7.2, 6.9};
float p;
p = Prom(a, 5); /* slo se desea procesar los 5 primeros elementos del arreglo*/
printf(%f\n, p);
return 0;
}
Cuando se pasa en arreglo a una funcin se est proporcionando a la funcin la
direccin de comienzo asignada al arreglo, por lo que la funcin que recibe el arreglo,
puede escribir o manipular la informacin contenida en el mismo. En otras palabras, en
realidad no se pasa el arreglo a la funcin, y toda la carga que esto representa, sobre todo
tratndose de arreglos de tamaos considerables, sino la direccin en donde ste comienza.
En el siguiente programa de ejemplo, presenta a una funcin que recibe un arreglo
y el nmero de datos que se desea procesar, y lo ordena de forma ascendente, mediante el
mtodo conocido como mtodo de la burbuja
/*Ejemplo 1: Mtodo de la burbuja*/
#include <stdio.h>
#include <conio.h>
/*Funcin que recibe un arreglo y lo ordena de forma ascendente por el mtodo de la
burbuja*/
void Ordena(float Arreglo[], int Tam)
{
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 3
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
int i,j;
float t;
for(i=1; i<Tam; ++i)
for(j=Tam-1; j>=i; --j)
if(Arreglo[j-1]>Arreglo[j])
{ t=Arreglo[j-1];
Arreglo[j-1]=Arreglo[j];
Arreglo[j]=t;
}
}
/* Funcin que guarda los datos en un arreglo,y posteriormente lo enva a otra funcin que
los ordena*/
void GuardaArreglo()
{
int i, Tam;
float Arreglo[100];
printf("DAR EL NUMERO DE DATOS QUE SE QUIERE PROCESAR \n");
scanf("%d", &Tam);
if(Tam>100)
printf("EL NMERO QUE DISTE EXCEDE AL TAMAO DEL
ARREGLO \n");
else
{
printf("DAR LOS ELEMENTOS DEL ARREGLO \n");
for(i=0; i<Tam; i++)
{
printf("Arreglo[%d]= ", i);
scanf("%f", &Arreglo[i]);
}
Ordena(Arreglo, Tam); /*llamada a la funcin Ordena con el envo del
el arreglo y el numero de datos a procesar */
printf("\n LOS NMEROS ORDENADOS SON \n");
for(i=0; i<Tam; i++)
printf("%.2f \t", Arreglo[i]);
return 0;
}
}
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 4
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
int main(void)
{
GuardaArreglo(); /* Se llama a la funcin que guarda datos en el arreglo*/
return 0;
}
Otros ejemplos que muestran el paso de arreglos a una funcin son:
Ejemplo 2. Nmero capica
Se desea leer por teclado un nmero entero largo e indicar si el nmero ledo es o no
capica.
Para esto, se debe considerar que un nmero capica es aqul que es ledo igual de
izquierda a derecha que de derecha a izquierda por ejemplo 15651.
Es indispensable, como primer paso, saber la cantidad (k) de dgitos que el nmero
ingresado contiene, cules son estos dgitos y la posicin que ocupan dentro del nmero
contabilizar la posicin a partir de cero y finalizando en cantidad de dgitos menos uno
(k-1).
En el nmero 15615 se tienen 6 dgitos y las posiciones de cada uno son:
El segundo paso consiste en comparar de dos en dos los dgitos del nmero,
iniciando en los extremos y finalizando en el centro, esto es, la primera comparacin se
realiza entre el primer dgito y el dgito k-1, la segunda comparacin es entre el segundo
dgito y el dgito k-2, as sucesivamente.
1 5 6 5 1
Posicin 0
Posicin 1
Posicin 2
Posicin 4 (k-1)
Posicin 3
Primera comparacin
Segunda comparacin
1 5 6 5 1
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 5
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
Observar que un nmero con una cantidad de dgitos impar, no necesita comparar el
dgito central con otro dgito.
Considerando los pasos anteriores, se plantean en el programa dos funciones:
a) int numero(long c,int tabla[]) - la cual permite realizar la cuenta de la cantidad
de dgitos contenidos en el nmero y guardar uno por uno en un arreglo.
b) int comparar_numero(int c,int tabla[]) sta permite realizar las comparaciones
por parejas de los dgitos contenidos en el nmero, para resolver si ste es o no
capica.
/*Ejemplo 2: Programa que indica si un nmero entero es o no capica*/
#include <stdio.h>
int numero(long a,int tabla[]);
int comparar_numero(int c,int tabla[]);
int main(void)
{
long n;
int t[50], c;
printf("\nIntroduce un nmero para ver si es capica :");
scanf("%ld",&n);
c=numero(n,t);
if(comparar_numero(c,t))
printf("\nEl nmero es capica \n ");
else
printf("\nEl nmero no es capica\n");
}
int numero(long a,int tabla[]) /*Funcin que cuenta la cantidad de dgitos en el nmero*/
{
int cifras=0;
while(a!=0)
{
tabla[cifras]=a%10;
a=a/10;
cifras++;
}
return cifras; /*Cantidad de dgitos */
}
int comparar_numero(int c,int tabla[]) /*Funcin que compara los dgitos*/
{
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 6
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
int i=0;
while(i<c)
{
if(tabla[i]!=tabla[c-1])
return 0; /*El nmero no es capica*/
i++;
c--;
}
return 1; /*El nmero es capica*/
}
Ejemplo 3. Anlisis de regresin lineal
Se desea ajustar parejas de datos experimentales
i
x ,
i
y a la ecuacin de la recta:
b mx y + =
en donde m es la pendiente y b la ordenada al origen. De acuerdo con el mtodo de los
mnimos cuadrados estos coeficientes, llamados coeficientes de regresin, y el coeficiente
de correlacin r, se obtienen como sigue:
2
1 1
2
1 1 1
|
.
|

\
|

=


= =
= = =
n
i
i
n
i
i
n
i
n
i
i
n
i
i i i
x x n
y x y x n
m
x m y b =
(
(

|
.
|

\
|

(
(

|
.
|

\
|

=


= = = =
= = =
2
1 1
2
2
1 1
2
1 1 1
n
i
i
n
i
i
n
i
i
n
i
i
n
i
n
i
i
n
i
i i i
y y n x x n
y x y x n
r
En las anteriores ecuaciones n representa el nmero de parejas de datos
i
x ,
i
y y x ,
y su valor promedio, respectivamente.
Hacer un programa que, mediante la invocacin a una funcin denominada RegLin
efecta un anlisis de regresin lineal sobre parejas de datos contenidas en dos arreglos.
La funcin RegLin lleva a cabo una anlisis de regresin con datos contenidos en
los arreglos x[], y[]; tambin recibe en la variable n el nmero de datos que contienen los
arreglos. Como la funcin entrega tres resultados, se le enva un arreglo de dos elementos
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 7
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
mb[2], de modo que ah ponga los coeficientes de regresin m, b. El coeficiente de
correlacin lo regresa de manera normal, usando la instruccin return.
/*Ejemplo 3: Anlisis de regresin lineal*/
#include <stdio.h>
#include <math.h>
float RegLin(float x[], float y[], int n, float mb[2])
{
/* Ajusta por el mtodo de los mnimos cuadrados los datos contenidos en los arreglos x[],
y[] a la recta y = mx + b, retornando el coeficiente de correlacin r de la manera usual. Los
valores de m, b los entrega en el arreglo mb[2].*/
int i ;
float xy, x2, y2, sx, sy, sx2, sy2, sxy ;
float r ;
sx = sy = sx2 = sy2 = sxy = 0; /* primero se obtienen las sumatorias*/
for(i = 0; i < n; i++)
{
sx += x[i] ; /* suma de x's*/
sy += y[i] ; /* suma de y's*/
sx2 += x[i] * x[i] ; /* suma de x's al cuadrado*/
sy2 += y[i] * y[i] ; /* suma de y's al cuadrado*/
sxy += x[i] * y[i] ; /* suma de productos x*y's*/
}
xy = n * sxy - sx * sy ; /* se hacen unos clculos adicionales*/
x2 = n * sx2 - sx * sx ;
y2 = n * sy2 - sy * sy ;
mb[0] = xy / x2 ; /* pendiente*/
mb[1] = sy / n - mb[0] * sx / n ; /* ordenada al origen*/
r = xy / sqrt(x2 * y2) ; /* coeficiente de correlacin*/
return r;
}
int main(void)
{
float mb[2], r;
/* se forman dos conjuntos de datos de prueba*/
float x[7] = {12, 18, 24, 30, 36, 42, 48};
float y[7] = {5.27, 5.68, 6.25, 7.21, 8.02, 8.71, 8.42};
r = RegLin(x, y, 7, mb);
printf("Analisis de regresin: y = mx + b \n");
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 8
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
printf("m = %f\nb = %f\nCoeficiente de correlacin r = %f\n",mb[0], mb[1], r);
return 0;
}
Errores ms comunes que se pueden cometer:
1. Omitir el tipo de valor de regreso definido para una funcin en la declaracin
del prototipo, olvidando escribir un valor de retorno.
2. Regresar un valor de una funcin que fue declarada como void.
3. Volver a definir dentro de la funcin una variable como local, siendo que sta
fue declarada como variable paramtrica dentro de los parntesis de la funcin.
Ejercicios propuestos
Nota: Realizar el algoritmo antes de elaborar el programa
1. Programar un algoritmo que obtenga la moda de un cierto nmero de valores dados
por el usuario. La moda es el nmero que aparece con ms frecuencia en un
conjunto de datos.
2. Hacer un programa que utilizando una funcin, reciba un arreglo de nmeros reales
y entregue el nmero mayor.
3. Variar el programa anterior obteniendo el nmero menor.
4. Hacer un programa que utilizando una funcin, reciba un arreglo de nmeros reales
y entregue el valor promedio y la desviacin estndar de los datos en un arreglo de
dos elementos.
5. Disear un programa que determine la distribucin de frecuencias de un conjunto de
datos dados desde el teclado y colocados en un arreglo de reales. Las frecuencias
debern obtenerse en NI intervalos de clase. (Sugerencia: Utilizar las funciones
desarrolladas en los problemas 2 y 3 para calcular los valores mximo y mnimo de
los datos, y dividir este intervalo en los NI intervalos de clase).
1. Hacer un programa que interpole linealmente entre y
1
y y
2
cada d de acuerdo con la
siguiente frmula:
y
int
= (1 - )y
1
+ y
2
en donde 0 1; = 0 en y
1
, = 1 en y
2
El programa debe invocar a una funcin a la cual se le proporcionan los extremos
del intervalo de interpolacin y
1
y y
2
, el nmero de datos a interpolar n, y dos
arreglos vacos x[], y[], en donde debern colocarse los valores interpolados.
PRCTICA
ARREGLOS CON FUNCIONES
Elaborada por:
M.C. Vicente Fuentes Gea vfg@servidor.unam.mx 9
M.C. Cintia Quezada Reyes cintia@fi-b.unam.mx
Ing. Alejandra Vargas E. De los M. alejandrav@correo.unam.mx
Posteriormente el programa debe invocar a otra funcin que tabule los valores
contenidos en los dos arreglos mencionados. (Ayuda:
n
d
) 0 1 (
= ).
7. Repetir el ejercicio 6 usando la interpolacin coseno, cuya frmula es:

2

2
)) cos( 1 (
=
y
int
= (1
2
)y
1
+
2
y
2
8. Hacer un programa que utilizando una funcin, reciba un arreglo de nmeros
enteros y calcule el promedio de los que estn en posiciones pares.
9. Hacer un programa que utilizando una funcin, reciba un arreglo de nmeros
enteros y calcule el promedio de los que estn en posiciones impares.
10. Hacer un programa que utilizando una funcin, contabilice los dgitos de un nmero
entero y posteriormente indique si un nmero entero tiene ms de dos dgitos.
11. Realizar un programa donde se ingrese un nmero y cada dgito sea cambiado con
base en la tabla siguiente:
Dgito 0 1 2 3 4 5 6 7 8 9
Cambiar por 9 5 4 2 7 6 1 3 0 8
(Sugerencia: Utilizar dos funciones, una para obtener cada dgito que conforma el
nmero y otra para cambiarlo con base en la tabla anterior).
Posteriormente visualizar el nmero que resulta de la modificacin.