programacion estructurada: tema 3. programacion modular · programacion estructurada: tema 3....
TRANSCRIPT
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
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