Você está na página 1de 4

Ing.

Ricardo Castañeda

UNIVERSIDAD NACIONAL DE INGENIERÍA


FACULTAD DE INGENIERÍA MECÁNICA

PROFESOR : RICARDO CASTAÑEDA DE LA ROSA

2011
-1-
FUNCIONES EN LENGUAJE “C”
6.1. Definición.- Es un conjunto de instrucciones agrupadas que tienen un
nombre común y que realizan un calculo (o proceso) especifico. Todo programa
en lenguaje “C” se desarrolla basándose en funciones estas posteriormente
pueden formar una librería particular. Su estructura es:
Forma General
Ing. Ricardo Castañeda

Tipo nombrefuncion ( lista de parámetros)


{................... ;
.....................;
.....................;
[return(.....);]
.....................;
}
Donde:
Tipo .............. Tipo de valor que devuelve la función en algunos
casos no devuelven ningún valor y el tipo será
void (no devuelve).
nombrefuncion ......Identificador de la función
Lista de parámetros...Establecen la comunicación entre la función que
realiza la llamada y nuestra función
return( ) .....Permite retornar un valor a la función que realizo la
llamada, si la función es de tipo void no retorna valor.
Ejemplo1:
int primo( int p1)
{ int i, sw=1; //asumo que es primo
for( i=2; i <= (p1/2) ; i++)
if ( (p1 % i) == 0)
{ sw = 0;// si es divisible no es primo
break;
}
return(sw); }
La llamada será
If ( primo(a))// a necesariamente es entero
Cout<< a << “ Es primo”<< endl;
Ejemplo2:
void leer ( long *código, char nombre[40], char dirección[50])
{ // programa de lectura
clrscr();
cout << “ingrese código: “; cin>>*codigo;
cout << “ Ingrese nombre: “;gets(nombre); //Función de lectura
cout << “Ingrese dirección: “; gets(direccion);
}
La llamada será leer( &code, name, dire);
Si las declaraciones han sido:
long code; char name[40],dire[50];
-2-
6.2. Llamada por valor y llamada por referencia.- Cuando una función es
llamada se le debe enviar una lista de argumentos que son los que establecen
la comunicación entre los dos módulos. La pregunta es , ¿Que argumentos
enviar? . Los argumentos enviados pueden ser valores o direcciones
dependiendo del parámetro:
Si el encabezado es void f1(int p1, int p2, float *p3)
Supongamos que los argumentos son a1, a2 y a3; entonces a1 y a2 deben
necesariamente generar valores simples de tipo entero y a3 será
Ing. Ricardo Castañeda

obligatoriamente variable simple de tipo float, pero el primer parámetro y el


segundo al ser variables solamente piden valores enteros pero el tercer
parámetro al ser tipo puntero pide una dirección de una variable simple de tipo
float. Entonces la llamada será:
f1( a1, a2, &a3);
O sea se envía el contenido de a1 y de a2 pero la dirección de a3, entonces
 a1 y a2 ha sido llamadas por valor
 a3 ha sido llamada por referencia

6.3. Funcionamiento de un subprograma tipo función.- Cuando aparecen el


nombre de una función seguido de una lista de argumentos f2(a1, a2, &a3,
&a4) los siguientes eventos tienen lugar:
 Se realiza una transferencia de valores y direcciones hacia sus respectivos
parámetros. Como lo visualizamos en el siguiente gráfico(Suponiendo que la
llamada se realizo desde main):

main() f2()_
a1 p1
35
a2 p2
40

a3 p3

a4 p4

MEMORIA ASIGNADA A main () MEMORIA ASIGNADA A f2()


Se ejecuta la función hasta que la primera sentencia return es alcanzada o
termina la función.
Cuando termina la ejecución de la función sucede lo siguiente:
 El control retorna al punto siguiente desde donde se realizo la llamada
 Sigue la ejecución de main (En este caso).

-3-
Ejemplos de Funciones en C++ getch();
}
/* PROGRAMA1 Halla una raíz positiva int facto ( int num)
de la ecuación cubica x3 - x2 - x –1 = 0, { if (num < = 1)
en el intervalo [0,5] con un error menor que return(1);
0.001 */ else
# include<iostream.h> return(num * facto(num-1));
Ing. Ricardo Castañeda

# include<math.h> }
# include<conio.h> /*PROGRAMA 3 Halla los factores primos
# define error 0.001 de un numero en forma recursiva */
# define x0 0.0
# include<iostream.h>
# define x1 5.0
# include<math.h>
float fcub(float x);
# include<conio.h>
float bisecar(float a, float b);
void fprimo(int num);
void main( )
void main( )
{ clrscr();
{ int n;
cout<< “ RAIZ = “<< bisecar( x0,x1);
clrscr();
getch();}
do{
float fcub(float x)
cout<< “ NUMERO = “;
{ return( pow(x,3) – pow(x,2) – x –1);}
cin>> n;
float bisecar(float a, float b)
}while(n > 1);
{float r ,medio ;
fprimo(n);
while ( ! abs(a-b) < error)
getch();
{ medio = (a+b)/2.0;
}
if ((fcub(a) * fcub(medio))<= 0)
void fprimo( int num)
b= medio;
{
else
int nr, k =1;
a= medio;
if (num > 1)
}
{ do
r = a;
{ k = k +1;
return( r );
}
} while( (num % k) != 0);
/*PROGRAMA 2 Halla factorial en forma cout<< k << “ “;
recursiva */ nr = num / k;
fprimo( nr);
# include<iostream.h> }
# include<conio.h> }
int facto(int num); TAREA
void main( )
{ int n; Escriba un programa que trabaje
clrscr(); cout<< “ NUMERO = “; cin>> n; como el programa 1 , pero que halle
cout << “ FACTORIAL = “<<facto(n); raíces en cualquier intervalo.
-4-