Tema 10. Dinámica y funciones de la Atmosfera 2024
Clase2 c
1. FUNCIONES
Realizado por Mariela Curiel
Universidad Simón Bolívar
Junio, 2011
Programación en C (II Parte)
•05/06/2011
2. La mejor forma de desarrollar y
mantener un programa grande es
construirlo a partir de piezas menores
o módulos (divide y vencerás)
Reutilización: uso de funciones
existentes, como bloques de
construcción, para crear nuevos
programas.
Al programar modularmente se facilita
el mantenimiento de los programas.
Funciones
3. Como la mayoría de los lenguajes, C
ofrece la posibilidad de programar con
funciones.
Sintaxis de una función:
tiporetorno nombre_func(par1, par2,...){
variables locales
código de la función
}
Funciones
4. Ejemplo de Definición de una Función
Tipo del valor de retorno
Nombre de la función
float promedio(float a, float b){
float prom;
prom=(a+b)/2;
return(prom); Argumentos o parámetros
}
Variable Local
Valor de retorno
5. En C los programas se escriben
combinando las funciones que el
programador escribe, con funciones
“pre-definidas” disponibles en la
librería estándar de C.
Funciones
6. Ejemplo: calcular el promedio de dos
enteros
float promedio(float a, float b){
float prom;
Definición
prom=(a+b)/2;
return(prom);
}
main(){
float a=5,b=15,result;
result=promedio(a,b); Llamada a la
printf(”promedio=%f",result);función
}
7. void cuadrados(){
int ciclo;
for(ciclo=1;ciclo<10;ciclo++)
printf("%dn",ciclo*ciclo);
}
main() { Si la función no retorna
cuadrados();
} ningún valor se debe usar
como tipo de retorno el
void y omitir de la función
la instrucción return.
Funciones VOID
8. Una función pudiera no tener
argumentos. En este caso también se
utiliza la palabra reservada void en
lugar de los argumentos.
Los argumentos pueden ser
constantes, variables o expresiones.
Funciones: Argumentos
9. Ejemplos:
int main(){
float a=5,b=15,result, c=1, d=2, x;
Los argumentos son
result=promedio(a,b); variables
printf(”promedio=%f",result);
… Los argumentos son
expresiones
x = promedio(a+b, c*d);
}
10. Funciones: Parámetros o
Argumentos Formales y Actuales
float promedio(float x, float y){
float prom;
prom=(x+y)/2; x,y son
return(prom); Parámetros
formales
}
main(){
float a=5,b=15,result, c=1, t=3;
result=promedio(a,b); Parámetros
result=promedio(c+t,40); Reales o
result=promedio(a+b,c*t);
}
Actuales
11. float promedio(float, float);
Un prototipo de función le indica al compilador
el tipo de dato regresado por la función, el número
de parámetros que la función espera recibir, los tipos
de dichos parámetros y el orden en el cuál se esperan.
Los prototipos de las funciones se suelen incluir
En los archivos .h (archivos de cabecera)
Prototipo de una función
12. Los archivos de cabecera (con
extensión .h) contienen los
prototipos de función de todas las
funciones utilizadas en el programa
y las definiciones de varios tipos de
datos y constantes.
Funciones
13. /* Ejemplo de un archivo de cabecera (.h) */
#define MAXEMP 20
#define MAXLIN 80
#define MAXNOMBRE 20
typedef struct reg {
int edad;
int ttrabajo;
char nombre[MAXNOMBRE];
} emple;
// prototipos de las funciones
extern int getline(char *, int, FILE *);
void asignar(emple *, int, int, char *, int);
14. Cuando los argumentos se pasan por
valor se efectúa una copia del valor
del parámetro y ésta se pasa a la
función (a través de la pila). Las
modificaciones que realice la función
a la copia no afectan los valores
originales de la variable.
Funciones: parámetros por valor
y referencia.
15. Cuando un argumento se pasa
por referencia, el llamador
permite que la función llamada
modifique el valor de la
variable.
Funciones: parámetros por valor
y referencia.
16. Ejemplos donde el pasaje de
parámetros por valor es suficiente:
◦ sqrt(x), promedio(a,b), exp(x) …. La
función trabaja con los valores, no necesita
cambiar los argumentos.
Ejemplo donde se necesita modificar la
variable:
◦ strcat(str1, str2) // concatena la cadena de
caracteres str2 al final de str1
Funciones: parámetros por valor
y referencia.
17. Funciones (Pasaje de Parámetros)
Por. defecto, en C el pasaje de
parámetros es por valor, es decir
los argumentos que se les pasan a
las funciones son copias de los
VALORES de las variables.
18. Funciones (Pasaje de
Parámetros)
void swap(int i,int j){
int temp;
.
int x=3, y=4;
temp = i;
...
i = j;
swap(x,y);
j = temp; printf(“%d, %d”,x,y);
} /* después de invocar
a la función:
x es 3
y es 4 */
19. En las siguientes láminas vamos a
ilustrar qué pasa con las
variables en la zona de memoria
del llamador (función main) y en
la pila utilizada por la función en
un pasaje de parámetros por
valor y referencia.
Pasaje de Parámetros
•05/06/2011
20. Memoria Principal (área de las variables del main)
1000 4 X
1004 5 Y
1008 - 15
Posiciones de la
main() {
Memoria
78 int x=4,y=5
…
Por valor swap(x,y) //swap (4,5)
swap(&x,&y) // swap (1000, 1004)
}
21. Memoria Principal
1000 4 X
1004 5 Y
1008 - 15
Posiciones de la
main() {
Memoria
78 int x=4,y=5
…
swap(x,y) //swap (4,5)
Por referencia swap(&x,&y) // swap (1000, 1004)
}
22. La función swap intercambia el valor de dos
variables, usando una tercera (temp)
como temporal.
void swap(int i,int j){
int temp;
temp = i;
i = j;
j = temp;
}
•05/06/2011
23. Memoria del programa
ppal (main).
1000 4 Pila de la función
5 al momento de la llamada swap(x,y)
1004
1008 - 15
8004
8008 4 Parámetros
8012 5 empilados
y espacio
temp para la
variable local
Pasaje de parámetros
por valor
24. Memoria del programa ppal (main)
después de la llamada
pila de la función
después del swap
1000 4
1004 5
8004
1008 - 15
8008 5
8012 4
temp 4
Pasaje de parámetros
Por valor
25. Memoria del programa ppal (main)
después de la llamada
pila de la función
1000 4
después del swap
1004 5
1008 - 15
8004
8008 5
8012 4
temp 4
Los valores se intercambian en la
pila de la función pero las
variables x, y permanecen
intactas
26. Memoria del programa ppal.
1000 4
1004 5
1008 - 15
pila de la función
al momento de la llamada
swap (&x, &y)
8004
8008 1000
8012 1004
temp
Pasaje de
Parámetros por referencia
27. Memoria del programa ppal (main)
después de la llamada.
1000 5
1004 4
1008 - 15 Pila de la función después de la
llamada
8004
8008 1000
8012 1004
temp 4
Pasaje de
Parámetros por referencia
28. Funciones y Arreglos
Los arreglos de una dimensión pueden pasarse
a las funciones como parámetros:
float promedio(int size,float list[])
{
int i;
float suma=0.0; No es necesario
for (i=0;i<size;i++) especificar
suma+=list[i]; el tamaño
return(sum/size);
}
La declaración float list[] le dice a C que list es
un vector de floats. En este caso el
parámetro size indica el tamaño del
arreglo.
29. Funciones y Arreglos
Ejemplo de una llamada a la función
promedio:
int main() {
float numeros = {3.0, 4.5, 2.1}, x;
…
x = promedio(3,numeros);
…
}
30. Funciones y Arreglos
Arreglos Multi-dimensionales:
void printtable(int xsize,int ysize,
float tabla[][5]){
int x,y;
for (x=0;x<xsize;x++){
for (y=0;y<ysize;y++)
printf("t%f",table[x][y]);
printf("n");
}
}
float tabla[][5] le dice a C que la tabla es
un arreglo de dimensión Nx5.
31. Ejemplo de una función que recibe como parámetro
Un arreglos de dos dimensiones y la llamada a la misma.
main(){
int array1[2][3]={{1,2,3},{4,5,6}};
printf(“Los valores del array1 sonn”);
printArray(2,3, array1); // llamada
}
void printArray(int dx, int dy, int a[][3]) // definición
{ int i,j
for (i= 0;i<dx; i++) {
for(j=0; j < dy; j++)
print(“%d”, a[i][j];
print(“n”);
}
32. Funciones (Tipos de Variables)
VARIABLES GLOBALES
Están definidas FUERA de cualquier
función (incluyendo el main() )
Existirán todo el tiempo que esté
ejecutándose el programa.
Se inicializan automáticamente en
CERO cuando el programa comienza a
ejecutarse.
Son accesibles desde todas las
funciones.
34. Funciones (Tipos de Variables)
VARIABLES LOCALES
Las variables definidas DENTRO de una
función, se denominan VARIABLES
LOCALES o AUTOMATICAS.
Se crean y destruyen automaticamente por
la llamada y el retorno de una función
respectivamente.
Se ubican en la pila dinámica (stack) de
memoria.
35. Su visibilidad está limitada a la función
donde son declaradas. No guardan
relación con variables globales del mismo
nombre.
No se les pueda inicializar previamente,
en consecuencia su valor inicial será
indeterminado (basura).
Funciones (Tipos de Variables)
36. double potencia(double val,unsigned exp){
double ret_val = 1.0; //var. locales
int i;
for(i = 0; i < exp; i++)ret_val *= val;
return(ret_val);
}
float promedio(int size,float list[])
{
int i;
float suma=0.0;
for (i=0;i<size;i++) suma+=list[i];
return(sum/size);
}
37. Funciones (Tipos de Variables)
VARIABLES LOCALES ESTATICAS
Son variables que mantienen su
valor, entre una y otra llamada a
la función sin por ello perder su
ámbito de existencia.
Sedeclaran con la palabra clave
static.
38. Funciones (Tipos de
Variables)
main() { void func(void){
void func(void); static int i=0;
int n; i++;
for(n=1;n<=4;n++) printf(“llamada
func(); Nro. %d”, i)
} }
Al ejecutar el Llamada Nro. 1
Llamada Nro. 2
main, se imprime.
Llamada Nro. 3
Llamada Nro. 4
39. Funciones (Tipos de Variables)
VARIABLES GLOBALES ESTATICAS
Son variables inaccesibles al exterior
del archivo fuente donde se
encuentran definidas.
static int a;
main(){
}
40. Funciones (Tipos de Variables)
VARIABLES DE REGISTRO
Son variables que se almacenan en los
registros internos del CPU.
Se suelen usar registros para almacenar
los contadores de los bucles (FOR,
WHILE, etc).
register int x;
register char c;
41. VARIABLES EXTERNAS
Son variables globales definidas en otro
archivo.
Para usarlas bastará con que se la
DECLARE especificando que es EXTERNA
a dicho módulo.
Funciones (Tipos de Variables)
42. Archivo 1
extern int sp;
Archivo 2
extern double val[];
void push(double f) { int sp;
... } double val[MAX]
double pop(void){ ...}
Funciones (Tipos de Variables)
43. Declaración: expone Definición: aparte
las propiedades de de exponer las
una variable propiedades de una
(principalmente su variable, también
tipo) provoca que se le
extern int sp; reserve:
extern double val[]; int sp;
double val[MAX]
Funciones (Tipos de Variables)