12 Funciones 8453
12 Funciones 8453
12 Funciones 8453
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx – xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Continuación de Capítulo 2
CAPITULO 2
ENTRADA Y SALIDA ESTÁNDAR
El proceso de entrada obtiene datos de algún medio externo (por ejemplo, del
teclado o de un fichero en disco) y los envía al ordenador para que sean
procesados por un programa. Cuando se introduce un dato, se almacena en una
variable en memoria. Esto quiere decir que habrá que utilizar variables en
cualquier proceso de un programa.
La operación de salida envía una copia de los datos que hay en la memoria del
ordenador a otro lugar; por ejemplo, los visualiza en el monitor, los escribe por
la impresora o los guarda en un fichero en disco. La operación de salida no borra
los datos de la memoria ni cambia la forma en la que están almacenados.
Simplemente hace una copia de los mismos para enviarlos a otro lugar.
Funciones
Una función es una colección de sentencias que ejecutan una tarea específica. En un
programa C se distinguen dos clases de funciones, las funciones definidas por el usuario y
las funciones de biblioteca. En C, la definición de una función nunca puede contener a la
definición de otra función.
Sí se encuentra que en una función hay involucrada más de una tarea, debe subdividir en
dos o más funciones según el caso. En las funciones es importante declarar las variables y
estas pueden ser locales o globales.
Variables locales: estas, solo pueden ser utilizadas únicamente en la función que hayan sido
declaradas.
Variables globales: las variables globales se crean durante la ejecución del programa, y son
globales porque son llamadas, leídas, modificadas, etc. Desde cualquier función y se definen
por lo general antes del programa principal (main).
También se definen fuera de cualquier bloque de instrucciones. Estas variables pueden ser
utilizadas a partir de su definición en cualquier parte del programa.
Donde:
tipo_de_retorno: es el tipo de dato que devolverá esa función, que puede ser real, entero,
o tipo void (es decir que no devolverá ningún valor).
nombre_de_la_función: es el identificador o el nombre que se le da a una función.
Declaración de Parámetros: los parámetros que recibe la función y pueden existir funciones
que no reciban parámetros. Los parámetros de una función no son más que
variables locales que reciben un valor.
Entre abrir y cerrar {}, se encuentran las instrucciones o lo que queremos que haga la
función; al final antes de cerrar con llave debemos colocar una instrucción return, el cual
devolverá un valor específico; si la función es de tipo void no devuelve ningún valor
específico, debido a que esta instrucción reconoce todo tipo de dato.
Las funciones pueden ser colocadas en cualquier orden dentro del programa, pero si se van
a invocar antes de su declaración, se deberá colocar el "prototipo" de la función al inicio del
programa. El "prototipo no es más que el encabezado de la función, el cual termina con un
";".
TIPOS DE FUNCIONES.
Una función es un bloque de código dentro de un programa que se encarga de una tarea
específica. El programa puede tener muchas funciones y no puede faltar la función principal
main(). Entonces un programa, está constituido por más de una función, las llamadas a la
misma pueden realizarse desde cualquier parte del programa y no solo una vez, se pueden
llamar muchas veces y empiezan a ejecutarse las acciones que están escritas en código.
Los tipos de funciones son de acuerdo al tipo de dato que manejan como:
Una función en C, se declara antes de ser utilizada por el programa principal (main()) y se
declaran después de invocar las librerías. El prototipo de una función es su cabecera
terminada en punto y coma (;), como se muestra en el siguiente ejemplo:
int suma(int n) // definición de la función sin el (;) y va después del programa principal
{
int i,sum=0;
for(i=1; i<=n; i++)
sum+=i;
return(sum); //return 6
} //fin suma
SALIDA:
entre el valor de n: 4
la suma de los n primeros numeros enteros es: 10
Así:
int main ()
{
int a, b = 7; //variables automáticas, sólo se pueden usar dentro de la
//función main.
a=b-7;
}
...
}//fin programa
int f(void)
{ int x; //variable automática, sólo se pueden usar dentro de la función f.
x = a; //ERROR: no puede usas la variable a dentro de la función f.
...
return 10;
}
while (b>3)
{
f *= 10; f=50
printf("f= %d\n", f); f=50
b--; f=50
} f=50
}
Las variables estáticas se crean la primera vez que se ingresa al bloque, pero
no se destruyen, permanecen definidas en la memoria hasta que se acabe el
programa, su valor se mantiene. Sin embargo el ámbito de esta variable se limita
al bloque en el que fue definida.
Sintaxis:
Ejemplo:
#include <stdio.h>
void muestra (int a)
{
static int b=1;
b += a;
printf("a= %5d b= %5d\n", a, b);
}
int main ()
{
int a;
for (a=0; a<4; a++)
muestra (a);
} 3
Inicialización de variables
Ejemplo:
#include <stdio.h>
int producto(int A, int B);
int main()
{
int A, B,resultado;
do{
printf("Ingrese dos n%cmeros # # (Enter) \nPara finalizar digite
9999\n",163); A B
scanf("%d %d",&A ,&B);
resultado=0; 3 2
if (A!=9999 && B!=9999)
{
resultado = producto(A,B,5,8); //llamando a la función
producto(3) //llamando a función con el argumento 3 y 2
printf(" A B PRODUCTO\n");
printf("%10d %10d %10d\n",A,B,resultado);
}
}while (A!=9999 && B!=9999);
}//fin programa
argumento 3 2
if (negativo==0)
return total;
else
return total*(-1);
} //fin de la funcion
La lista de parámetros normalmente consiste en una lista de identificadores con sus tipos,
separados por comas. En el caso de que se trate del prototipo de una función, se pueden
omitir los identificadores. Por ejemplo:
Para asegurar la portabilidad de los programas, se puede utilizar el tipo void para especificar
que una función no acepta argumentos, ya que, a diferencia de C++, en el lenguaje C
estándar la ausencia de parámetros y la no especificación de void indica cualquier número
#include <stdio.h>
La definición de una función consta de una cabecera de función y del cuerpo de la función
encerrado entre llaves.
Las variables declaradas en el cuerpo de la función son locales y por definición solamente
son accesibles dentro del mismo.
El tipo del resultado especifica qué tipo de datos retorna la función. Este, puede ser
cualquier tipo fundamental, o tipo definido por el usuario, pero no puede ser un array o una
función. Si no se especifica, se supone que es int. El resultado de una función es devuelto a
la sentencia de llamada, por medio de la sentencia:
return [()expresión[));
Esta sentencia puede ser o no la última y puede aparecer más de una vez en el cuerpo de la
función. En el caso de que la función no retorne un valor, se puede omitir o especificar
simplemente return. Por ejemplo,
Los parámetros formales de una función son las variables que reciben los valores de los
argumentos especificados en la llamada a la función. Consisten en una lista de
identificadores con sus tipos, separados por comas. A continuación puede ver un ejemplo:
Para ejecutar una función hay que llamarla. La llamada a una función consta del nombre de
la misma y de una lista de argumentos, denominados parámetros actuales, encerrados
entre paréntesis y separados por comas. Por ejemplo:
Cuando se llama a una función, el valor del primer argumento actual es pasado al primer
parámetro formal, el valor del segundo argumento actual es pasado al segundo parámetro
formal y así sucesivamente. Por defecto, todos los argumentos, excepto los arrays, son
pasados por valor. Esto significa que a la función se pasa una copia del valor del argumento,
no su dirección. Esto hace que la función invocada, no pueda alterar las variables que
contienen los valores pasados.
En el siguiente ejemplo, puede observar que la función main llama a la función intercambio
y le pasa los argumentos a y b. La función intercambio almacena en x el valor de a y en y el
x=a
y=b
20 30
a b
20 30
x y
Los parámetros formales x e y son variables locales a la función intercambio, por lo tanto
sólo son accesibles dentro de la propia función. Esto significa que las variables locales se
crean cuando se ejecuta la función y se destruyen cuando finaliza la ejecución de la función.
20 30
20 20 30
z x y
Operador dirección-de
El resultado desde el punto de vista gráfico puede verlo en la. figura siguiente. La figura
representa un segmento de memoria de n bytes. En este segmento localizamos el entero 7
de dos bytes de longitud, en la dirección 13162. La variable a representa al valor 7 y &a
(dirección de a; esto es, donde se localiza a) es 13162.
13162
7
a
16456
a
int a;
int *aucas; 12
a = 10;
aucas = 12; //esto es error aucas
aucas = &a; esto es correcto 16456
Operador de indirección
Un puntero es una variable capaz de contener una dirección de memoria que indica dónde
se localiza un objeto de un tipo especificado (por ejemplo, un entero). La sintaxis para
definir un puntero es:
tipo *identificador;
donde tipo es el tipo del objeto apuntado e identificador el nombre del puntero.
El siguiente ejemplo declara un puntero px a un valor entero x y después asigna este valor
al entero y.
px x y
7 7
int main()
{
int *px, x = 7, y= 0; // px es un puntero a un valor entero
px = &x; // en el puntero px se almacena la dirección de x
y= *px; //a la variable y se le asigna el valor localizado en la dirección
// almacenada en px
} x
maria
char c;
int x; 15
int *maria;
char *pedro;
x=15;
maria = 7; //error
maria = &x; esto es valido
pedro = &x; error es error
13162
13162 7 7
px x y
Apunta
20 30
a b
16382 16384
x y
3. Ahora x apunta al dato a; esto es, el valor de x especifica el lugar donde se localiza
el dato a dentro de la memoria. Análogamente, diremos que y apunta al dato b.
16382 16384
x y
20 30
a b
Observe que *x hace referencia al mismo dato de memoria que a y que *y hace
referencia al mismo dato de memoria que b.
30 20
a b
Cuando la función intercambio finaliza, los valores de a y b han sido intercambiados y las
variables x e y, por el hecho de ser locales, son destruidas.
Por lo tanto, pasar parámetros por referencia a una función es hacer que la función acceda
indirectamente a las variables pasadas. A diferencia de cuando se pasan los parámetros por
valor, no hay duplicidad de datos.
//Sumar dos valores por medio de una función, la función no devuelve nada y el resultado
se regresará en un tercer parámetro por dirección
#include <stdio.h>
void suma(int , int , int *);
int main ()
{
int a= 0, b = 0, s = 0;
printf ( "Ingrese valores de a y b: ”);
scanf("%d %d", &a, &b); // leer desde el teclado a y b
suma(a,b, &s);
printf("La suma es %d\n", s);
}
void suma(int x, int y, int *z )
{
*z = x + y;
}
Ejercicio 1
Elaborar una función que reciba como argumento un dato de tipo float y devuelva
tres variables: la primera que almacene la parte entera del número, la segunda
que almacene como entero la parte decimal del número y la última que almacene
el número de decimales que contiene el dato recibido por la función.
Ejercicio 2
Elaborar una función que reciba en una variable entera un número n, y devuelva
en otra variable la palabra "verdadero" si el número recibido es primo, caso
contrario devuelva la palabra "falso".
Ejercicio 3
1
1 1
1 2 1
1 3 3 1
Ingrese su opción: 1