Capitulo 06 modularidad en c++, phyton, algoritmo
Procedimiento simple
Procedimiento con argumento
Funciones
Funciones recursivas
En Pseudocódigo, C++ y Phyton
1. 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.
2. 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.
3. 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
4. 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
5. 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
}
6. 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);
}
7. 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( );
}
8. 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)
9. 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();
}
10. 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
11. 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
12. 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();
}
13. 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
14. 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
15. 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();
}
16. 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
17. 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:bc5bgi");
Cfractal(getmaxx()/2,getmaxy()/2,100);
getch();
}