PROGRAMACION ESTRUCTURADA: Tema 3. Programacion modular · PROGRAMACION ESTRUCTURADA: Tema 3....

Post on 18-Jun-2020

94 views 2 download

Transcript of PROGRAMACION ESTRUCTURADA: Tema 3. Programacion modular · PROGRAMACION ESTRUCTURADA: Tema 3....

PROGRAMACION ESTRUCTURADA:Tema 3. Programación Modular

Presenta: David Martínez Torres

Universidad Tecnológica de la Mixteca

Instituto de Computación

Oficina No. 37

dtorres@mixteco.utm.mx

Contenido

1. Diseño descendente2. Funciones3. Funciones con paso de parámetros por valor4. Funciones con paso de parámetros por

referencia5. Funciones recursivas6. Referencias

1. Diseño descendente

También conocido como diseño top-down o divide y vencerás. Consiste en empezar analizar un problema complejo e ir descomponiendo en subproblemas(módulos) e ir avanzando nivel a nivel, hasta obtener subproblemas fáciles de solucionar.

En lenguaje C, la solución de un problema se compone de un módulo principal, el cual invoca a funciones que resuelven una parte del problema dado, donde cada función puede particionarse en otras más.

1. Diseño descendente

Entrada Cálculo Salida

Entradaaltura

Entradabase

Salidaaltura

Salidabase

Salidasuperficie

Lecturanum. Real

Validación

S = B * Alt

Cálculo superficie

de un rectángulo

Lecturanum. Real

Validación

Nivel 1

Nivel 2

Nivel 3

Nivel 4

1. Diseño descendente

Ventajas

Facilita solución de problemas

Permite que cada desarrollador realice una parte de forma independiente.

Propicia la reutilización de código.

Consideraciones

Realizar una correcta descomposición

Correcta definición de las interfaces(argumentos)

Importante una correcta integración

2. Funciones

La funciones son módulos que resuelven una parte de un problema complejo.

Componentes de una función en C

Prototipo de función

Llamadas a función (Paso de parámetros)

Definición o implementación de la función

2. Funciones

Tanto el prototipo, llamada e implementación de la función, deben coincidir en todo: en tipo de retorno, nombre de la función y tipos de los parámetros, así como el orden de estos últimos.

Las funciones crean un espacio en memoria durante su ejecución y se libera ese espacio al terminar su ejecución.

#include <stdio.h>int menu(); // prototipos de funcionesvoid introducir(…);

int main() { int opc; opc=menu(); //llamadas de función}

int menu() { //Implementación de función... }

void introducir(…) { //Implementación de función... }

2. Funciones

2. Funciones (Prototipos)

Las funciones en C deben de ser declaradas antes de poder ser usadas, de manera que tenemos dos opciones:

1. El estándar ANSI C en la estructura de un programa indica que el prototipo de función se coloca antes de la implementación del main.

2. Puede no colocarse el propotipo e iniciar con la implementación de la función antes de la implementación del main (no recomendado de acuerdo al ANSI C).

2. Funciones (Prototipos)

El uso de propotipos de función le indica al compilador la cantidad y tipo de dato de los parámetros o argumentos y el tipo de dato que retornará la función.

En el prototipo no es necesario definir el nombre de los argumentos.

2. Funciones (Prototipos)

tipo nombre(lista_parámetros); //sintaxis

Ejemplo: prototipo de la función del cálculo de factorial:

#include <stdio.h>int factorial (int); //prototipo de funciónint main() { …}

2. Funciones (Llamada de función)

La llamada a una función es cuando se solicita la ejecución de una función que ya se encuentra definida previamente.

En este caso se debe incluir el nombre de la función y entre paréntesis la lista de los datos que se envían como parámetros.

2. Funciones (Llamada de función)

Los datos deben coincidir en número y tipo con los declarados en el prototipo y la definición de la función.

#include <stdio.h>int factorial (int); //prototipoint main() { …resultado=factorial(num); //llamada…}

tipo nombre (lista_parámetros ) {declaracionesinstrucciones}

2. Funciones (implementación de función)

2. Funciones (implementación de función)

miFuncionNula(){}

Al no declarar tipo de retorno, se considera entero

Será válida?

2. Funciones (implementación de función)

Ejemplo: A continuación se muestra la implementación de la función que calcula el factorial de un número entero positivo.

int factorial (int n)

{

int i, mult;

mult =1;

for( i=n; i>1; i--)

mult = mult *i;

return mult;

}

3. Funciones con paso de parámetros por valor

En la llamada de función, se pasa solo el contenido de los parámetros (variables) a la función que se invoca.

Estas funciones no modifican los valores de las variables de la función que la invocó.

El resultado que retorna es la solución del subproblema.

3. Funciones con paso de parámetros por valor

Para que la función regrese algún valor es necesario utilizar la instrucción return

return provoca además la terminación de la ejecución de la función

Se recomienda que se coloque al final de la función

La sintaxis de la instrucción return es:

return expresión;

ejemplo:

return resultado;return 0;

#include <stdio.h>int factorial (int); //prototipoint main() { …resultado=factorial(num); //llamada…}

int factorial (int n){

int i, mult;

mult =1;

for( i=n; i>1; i--)

mult = mult *i;

return mult;

}

4. Funciones con paso de parámetros por referencia

En la llamada de función, se pasa la dirección de uno o más parámetros a la función que se invoca.

Desde la implementación de la función, se puede modificar el valor de variables que se pasaron por referencia.

4. Funciones con paso de parámetros por referencia

Importante mencionar que en C no existe el paso de parámetros por referencia [2], todos los parámetros se pasan por valor. Sin embargo, es posible por medio de variables de tipo apuntador simular el paso por referencia.

4. Funciones con paso de parámetros por referencia

Antes, introducción a apuntadores.

Un apuntador es una variable que contiene una dirección de memoria. Frecuentemente esta dirección es la localidad de otra variable.

La forma general de la declaración de una variable apuntador es:

tipo * nombreVariable;

4. Funciones con paso de parámetros por referencia

Declaración de variables apuntador

int *intPtr;

float *floatPtr;

char *strPtr;

int **intPtrPtr;

4. Funciones con paso de parámetros por referencia

Operadores a utilizar con apuntadores:

& Operador “de dirección o referencia”. Devuelve la dirección de memoria de la variable

* Operador “de indirección o desreferencia”. Devuelve el valor situado en la

dirección del operando. Se dice que da acceso a la variable que señala el apuntador.

4. Funciones con paso de parámetros por referencia

int balance, value;

int *bal_ptr;

balance=3200; //step 1

bal_ptr = &balance; //step 2

value=*bal_ptr; //step 3

4. Funciones con paso de parámetros por referencia

C sabe cuantos bytes copiar en value de la dirección apuntada por balptr, esto es, porque el compilador asume que el tipo base del apuntador determina el tipo de datos al cual está apuntando.

El siguiente fragmento de código es incorrecto:

int *int_ptr; double f;int_ptr = &f; // ERROR

Técnicamente correcto, pero no recomendado (usar un operador cast):

int_ptr = (int *) &f;

Ejemplo del cuidado a tener con el operador cast

void main()

{

double x,y;

int *ptr;

x = 123.23;

ptr= (int *) &x; // Usa cast para asignar un double* a int*

y = *ptr; // Que hace esto?

printf("%.0f\n",y); // Que imprime?

}

//Cálculo de una tabla de potencias

#include <stdio.h>#define N 7

//prototiposlong pot(int, int); //long int es implícitovoid impEncab(void);void impTabPot(int);

void main(void){impEncab();impTabPot(N); //paso por valor}

…continuación del ejemplo//implementación de función

void impEncab(void) {

int i;

printf("\n ------- Tabla de potencias --------\n");

printf("1");

for(i=2; i<=N; i++)

printf("%9d", i);

putchar('\n');

printf("------------------------------------------------------\n");

}

void impTabPot(int n){int i, j;for(i=1; i<=n; i++) {

for(j=1; j<=n; j++)if(j==1)

printf("%ld", pot(i,j));else

printf("%9ld", pot(i,j));putchar('\n');}

}

long pot(int m, int n){int i;long producto=1;for(i=1; i<=n; i++)

producto*=m;return producto;}

5. Funciones recursivas

Una función recursiva es una función que se llama a sí misma, ya sea directa o indirecta a través de otra función.

Componentes

Caso base. Es el resultado más simple, lo que conoce la función.

Paso de recursión. Llamada a la misma función, pero con el problema poco menos complejo que el original. También puede incluir la palabra reservada return.

5. Funciones recursivas

Calculo del factorial, ejemplo recursivo

33

5. Funciones recursivas

34

5. Funciones recursivas

int factorial(int n) //definición de la función

{

int fact;

if(n==0||n==1) //caso base

fact=1;

else

fact=n*factorial(n-1);

return fact;

} 35

5. Funciones recursivas

Cálculo de la potencia, ejemplo de problema recursivo

36

7. Referencias

1. Joyanes Aguilar, Luis (1996) Fundamentos de programación, Algoritmos y Estructura de datos. McGraw-Hill, México.

2. Deitel & Deitel (2001) C++ Como programar en C/C++.Prentice Hall

3. Kerrighan y Ritchie “El lenguaje de programación”. Prentice Hall

4. Gottfried, Byron (1999) “Programación en C” McGrawHill, México.

5. Levine Gutierrez, Guillermo (1990) Introducción a la computación y a la programación estructurada. McGraw-Hill, México.

6. Levine Gutierrez, Guillermo (1990) Introducción a la computación y a la programación estructurada. McGraw-Hill, México.

7. H. Schildt, C++ from the Ground Up, McGraw-Hill, Berkeley, CA, 1998

8. Keller,,AL;Pohl,Ira. A Book on C. 3 ª edición. Edit.Benjamin umnings.1995