apuntes u6 de pb 2014-1 (modulos)

33
25-4-2014 San Luis Potosí, México. Unidad 6. Módulos Ing. Héctor Bazarte Torres ITSLP/ 2014-1 ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Upload: kristian-alvarez

Post on 28-Dec-2015

31 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Apuntes u6 de PB 2014-1 (Modulos)

San Luis Potosí, México.

ITSLP/2014-1 ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Page 2: Apuntes u6 de PB 2014-1 (Modulos)

Unidad 6.- Módulos

6.1 Diferencia entre Funciones y Procedimientos.6.2 Activación / Invocación de Funciones y Procedimientos6.3 Uso de Funciones y Procedimientos con Parámetros.

Introducción

Las funciones son los bloques constructores de C, es el lugar donde se produce toda la actividad del programa. Las funciones realizan una tarea específica, como mandar a imprimir un mensaje en pantalla, o abrir un archivo.

Es la característica más importante de C. Subdivide en varias tareas el programa, así sólo se las tendrá que ver con diminutas piezas de programa, de pocas líneas, cuya escritura y corrección es una tarea simple. Las funciones pueden o no devolver y recibir valores del programa.

Diseño modular de programas: Descomposición modular

Hasta ahora hemos estado pensando los pasos que deberíamos dar para resolver un cierto problema, y hemos creado programas a partir de cada uno de esos pasos. Esto es razonable cuando los problemas son sencillos, pero puede no ser la mejor forma de actuar cuando se trata de algo mas complicado.

A partir de ahora vamos a empezar a intentar descomponer los problemas en trozos mas pequeños, que sean mas fáciles de resolver. Esto nos puede suponer varias ventajas:

• Cada “trozo de programa” independiente será mas fácil de programar, al realizar una función breve y concreta.

• El “programa principal” será mas fácil de leer, porque no necesitara contener todos los detalles de como se hace cada cosa.

• Podremos repartir el trabajo, para que cada persona se encargue de realizar un “trozo de programa”, y finalmente se integrara el trabajo individual de cada persona.

Esos “trozos” de programa son lo que suele llamar “subrutinas”, “procedimientos” o “funciones”. En el lenguaje C, el nombre que más se usa es el de funciones.

Concepto y características

 Módulo:

        Es aquél que está constituido por una o varias instrucciones físicamente contiguas y lógicamente encadenadas, las cuales se pueden referenciar mediante un nombre y pueden ser llamadas desde diferentes puntos de un programa.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 1Unidad 6/Ing. Héctor Bazarte Torres

Page 3: Apuntes u6 de PB 2014-1 (Modulos)

 Un módulo puede ser:

Un programa

Una función

Una subrutina (o procedimiento)

  Características de un Módulo

        Los módulos deben tener la máxima cohesión y el mínimo acoplamiento. Es decir, deben tener la máxima independencia entre ellos.

        La salida del módulo debe ser función de la entrada, pero no de ningún estado interno. En la creación de los módulos deben cumplirse tres aspectos básicos: descripción, rendimiento y diseño.

         En la descripción se definen las funciones y objetivos del programa. Para obtener el máximo rendimiento se ha de comprobar que el programa realice el proceso aprovechando al máximo todos los recursos de los que dispone. En cuanto al diseño, se debe comprobar la estructura que sigue el módulo, así como la estructura de los datos y la forma de comunicaciones entre los diversos y diferentes módulos.

        Conforme se extiende el tamaño de los algoritmos, se hace más difícil su revisión, actualización y/o corrección.

        Una política común para solventar este problema consiste en la modularización. Esto significa que el algoritmo se fragmenta en partes llamadas módulos. En realidad, es un método de diseño que tiende a dividir el problema, de forma lógica, en partes perfectamente diferenciadas que pueden ser analizadas, programadas y puestas a punto independiente.

        Realmente la programación modular es un intento para diseñar programas, de forma tal que cualquier función lógica pueda ser intercambiada sin afectar a otras partes del programa.

 Algunas ventajas de utilizar módulos son:

Un programa modular es fácil de mantener y modificar.

Un programa modular es más fácil de escribir y depurar (ejecutar, probar y poner a punto).

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 2Unidad 6/Ing. Héctor Bazarte Torres

Page 4: Apuntes u6 de PB 2014-1 (Modulos)

Un programa modular es más fácil de controlar. El desglose de un problema en módulos permite encomendar los módulos más complejos a los programadores más experimentados y los más sencillos a los programadores nóveles.

Posibilita el uso repetitivo de las rutinas en el mismo o en diferentes programas.

 Desventajas del uso de módulos:

No se dispone de algoritmos formales de modularidad, por lo que a veces los programadores no tienen claras las ideas de los módulos.

La programación modular requiere más memoria y tiempo de ejecución.

 Objetivos de la programación modular:

Disminuir la complejidad.

Aumentar la claridad y fiabilidad.

Disminuir el coste.

Aumentar el control del proyecto.

Facilitar la ampliación del programa mediante nuevos módulos.

Facilitar las modificaciones y correcciones al quedar automáticamente localizadas en un módulo.

Clasificación de los módulos

 Pueden ser de dos tipos:

Funciones

Procedimientos

         Estas funciones y procedimientos se escriben solamente una vez, pero pueden ser referenciados (invocadas) en diferentes puntos de un programa, tantas veces como se requiera de modo que se puede evitar la duplicación innecesaria del código.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 3Unidad 6/Ing. Héctor Bazarte Torres

Page 5: Apuntes u6 de PB 2014-1 (Modulos)

6.1 Diferencia entre función y procedimiento

Las funciones y los procedimientos son conjuntos de instrucciones que realizar una tarea en particular y permiten crear programas complejos, mediante un reparto de tareas que permite construir el programa de forma estructurada y modular.

Desde un punto de vista académico, se entiende por procedimiento el conjunto de sentencias a las que se asocia un identificador (un nombre), y que realiza una tarea que se conoce por los cambios que ejerce sobre el conjunto de variables.

Y entendemos por función el conjunto de sentencias a las que se asocia un identificador (un nombre) y que genera un valor nuevo, calculado a partir de los argumentos que recibe.

Los elementos que componen un procedimiento o función son:

1. Un identificador, que es el nombre que sirve para invocar a esa función o a ese procedimiento.2. Una lista de parámetros, que es el conjunto de variables que se facilitan al procedimiento o función para que realice su tarea modularizada. Al hacer la abstracción del sistema, ymodularlo en partes más accesibles, hay que especificar los parámetros formales quepermiten la comunicación y definen el dominio (tipo de dato) de los datos de entrada. Esa lista de parámetros define el modo en que podrán comunicarse el programa que utiliza la función y la función usada.3. Un cuerpo o conjunto de sentencias. Las necesarias para poder realizar la tarea para la que ha sido definida la función o el procedimiento. Dentro de las sentencias también se encuentran las declaraciones de variables locales.4. Un entorno. Entendemos por entorno el conjunto de variables globales al procedimiento ofunción, que pueden ser usadas y modificadas dentro del ámbito de la función. Esas variables, por ser globales y por tanto definidas en un ámbito más amplio al ámbito local de la función, no necesitan ser explicitadas en la lista de parámetros de la función.

Es una práctica desaconsejable trabajar con el entorno de la función desde el ámbito local de la función. Hacerlo lleva consigo que esa función deja de ser independiente de ese entorno y, por tanto, deja de ser exportable. Perderíamos entonces el valor de la independencia funcional, que es una de las propiedades de la programación por módulos.

Podemos pues concluir que el uso de variables globales dentro del cuerpo de un procedimiento ofunción es altamente desaconsejable.

En el lenguaje C no se habla habitualmente de procedimientos, sino sólo de funciones. Pero existen de las dos tipos de módulos. Procedimientos serían, por ejemplo, la función printf no se invoca para calcular valores nuevos, sino para realizar una tarea sobre las variables. Más claro se ve con la función scanf que, efectivamente, realiza una tarea que se conoce por los cambios que ejerce sobre una variable concreta. Y funciones serían, por ejemplo, la función strlen, que a partir de una cadena de caracteres que recibe como parámetro de entrada calcula un valor, que es la longitud de esa cadena; o la función sin, que a partir de un ángulo que recibe como valor de entrada, calcula el seno de ese ángulo como valor de salida.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 4Unidad 6/Ing. Héctor Bazarte Torres

Page 6: Apuntes u6 de PB 2014-1 (Modulos)

En definitiva, una función o procedimiento es una porción de código, identificada con un nombre concreto (su identificador), que realiza una tarea concreta, que puede ser entendida de forma independiente al resto del programa, y que tiene muy bien determinado cómo se hace uso de ella, con qué parámetros se la invoca y bajo qué condiciones puede ser usada, cuál es la tarea que lleva a cabo, y cuál es el valor que calcula y devuelve.

Tanto los procedimientos como las funciones pueden ser vistos como cajas negras: un código del que desconocemos sus sentencias, al que se le puede suministrar unos datos de entrada y obtener modificaciones para esos valores de entrada y/o el cálculo de un nuevo valor, obtenido a partir de los valores que ha recibido como entrada.

Con eso se consigue programas más cortos; que el código pueda ser usado más de una vez; mayor facilidad para gestionar un correcto orden de ejecución de sentencias; que las variables tengan mayor carácter local, y no puedan ser manipuladas fuera del ámbito para el que han sido creadas.

  Funciones

        Las funciones son bloques de instrucciones que tienen por objeto el alcanzar un resultado que sustituirá a la función en el punto de invocación (las funciones devuelven un resultado).

        Cada función se evoca utilizando su nombre en una expresión con los argumentos actuales o reales encerrados entre paréntesis.

        Para hacer una referencia a una función se invoca mediante un nombre y en caso de existir, una lista de parámetros actuales necesarios (argumentos). Los argumentos deben coincidir en cantidad, tipo y orden con los de la función que fue definida. La función devuelve un valor único.

        Las funciones a que se hace referencia, se conocen como funciones de usuario puesto que son definidas por él mismo y permiten su uso en forma idéntica a las funciones estándares. Para coordinar e iniciar el procesamiento, se utiliza un módulo principal que es colocado al final del algoritmo.

 Declaración de funciones

función nombre_función (par1, par2,par3,...) : tipo_del_resultado

 Inicio

acción1

acción2

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 5Unidad 6/Ing. Héctor Bazarte Torres

Page 7: Apuntes u6 de PB 2014-1 (Modulos)

:

nombre_función Resultado_Obtenido

Fin

  

Donde:

par1,par2 ....               Lista de parámetros formales o argumentos.

nombre_función         Nombre asociado de la función, que será un nombre de identificador válido.

 acción1, acción2,..      Instrucciones que constituyen la definición de las función, y que debe contener                                    una acción sola de asignación que asigne un valor al nombre de la función.

 Ejemplo:

        Obtener el sexto carácter de un nombre y si dicho carácter no existe, se asumirá un asterisco como tal.

 Función SEXTO(n:string):carácter

Inicio

si  longitud(n) >= 6 entonces

SEXTO Subcadena(n,6,1)

en caso contrario

SEXTO  ‘*’

Fin

 Invocación a las funciones

Una función puede ser llamada sólo mediante referencia de la forma siguiente:

nombre_función (lista de parámetros actuales)

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 6Unidad 6/Ing. Héctor Bazarte Torres

Page 8: Apuntes u6 de PB 2014-1 (Modulos)

 Donde:

nombre_función                 Función que llama.

Lista de param. actuales      Constantes, variables, expresiones, valores de funciones,

                                          nombres de funciones o procedimientos.

 Una llamada a la función implica los siguientes pasos:

A cada parámetro formal se le asigna el valor real de su correspondiente parámetro actual (esta correspondencia se verá más tarde y se denomina llamada por valor).

Se ejecuta el cuerpo de acciones de la función.

Se devuelve el valor de la función y se retorna al punto de llamada.

 Ejercicio:

Calcular la potencia de un número.

funcion POTENCIA(x,n :entero): entero

Inicio

y 1

Desde  i 1 hasta abs(n) hacer

    y y*x

fin Desde

si n < 0 entonces

    y   1/y

Fin si

POTENCIA y

Fin

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 7Unidad 6/Ing. Héctor Bazarte Torres

Page 9: Apuntes u6 de PB 2014-1 (Modulos)

Operación de Módulos y sus Parámetros

 PASO DE PARAMETROS

       Existen diferentes métodos para el paso de parámetros a subprogramas, un mismo programa puede producir diferentes resultados bajo diferentes sistemas de paso de parámetros.

 Los parámetros se clasifican de la siguiente manera:

    1.  Entradas:     Las entradas proporcionan valores desde el programa que llama y que se utilizan dentro de un procedimiento. En los subprogramas función     las entradas son los argumentos en el sentido tradicional.

   2. Salidas:    Las salidas producen los resultados del subprograma; de nuevo si se utiliza el caso una función,  mientras que con procedimientos pueden calcularse cero, una o varias salidas.

    3.   Entradas/Salidas:    Un solo parámetro se utiliza para mandar argumentos a un programa y para devolver resultados.

Los métodos más empleados para realizar el paso de parámetros son:

Paso por valor (parámetro valor). Paso por referencia o dirección  (parámetro variable).

PASO POR VALOR

    Se utiliza en muchos lenguajes de programación (pascal, basic, modula-2, algol, etc), debido a su analogía con los argumentos de una función, donde los valores se proporcionan en el orden de cálculo de resultados.  Los parámetros se tratan como variables locales y los valores iniciales se proporcionan copiando los valores de los correspondientes argumentos.

    Los parámetros formales (locales a la función), reciben como valores iniciales los valores de los parámetros actuales y con ello se ejecutan las acciones descritas en el subprograma.

     La llamada por valor no devuelve información al programa que llama.

PASO POR REFERENCIA

    Se utiliza cuando se requiere que ciertos parámetros sirvan como parámetros de salida, es decir, devuelvan los resultados a la unidad o programas que llama.  La unidad que llama pasa a la unidad llamada la dirección del parámetro actual (que está en el ámbito de la

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 8Unidad 6/Ing. Héctor Bazarte Torres

Page 10: Apuntes u6 de PB 2014-1 (Modulos)

unidad llamante). Una referencia al correspondiente parámetro formal se tratra como una referncia a la posición de memoria, cuya dirección se ha pasado. Entonces una variable pasada como parámetro real es compartida, es decir, se puede modificar directamente por el subprograma. Si el parámetro actual es una expresión, el subprograma recibe la dirección de la posición temporal que contiene el valor de la expresión.

6.4 Funciones definidas por el usuario

El mecanismo para trabajar con funciones es el siguiente, primero debemos declarar el prototipo de la función, a continuación debemos hacer la llamada y por último desarrollar la función. Los dos últimos pasos pueden cambiar, es decir, no es necesario que el desarrollo de la función esté debajo de la llamada.

Antes de seguir debemos conocer las reglas de ámbito de las funciones. El código de una función es privado a ella, el código que comprende su cuerpo está oculto al resto del programa a menos que se haga a través de una llamada. Todas las variables que se definen dentro de una función son locales con excepción de las variables estáticas.

SINTAXIS DEL PROTOTIPO:

tipo_devuelto nombre_funcion ([parámetros]);

SINTAXIS DE LA LLAMADA:

nombre_funcion ([parámetros]);

SINTAXIS DEL DESARROLLO:

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 9Unidad 6/Ing. Héctor Bazarte Torres

Page 11: Apuntes u6 de PB 2014-1 (Modulos)

tipo_devuelto nombre_funcion ([parámetros])

{

cuerpo;

}

Ejercicio 4.5.

Un mensaje es desplegado a través de una función.

#include <stdio.h>

void saludo();

void primer_mensaje();

void main ( )

{

saludo();

primer_mensaje();

}

void saludo()

{

printf ("Buenos dias\n");

83

}

void primer_mensaje()

{

printf("Un programa esta formado ");

printf("por funciones\n");

}

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 10Unidad 6/Ing. Héctor Bazarte Torres

Page 12: Apuntes u6 de PB 2014-1 (Modulos)

La función primer_mensaje despliega un mensaje en pantalla, esta función es llamada desde la función principal o main ().

Cuando se declaran las funciones es necesario informar al compilador el tamaño de los valores que se le enviarán y el tamaño del valor que retorna. En el caso de no indicar nada para el valor devuelto toma por defecto el valor int.

Al llamar a una función se puede hacer la llamada por valor o por referencia. En el caso de hacerla por valor se copia el contenido del argumento al parámetro de la función, es decir, si se producen cambios en el parámetro no afecta a los argumentos. C utiliza esta llamada por defecto. Cuando se utiliza la llamada por referencia lo que se pasa a la función es la dirección de memoria del argumento, por tanto, si se producen cambios, afectan también al argumento. La llamada a una función se puede hacer tantas veces como se quiera.

PRIMER TIPO: Las funciones de este tipo ni devuelven valor ni se les pasan parámetros. En este caso hay que indicarle que el valor que devuelve es de tipo void, y para indicarle que no recibirá parámetros también utilizamos el tipo void. Cuando realizamos la llamada no hace falta indicarle nada, se abren y cierran los paréntesis.

void nombre_funcion (void);

nombre_funcion();

Ejercicio 4.6.

El siguiente programa es muy similar al anterior, este tipo de funciones no tienen parámetros ni devuelven ningún valor.

#include <stdio.h>

#include <conio.h>

void mostrar(void);

void main(void)

{

printf("Estoy en la principal\n");

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 11Unidad 6/Ing. Héctor Bazarte Torres

Page 13: Apuntes u6 de PB 2014-1 (Modulos)

mostrar();

printf("De vuelta en la principal");

getch();

}

void mostrar(void)

{

printf("Ahora he pasado a la función, presione

cualquier tecla\n");

getch();

}

SEGUNDO TIPO: Son funciones que devuelven un valor una vez que han terminado de realizar sus operaciones, sólo se puede devolver uno. La devolución se realiza mediante la sentencia return, que además de devolver un valor hace que la ejecución del programa vuelva al código que llamó a esa función. Al compilador hay que indicarle el tipo de valor que se va a devolver poniendo delante del nombre de la función el tipo a devolver. En este tipo de casos la función es como si fuera una variable, pues toda ella equivale al valor que devuelve.

tipo_devuelto nombre_funcion (void);

variable = nombre_funcion ();

Ejercicio 4.7.

Este programa calcula la suma de dos números introducidos por el usuario, la función suma () devuelve el resultado de la operación a la función principal a través de la función return ().

#include <stdio.h>

#include <conio.h>

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 12Unidad 6/Ing. Héctor Bazarte Torres

Page 14: Apuntes u6 de PB 2014-1 (Modulos)

int suma(void);

void main(void)

{

int total;

printf("Suma valores\n");

total=suma();

printf("\n%d",total);

getch();

}

int suma(void)

{

int a,b,total_dev;

printf("valores: ");

scanf("%d %d",&a,&b);

total_dev=a+b;

return total_dev;

}

TERCER TIPO: En este tipo las funciones pueden o no devolver valores pero lo importante es que las funciones pueden recibir valores. Hay que indicar al compilador cuántos valores recibe y de qué tipo es cada uno de ellos. Se le indica poniéndolo en los paréntesis que tienen las funciones. Deben ser los mismos que en el prototipo.

void nombre_funcion (tipo1, tipo2…tipoN);

nombre_funcion (var1, var2…varN);

Ejercicio 4.8.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 13Unidad 6/Ing. Héctor Bazarte Torres

Page 15: Apuntes u6 de PB 2014-1 (Modulos)

Este programa utiliza una función de nombre resta(), que tiene dos parámetros, los parámetros son los operandos de una resta, además la función devuelve el resultado de la operación a la función principal a través de la función return().

#include<stdio.h>

int resta(int x, int y); /*prototipo de la función*/

main()

{

int a=5;

int b=93;

int c;

c=resta(a,b);

printf("La diferencia es: %d\n",c);

return(0);

}

int resta(int x, int y) /*declaracion de la función*/

{

int z;

z=y-x;

return(z); /*tipo devuelto por la función*/

}

Ejercicio 4.9.

Realiza un programa que lea un número entero y determine si es par o impar.

/*Lee un numero entero y determina si es par o impar */

#include <stdio.h>

#define MOD %

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 14Unidad 6/Ing. Héctor Bazarte Torres

Page 16: Apuntes u6 de PB 2014-1 (Modulos)

/* %, es el operador que obtiene el resto de la división

entera */

#define EQ ==

#define NE !=

#define SI 1

#define NO 0

void main ( )

{

int n, es_impar(int);

printf ("Introduzca un entero: \n");

scanf ("%d", &n);

if ( es_impar (n) EQ SI )

printf ("El numero %d es impar. \n", n);

else

printf ("El numero %d no es impar. \n", n);

}

int es_impar (int x)

{

int respuesta;

if ( x MOD 2 NE 0 ) respuesta=SI;

else

respuesta=NO;

return (respuesta);

}

Ejercicio 4.10.

Realiza un programa en C que sume, reste, multiplicaque y divida con datos introducidos por el usuario.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 15Unidad 6/Ing. Héctor Bazarte Torres

Page 17: Apuntes u6 de PB 2014-1 (Modulos)

#include<stdio.h>

int resta(int x, int y); /*prototipo de la función*/

int suma(int x, int y); /*prototipo de la función*/

main()

{

int a,b,c,d;

printf("Introduce el valor de a: ");

scanf("%d",&a);

printf("\nIntroduce el valor de b: ");

scanf("%d",&b);

c=resta(a,b);

d=suma(a,b);

printf("La diferencia es: %d\n",c);

printf("La suma es: %d\n",d);

return(0);

}

int resta(int x, int y) /*declaración de la función*/

{

int z;

z=y-x;

return(z); /*tipo devuelto por la función*/

}

int suma(int x, int y) /*declaración de la función*/

{

int z;

z=y+x;

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 16Unidad 6/Ing. Héctor Bazarte Torres

Page 18: Apuntes u6 de PB 2014-1 (Modulos)

return(z); /*tipo devuelto por la función*/

}

Ejercicio 4.11.

Realiza una función que eleve un número al cubo.

#include<stdio.h>

int cubo(int base);

void main(void)

{

int res,num;

printf("Introduzca un numero:");

scanf(" %d",&num);

res=cubo(num);

printf("El cubo de %d es: %d\n",num,res);

}

int cubo(int x)

{

int cubo_res;

cubo_res=x*x*x;

return(cubo_res);

}

Ejercicio 4.12.

Realiza una función que eleve un número a un exponente cualquiera.

#include<stdio.h>

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 17Unidad 6/Ing. Héctor Bazarte Torres

Page 19: Apuntes u6 de PB 2014-1 (Modulos)

int cubo(int base,int expo);

void main(void)

{

int res,num,ex;

printf("Introduzca una base:");

scanf(" %d",&num);

printf("Introduzca un exponente:");

scanf(" %d",&ex);

res=cubo(num,ex);

printf("El numero %d elevado es: %d\n",num,res);

}

int cubo(int x, int y)

{

int i,acum=1;

for(i=1;i<=y;i++)

acum=acum*x;

return(acum);

}

Ejercicio 4.13.

Realiza una función que obtenga la raíz cuadrada de un número.

# include <stdio.h>

# include <math.h>

void impresion(void);

main()

{

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 18Unidad 6/Ing. Héctor Bazarte Torres

Page 20: Apuntes u6 de PB 2014-1 (Modulos)

printf("Este programa extraerá una raiz

cuadrada.\n\n");

impresion();

return(0);

}

void impresion(void)

{

double z=4;

double x;

x=sqrt(z);

printf("La raíz cuadrada de %lf es %lf \n",z,x);

}

Nota: Ámbito de variables (locales y globales)

Las variables son locales cuando se declaran dentro de una función. Las variables locales sólo pueden ser referenciadas (utilizadas) por sentencias que estén dentro de la función donde han sido declaradas.

Las variables son globales cuando son conocidas a lo largo de todo el programa, y se pueden usar desde cualquier parte del código. Mantienen sus valores durante toda la ejecución. Deben ser declaradas fuera de todas las funciones incluida main ().

Parámetros de una función

Es muy frecuente que nos interese además indicarle a nuestra función ciertos datos especiales con los que queremos que trabaje. Por ejemplo, si escribimos en pantalla números reales con frecuencia, nos puede resultar útil que nos los muestre con el formato que nos interese. Lo podríamos hacer así:

escribeNumeroReal ( float n ) {

printf ("%4.2f", n);

}

Y esta función se podría usar desde el cuerpo de nuestro programa así:

float x;

main() {

x= 5.1;

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 19Unidad 6/Ing. Héctor Bazarte Torres

Page 21: Apuntes u6 de PB 2014-1 (Modulos)

printf("El primer numero real es: ");

escribeNumeroReal(x);

printf(" y otro distinto es: ");

escribeNumeroReal(2.3);

}

Estos datos adicionales que indicamos a la función es lo que llamaremos sus “parámetros”.

Como se ve en el ejemplo, tenemos que indicar un nombre para cada parámetro (puede haber varios) y el tipo de datos que corresponde a ese parámetro. Si hay mas de un parámetro, deberemos indicar el tipo y el nombre para cada uno de ellos:

sumar ( int x, int y ) {

...

}

Valor devuelto por una función

También es habitual que queramos que nuestra función realice una serie de cálculos y nos

“devuelva” el resultado de esos cálculos, para poderlo usar desde cualquier otra parte de nuestro programa. Por ejemplo, podríamos crear una función para elevar un número entero al cuadrado así:

int cuadrado ( int n ) {

return n*n;

}

main() {

int numero;

int resultado;

numero= 5;

resultado = cuadrado(numero);

printf("El cuadrado del numero es %d", resultado);

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 20Unidad 6/Ing. Héctor Bazarte Torres

Page 22: Apuntes u6 de PB 2014-1 (Modulos)

printf(" y el de 3 es %d", cuadrado(3));

}

Podemos hacer una función que nos diga cual es el mayor de dos números reales así:

float mayor ( float n1, float n2 ) {

if (n1>n2)

return n1;

else

return n2;

}

Invocación a las funciones

Una función puede ser llamada sólo mediante referencia de la forma siguiente:

nombre_función (lista de parámetros actuales)

 Donde:

nombre_función                 Función que llama.

Lista de param. actuales      Constantes, variables, expresiones, valores de funciones,

                                          nombres de funciones o procedimientos.

 Una llamada a la función implica los siguientes pasos:

A cada parámetro formal se le asigna el valor real de su correspondiente parámetro actual (esta correspondencia se verá más tarde y se denomina llamada por valor).

Se ejecuta el cuerpo de acciones de la función.

Se devuelve el valor de la función y se retorna al punto de llamada.

 Ejercicio:

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 21Unidad 6/Ing. Héctor Bazarte Torres

Page 23: Apuntes u6 de PB 2014-1 (Modulos)

Calcular la potencia de un número.

funcion POTENCIA(x,n :entero): entero

Inicio

y 1

Desde  i 1 hasta abs(n) hacer

    y y*x

fin Desde

si n < 0 entonces

    y   1/y

Fin si

POTENCIA y

Fin

Los métodos más empleados para realizar el paso de parámetros son:

Paso por valor (parámetro valor). Paso por referencia o dirección  (parámetro variable).

Elaboración de programas

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

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 22Unidad 6/Ing. Héctor Bazarte Torres

Page 24: Apuntes u6 de PB 2014-1 (Modulos)

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 23Unidad 6/Ing. Héctor Bazarte Torres

Page 25: Apuntes u6 de PB 2014-1 (Modulos)

2. Vamos a acceder a las funciones primera y segunda desde la función main.

práctico

3. Utilización del mismo identificador de variable en diferentes funciones mostrando su localidad.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 24Unidad 6/Ing. Héctor Bazarte Torres

Page 26: Apuntes u6 de PB 2014-1 (Modulos)

• Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.

• Crear una función que calcule el cubo de un numero real (float). El resultado deberá ser otro número real. Probar esta función para calcular el cubo de 3.2 y el de 5.

• Crear una función que calcule cual es el menor de dos números enteros. El resultado será otro número entero.

• Crear una función llamada “signo”, que reciba un número real, y devuelva un número entero con el valor: -1 si el número es negativo, 1 si es positivo o 0 si es cero.

• Crear una función que devuelva la primera letra de una cadena de texto. Probar esta función para calcular la primera letra de la frase “Hola”

• Crear una función que devuelva la última letra de una cadena de texto. Probar esta función para calcular la última letra de la frase “Hola”.

• Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 25Unidad 6/Ing. Héctor Bazarte Torres

Page 27: Apuntes u6 de PB 2014-1 (Modulos)

• Crear una función que reciba un número y muestre en pantalla el perímetro y la superficie de un cuadrado que tenga como lado el número que se ha indicado como parámetro.

• Crear una función “pedirEntero”, que reciba como parámetros el texto que se debe mostrar en pantalla, el valor mínimo aceptable y el valor máximo aceptable. Deberá pedir al usuario que introduzca el valor tantas veces como sea necesario, volvérselo a pedir en caso de error, y devolver un valor correcto. Probarlo con un programa que pida al usuario un ano entre 1800 y 2100.

• Crear una función “escribirTablaMultiplicar”, que reciba como parámetro un número entero, y escriba la tabla de multiplicar de ese numero (por ejemplo, para el 3 deberá llegar desde 3x0=0 hasta 3x10=30).

• Crear una función “esPrimo”, que reciba un numero y devuelva el valor 1 si es un numero primo o 0 en caso contrario.

• Crear una función que reciba una cadena y una letra, y devuelva la cantidad de veces que dicha letra aparece en la cadena. Por ejemplo, si la cadena es "Barcelona" y la letra es 'a', debería devolver 2 (aparece 2 veces).

• Crear una función que reciba un número cualquiera y que devuelva como resultado la suma de sus dígitos. Por ejemplo, si el número fuera 123 la suma seria 6.

• Crear una función que reciba una letra y un número, y escriba un “triangulo” formado por esa letra, que tenga como anchura inicial la que se ha indicado. Por ejemplo, si la letra es * y la anchura es 4, debería escribir

****

***

**

*

1.Escribir el programa que ordena las líneas de un texto leído desde la entrada estándar, donde cada línea tiene diferente longitud, según lo descrito en la sección de arreglo de apuntadores.

2.Escribir una función que convierta una cadena s a un número de punto flotante usando apuntadores. Considerar que el número tiene el siguiente formato 99999999.999999, es decir, no se dará en notación científica. La función deberá suministrársele una cadena y deberá devolver un número.

3.Escribir un programa que encuentre el número de veces que una palabra dada (esto es, una cadena corta) ocurre en una sentencia (una cadena larga).

Leer los datos de la entrada estándar. La primera línea es una sola palabra, en la segunda línea se tiene un texto general. Leer ambas hasta encontrar un caracter de nueva línea. Recordar que se debe insertar un caracter nulo antes de procesar.

La salida típica podría ser:

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 26Unidad 6/Ing. Héctor Bazarte Torres

Page 28: Apuntes u6 de PB 2014-1 (Modulos)

La palabra es "el"

La sentencia es "el perro, el gato y el canario"

La palabra ocurrio 3 veces.

2014ITSLP/APUNTES DE PROGRAMACIÓN BÁSICA

Página 27Unidad 6/Ing. Héctor Bazarte Torres