modularidad - wordpress.com · 2016. 10. 30. · int cubo(int nro){return (nro * nro * nro);}...
TRANSCRIPT
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
1
Programación – Unidad 4
Modularidad
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP 2
222
Dividir para Vencer (1)• Es una técnica para resolver problemas que consiste en
dividir el problema original en subproblemas (de menortamaño), resolver cada un de los subproblemas, yfinalmente combinar las soluciones de cada uno de ellospara obtener la solución del problema original. En cadanivel del procedimiento, este método consta de lossiguientes pasos:
1) Dividir el problema en subproblemas.2) Resolver cada uno de los subproblemas.3) Combinar las soluciones de los subproblemas para
obtener la solución del problema original.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
3
Dividir para Vencer (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
44
Dividir para Vencer (3)
• Es decir que si:
• Entonces:
"Todo problema P puede ser descompuesto en una seriede subproblemas P1, P2, …, Pn, de forma tal que laresolución de todos los subproblemas Pi, involucre laresolución del problema P inicial".
P = P1 + P2 + ... + Pn
resolución(P) = resolución(P1) + ...+ resolución(Pn)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
555
Dividir para Vencer (4)• Siendo la principal ventaja de esta estrategia, que
generalmente se cumple con:
• A su vez, si un problema Pi es todavía difícil deresolver, podemos nuevamente descomponerlo ensubproblemas Pi,j tal que:
complejidad(P) > Σ complejidad(Pi)
Pi = Pi,1 + Pi,2 + ... + Pi,m
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
6666
Dividir para Vencer (5)• Es decir que aplicamos nuevamente este método
(denominado Refinamientos Sucesivos) para laresolución de cada subproblema:
666
resolución(Pi) = SI Pi es lo suficientemente fácilENTONCES resolverlo inmediatamenteSINO descomponerlo en problemas Pi,j
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
7
Dividir para Vencer (6)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
8
1) Estar jerarquizados.
2) Ser pequeños, sencillos y legibles (Legilibilidad).
3) "Esconder" los detalles poco importantes a los módulosque se encuentran por arriba de ellos en la jerarquía(Ocultamiento de la Información).
• Consiste en "descomponer" (subdividir) un programa enpartes, denominadas módulos (ó subprogramas), cadauno de ellos realizando una tarea específica, quedeberán cumplir con los siguientes requisitos:
Modularidad (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
99
4) Deberán, a su vez, usarse tantos módulos de más bajajerarquía como sean necesarios, para cumplir con elpunto (2).
Modularidad (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
1010
1) El costo total de resolver cada subproblema de maneraindependiente, es con frecuencia menor que el deabordar la resolución del problema completo.
2) Facilita el trabajo en equipo pues varios grupos depersonas pueden estar resolviendo, simultánemente,cada uno de ellos un subproblema distinto.
3) Incrementa la reusabilidad de los módulos, pues esposible volverlos a utilizar en la resolución de otrosproblemas.
• Las ventajas de la modularidad son las siguientes:
Modularidad (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
1111
• La mayoría de los lenguajes de programación soportanampliamente la modularidad, poniendo a nuestradisposición, desde el punto de vista conceptual, dostipos de módulos:
Modularidad (4)
Funciones: Es una abstracción sobre un proceso decálculo, pues son similares a las funciones matemáticas,que devuelven un solo valor.
Procedimientos: Es una abstracción sobre una orden,pues actúan como una sentencia más del lenguaje, quedeben ser invocadas para ejecutar su tarea.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
121212
• En el lenguaje C un programa está compuesto por unconjunto de funciones, siendo main la función principal(por donde se inicia la ejecución del programa) .
• La estructura general de una función en C es lasiguiente:
<tipo> <nombre> (<parámetros>){<declaraciones><sentencias>return (<expresión>)
}
Modularidad en C (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
13131313
• En donde:
tipo: Es el tipo del valor devuelto por la función; y si lafunción no devuelve valor alguno (porque es unprocedimiento), se utiliza la palabra reservada void.
nombre: Es el nombre o identificador asignado a lafunción.
parámetros: Componen la lista de declaración de losargumentos que deben ser pasados a la función. Estalista consta de un conjunto de variables con sus tipos,separadas por comas.
Modularidad en C (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
1414141414
declaraciones y sentencias: Forman el cuerpo dela función. Las sentencias definen lo que hace lafunción; y también se pueden realizar declaraciones devariables utilizadas en dichas sentencias.
return (expresión): Se devuelve un valor a lasentencia de invocación (ó llamada) de la función.
• Por ejemplo:int cubo(int nro){
return (nro * nro * nro);}
Modularidad en C (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
15
• Variables Locales
Son las declaradas dentro del módulo.
Sólo pueden utilizarse en el módulo en el quefueron definidas.
No pueden conservar los datos entre dosinvocaciones (salvo las estáticas).
Evitan los efectos colaterales.
Permiten escribir módulos autosuficientes.
Variables Locales y Globales (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
1616
• Variables Globales:
Son las declaradas al comienzo del programa, fuerade cualquier módulo.
Pueden ser utilizadas por todos los módulos.
Variables Locales y Globales (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
17
Clases de Almacenamiento (1)• Todas las variables en C, además de un nombre y un
tipo de dato, poseen una clase de almacenamiento,consistente en una indicación al compilador, sobre elmodo de asignarle memoria a esa variable. Esos modosson:
1) auto: Indica al compilador que reserve una posición dememoria temporal, de manera que cada vez que seproduce una llamada a una función, se emplea unanueva posición de memoria para las variables,quedando luego libre esa posición cuando se produce elretorno de la función. Un ejemplo de esto son lasvariables locales .
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
1818
Clases de Almacenamiento (2)2) register: Indica al compilador que de ser posible,
emplee un registro interno de la CPU para almacenar lavariable, en lugar de utilizar una posición de lamemoria principal. Con esto se logra disminuir eltiempo de acceso a las variables que son referenciadasmuy frecuentemente, y por lo tanto, mejorar lavelocidad de ejecución del programa. Por ejemplo:
{register int i;for (i=0; i < N; i++){...}
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
191919
Clases de Almacenamiento (3)3) static: Produce la asignación de una posición fija
(estática) de memoria, de manera que en cadainvocación a la función, utiliza siempre la mismaposición de memoria, conservando por lo tantoinalterable su contenido en el transcurso de dosllamadas consecutivas a la función. Por ejemplo:
void demoStatic(){static int contador = 0;printf("%d", contador++);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
202020
Clases de Almacenamiento (4)4) extern: Produce la asignación de un lugar fijo de
memoria, por lo que distintas funciones pueden accedera ella. Las variables externas constituyen un métodopara transmitir información entre funciones. Cuandouna variable se declara fuera de una función, se leasigna almacenamiento permanente, y su clase esextern.
int x = 1; // variable externa main(){
x = x + 10;printf("%d",x);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
21
Clases de Almacenamiento (5)
CLASE DURACIÓN ALCANCE
auto temporal local
register temporal local
static permanente local/global
extern permanente global
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
22
Invocación de Módulos
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
2323
// programa mayor1 (v0)
main(void){
int a, b, max;
scanf("%d %d",&a, &b);
if (a > b) max = a;
else max = b;
printf("%d", max);
}
// programa mayor1 (v1)
int a, b, max;
void maximo2 (void){
if (a > b) max = a;
else max = b;
}
main(void){
scanf("%d %d",&a, &b);
maximo2();
printf("%d", max);
}
Ejemplo de Procedimiento
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
24
• Si queremos que un módulo actúe sobre distintasvariables, entonces deberemos usar unas variablesespecíficas asociadas al módulo.
• También muchos programas precisan que seintercambie información entre un módulo y el puntoen que el mismo fue invocado.-
• El uso de parámetros ofrece un método para lacomunicación entre módulos.-
• El nombre del módulo junto con los parámetros queutiliza, constituyen la interfaz del mismo.-
Parámetros (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
25
• Parámetros Formales
o Corresponden a las definiciones de los parámetrosdel módulo (procedimiento ó función).
o Deben tener su nombre identificador y su tipo dedato.
o Un parámetro formal se comporta como unavariable local dentro del módulo.-
Parámetros (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
2626
• Parámetros Actuales
o Estos corresponden a los valores ó expresiones conlos cuáles se invoca al módulo.
o El parámetro actual toma el lugar del parámetroformal.
Parámetros (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
27
• Cuando se invoca a un módulo con parámetros, lacorrespondencia entre parámetros (actuales y formales)se resuelve en el lenguaje C por posición.
• Por posición: La correspondencia se establecerelacionando los parámetros según su posición. Porejemplo, el primer parámetro actual A1 se correspondecon el primero formal F1, y Ai se corresponde con Fi,para i = 1, 2, . . ., n.
Parámetros (4)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
28
Parámetros (5)• Métodos de Paso de Parámetros: Son las formas
mediante las cuales los parámetros actuales y formalesson transmitidos o devueltos entre los módulos. En ellenguaje C existen básicamente dos métodos para elpaso de parámetros, ellos son:
Por valor
Por referencia
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
29
• Paso de Parámetros por Valor
Pueden considerarse como parámetros que ingresaninformación a sus respectivos módulos.-
Su uso hace que el valor del parámetro actual se asigneal parámetro formal (es decir, mediante unaasignación).-
Sus valores no pueden ser transferidos en la direcciónopuesta, esto es, desde el módulo al punto en dondefue invocado.-
Parámetros (6)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
30
Parámetros (7)• Paso de Parámetros por Valor
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
31
Parámetros (8)• Paso de Parámetros por Referencia Cuando se invoca un módulo, lo que se le transfiere es
la dirección física en memoria del parámetro actual (esdecir se realiza una substitución).
Cualquier cambio en el valor del parámetro porreferencia dentro del módulo, involucrará lacorrespondiente modificación del parámetro actualfuera de él.
Pueden afectar globalmente a un programa, aúncuando su ámbito sea local al módulo dentro del cualfueron declarados.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
32
Parámetros (9)• Paso de Parámetros por Referencia
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
33
Tipos de Parámetros en C
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
34
Procedimiento con Parámetros (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
35
Procedimiento con Parámetros (2)#include <stdio.h>
// programa mayor2 (v2)
int a, b, may; // Variables Globales
void maximo2(int x, int y, int *max){// x, y, max: Parámetros Formalesif (x > y) *max = x;else *max = y;
}
main(){ // principalscanf("%d %d", &a, &b);maximo2(a, b, &may);// a, b, may: Parámetros Actualesprintf("%d", may);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
36
Procedimiento con Parámetros (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
37
Procedimiento con Parámetros (4)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
38
#include <stdio.h>
// programa mayor2 (v3)int a, b, may;
void leerDatos(...)
void maximo2(int x, int y, int *max){......}
void mostrarMayor(...)
main(){leerDatos(&a, &b);maximo2(a, b, &may);mostrarMayor(may);
}
Procedimiento con Parámetros (5)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
39
Procedimiento con Parámetros (6)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
40
Procedimiento con Parámetros (7)
void leerDatos(int *x, int *yr)
{
scanf("%d %d", &x, &y);
}
void mostrarMayor(int max)
{
printf("%d",max);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
41
Funciones (1)• Un programa esta formado por funciones.• No se pueden definir funciones anidadas.• Desde una función se puede llamar a cualquier otra.• Si no se indica otro tipo, las funciones son de tipo int
por defecto.• El mecanismo de paso de parámetros es por valor.• Devuelven un solo valor (simple ó estructurado).• Está permitida la recursividad (funciones que se
llaman a sí mismas).
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
42
Ejemplo de Función#include <stdio.h>
// programa mayor2 (v4)
int max(int x,int y){int res;if (x > y) res = x;else res = y;return (res);
}
main(){int a, b, may;scanf("%d %d", &a,& b);may = max(a, b);printf("%d",may);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
43
Número Primoroso (1)• Un entero n se llama "primoroso" si todos sus dígitos
son números primos. Por ejemplo, el número 235 es unnúmero primoroso.
1) Escribir un módulo de nombre esPrimoroso, quedetermine si un número entero es o no primoroso.
2) Escribir un programa que determine en una lista de N
números enteros, y utilizando el módulo del puntoanterior, cuáles son primorosos.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
44
Número Primoroso (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
45
int esPrimoroso(int n){int band;
if (cantPrimos(n) == cantDigitos(n))band = 1; // Verdadero
elseband = 0; // Falso
return (band);}
Número Primoroso (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
46
int cantPrimos(int n){
int cp, d;
cp = 0;while (n > 0){d = n % 10;if (esPrimo(d) == 1)
cp = cp + 1;n = div(n,10);
}return (cp);
}
Número Primoroso (4)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
47
Número Primoroso (5)int cantDigitos(int n){
int cd;
cd = 0;while (n > 0){cd = cd + 1;n = div(n, 10);
{return (cd);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
48
Número Primoroso (6)int esPrimo(int n){
int band,i;
band = 1;
for (i = 2; i < n; i++)
if (n % i == 0)
band = 0;
return (band);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
49
Número Primoroso (7)main(){
int num;
scanf("%d", &num);
if (esPrimoroso(num)) printf("Es primoroso")
else printf ("No es primoroso");
while (!kbhit()); // getch();
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
50
Arrays como Parámetros (1)main(){
int i, n, Lista[100]; float prom;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &Lista[i]);
prom = promedio(n, Lista);
printf("%f", prom);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
51
Arrays como Parámetros (2)float promedio (int n, int V[]){
int i, s;
s = 0;
for (i = 0; i < n; i++)
s = s + V[i];
return(s/n);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
52
main(){
int cant, Lista[MAX];
leerLista(&cant, Lista);
ordenarLista(cant, Lista);
mostrarLista(cant, Lista);
}
Arrays como Parámetros (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
53
Arrays como Parámetros (4)void leerLista(int *n, int V[]){
int i;
printf("Ingrese N: ");
scanf("%d", n);
printf("Ingrese los Elementos: ");
for (i = 0; i < *n; i++)
scanf("%d", &V[i]);
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
54
Arrays como Parámetros (5)void ordenarLista(int n, int V[]){
int i,j, aux;
for (i = 0; i < n - 1; i++)
for(j = i + 1; j < n; j++)
if (V[i] > V[j]){
aux = V[i];
V[i] = V[j];
V[j] = aux;
}
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTIG - TUP
55
Arrays como Parámetros (6)
void mostrarLista(int n, int V[]){
int i;
for (i = 0; i < n; i++)
printf("%d \n", V[i]);
}