6 libro fundamentos cap__modularidad_ecler mv

17
Pág. 1 Algoritmica I- Modularidad Modularidad DEFINICIÓN La Modularidad es la sub división de un algoritmo, o programa en partes más pequeñas, llamadas módulos, cada una de las cuales debe ser lo más independiente posible de la aplicación principal y de las restantes partes. La programación modular es una de las técnicas fundamentales de la programación. Se apoya en el diseño descendente y en la filosofía de “divide y vencerás”, es decir se trata de dividir el problema dado, en problemas más simples en que cada uno de los cuales lo implementaremos en un módulo independiente. Gráfico 01. Esquema de modularidad Siempre existirá un módulo o programa principal que es con el que comienza la ejecución de todo el programa, y a partir de él iremos llamando al resto. Cada vez que se llama a un subprograma se le pasa la información que necesita en la llamada, a continuación comienza a ejecutarse el subprograma llamado, y cuando termine su ejecución, devuelve el control a la siguiente instrucción a la de llamada en el programa que lo llamó. Así cabe mencionar que los módulos también se les conoce como, sub algoritmos, subprogramas y sub subrutinas.

description

Capitulo 06 modularidad en c++, phyton, algoritmo Procedimiento simple Procedimiento con argumento Funciones Funciones recursivas En Pseudocódigo, C++ y Phyton

Transcript of 6 libro fundamentos cap__modularidad_ecler mv

Page 1: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 1

Algoritmica I- Modularidad

Modularidad

DEFINICIÓN La Modularidad es la sub división de un algoritmo, o programa en partes más pequeñas, llamadas módulos, cada una de las cuales debe ser lo más independiente posible de la aplicación principal y de las restantes partes. La programación modular es una de las técnicas fundamentales de la programación. Se apoya en el diseño descendente y en la filosofía de “divide y vencerás”, es decir se trata de dividir el problema dado, en problemas más simples en que cada uno de los cuales lo implementaremos en un módulo independiente.

Gráfico 01. Esquema de modularidad

Siempre existirá un módulo o programa principal que es con el que comienza la ejecución de todo el programa, y a partir de él iremos llamando al resto. Cada vez que se llama a un subprograma se le pasa la información que necesita en la llamada, a continuación comienza a ejecutarse el subprograma llamado, y cuando termine su ejecución, devuelve el control a la siguiente instrucción a la de llamada en el programa que lo llamó. Así cabe mencionar que los módulos también se les conoce como, sub algoritmos, subprogramas y sub subrutinas.

Page 2: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 2

Ecler Mamani Vilca

A nivel general podemos clasificar en dos:

• Procedimientos • Funciones

Diferencias entre procedimientos y funciones Estos subprogramas son similares aunque presentan diferencias entre ellos:

1. Las funciones devuelven un sólo valor al algoritmo principal. Los procedimientos pueden devolver cero, uno o más valores.

2. A un nombre de procedimiento no se puede asignar un valor y por

consiguiente ningún tipo está asociado con un nombre de procedimiento.

3. Una función se referencia utilizando su nombre en una expresión,

mientras que un procedimiento se referencia por una llamada o invocación al mismo

Argumentos Un argumento representa el valor que se transfiere a un parámetro del procedimiento cuando se llama al procedimiento. El código de llamada proporciona los argumentos cuando llama al procedimiento. Cuando se llama al procedimiento Function o Sub, se incluye una lista de argumentos entre paréntesis que van inmediatamente después del nombre del procedimiento. A diferencia de la definición de parámetros, los argumentos no tienen nombres. Cada argumento es una expresión que puede contener cero o más variables, constantes y literales. El tipo de datos de la expresión evaluada normalmente debe coincidir con el tipo de datos definido para el parámetro correspondiente, y en algún caso, debe poder convertirse al tipo del parámetro. Parámetros Un parámetro representa un valor que el procedimiento espera que se transfiera cuando es llamado. La declaración del procedimiento define sus parámetros. El nombre de cada parámetro actúa como una variable local dentro del procedimiento. El nombre del parámetro se utiliza del mismo modo que cualquier otra variable.

Page 3: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 3

Algoritmica I- Modularidad

PROCEDIMIENTO Un procedimiento es un subprograma o un sub algoritmo que ejecuta una determinada tarea, pero que tras ejecutar no necesariamente debe devolver un valor aun cuando tengan argumentos. En realidad los argumentos son parámetros (variables) de entrada cuando ejecutas un programa. En Python y C++ los procedimientos son funciones sin parámetros de retorno. El uso de las variables de en un procedimiento son como locales y la estructura del programa similar al del programa principal.

Algoritmo Python C++ //Procedimiento Sub nombre_modulo( ) //procesos FinSub

#Procedimiento nombre_modulo( ): #procesos

//Procedimiento nombre_modulo( ){ //procesos }

//Programa principal Inicio //llamando al modulo nombre_modulo( ) Fin

#Programa principal //llamando al modulo nombre_modulo( )

//Programa principal main( ) { //llamando al modulo nombre_modulo( ); }

a) Procedimientos sin argumentos Son aquellas que no reciben argumentos de entrada al módulo.

Ejemplo 01. Crear dos módulos, el primero que escriba una etiqueta y para el segundo que permita calcular un número al cuadrado.

a) Análisis del problema

El cuadrado es: Cuad � Num * Num

Declaración de variables y argumentos Programa principal Invocación a etiqueta ( ), cuadrado ( ) Sub Programa Etiqueta ( ) Variable de Salida: Texto Sub Programa cuadrado ( ) Variable de Entrada: Numerico real : Num Variable de Salida: Numerico real : Cuad

Page 4: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 4

Ecler Mamani Vilca

b) Algoritmo c) Codificación

En Pseudocódigo // Ejem. 01. Procedimiento sin argumentos

Sub etiqueta ( ) Escribir “======================” Escribir “ Procedimiento sin Argumentos” Escribir “======================”

Fin Sub cuadrado ( )

Escribir “Ingrese un Número” Leer Num Cuad � Num * Num Escribir “ El cuadrado es ”, Cuad

Fin //Programa principal Inicio etiqueta ( ) //Invoca al modulo cuadrado ( ) //Invoca al modulo Fin

En Phyton # Ejem. 0. Procedimiento sin argumentos

def etiqueta(): print "=======================" print " Procedimiento sin argumentos" print "=======================" def cuadrado( ): print "Ingrese numero" n = float(raw_input()) cuad = n * n print n," al cuadrado es ",cuad #Programa principal en Python etiqueta() #Invoca al modulo cuadrado()#Invoca al modulo

Page 5: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 5

Algoritmica I- Modularidad

b) Procedimientos con argumentos Son aquellas que reciben argumentos de entrada al módulo mas no

emiten un valor como retorno.

Ejemplo 02. Realizar un procedimiento con argumento que permita generar la tabla de multiplicar.

a) Análisis del problema

En referencia la ejercicio 02, de la unidad de bucles. Se tiene: Para i� 1 hasta 20 Hacer

prod �i * m Escribir i,” X“, m,”=”,prod

Declaración de variables y argumentos: Programa principal Invocación a Tabla (multip) Variable de Entrada: Numérico entero multip Sub Programa Tabla ( real m) Argumento de entrada: Numérico real m

En C++,

void declara una función que no tiene valor de retorno, en los nuevos compiladores de C++ ya no es necesario declararlos.

En C++ //Ejem. 01. Procedimiento sin argumentos

#include<conio.h> #include<iostream.h> void etiqueta ( ) {

cout<<"====================="<<endl; cout<<" Procedim. sin argumentos ”<<endl; cout<<"====================="<<endl;

} void cuadrado ( ){

//Variable local float Cuad, Num; cout<<"Ingrese un Numero "; cin>>Num; Cuad=Num * Num; cout<<"El cuadrado es "<<Cuad; getch();

} //Programa principal main( ){ etiqueta ( ); //Invoca al modulo cuadrado ( ); //Invoca al modulo }

Page 6: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 6

Ecler Mamani Vilca

Algoritmo d) Codificación

En Pseudocódigo // Ejemplo de procedimiento con argumentos

//llama el argumento m Sub tabla (real m )

Para i� 1 hasta 20 Hacer prod �i * m Escribir i,” X“, m,”=”,prod

Fin //Programa principal Inicio Escribir “Ingrese multiplicador” Leer multip tabla (multip ) Fin

En Phyton # Ejem .02 Procedimiento con argumentos #llama el argumento m def tabla(m): for i in range (1,20): prod = i * m print i," x ",m," = ",prod #Programa principal print "Ingrese multiplicador " multi = float(raw_input( )) tabla(multi)

En C++

// Ejem .02 Procedimiento con argumentos #include<conio.h> #include<iostream.h> #llama el argumento m tabla (float m) { int i; float prod; for (i=1;i<=20;i++){ prod = i*m; cout<<i<<"x"<<m<<"=" <<prod<<endl; } } //Programa principal main( ){ float multi; cout<<"Ingrese multiplicador"; cin >>multi; tabla(multi); }

Page 7: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 7

Algoritmica I- Modularidad

FUNCIÓN Una función es un módulo de código con un nombre asociado que realiza una serie de tareas y devuelve un valor. Desde el punto de vista matemático, una función es una operación que toma uno o a varios operandos, y devuelve un resultado. Y desde el punto de vista algorítmico, es un subprograma que toma uno o varios parámetros como entrada y devuelve a la salida un único resultado. f(p1,p2,...,pn) donde p1, p2, ..., pn son los parámetros y f es el nombre de la función. Cabe recordar que para el uso de las funciones en muchas ocasiones es necesario usar variables globales. Variable global Una variable global es aquella que se define fuera del cuerpo de cualquier función. El ámbito de una variable global son todas las funciones que componen el programa, cualquier función puede acceder a dichas variables para leer y escribir en ellas. Es decir, se puede hacer referencia a su dirección de memoria en cualquier lugar del programa.

Variable local Es aquella cuyo ámbito se restringe a la función que la ha declarado se dice entonces que la variable es local a esa función. Esto implica que esa variable sólo va a poder ser manipulada en dicha sección, y no se podrá hacer referencia fuera de dicha sección. Un ejemplo en C++, observamos una modificación para “int i” como variable global y “float prod”, es una variable local.

En C++ //Ejem. tipos de variables

#include<conio.h> #include<iostream.h> int i; //Variable global tabla (float m) { float prod; //Variable local for (i=1;i<=20;i++){ prod = i*m; cout<<i<<"x"<<m<<"=" <<prod<<endl; } getch( ); }

Page 8: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 8

Ecler Mamani Vilca

Sintaxis:

Algoritmo Python C++ //función Sub nombre (parametro) //procesos Retorna valor FinSub

//función nombre(tipo parametro){ //procesos return valor; }

#función nombre(parametro ): #procesos return valor

//Programa principal Inicio //Ingreso de datos //llamando al modulo nombre(parametro ) Fin

//Programa principal main( ) { //Ingreso de datos // Llamando al modulo nombre(parametro); }

#Programa principal #Ingreso de datos nombre(parametro )

La sentencia return 0, break o exit (0), le permite terminar la ejecución de una función. Cuando el valor devuelto es diferente de 0, es cuando retorna un valor, con fines didácticos utilizaremos los ejemplos anteriores. Ejemplo 03. Realizar una función que genere un número al cuadrado. a) Análisis del problema

Declaración de variables y argumentos: Programa principal Invocación a cuadra (num) Argumento de entrada: Numérico real num Sub Programa cuadra ( real ) Argumento de recepción Numérico real n

b) Algoritmo

Pseudocódigo // Función numero al cuadrado

Sub cuadra (real n) Retorna n*n Fin //Programa principal Inicio Escribir “Ingrese un numero” Leer num Escribir num,”^ 2 =”,cuadra(num) Fin

En Phyton

# Función numero al cuadrado def cuadra(n): return n*n #Programa principal print "Ingrese un numero" num = float(raw_input()) print num,"^2 =",cuadra(num)

Page 9: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 9

Algoritmica I- Modularidad

c) Codificación Función recursiva La recursividad es una función que se llama así misma generando secuencias en forma descendente, ya sea directamente o indirectamente. La función recursiva al principio cuesta un poco entender cuando se está aprendiendo a programar. No todas las funciones son recursivas son particularidades. Si hacemos una comparación visual en la parte inferior, observamos que dentro del monitor mayor se encuentra dentro de un segundo y este último en un tercer monitor, ha esto podemos denominar una recursividad visual.

La definicion de recursividad algunas veces puedes causar algo de humor, siempre y cuando se entienda bien, para ejemplo tenemos en un diccionario cuya definición indica:

En C++ // Función numero al cuadrado

#include<conio.h> #include<iostream.h> cuadra (float m){ return m*m; } //Programa principal main( ){ float num;

cout<<"Ingrese un numero "; cin>>num; //imprime directamente la función cout<<num<<"^2 = " <<cuadra(num);

getch(); }

Page 10: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 10

Ecler Mamani Vilca

"Recursion". Consulte la sección "Recursividad". Recursividad. Vease “recursión”

Una de las apliaciones mas entendibles es usando las matemáticas visuales, nos referimos a los fracales, los fractales gráficos son formas que se repiten entre si, cuya función principal es la recursividad, veamos algunos de ellos.

Sintaxis:

PSeudocódigo Python C++

#función recursiva Sub nombre(n): #el bucle se rompe Si n ==0 Entonces return 0 Sino : retorna nombre(n - 1) // desciende de n hasta 1

#función recursiva def nombre(n): #el bucle se rompe if n == 0: return 0 else : return nombre(n - 1) // desciende de n hasta 1

//función recursiva nombre(tipo n) { // el bucle se rompe if (n==0) return 0; else return nombre(n-1); //desciende de n hasta 1 }

#programa principal nombre ( numero)

#programa principal nombre ( numero)

//programa principal main( ) { //llamando al modulo nombre ( numero); }

Ejemplo 04. Realizar una función recursiva, cuenta regresiva. a) Análisis del problema

Cuenta atrás espera que su parámetro, n, sea un entero positivo. Si n el parámetro es cero, muestra la palabra “Despegando….!”. En otro caso, muestra n y luego llama a la función llamada regresiva (ella misma) pasándole como argumento n-1.

Triángulo de Sierpiński Curva T Curva de Koch

Page 11: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 11

Algoritmica I- Modularidad

Que sucede si llamamos a la función de la siguiente manera?, regresiva (n), donde n= 10. La ejecución de cuenta atrás comienza con n=10, y puesto que n no es cero, da como salida el valor 10, y luego se llama a sí misma, veamos en una prueba de escritorio:

Condición n = 10

Iteración Función Escribir

F 10 regresiva(n) = 10 10

F 9 regresiva (regresiva(n-1) = 10-1) 9 F 8 regresiva(regresiva(n-1) = 9-1) 8

F 7 regresiva(regresiva(n-1) = 8-1) 7 F 6 regresiva(regresiva(n-1) = 7-1) 6

F 5 regresiva(regresiva(n-1) = 6-1) 5 F 4 regresiva(regresiva(n-1) = 5-1) 4

F 3 regresiva(regresiva(n-1) = 4-1) 3 F 2 regresiva(regresiva(n-1) = 3-1) 2

F 1 regresiva(regresiva(n-1) = 2-1) 1 Verdad Corte regresiva(regresiva(n-1) = 0) “Despegando¡”

La ejecución de regresiva atrás comienza con n=10, y puesto que n no es cero, muestra el valor 10 y luego se llama a sí misma ...hasta llegar a cero, la ejecución de cuenta atrás llega a n=0, y puesto que n es cero, muestra la palabra “Despegando…¡”. Declaración de variables y parámetros Programa principal Invocación a regresiva (entero num ) Sub regresiva ( entero n ) Parámetro de salida: retorno regresiva (n-1);

b) algoritmo

Pseudocódigo //Ejemplo cuenta regresiva

Sub regresiva (n) Si n=0 Entonces Escribir “Despegando…..¡” retorna 0 SiNo Escribir n #llamando a sí mismo retorna regresiva (n-1) FinSi #Programa principal Inicio

Escribir "Ingrese un numero "; Leer num regresiva(num)

Fin

Page 12: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 12

Ecler Mamani Vilca

En Phyton

#Ejemplo de función recursiva cuenta # regresiva def regresiva (n): if n==0: print “Despegando…..¡” return 0 else: print n #llamando a sí mismo return regresiva (n-1) #Programa principal print "Ingrese un numero " num=int(raw_input()); regresiva(num)

En C++ // Ejemplo cuenta regresiva

#include<conio.h> #include<iostream.h> regresiva (int n){ if (n==0) cout<<”Despegando…..¡” return 0; else cout<<n<<endl; //llamando a si mismo return regresiva (n-1); } //Programa principal main(){ int num; cout<<"Ingrese un numero "; cin>>num; regresiva(num); getch(); }

Page 13: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 13

Algoritmica I- Modularidad

Ejercicios 1. Realizar una función recursiva para imprimir y numerar n veces el nombre de “Hola”. a) Análisis del problema

Utilizaremos el bucle que genera la recursividad para imprimir la numeración.

Función Interacción Impresión, n,“Hola” n = 5 5 5 “Hola” n -1 � (5-1) 4 4 “Hola” n -1 � (4-1) 3 3 “Hola” n -1 � (3-1) 2 2 “Hola” n -1 � (2-1) 1 1 “Hola” n -1 � (1-1) 0 Como n=0, termina

Declaración de variables y argumentos: Programa principal Invocación a nombre (cantidad) Argumento de entrada: Numérico real num Sub Programa nombre ( cantidad ) Argumento de recepción Numérico entero cantidad

Page 14: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 14

Ecler Mamani Vilca

b) Algoritmo 2. Realizar una función recursiva en Phyton que muestra la tabla de multiplicar. a) Análisis del problema

Conociendo que la recursividad generar los bucles en orden decreciente, agregaremos un contador k, el cual genera la iteración ascendente

Función Iterac. k�0 p�12 ,p�k*m k," x ",m," = ",p

N = 8 8 k � k +1 (0+1 = 1) P� (1*12) = 12 1 x 12 = 12

N -1 � (8-1) 7 k � k +1 (1+1 = 2) P� (2*12) = 12 2 x 12 = 24

N -1 � (7-1) 6 k � k +1 (2+1 = 3) P� (3*12) = 12 3 x 12 = 36

N -1 � (6-1) 5 k � k +1 (3+1 = 4) P� (4*12) = 12 4 x 12 = 48

N -1 � (5-1) 4 k � k +1 (4+1 = 5) P� (5*12) = 12 5 x 12 = 60

N -1 � (4-1) 3 k � k +1 (5+1 = 6) P� (6*12) = 12 6 x 12 = 72

N -1 � (3-1) 2 k � k +1 (6+1 = 7) P� (7*12) = 12 7 x 12 = 84

N -1 � (2-1) 1 k � k +1 (7+1 = 8) P� (8*12) = 12 8 x 12 = 96

n -1 � (1-1) 0

Declaración de variables y argumentos: Programa principal Invocación a tabla (cantidad,multimplicador) Argumento de entrada: Numérico entero cantidad,multimplicador Sub tabla ( n,m ) Argumento de recepción Numérico entero n,m

En pseudocódigo //Imprime n veces hola

Sub nombre( n ) Si (n=0) Entonces //si n llega ha ser 0 la iteracion se rompe retorna 0; //se detiene Sino Escribr n, " Hola" retorna nombre(n-1) // decrementa desde n hasta 1 FinSub //Programa principal Inicio Escribir "Ingrese la cantidad de nombres a imprimir ==> " Leer cantidad nombre(cantidad);//función recursiva Fin

Page 15: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 15

Algoritmica I- Modularidad

3. Realizar una función recursiva en C++ que muestre la potencia de un base x a la potencia n. a) Análisis del problema

Usaremos la recursividad para generar bucles con el cual repetir las veces de “x” se multiplique por “n”.

En Phyton #Tabla de multiplicar con recursividad

#Variable globlal k=0 def tabla(n,m): global k if (n==0):#si n llega ha ser 0 la iteracion se rompe return 0 else: k=k+1 #contador para imprimir ascendentemente p=k*m print k," x ",m," = ",p return tabla(n-1,m) #punto recursivo #Programa principal cantidad=int(raw_input("Hasta que numero desea la tabla ==> ")) multiplicador=int(raw_input(" Ingrese multiplicador ==> ")) tabla(cantidad,multiplicador)#funcion recursiva

En C++

# include<conio.h> # include <iostream.h> int potencia(int base,int exponente) //funcion recursiva

{ int pot; if (exponente==0)

return 0; else { // productoria

pot=base*potencia(base,exponente-1); return pot;

} }

main ( ) { int base,exponente,resultado;

cout<<" Ingresa la base X = "; cin >>base; cout<<"Ingresa la exponente n = "; cin>>exponente; resultado=potencia(base,exponente); cout<<" La potencia es igual a = "<<resultado; getch();

}

Page 16: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 16

Ecler Mamani Vilca

4. Realizar un algoritmo que permita convertir números decimales a binario usando recursividad. b) Análisis del problema

Para el caso de convertir un numero decimal a binario es excelente el método de recursividad, pues la conversion normal de cambio de base se realiza en forma descendente. Realizaremos una prueba para 8 que es en binario 1000.

binario (num/2) num Escribir num mod 2

8 1 1 mod 2 = 1 8/2=4 2 2 mod 2 = 0 4/2=2 4 4 mod 2 = 0

2/2 = 1 8 8 mod 2 = 0

5. Graficar el fractal de Tcuadrado. a) Análisis del problema

Puede ser generado a partir de usar este algoritmo :

Pseudocódigo //Numero decimal a binario con recursividad

Sub binario( num) Si (num = 0) Entonces Retorno 0 Sino

binario(num/2) //divide entre hasta que sea cero FinSi //escribe bit de resto printf("%d",num%2); FinSub //Programa Principal Inicio

Escribir "Ingrese un numero en decimal " Leer n binario(n)

Fin

Page 17: 6 libro fundamentos cap__modularidad_ecler mv

Pág. 17

Algoritmica I- Modularidad

1. Imagen 1: 1. Comience con un cuadrado. 2. Restar un medio cuadrado de la longitud original y la anchura (un cuarto de la zona) desde el centro. 2. Imagen 2: 1. Comience con la imagen anterior. 2. Escala abajo una copia de una mitad de la longitud original y anchura. 3. De cada uno de los cuadrantes de imagen 1, restar la copia de la imagen. 3. Imágenes 3-6:

1. Repita el paso 2.

En C++

#include <conio.h> #include <graphics.h> #include <dos.h> void Cfractal(int x,int y,int radio) { rectangle(x-radio,y-radio,x+radio,y+radio); if(radio>10) { Cfractal(x-radio,y-radio,radio/2); Cfractal(x-radio,y+radio,radio/2); Cfractal(x+radio,y-radio,radio/2); Cfractal(x+radio,y+radio,radio/2); } } void main() { int driver=DETECT,x; initgraph(&driver,&x,"c:\\bc5\\bgi"); Cfractal(getmaxx()/2,getmaxy()/2,100); getch(); }