• No se han encontrado resultados

Funciones. Ejercicios Resueltos Ejercicios Propuestos

N/A
N/A
Protected

Academic year: 2021

Share "Funciones. Ejercicios Resueltos Ejercicios Propuestos"

Copied!
17
0
0

Texto completo

(1)

Funciones

Contenido

INTRODUCCIÓN ... 2

Declaración de una función... 3

Definición de una función ... 4

FUNCION MAIN ... 5

Llamada a una función ... 6

Variables Locales ... 6

Variables Globales ... 7

Paso por valor y Referencia ... 8

Funciones para el manejo de cadenas……….…11

Ejercicios Resueltos ... 133

(2)

INTRODUCCIÓN

Una función es un fragmento de código que realiza una tarea bien definida. Por ejemplo, la función printf imprime por la salida estándar los parámetros que le pasamos. Al igual que esta función, existen otras funciones que realizan diversas tareas ya definidas en el estándar ANSY C y que pueden ser utilizadas por el programador. Este tipo de funciones predefinidas son denominadas funciones de biblioteca. Sin embargo, cada programador define sus propias funciones de acuerdos a sus necesidades. Las funciones que define el programador son conocidas como funciones de usuario.

La utilización de funciones nos permite dividir un programa extenso en pequeños segmentos que realizan tareas concretas. Probablemente, dentro de un mismo programa se realicen las mismas tareas varias veces, lo que se facilita mediante la utilización de funciones. Sin embargo, es probable que ciertas funciones no sean reutilizables, pero al usarlas se mejora la legibilidad del programa.

Con el propósito de permitir un manejo eficiente de los datos, las funciones en C no se pueden anidar. En otras palabras, una función no se puede declarar dentro de otra función, por lo que todas las funciones son globales o externas, lo que hace que puedan llamarse desde cualquier parte de un programa.

Las funciones son los bloque constructores en C, y el lugar donde se centra toda la actividad del programa siendo una de las características principales de C.

El bloque es el cuerpo de la función y el nombre del bloque es el nombre de la función, cuando se declara una función además del cuerpo y el nombre de la misma también hay que especificar los parámetros o argumento y el tipo de resultado que retornara.

Un argumento es el valor que se le pasa a una función cuando estas es llamada, dicho valor será almacenado en el parámetro correspondiente de la función.

Ej: Tipo_Retorno Nombre_funcion(Lista_de_parametros) { //Cuerpo_de_la_Funcion //Valor retornado }

(3)

a cabo la tarea específica para la cual ha sido creada la función.

Valor Retornado: mediante la palabra reservada return, se devuelve el valor de la

función, en este caso representado por expresión.

Declaración de una función

La declaración de una función o también conocida como prototipo de la función indica además del nombre de la función, cuantos parámetros tiene y de qué tipo son, así como el valor

especificado.

En general el prototipo de la función o declaración de la función permite conocer las características de la misma antes que defina la tarea que realizara.

Ej:

float convertir(int g);

La sentencia anterior indica que cuando sea invocada la función convertir hay que pasarle un argumento entero y que dicha función retornara una valor real.

Una función también puede ser declarada implícitamente o explícitamente. La declaración

implícita es cuando la función es llamada y no existe una declaración previa (Prototipo de la función). La función main que hemos utilizado hasta ahora siempre se hace implícitamente y

no retorna ningún valor ya que en el programa no se hace ninguna llamada a ella misma.

La declaración explicita específica el número y el tipo de parámetros de la función así como el valor retornado. Ej:

float sumar(int x, int y);

La lista de parámetros normalmente consiste en una lista de identificadores con sus tipos separados por comas, en el caso del ejemplo anterior se pueden omitir los identificadores y quedaría de la siguiente forma:

float sumar(int, int); // Se le pasan 2 parámetros enteros y retorna un numero real.

También hay que tener en cuenta que el nombre de los parámetros utilizados en la declaración de la función y los utilizados en la definición de la función no necesariamente tienen que ser los mismos.

Ej:

float sumar(int x, int y); //Declaración de la función float sumar(int A, int B) //Definición de la función

(4)

La lista de parámetros puede también estar vacía. Ej:

float sumar();

Así cuando declaremos una función sin parámetros utilizaremos la palabra reservado void. Ej:

float sumar(void);

Definición de una función

La definición de una función consta de una cabecera de función y del cuerpo de la función encerrado entre llaves.

Tipo Nombre_funcion(parametro1, parametro2, parámetro n) {

//Declaración de las variables locales //Sentencias

[return()]; }

Las variables declaradas en el cuerpo de la función son locales y por definición solamente son accesibles dentro del mismo.

El Tipo especifica el tipo de datos retornados por la función, este puede ser cualquier tipo de valor menos una matriz o una función, si no se especifica se supone que en int. Para indicar que no devuelve nada se utiliza la palabra reservada void. Ej:

(5)

FUNCION MAIN

La filosofía en la que se base el diseño de C es el empleo de funciones. Por esta razón, un programa en C contiene al menos una función, la función main. Esta función es particular dado que la ejecución del programa se inicia con las instrucciones contenidas en su interior. Una vez iniciada la ejecución del programa, desde la función main se puede llamar a otras funciones y, posiblemente, desde estas funciones a otras. Otra particularidad de la función main es que se llama directamente desde el sistema operativo y no desde ninguna otra función. De esta manera, un programa en C sólo puede contener una función main.

Su definición es: void main(void) {

//Cuerpo de la función }

EJ: El siguiente programa calcula el cubo de los números del 1 al 5 utilizando una función definida por el usuario.

#include <stdio.h> int cubo(int base); main()

{

int numero;

for(numero=1; numero<=5; numero++) {

printf("El cubo del número %d es %d\n", numero, cubo(numero)); }

return 0; }

int cubo(int base) {

int potencia;

potencia = base * base * base; return potencia;

}

La salida es:

El cubo del número 1 es 1 El cubo del número 2 es 8 El cubo del número 3 es 27 El cubo del número 4 es 64 El cubo del número 5 es 125

(6)

Llamada a una función

Llamar a una función es sinónimo de ejecutarla, la llamada debe realizarse desde otra función o desde ella misma. Esta llamada debe estar formada por el nombre de la función seguido de una lista de argumentos o parámetros encerrados en paréntesis y separados por comas.

Ej: Se tiene la función int sumar(int x,int y); //Llamada a la función sumar

X = sumar(a,b);

Los parámetros a y b son lógicamente variables enteras definidas anteriormente a la llamada de la función las cuales almacenaran el dato que se desea pasar a la función, y como se menciono anteriormente los nombres de los parámetros no necesariamente tienen que ser las misma.

Variables Locales

Las variables locales se crean en el momento en que se activa la función, y desaparecen en el momento en que la función termina. Veamos un ejemplo.

#include <stdio.h> #include <ctype.h> int suma_d (int x) {

int d, suma; //Variables locales suma=0; d = x % 10; while (x >0) { suma = suma + d; x = x/10; d = x%10; } return (suma); } void main () { int a;

printf ("Escribe el numero:\n"); scanf ("%d",&a);

printf ("La suma de digitos es %d\n",suma_d(a)); }

(7)

Variables Globales

A diferencia de las variables locales cuyo ámbito estaba confinado a la función donde estaban declaradas, el ámbito de las variables globales se extiende desde el punto en el que se definen hasta el final del programa. En otras palabras, si definimos una variable al principio del programa, cualquier función que forme parte de éste podrá utilizarla simplemente haciendo uso de su nombre.

La utilización de variables globales proporciona un mecanismo de intercambio de información entre funciones sin necesidad de utilizar argumentos. Por otra parte, las variables globales mantienen el valor que se les ha asignado dentro de su ámbito, incluso después de finalizar las funciones que modifican dicho valor. Debemos tener en cuenta que el uso de variables globales para el intercambio de informaciones entre funciones puede resultar útil en algunas situaciones (como cuando se desea transferir más de un valor desde una función), pero su utilización podría llevarnos a programas de difícil interpretación y complejos de depurar.

Ej: Utilización de variables globales como mecanismo de intercambio de información entre funciones. #include<stdio.h> void unaFuncion(); void otraFuncion(); int variable; void main() { variable = 9;

printf("El valor de variable es: %d\n", variable); unaFuncion();

otraFuncion();

printf("Ahora el valor de variable es: %d\n", variable); return 0;

}

void unaFuncion() {

printf("En la función unaFuncion, variable es: %d\n", variable); }

void otraFuncion() {

variable++;

printf("En la función otraFuncion, variable es: %d\n",variable); }

La salida es:

El valor de variable es: 9

En la función unaFuncion, variable es: 9 En la función otraFuncion, variable es: 10 Ahora el valor de variable es: 10

(8)

Paso por valor y Referencia

En C todos los argumentos que se pasan a una función se pasan por valor. En otras palabras, se pasa una copia del valor del argumento y no el argumento en sí (por ello, este procedimiento se conoce en algunas ocasiones como paso por copia). Al pasar una copia del argumento original a la función, cualquier modificación que se realice sobre esta copia no tendrá efecto sobre el argumento original utilizado en la llamada de la función. Se puede considerar un argumento pasado por valor como una variable local de la función a la que se ha pasado, de tal modo que los cambios que se realicen sobre ésta tendrán efecto sólo dentro de la función. Veamos un ejemplo del paso por valor de argumentos a una función:

#include <stdio.h>

void modificar(int variable); void main()

{

int i = 1;

printf("\ni=%d antes de llamar a la función modificar", i); modificar(i);

printf("\ni=%d después de llamar a la función modificar", i); }

void modificar(int variable) {

printf("\nvariable = %d dentro de modificar", variable); variable = 9;

printf("\nvariable = %d dentro de modificar", variable); }

Dado que lo que se pasa a la función modificar es una copia de la variable i, el valor de ésta en la función main no se ve alterado cuando dentro de la función modificar se cambia el valor de variable. De ahí, la salida del ejemplo anterior es la siguiente:

i=1 antes de llamar a la función modificar variable = 1 dentro de modificar

variable = 9 dentro de modificar

i=1 después de llamar a la función modificar

Como ya hemos visto, cuando se pasa un argumento por valor, realmente se pasa una copia de éste, y si esta copia se modifica el argumento original no se ve alterado. Sin embargo, en muchas ocasiones lo que queremos es que una función cambie los valores de los argumentos que le pasamos. Para lograrlo se utiliza lo que se conoce como paso de argumentos por

referencia. En estos casos, no se pasa una copia del argumento, sino el argumento mismo.

(9)

modificar(&i);

printf("\ni=%d después de llamar a la función modificar", i); return 0;

}

void modificar(int *variable) {

printf("\nvariable = %d dentro de modificar", *variable); *variable = 9;

printf("\nvariable = %d dentro de modificar", *variable); }

La salida de este ejemplo sería:

i=1 antes de llamar a la función modificar variable = 1 dentro de modificar

variable = 9 dentro de modificar

i=9 después de llamar a la función modificar

Como se puede observar, el valor de i ha cambiado puesto que la función modificar ha utilizado la dirección de memoria de esta variable en la sentencia de asignación *variable = 9. Analicemos detenidamente este ejemplo. Lo primero que tenemos que tener en cuenta es que la premisa de que en C todos los argumentos se pasan por valor sigue siendo cierta. Lo que sucede es que en este caso estamos pasando el valor de la dirección de memoria de la variable i y no el valor de su contenido (1). Para pasar la dirección de memoria de una variable se utiliza el operador &. Al finalizar la función, el valor de dicha dirección permanece igual y lo que se ha modificado es el contenido de esa dirección de memoria. Dentro de la función se utilizan los punteros para trabajar con las direcciones de memoria (*variable).

Dado que el paso de argumentos por referencia es común en C, conviene que en este punto ampliemos el concepto de puntero. Consideremos las siguientes declaraciones:

int dato; int *puntero;

La primera de las declaraciones reserva memoria para almacenar una variable de tipo entero

(int) mientras que la segunda declaración reserva memoria para almacenar una dirección. A

pesar de que apunta a una variable de tipo entero, lo que se va a almacenar es una dirección. Como en el fondo un puntero puede apuntar a cualquier cosa, C permite la declaración de punteros tipo void. Supongamos que el compilador reserva la dirección en hexadecimal bffff120 para la variable dato y la dirección en hexadecimal 0012fed4 para puntero.

En la Figura 3.1 se muestra gráficamente la representación de la declaración de las variables Anteriores

Fig. 3.1. Declaración de variables.

(10)

dato = 99; puntero = &dato;

El resultado en la memoria se muestra en la Figura 3.2. Debemos recordar que mediante el operador & obtenemos la dirección de una variable.

Fig. 3.2. Asignación de valores.

Una vez realizada la asignación anterior, disponemos de dos maneras de acceder al contenido de la variable dato. La primera forma de acceder es mediante el nombre de la variable y la segunda mediante el puntero que apunta a dicha variable. Para acceder a la variable dato mediante puntero, se utiliza el operador *. Una utilidad del paso de argumentos por referencia se relaciona con la devolución de valores desde una función. Como ya sabemos, en C una función sólo puede devolver un único valor. Sin embargo, a menudo se hace necesario que una función devuelva más de un valor, y es aquí donde podemos utilizar el paso de argumentos por referencia.

Además, la utilización del paso de argumentos por referencia nos permite ahorrar tiempo y espacio. En el caso que deseáramos pasar algo a una función cuyo tamaño sea grande, por ejemplo una estructura, sería conveniente pasarla por referencia, ya que si lo hacemos por valor, se tiene que realizar una copia de la misma y colocarla en la pila, lo que implica consumo de tiempo y espacio.

(11)

Funciones para el manejo de cadenas

Todas las funciones para el manejo de cadena su prototipo se encuentra en:#include<string.h>

Funcion Descripcion

stpcpy Copia una cadena de caracteres en otra.Se detiene cuando encuentra el terminador nulo.

strcat Añade una cadena de caracteres a otra.

strchr Busca, en una cadena, un caracter dado.

strcmp Compara dos cadenas.

strcmpi Macro que compara dos cadenas sin distinguir entre mayúsculas y minúsculas

strcpy Copia una cadena.

strcspn Busca segmentos que no contienen un subconjunto de un conjunto especificado de caracteres.

strdup Copia una cadena a una nueva localidad.

_strerror Genera un mensaje de error definido por el programador.

strerror Retorna el apuntador al mensaje asociado con el valor del error.

stricmp Compara dos cadenas sin diferenciar entre mayúsculas y minúsculas

strlen Determina la longitud de una cadena.

strlwr Convierte las mayúsculas de una cadena en minúsculas.

strncat Añade el contenido de una cadena al final de otra.

strncmp Compara parte de una cadena con parte de otra.

strncmpi Compara parte de una cadena con parte de otra, sin distinguir entre mayúsculas y minúsculas.

strncpy Copia un un número de bytes dados, desde una cadena hacia otra.

strnicmp Compara parte de una cadena con parte de otra, sin distinguir entre mayúsculas y minúsculas.

strnset Hace que un grupo de elementos de una cadena tengan un valor dado.

strpbrk Busca la primera aparición, en una cadena, de cualquier caracter de un conjunto dado.

strrchr Busca la última aparición de un caracter en una cadena.

strrev Invierte el orden de los caracteres de una cadena.

strset Hace que los elementos de una cadena tengan un valor dado.

strspn Busca en una cadena el primer segmento que es un subconjunto de un conjunto de caracteres dado

strstr Busca en una cadena la aparición de una subcadena dada.

_strtime Convierte la hora actual a una cadena.

strtod Convierte una cadena a un valor double ó long double.

strtol Convierte una cadena a un valor long.

strtoul Convierte una cadena a un valor unsigned long.

(12)

EJEMPLOS DE LAS PRINCIPALES FUNCIONES PARA EL MANEJO DE CADENAS Strlen()

n = strlen (cadena);

strcad(): Recuende que cadena1 es la cadena destino y cadena2 es la cadena origen strcat (cadena1, cadena2) ;

strcmp()

Strcmp (cadena1, cadena2) ;

strcmpi()

strcpy (cadena1, cadena2); strlwr()

strlwr (cadena); strrev() strrev (cadena);

/ * Programa de ejemplo para utilizar las funciones de cadena * / # Include <stdio.h> # Include <string.h> void main () { char s1 [20], s2 [20], s3 [20]; int X, L1, L2, L3;

printf ("Introduzca las cadenas"); scanf ("% s% s", s1, s2); x = strcmp (s1, s2); if (x! = 0)

{

printf ("\ nStrings no son iguales \ n");

strcat (s1, s2); }

printf ("\ nStrings son iguales"); strcpy (s3, s1);

l1 = strlen (s1); l2 = strlen (s2); l3 = strlen (s3);

printf ("\ ns1% s = \ longitud t =% d caracteres \ n", s1, L1); printf ("\ ns2% s = \ longitud t =% d caracteres \ n", s2, l2); printf ("\ ns3% s = \ longitud t =% d caracteres \ n", s3, l3);

(13)

Ejercicios Resueltos

Realizar una función llamada par, que toma un número entero como parámetro, y devuelve 1 si es par o devuelve 0 si es impar. NOTA: Para saber si un número entero es par, al dividirlo entre 2 su resto debe ser 0.

#include<stdio.h>

int par(int); // o int par(int numero); int main()

{

int numero, resultado;

printf(“Introduzca un número:\n”); scanf(“%i”,&numero); resultado=par(numero); if (resultado==1) printf(“Es par.\n”); else printf(“Es impar.\n”); return(0); }

/* Función par: Devuelve un valor indicando si un número entero es par o no. */ int par(int numero)

{ if((numero%2)==0) return(1); else return(0); }

(14)

Realizar una función llamada media2, que toma dos números reales como parámetros, y devuelve un número real que es la media de los dos números pasados como parámetros. NOTA: Para calcular la media de dos números, se suman, y ese resultado se divide entre 2.

#include<stdio.h> float media2(float,float);

//o float media2(float n1, float n2); int main()

{

float n1, n2, resultado;

printf(“Introduzca un número real:\n”); scanf(“%f”,&n1);

printf(“Introduzca otro número real:\n”); scanf(“%f”,&n2);

resultado=media2(n1,n2);

printf(“La media es: %f.\n”,resultado); return(0);

}

// Función media2: Devuelve la media de 2 números. float media2(float n1, float n2)

{

float resultado; resultado=(n1+n2)/2; return(resultado); }

(15)

Realizar una función llamada media3, que toma tres números reales como parámetros, y no devuelve nada. Esa función debe calcular la media de los tres números pasados como parámetros y mostrar con un mensaje cuál es la media calculada. NOTA: Para calcular la media de tres números, se suman, y ese resultado se ivide entre 3.

#include<stdio.h>

void media3(float,float,float);

//o void media3(float n1,float n2,float n3); int main()

{

float n1, n2, n3;

printf(“Introduzca un número real:\n”); scanf(“%f”,&n1);

printf(“Introduzca otro número real:\n”); scanf(“%f”,&n2);

printf(“Introduzca otro número real:\n”); scanf(“%f”,&n3);

media3(n1,n2,n3); return(0);

}

// Función media3: Informa de la media de void media3(float n1, float n2, float n3) 3 números.

{

float resultado;

resultado=(n1+n2+n3)/3;

printf(“La media es:%f\n”,resultado); }

(16)

Realizar una función llamada negativo, que toma un número entero como parámetro, y devuelve 1 si es negativo o 0 si no lo es.

#include<stdio.h> int negativo(int numero); int main() { int n,resultado; printf(“Introduzca un número:\n”); scanf(“%i”,&n); resultado=negativo(n); if (resultado==1)

printf(“Es un número negativo.\n)”; else

printf(“No es negativo.\n”); return(0);

}

/* Función negativo: Devuelve 1 si es negativo el número entero pasado como parámetro, o 0 si no lo es. */

int negativo(int numero) { int res; if (numero<0) res=1; else res=0; return(res); }

(17)

Ejercicios Propuestos

1. 1-Realice un programa en C que contenga una función llamada invertir que reciba un parámetro de tipo char y que retorne la cadena invertida.

2. Diseñe un Programa en C que contenga una función llamada primo que reciba

como parámetro un numero entero positivo. Retorne 1 si en numero es primo de los contrario retorne 0. Ojo, los números primos sólo son divisibles por el mismo y por la unidad (1).

3. Diseñe un programa en C que contenga un función llamada factorial que reciba como parámetro un numero entero positivo y muestre su facturial.

4. Diseñe un programa en C que contenga 4 funciones (sumar, restar, dividir,

multiplica), las cuales recibirán 2 parámetros de tipo entero y retorne el

resultado de la operación. Haga uso del switch.

5. Diseñe un programa con una función llamada potencia, que dada una cifra entera positiva, sea elevada a una potencia introducida por el usuario, la función recibirá 2 parámetros enteros y retornara el resultado de la operación . (Ejemplo: 5^2=25).

6. Escribir una función reemplaza, la cual toma una cadena como parámetro, le reemplaza todos los espacios en blanco de la cadena por un guión bajo, y devuelve el número de espacios reemplazados.

Referencias

Documento similar

Para completar mi día «libre», había planeado ir a una librería esa misma tarde y comprar un libro de hindi, pero Manik tenía algo en mente: «Vamos a subir cinco minutos a casa

Entonces usted tiene su atención sobre sus ojos y como ella esta centrada en los suyos comienza a decir:.. &#34; Maria, sé que hay alguna gente que puede mirar muy profundamente a

Coloquen el cursor sobre el controlador de relleno y hagan doble clic sobre él para copiar la fórmula en el resto del rango, es decir: B3:B101. Actualicen el

Quizás tengas muchas ideas nuevas, quizás las situaciones sean demasiado desconocidas para ti, quizás te falta información para poder decidir, en todas ellas la solución es

 Noordermer: Si, si y no porque son muy pocos los docentes que cuando planifican piensan en las diferentes respuestas que van a tener en el grupo, en general como docentes, como

Objetivo del Proyecto: Fortalecer el proyecto educativo del Centro Fe y Alegría Chiantla, fortaleciendo los procesos que lo constituyen, en el marco de la calidad educativa del

Debido a la calidad y el legado de nuestra compañía, los cuales se reflejan en nuestros pianos, elegir un instrumento hecho por Steinway &amp; Sons tiende a ser una decisión

The buildings of Jose Llinas besides their formal aptitudes, in addi- tion to the quality of their materials, not to mention the perfection of their