1. Programación 1
Funciones en C
Angel Vázquez-Patiño
angel.vazquezp@ucuenca.edu.ec
Departamento de Ciencias de la Computación
Universidad de Cuenca
14 de septiembre de 2017
2. 14/09/17 Angel Vázquez-Patiño 2/51
Objetivos
1) Conocer el concepto de función
2) Conocer el concepto de parámetro/argumento
3) Implementar funciones en C
4) Tener una primera aproximación al concepto
de puntero
5) Entender las llamadas de funciones por valor y
por referencia
6) Entender las reglas de ámbito de las variables
6. 14/09/17 Angel Vázquez-Patiño 6/51
Función
Definición
●
Subalgoritmo, parte de un algoritmo principal
que permite resolver una tarea específica
●
Puede ser invocada desde otras partes del
algoritmo cuantas veces se necesite
●
Puede recibir valores (parámetros o
argumentos)
●
Puede devolver valores
9. 14/09/17 Angel Vázquez-Patiño 9/51
1 #include<stdio.h>
2 // prototipo/declaración de función
3 float cuadrado(float x);
4 int main( ){
5 float m, n ;
6 scanf ("%f", &m) ;
7 n = cuadrado (m) ; // llamada
8 }
9 // definición
10 float cuadrado(float x){
11 float p = x * x;
12 return p;
13 }
10. 14/09/17 Angel Vázquez-Patiño 10/51
Función
Cómo nombrar una función
●
Letras del alfabeto inglés, dígitos y el carácter _
●
El primer carácter no puede ser número
●
No usar palabras reservadas
●
Usar nombres descriptivos (nemotécnicos)
●
No usar el mismo nombre de las funciones para
variables ni viceversa
●
No usar espacios
11. 14/09/17 Angel Vázquez-Patiño 11/51
Ejemplo guiado 1
Problema: calcular el cubo de un número
int cubo(int num)
{
return num*num*num;
}
Nombre ParámetroTipoTipo
Para devolver un valor
12. 14/09/17 Angel Vázquez-Patiño 12/51
Ejemplo guiado 1
#include<stdio.h> // Uso de la función
int cubo(int num);
int main(){
int m, n;
printf("Número: "); scanf("%d", &m);
n = cubo(m);
printf ("El cubo de %d es %d.", m,
n);
}
int cubo(int num){ return num*num*num; }
13. 14/09/17 Angel Vázquez-Patiño 13/51
Ejemplo guiado 1
#include<stdio.h> // Otra forma de llamar
int cubo(int num);
int main(){
int m;
printf("Número: "); scanf("%d", &m);
printf("%d^%d", m, cubo(m));
}
int cubo(int num){ return num*num*num; }
14. 14/09/17 Angel Vázquez-Patiño 14/51
Ejemplo guiado 2
Problema: calcular el área de un triángulo
●
Para más parámetros, se separa con coma
int areaTriangulo(int base,int altura)
{
return base*altura;
}
15. 14/09/17 Angel Vázquez-Patiño 15/51
Ejemplo guiado 2
#include<stdio.h>
int areaTriangulo(int base, int altura);
int main(){
int b, a;
printf("Base: "); scanf("%d", &b);
printf("Altura: "); scanf("%d", &a);
printf("Área: %d", areaTriangulo(b, a));
}
int areaTriangulo(int base, int altura)
{ return base*altura; }
16. 14/09/17 Angel Vázquez-Patiño 16/51
Ejemplo guiado 3
Problema: calcular 5!
●
Es posible usar funciones sin parámetros
#include<stdio.h>
int factorial5();
int main(){
printf("5!: %d", factorial5());
}
int factorial5(){return 5*4*3*2;}
17. 14/09/17 Angel Vázquez-Patiño 17/51
Ejemplo guiado 4
Problema: mostrar la tabla de multiplicar (1-10) de
un número
●
Una función no necesariamente devuelve un
valor
● En C se usa void para indicar que la función
no devuelve ningún valor. Y no se usa nunca
return (porque nunca se devuelve nada)
19. 14/09/17 Angel Vázquez-Patiño 19/51
Ejemplo guiado 5
Problema: mostrar la tabla de multiplicar del 7
●
Se puede definir funciones sin parámetros
#include<stdio.h>
void tabla7();
int main(){ tabla7(); }
void tabla7(){
for(int i=1; i<11; i++)
printf("7 x %d = %dn", i,
7*i);}
20. 14/09/17 Angel Vázquez-Patiño 20/51
Ejercicio propuesto 1
●
Implementar una función que reciba un número
entero y devuelva True si dicho valor es impar
y False si es par
●
Utilizar un nombre adecuado para la función,
i.e., un nombre nemotécnico
22. 14/09/17 Angel Vázquez-Patiño 22/51
Ejercicio propuesto 2
●
Implementar una función que reciba un número
entero e imprima en pantalla los valores
anterior y posterior a ese número
●
Utilizar un nombre adecuado para la función,
i.e., un nombre nemotécnico
25. 14/09/17 Angel Vázquez-Patiño 25/51
Llamada por valor y por referencia
Llamada por referencia
●
La dirección de la variable es pasada a la
función como parámetro
●
El valor del parámetro puede ser modificado
●
El mismo espacio de memoria es usado en la
función y desde donde se llama
26. 14/09/17 Angel Vázquez-Patiño 26/51
Llamada por valor y por referencia
Puntero
●
Variable que contiene la dirección de memoria
de un dato o de otra variable que contiene al
dato en un arreglo
●
Apunta al espacio físico donde está el dato o la
variable
●
Vea https://youtu.be/YqoV6UMQEcE
27. 14/09/17 Angel Vázquez-Patiño 27/51
Llamada por valor y por referencia
Puntero
●
Muchas de las funciones estándares de C,
trabajan con punteros, e.g. scanf y strcpy
char a;
scanf ("%c",&a);
28. 14/09/17 Angel Vázquez-Patiño 28/51
Llamada por valor y por referencia
Declaración de punteros
●
Igual que cualquier otra variable, pero
anteponiendo un * antes del nombre de la
variable
tipo *NombrePuntero;
29. 14/09/17 Angel Vázquez-Patiño 29/51
1 #include <stdio.h>
2 int main(){
3 int a=0; int *punt;
4 punt=&a;//Asigna dir memori de a
5 printf("Valor de a: %d. nValor de
*punt: %d. n", a, *punt);
6 printf("Dirección de memoria de
*punt: %p", punt);
7 printf("nDirección de memoria de a
(&a): %p", &a);
8 }
30. 14/09/17 Angel Vázquez-Patiño 30/51
#include<stdio.h>
void swap(int *a, int *b);
int main(){
int m = 22, n = 44;
printf("Antes m = %d y n = %dn", m, n);
swap(&m, &n);
printf("Después m = %d y n = %dn", m, n);}
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
printf("Función a = %d y b = %dn", *a, *b);}
31. 14/09/17 Angel Vázquez-Patiño 31/51
#include<stdio.h>
void swap(int a, int b);
int main(){
int m = 22, n = 44;
printf("Antes m = %d y n = %dn", m, n);
swap(m, n);
printf("Después m = %d y n = %dn", m, n);}
void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
printf("Función a = %d y b = %dn", a, b);}
33. 14/09/17 Angel Vázquez-Patiño 33/51
1 #include <stdio.h>
2 int * obtenerPares(int n){
3 // Arreglo entero stático local
4 static int arregloPares[100];
5 for(int i=0; i<n; i++)
6 arregloPares[i] = (i+1)*2;
7 // devuelve base address de arregloPares
8 return arregloPares;}
9 int main(){
10 int *arreglo; arreglo = obtenerPares(10);
11 for(int cont=0; cont<10; cont++)
12 printf("%dn", arreglo[cont]);}
34. 14/09/17 Angel Vázquez-Patiño 34/51
Ejercicio propuesto 3 (1)
//****************************************
num <- divisor
a_d <- num
Repetir
num <- a_d
a_d <- 0
Mientras num > 0 Hacer
a_d <- a_d + num MOD 10
num <- trunc(num / 10)
FinMientras
Hasta Que a_d < 10
//********************************************
num <- cociente
ac <- num
Repetir
num <- ac
ac <- 0
Mientras num > 0 Hacer
ac <- ac + num MOD 10
num <- trunc(num / 10)
FinMientras
Hasta Que ac < 10
Algoritmo pruebaDelNueve
// Versión de Angel Vázquez
Leer dividendo
Leer divisor
cociente <- trunc(dividendo / divisor)
residuo <- dividendo MOD divisor
//****************************************
num <- dividendo
aD <- num
Repetir
num <- aD
aD <- 0
Mientras num > 0 Hacer
aD <- aD + num MOD 10
num <- trunc(num / 10)
FinMientras
Hasta Que aD < 10
35. 14/09/17 Angel Vázquez-Patiño 35/51
Ejercicio propuesto 3 (2)
num <- residuo
ar <- num
Repetir
num <- ar
ar <- 0
Mientras num > 0 Hacer
ar <- ar + num MOD 10
num <- trunc(num / 10)
FinMientras
Hasta Que ar < 10
//***********************
num <- a_d * ac + ar
a_dc_r <- num
Repetir
num <- a_dc_r
a_dc_r <- 0
Mientras num > 0 Hacer
a_dc_r <- a_dc_r + num MOD 10
num <- trunc(num / 10)
FinMientras
Hasta Que a_dc_r < 10
//****************************************
Escribir "Dividendo: ", dividendo, ". Suma: ", aD
Escribir "Divisor : ", divisor, ". Suma: ", a_d
Escribir "Cociente : ", cociente, ". Suma: ", ac
Escribir "Residuo : ", residuo, ". Suma: ", ar
Escribir " "
Escribir " D = d * c + r -> ", aD, " = ",
a_dc_r
Escribir " "
Si aD = a_dc_r Entonces
Escribir " División correcta."
Sino
Escribir " División incorrecta."
Fin Si
FinAlgoritmo
37. 14/09/17 Angel Vázquez-Patiño 37/51
Ámbito de las variables
Ámbito
●
Región del programa donde una variable definida
puede tener su existencia y más allá de esa
variable no puede ser accedida
Tres lugares donde se pueden declarar en C
1) Dentro de una función o bloque, variables locales
2) Fuera de todas las funciones, variables globales
3) En la definición de los parámetros de la función,
parámetros formales
38. 14/09/17 Angel Vázquez-Patiño 38/51
Ámbito de las variables
Variables locales
●
Declaradas dentro de una función o bloque
●
Pueden ser usadas sólo por sentencias que
están dentro de esa función o bloque de código
●
No son conocidas por funciones fuera de donde
fueron declaradas
39. 14/09/17 Angel Vázquez-Patiño 39/51
1 #include <stdio.h>
2 int main() {
3 /* declaración de variables locales */
4 int a, b;
5 int c;
6 /* inicialización */
7 a = 10; b = 20; c = a + b;
8 printf("a: %d, b: %d y c: %d",a,b,c);
9 return 0;
10 }
40. 14/09/17 Angel Vázquez-Patiño 40/51
Ámbito de las variables
Variables globales
●
Definidas fuera de una función, usualmente al
inicio del programa
●
Toman sus valores durante todo el tiempo de
vida del programa
●
Pueden ser accedidas dentro de cualquier
función definida en el programa
41. 14/09/17 Angel Vázquez-Patiño 41/51
1 #include <stdio.h>
2 /* declaración de variable global */
3 int g;
4 int main() {
5 /* declaración de variables locales */
6 int a, b;
7 /* inicialización */
8 a = 10; b = 20; g = a + b;
9 printf("a: %d, b: %d y g: %d", a, b, g);
10 return 0;
11 }
42. 14/09/17 Angel Vázquez-Patiño 42/51
Ámbito de las variables
Variables globales
●
Un programa puede tener el mismo nombre
para una variable local y una variable global
●
El valor de la variable local dentro de una
función tendrá la preferencia
43. 14/09/17 Angel Vázquez-Patiño 43/51
1 #include <stdio.h>
2 /* declaración de variable global */
3 int g = 20;
4 int main()
5 {
6 /* declaración de variable local */
7 int g = 10;
8 printf("g: %d.n", g);
9 return 0;
10 }
44. 14/09/17 Angel Vázquez-Patiño 44/51
Ámbito de las variables
Parámetros formales
●
Son tratados como variables locales dentro de
una función y toman la precedencia por encima
de cualquier variable global
45. 14/09/17 Angel Vázquez-Patiño 45/51
1 #include <stdio.h>
2 int a = 20;
3 int main(){
4 int a = 10; int b = 20; int c = 0;
5 printf("a en main(): %d.n", a);
6 c = sumar(a, b);
7 printf("c en main(): %d.n", c);
8 return 0;}
9 int sumar(int a, int b){
10 printf("a en sumar(): %d.n", a);
11 printf("b en sumar(): %d.n", b);
12 return a + b;}
46. 14/09/17 Angel Vázquez-Patiño 46/51
Ámbito de las variables
Inicialización de variables locales y globales
●
Cuando se define una variable local, no es
inicializada por el sistema. El programador la
debe inicializar
●
Cuando se define una variable global, es
inicializada automáticamente por el sistema
47. 14/09/17 Angel Vázquez-Patiño 47/51
Ámbito de las variables
Tipo de dato Valor inicial por
defecto
int 0
char ‘0’
float 0
double 0
pointer NULL
48. 14/09/17 Angel Vázquez-Patiño 48/51
Ámbito de las variables
Inicialización de variables locales y globales
Es una buena práctica de programación
inicializar las variables apropiadamente, de otro
modo el programa puede producir resultados
inesperados porque las variables no inicializadas
tomarán valores basura ya disponibles en sus
posiciones de memoria
49. 14/09/17 Angel Vázquez-Patiño 49/51
Conceptos y términos importantes
●
Palabras reservadas de C que no pueden ser
usadas como nombres de funciones
●
Punteros: obtención del valor del espacio de
memoria y la dirección del espacio de memoria
●
Llamado de función por valor y por referencia
●
Funciones que devuelven un arreglo
●
Reglas del ámbito de una variable
50. 14/09/17 Angel Vázquez-Patiño 50/51
Referencias
●
C programming tutorial,
http://fresh2refresh.com/c-programming/
●
Departamento de Ciencias de la Computación, 2016.
Guía de aprendizaje del MOOC de Fundamentos de
Programación: parte II. Universidad de Cuenca,
Cuenca, Ecuador.
●
Plataforma MOOC Cedia, https://goo.gl/VDWwKV
●
Programación en C/Punteros, https://goo.gl/Wqx2Pa
●
Return array from function in C, https://goo.gl/YnlUbi