Está en la página 1de 38

3.1.

Definición de
programación Modular
Martín Alvarez Pulido
Todo programa contiene un módulo principal
que controla todo lo que sucede

Se transfiere el control a submódulos


(subprogramas, subrutinas), para ejecutar
Programación sus funciones y devuelven el control al
módulo principal al completar su tarea.

Modular.
Si la tarea asignada es demasiado compleja,
el módulo deberá dividirse en otros módulos
más pequeños.

La subdivisión de módulos continúa hasta que


cada módulo tiene solamente una tarea
específica que ejecutar.
Programación Modular.

Un módulo puede transferir Los módulos son independientes


temporalmente el control a en el sentido en que ningún Los resultados producidos por un
módulo pueden ser utilizados
otro módulo; sin embargo, cada módulo puede tener acceso
módulo debe devolver el control directo a cualquier otro módulo por cualquier otro módulo
al módulo del cual se recibe excepto el módulo al que llama cuando se transfiera a ellos el
control.
originalmente el control. y sus propios submódulos.
Programación Modular.
3.1.1 FUNCIONES y PROCEDIMIENTOS

Función: bloque de código o subrutina que realiza una


tarea determinada, puede o no tener argumentos y
siempre retorna un valor.

Procedimiento: bloque de código o subrutina que realiza


una tarea determinada, puede o no tener argumentos y
no retorna ningún valor.
Sintaxis de una función
tipoRetornoFunción nombreFunción (tipo y nombreDeArgumentos) {
bloque de sentencias;
return datoRetornado;
}
⚫ tipoRetornoFunción: puede ser de cualquier tipo de los que se usan en C. El valor devuelto
por la función será de este tipo (datoRetornado). Si no indicamos el tipo, la función devolverá
un valor de tipo entero ( int ).
⚫ nombreFunción: es el nombre que le daremos a la función.
⚫ tipo y nombreDeArgumentos: son los parámetros que recibe la función. Los argumentos de
una función no son más que variables locales que reciben un valor. Este valor se lo enviamos
al hacer la llamada a la función. Pueden existir funciones que no reciban argumentos.
⚫ bloque de sentencias: Sentencias que serán ejecutadas cuando se realice la llamada a la
función.
Sintaxis de un procedimiento
void nombreProc (tipo y nombreDeArgumentos) {
bloque de sentencias;

}
⚫ void: indicamos tipo vacío o nulo, es decir sin retorno de valor
⚫ nombreProc: es el nombre que le daremos al procedimiento.
⚫ tipo y nombreDeArgumentos: son los parámetros que recibe el procedimiento. Los
argumentos de un procedimiento no son más que variables locales que reciben un
valor. Este valor se lo enviamos al hacer la llamada al procedimiento. Pueden existir
procedimientos que no reciban argumentos.
⚫ bloque de sentencias: Sentencias que serán ejecutadas cuando se realice la llamada
al procedimiento.
 Las funciones y procedimientos pueden ser
llamadas desde la función main o desde
otras funciones o procedimientos.

A tomar en  Nunca llamar a la función main desde otro


lugar del programa.
cuenta  Los argumentos de la función o
procedimiento y sus variables locales se
destruirán al finalizar la ejecución de la
función o procedimiento.
3.1.2. Prototipos,
librerías y
módulos.
Declaración de funciones y
procedimientos
 Se deben declarar antes de usarse
 A su declaración se le llama prototipo de funciones y
procedimientos
 Los prototipos pueden escribirse antes de la función main o bién
en otro archivo y lo indicamos con #include
 #include “archivo.h” si está en el mismo directorio del proyecto
 #include “ruta\archivo.h” si no está en el mismo directorio del
proyecto
 #include <archivo.h> si esta en el directorio include del
compilador
#include <iostream> Ejemplo 1
using namespace std;
void mostrar(float); /* prototipo */
float suma(float,float); /* prototipo */
int main() {
float num1=10.4;
float num2=20.8
float res;
res=suma(num1,num2); /* llamada */
mostrar(res);
return 0;
}
void mostrar(float numeroFlotante){
cout << numeroFlotante<<endl;
}
float suma(float numero1, float numero2){
return (numero1+numero2);
}
Paso de parámetros

 Las funciones pueden retornar un valor mediante la


instrucción return, que finaliza la ejecución de la función
 En una misma función podemos tener más de una instrucción
return.
 La forma de retornar un valor es la siguiente:
 return ( valor o expresión );
 El valor devuelto por una función debe asignarse a una
variable. De lo contrario, el valor se perderá.
 También en el cout, podemos llamar a la función, aunque aquí
se perderá su valor
Ejemplo
#include <iostream>
using namespace std;
float suma(float,float); /* prototipo */
int main() {
float num1=23.7;
float num2=27.5;
float res;
res=suma(num1,num2); /* guardamos el valor */
cout << "La suma es "<< suma(num1,num2)<<endl;
cout << "La suma es "<< res <<endl;
suma(num1,num2); /* el valor se pierde */
}
float suma(float n1,float n2){
return (n1+n2);
}
Argumentos o parámetros de main

 La función main puede también recibir parámetros.


 Los parámetros habituales para main son:
 argc: es el contador de argumentos o parámetros
 *argv[]: es un apuntador de tipo arreglo, apunta a los argumentos pasados en main
 Para poder pasar argumentos a un programa en C/C++ debe ser ejecutado
manualmente desde la CLI (Interfaz de línea de comandos), en el caso de
Windows la línea de comandos se invoca con cmd.
 Se debe escribir el nombre del ejecutable binario y después los valores de los
argumentos
Argumentos o parámetros de main

#include <cstdlib>
 Este es un #include <iostream>
ejemplo de using namespace std;
int main(int argc, char *argv[]){
uso de int contador=0;
parámetros en cout << "Cantidad de argumentos = " << argc << endl;
main: if (argc!=4){
cout << "Error, Escriba argumentosEnMain Nombre ApellidoPaterno ApellidoMaterno ...";
exit(0);
}else{
while (contador<argc){
cout << "Valor de los argumentos [" << contador <<"] = [" << argv[contador] <<"]" << endl;
contador++;
}
}
cout << "Presione tecla enter para continuar ...";
cin.get();
return 0;
}
3.2. Ámbito de variables.

 El ámbito de las variables se refiere a su alcance, es decir, desde donde es


accesible
 El alcance va a limitar o proporcionar el tipo de uso de las variables
3.2.1. Variables de entorno.

 Una variable de entorno es un valor con nombre dinámico que puede afectar la
forma en que los procesos en ejecución se comportarán en una computadora.
 Son parte del entorno en el que se ejecuta un proceso.
 Por ejemplo, un proceso en ejecución puede consultar el valor de la variable de entorno
TEMP para descubrir una ubicación adecuada para almacenar archivos temporales, o la
variable HOME o USERPROFILE para encontrar la estructura de directorio propiedad del
usuario que ejecuta el proceso.
 Se incluyeron en los sistemas operativos en 1979 con la versión 7 de Unix, por lo
que son parte de todas las distribuciones de Unix, GNU/Linux y macOS.
 También el DOS 2.0 las incluye en 1982, por lo que todos los sistemas operativos
de Microsoft y OS/2 de IBM, también los han incluido.
 Utilizan una sintaxis estándar (excepto los sistemas operativos de Microsoft y OS/2
y 3 de IBM
3.2.1. Variables de entorno.

 Para ver o crear variables de entorno, vaya a:


 Propiedades del sistema
 Dar clic en variables de entorno
 Se abre una ventana donde puede editar, modificar, eliminar o crear nuevas
variables de entorno
3.2.2. Variables globales.

 Las variables globales son aquellas que se declaran fuera de cualquier función
/procedimiento
 Pueden utilizarse, en cualquier parte del programa, después de haberse
declarado.
 Pueden utilizarse en cualquier función
 Pueden declararse también en librerías .h
3.2.3. Variables locales

 Son variables declaradas dentro de una función o procedimiento


 Los argumentos también son variables locales
 Se pueden crear variables locales específicas de una estructura de control o
de bucle
 No pueden ser accedidas desde otras funciones
Ejemplo ámbito de variables
#include <iostream>
using namespace std;
int numero{67};
int main(){
double numero{70.5};
int control=10;
cout << "Valor de la variable local numero double = " << numero
<< "\ny el valor de la variable global entera numero es = " << ::numero << endl;

if(control<100){
float numero{80.5};
cout << "El valor de la variable numero local a if es " << numero << endl;
}
cout << "Espero hayas entendido el espacio de cada variable" << endl;
return 0;
}
3.3. Paso de parámetros
y valores de retorno
3.3.1. Paso de parámetros por valor.
3.3.0. Valores de retorno.

 Como ya hemos visto, las funciones pueden retornar un valor.


 Esto se hace mediante la instrucción return, que finaliza la ejecución de la
función, devolviendo o no un valor.
 En una misma función podemos tener más de una instrucción return.
 La forma de retornar un valor es la siguiente:
 return ( valor o expresión );
 El valor devuelto por la función debe asignarse a una variable. De lo
contrario, el valor se perderá.
3.3.1. Paso de parámetros por valor.

 Existen 3 formas de pasar valores como parámetros o argumentos


 Por valor
 Por referencia con referencia a un argumento es decir su dirección
 Por referencia con un puntero
3.3.1. Paso de parámetros por valor.

 El paso por valor, se realiza:


 Pasando valores directamente en la llamada a la función/procedimiento
 Pasando variables “normales como argumentos al momento de llamar a una
función/procedimiento”
 Se pueden utilizar valores de tipos nativos o variables de tipos nativos
 Los ejemplos realizados hasta el momento son ejemplos de paso por valor
(excepto los argumentos en main)
3.3.1. Paso de parámetros por valor.
//libreriaValRef.h
//prototipo de paso por valor
 Ejemplo de paso por valor:
float cuboPorValor(float);

//declaración de paso por valor


El valor de numero antes de pasar por valor es: 10.1 float cuboPorValor(float base){
El cubo de numero pasado por valor es: 1030.3 //Valor de retorno indicado la función
El valor de numero despues de pasar por valor es: 10.1 return base*base*base;
}

#include <iostream>
#include "libreriaValRef.h"
using namespace std;
int main(){
float numero=10.1;
cout << "El valor de numero antes de pasar por valor es: " << numero << endl;
//pasando por valor la variable numero
float porValor=cuboPorValor(numero);
cout << "El cubo de numero pasado por valor es: " << porValor << endl;
cout << "El valor de numero despues de pasar por valor es: " << numero << endl;
return 0;
}
3.3.2. Paso de parámetros por
referencia (con punteros).
 El paso por referencia con punteros se realiza
 Creando argumentos de tipo puntero
 Pasando el argumento como dirección de una variable
 Hay que tener cuidado al momento de manejar direcciones y punteros,
porque se utilizan los valores originales
 Modifiquemos el programa anterior como se muestra en las siguientes
diapositivas para mostrar el paso de parámetros por referencia con punteros
3.3.2. Paso de parámetros por
referencia (con punteros).
//prototipo de paso por valor
float cuboPorValor(float);

//prototipo de paso por referencia con puntero


void cuboPorReferencia(float*);

//declaración de paso por valor


float cuboPorValor(float base){
//Valor de retorno
return base*base*base;
}

// declaración de paso por referencia con puntero


void cuboPorReferencia(float* ptrBase) {
*ptrBase = *ptrBase * *ptrBase * *ptrBase; // cubo *ptrBase
}
3.3.2. Paso de parámetros por
referencia (con punteros).
#include <iostream>
#include "libreriaValRef.h"

using namespace std;

int main(){
float numero=10.1;
cout << "El valor de numero antes de pasar por valor es: " << numero << endl;
//pasando por valor la variable numero
float porValor=cuboPorValor(numero);
cout << "El cubo de numero pasado por valor es: " << porValor << endl;
cout << "El valor de numero despues de pasar por valor es: " << numero << endl;

cout << "El valor de numero antes de pasar por referencia es: " << numero << endl;
// pasando numero por referencia
cuboPorReferencia(&numero);
cout << "El valor de numero despues de pasar por referencia es es: " << numero << endl;

return 0;
}
3.3.2. Paso de parámetros por
referencia (con punteros).
El valor de numero antes de pasar por valor es: 10.1
El cubo de numero pasado por valor es: 1030.3
El valor de numero despues de pasar por valor es: 10.1
El valor de numero antes de pasar por referencia es: 10.1
El valor de numero despues de pasar por referencia es es: 1030.3

Process returned 0 (0x0) execution time : 0.134 s


Press any key to continue.
3.3.3. Paso de parámetros por dirección (también
es paso por referencia pero sin punteros).

 El paso por referencia sin punteros se realiza


 Creando argumentos de tipo referencia o dirección
 Pasando el argumento como dirección de una variable
 Hay que tener cuidado al momento de manejar direcciones y punteros,
porque se utilizan los valores originales
 Modifiquemos el programa anterior como se muestra en las siguientes
diapositivas para mostrar el paso de parámetros por referencia con punteros
3.3.3. Paso de parámetros por dirección (también
es paso por referencia pero sin punteros).

//prototipo de paso por valor


float cuboPorValor(float);

//prototipo de paso por referencia con puntero


void cuboPorReferencia(float*);

//prototipo de paso por referencia sin puntero


// es decir solo con direcciones o referencias
void mitadDelValor(float &);

//declaración de pas o por valor


float cuboPorValor(float base){
//Valor de retorno
return base*base*base;
}

// declaración de paso por referencia con puntero


void cuboPorReferencia(float* ptrBase) {
*ptrBase = *ptrBase * *ptrBase * *ptrBase; // cubo *ptrBase
}

// declaración de paso por referencia con direcciones


void mitadDelValor(float &elNumero){
elNumero=elNumero/2;
}
3.3.3. Paso de parámetros por dirección (también
es paso por referencia pero sin punteros).
#include <iostream>
#include "libreriaValRef.h"

using namespace std;

int main(){
float numero=10.1;
cout << "El valor de numero antes de pasar por valor es: " << numero << endl;
//pasando por valor la variable numero
float porValor=cuboPorValor(numero);
cout << "El cubo de numero pasado por valor es: " << porValor << endl;
cout << "El valor de numero despues de pasar por valor es: " << numero << endl;

cout << "El valor de numero antes de pasar por referencia es: " << numero << endl;
// pasando numero por referencia
cuboPorReferencia(&numero);
cout << "El valor de numero despues de pasar por referencia es es: " << numero << endl;
//pasando por referenci solo dirección
mitadDelValor(numero);
cout << "El valor de numero despues de pasar por direccion es es: " << numero << endl;

return 0;
}
3.3.3. Paso de parámetros por dirección (también
es paso por referencia pero sin punteros).

El valor de numero antes de pasar por valor es: 10.1


El cubo de numero pasado por valor es: 1030.3
El valor de numero despues de pasar por valor es: 10.1
El valor de numero antes de pasar por referencia es: 10.1
El valor de numero despues de pasar por referencia es es: 1030.3
El valor de numero despues de pasar por direccion es es: 515.151
3.4. Recursividad.

 Para algunos tipos de problemas, es útil que las funciones se llamen a sí


mismas.
 ¿Qué es una función recursiva?
 Es aquella que se llama a sí misma directa o indirectamente a través de otra
función.
 La recursividad es un tema complejo que se discute extensamente en los
cursos de informática de nivel superior.
 En este curso, presentamos ejemplos sencillos de recursividad para su
comprensión.
3.4. Recursividad.

 Analice las siguientes funciones, y observe como se llaman a sí mismas dentro


de las mismas
unsigned long factorial(unsigned long);
unsigned long fibonacci(unsigned long);

// definición de una funcion recursiva


unsigned long factorial(unsigned long numero) {
if (numero <= 1) {
return 1; // en los casos en los que numero sea: 0! = 1 and 1! = 1
}
else { // recursion
return numero * factorial(numero - 1);
}
}

unsigned long fibonacci(unsigned long numero) {


if ((0 == numero) || (1 == numero)) { // casos base
return numero;
}
else { // recursion
return fibonacci(numero - 1) + fibonacci(numero - 2);
}
}
3.4. Recursividad.
#include <iostream>
#include <iomanip>
#include "libreriaRecursivas.h"
/* iomanip es una biblioteca que se utiliza para manipular la salida del programa C ++.
Proporciona manipuladores paramétricos*/
using namespace std;

int main(){
// calcula los factoriales de 0 hasta 10
for (unsigned int contador{0}; contador <= 10; ++contador) {
cout << setw(2) << contador << "! = " << factorial(contador)<< endl;
// setw e utiliza para establecer el ancho del campo.
}

// calcula la serie de fibonacci de 0 a 10


for (unsigned int contador{0}; contador <= 10; ++contador)
cout << " fibonacci(" << contador << ") = "
<< fibonacci(contador) << endl;

// mostrar valores de fibonacci más altos


cout << "\nfibonacci(20) = " << fibonacci(20) << endl;
cout << "fibonacci(30) = " << fibonacci(30) << endl;
cout << "fibonacci(35) = " << fibonacci(35) << endl;

cout << "\n\nEsto fue, uso de recursividad!" << endl;


return 0;
}
Bibliografía

 Deitel, P. J., & Deitel, H. (2016). C how to program, whith inttroduction to


C++ Global Edition (8a ed.). Pearson.
 Deitel, P. J., & Deitel, H. (2016). C how to program, whith introduction to
C++ (8a ed.). Pearson.
 Deitel, P. J., & Deitel, H. (2017). C++ how to program (10a ed.). Pearson.
 Deitel, P. J., & Deitel, H. (2017). C++ how to program Global Edition (10a
ed.). Pearson.
 Deitel, P. J., & Deitel, H. (2014). C++ how to program (9a ed.). Pearson.
 Deitel, P. J., & Deitel, H. (2012). C++ how to program (8a ed.). Pearson.

También podría gustarte