miércoles, 9 de noviembre de 2011

3 - Programación modular


EJERCICIO PARA CALENTAR MOTORES 01 - Dibujando la manzana mordida de Apple



PRÁCTICA 5
PROGRAMACIÓN MODULAR
EJERCICIOS PROPUESTOS EN LAS PRÁCTICAS 01 - Área de figuras geométricas
02 - Cuadro relleno y cuadro contorno





Cuando definas un módulo, recuerda incluir un comentario que especifique qué hace cada módulo.



// Ejemplo del programa anterior
#include
using namespace std;


//Cambios de moneda a Euros
const float US_DOLAR_EURO = 0.738868;
const float LIBRA_ESTERLINA_EURO = 1.173295;


//Declaración de procedimientos y funciones
void Leer_Importe(float &cantidad, char &moneda);
float Cambio_En_Euros(float cantidad, char moneda);


main(){
    float cantidad, euros;
    char moneda, respuesta;


    do{
        Leer_Importe(cantidad,moneda);
        euros = Cambio_En_Euros(cantidad,moneda);
        cout << "El cambio en euros es: " << euros << endl;
        cout << "¿Desea introducir otro importe? ";
        cin >> respuesta;
    }while( (respuesta == 's') || (respuesta == 'S') );
    system("PAUSE");
}


/*
Leer de teclado un importe y el tipo de moneda 
validando los datos introducidos hasta que sean correctos
*/
void Leer_Importe(float &cantidad, char &moneda){
    bool datos_correctos;
    do{
        cout << "Introduce cantidad y moneda (D/L) ";
        cin >> cantidad >> moneda;
        datos_correctos = (cantidad>0.0) && (moneda=='D'||moneda=='L');
    }while(!datos_correctos);
}


//Devolver el cambio en euros equivalente al importe y moneda especificados
float Cambio_En_Euros(float cantidad, char moneda){
    float conversion;
    
    switch(moneda){
        case 'D':
            conversion = cantidad * US_DOLAR_EURO;
        break;
        case 'L':
            conversion = cantidad * LIBRA_ESTERLINA_EURO;
        break;
    }
    return(conversion);
}


Bien, ahora para entender el programa anterior, hay que tener en cuenta lo siguiente:



Módulo o subprograma

- Resuelve un problema parcial del programa principal
- Puede ser llamado desde el programa principal o desde otros módulos
- Permite ocultar los detalles de la solución de un problema parcial (caja negra)



Declaración, definición y llamada de un módulo.
Declaración del módulo

Nombre_del_modulo(declarar_parámetros)

int maximo(int a,int b);
Definición del módulo

Nombre_del_modulo(declarar_parámetros)
   Declaración_de_variables_locales
   Cuerpo del módulo: sentencias ejecutables
Fin_de_modulo
int maximo(int a,int b){
int m;
if(a>b)
m=a;
else
m=b;
return(m);
}
Llamada del módulo

Nombre_del_módulo(lista_de_parametros)

mayor= maximo(n1,n2);


Un módulo puede tener parámetros de entrada y/o salida.

Parámetros actuales o reales

Los que aparecen en la sentencia de llamada al módulo
mayor= maximo(n1,n2);

Parámetros formales o ficticios

Los que aparecen en la declaración del módulo
int maximo(int a,int b);

Correspondencia entre parámetros actuales y formales

Número de parámetros
Tipo de parámetros
Orden de los parámetros
Nombre de los parámetros

Paso de parámetros por valor

El módulo recibe una copia del valor del dato (parámetro actual) que el módulo invocador le pasa.

Si dentro del módulo se modifica el parámetro formal correspondiente, el valor del parámetro actual permanece inalterable.

void rectangulo(int ancho, int alto, int &area, int &perimetro);

Paso de parámetros por referencia

El parámetro actual debe ser obligatoriamente una variable (que puede contener o no un valor)

Si dentro del módulo se modifica el parámetro formal correspondiente, se estará cambiando el contenido en memoria del parámetro actual.

void rectangulo(int ancho, int alto, int &area, int &perimetro);

Función y procedimiento

Función

Se puede definir con N parámetros (N>=1)

Sólo se debe utilizar paso de parámetros por valor

* Devuelve un valor que está asociado al nombre de la función

bool es_par(int n){
return ( (n%2) == 0);
}

boolTipo de dato del valor que devuelve
es_parNombre de la función
(int n)Declaración de parámetros
return ( (n%2) == 0);Sentencia para devolver el valor

int x;
bool fin;

Llamada a la función (Correcta)Llamada a la función (Incorrecta)
if (es_par(x) == true)
if (es_par(3))
if (es_par(x)&&(x>10))
fin = es_par(x);
fin = es_par(4) || (x<0);
es_par(x);


Procedimiento

Se puede definir con N parámetros (N>=0)

Se puede utilizar paso de parámetros por valor y/o por referencia

Se invoca con una sentencia compuesta por su nombre y lista de parámetros actuales (la llamada es una sentencia por si misma)

void Escribe_Caracter(char c, int n){
int i;
for(i=1; i<=n; i++){
cout << c;
cout << endl;
}
}


voidSólo se pueden devolver valores con los parámetros
Escribe_CaracterNombre del procedimiento
(char c, int n)Declaración de parámetros


int num;
char c;
Llamada al procedimiento

Escribe_Caracter(‘*’, 20);
Escribe_Caracter(c, num);
Escribe_Caracter(‘c’, 5);


¿Qué uso un procedimiento o una función?

Si el módulo tiene que devolver un sólo valor, usaremos una función, sino un procedimiento.



Return

Finaliza la ejecución del cuerpo de la función.

Devuelve el valor de retorno de la función, después de evaluar su expresión asociada.

Es recomendable usar una sola sentencia return dentro del cuerpo de una función

Debería ser la última sentencia del cuerpo de la función.



Variables locales y globales

Variables locales

Su ámbito es el cuerpo del módulo en donde está declarada

Se crea cuando se declara y se destruye cuando finaliza la ejecución del módulo

Variables globales

Su ámbito es todo el programa (todos sus módulos y el programa principal)

Se crea cuando se declara y se destruye cuando finaliza la ejecución del programa.

* Prohibido utilizar variables globales

La comunicación entre módulos debe realizarse a través de parámetros, y no de variables globales.



Efecto lateral

Comunicación de datos entre módulos al margen de los parámetros y la devolución de resultados.








La mayoría de lenguajes de programación proporcionan una colección de procedimientos y funciones de uso común (bibliotecas o librerías)

En lenguaje C/C++, para hacer uso de los módulos incluidos en una biblioteca se utiliza la directiva del compilador #include



Existe una gran variedad de bibliotecas disponibles

- Funciones matemáticas
- Manejo de caracteres y de cadena de caracteres
- Manejo de entrada y salida de datos
- Manejo de tiempo (fecha, hora, etc.)
- Etc.
































































































































EJERCICIO PARA CALENTAR MOTORES
01) Dibujando la manzana mordida de Apple






























/*
Tony Del Pino Gz tonydelpinogz@gmail.com Ejercicio para calentar motores usando lo que hemos dado hasta la fecha en los temarios 1- Tipos de datos simples e identificadores 2- Estructuras de control 3- Programación modular */ #include using namespace std; const int MAXFILAS=22; const int MAXCOLUMNAS=18; void manzana(char caracter); int main(){ char letra,continuar; do{ cout << "Teclea un caracter" << endl; cin >> letra; manzana(letra); cout << "¿Quieres escribir otra letra? (s/n)" << endl; cin >> continuar; }while(continuar=='s' || continuar=='S'); system("PAUSE"); } void manzana(char caracter){ int i,j; //Dibujando una tabla 22x18 for(i=1;i<=MAXFILAS;i++){ for(j=1;j<=MAXCOLUMNAS;j++){ //Dando forma a la manzana if( (i==1) || ((i==2)&&(j<12 || j>13)) || ((i==3)&&(j<11 || j>13)) || ((i==4)&&(j<10 || j>13)) || ((i==5)&&(j<10 || j>12)) || ((i==6)&&(j<5 || j>16)) || ((i==7)&&(j<4 || j>18)) || ((i==8)&&(j<3 || j>17)) || ((i==9)&&(j<2 || j>16)) || ((i==10)&&(j<2 || j>15)) || ((i==11)&&(j<2 || j>15)) || ((i==12)&&(j<2 || j>15)) || ((i==13)&&(j<2 || j>15)) || ((i==14)&&(j<2 || j>16)) || ((i==15)&&(j<2 || j>18)) || ((i==16)&&(j<2 || j>18)) || ((i==17)&&(j<3 || j>18)) || ((i==18)&&(j<4 || j>17)) || ((i==19)&&(j<5 || j>16)) || ((i==20)&&(j<6 || j>15)) || ((i==21) || (i==22)) ){ cout << " "; }else{ //Retocando detalles if( (i==2 && j==12) || (i==6 && j==5) || (i==6 && j==8) || (i==6 && j==13) || (i==6 && j==16) || (i==7 && j==9) || (i==7 && j==10) || (i==7 && j==11) || (i==7 && j==18) || (i==8 && j==17) || (i==9 && j==16) || (i==10 && j==15)|| (i==11 && j==15)|| (i==12 && j==15)|| (i==13 && j==15)|| (i==14 && j==16)|| (i==15 && j==18)|| (i==17 && j==3) || (i==17 && j==18)|| (i==18 && j==4) || (i==18 && j==17)|| (i==19 && j==5) || (i==19 && j==16)|| (i==20 && j==6) || (i==20 && j==15) ){ cout << "."; }else if( (i==6 && j==9) || (i==6 && j==12) || (i==20 && j==9) || (i==20 && j==10)|| (i==20 && j==11)|| (i==20 && j==12) ){ cout << " "; }else{ cout << caracter; } } } cout << endl; } }





PRÁCTICA 5
PROGRAMACIÓN MODULAR
EJERCICIOS PROPUESTOS EN LAS PRÁCTICAS



01)
/* Tony Del Pino Gz tonydelpinogz@gmail.com ******************************************** ÁREA DE FIGURAS GEOMÉTRICAS ******************************************** Realiza un programa en C que calcule el área de diferentes figuras geométricas. Concretamente de un rectángulo, un triángulo y un circulo. El programa deberá mostrar un menú con las diferentes opciones (más la opción de terminar) y posteriormente preguntar los datos necesarios para el cálculo del área. El área de un rectángulo se calcula como: area_rectangulo=base*altura El área de un triángulo se calcula como: area_triangulo=(base*altura)/2 El área de un círculo se calcula como: area_circulo=pi*radio^2 Ejemplo de ejecución: Seleccione la opción deseada: 1. Área de un rectángulo 2. Área de un triángulo 3. Área de un círculo Opción: 1 ¿Cuál es la base? 4 ¿Cuál es la altura? 5 El área del rectángylo es: 20 */ #include #include using namespace std; void mostrarMenu(); float rectangulo(float,float); float triangulo(float,float); float circulo(float); int main(){ char opcion; float base,altura,radio,resultado; mostrarMenu(); cout << "Opción: "; cin >> opcion; switch(opcion){ case '1': cout << "¿Cuál es la base? "; cin >> base; cout << "¿Cuál es la altura? "; cin >> altura; resultado = rectangulo(base,altura); cout << "El área del rectángulo es: " << resultado << endl; break; case '2': cout << "Cuál es la base? "; cin >> base; cout << "¿Cuál es la altura? "; cin >> altura; resultado = triangulo(base,altura); cout << "El área del triángulo es: " << resultado << endl; break; case '3': cout << "¿Cuál es el radio? "; cin >> radio; resultado = circulo(radio); cout << "El área del círculo es: " << resultado << endl; break; case '4': cout << "Fin del programa" << endl; break; default: break; } cin.get(); system("PAUSE"); } void mostrarMenu(){ cout << "Seleccione la opción deseada:" << endl; cout << "1.- Área de un rectángulo" << endl; cout << "2.- Área de un triángulo" << endl; cout << "3.- Área de un círculo" << endl; cout << "4.- Salir" << endl; } float rectangulo(float b,float a){ float resultado; resultado=b*a; return(resultado); } float triangulo(float b,float a){ float resultado; resultado=(b*a)/2; return(resultado); } float circulo(float r){ float resultado; resultado=3.141692*pow(r,2); return(resultado); }

02)
/* Tony Del Pino Gz tonydelpinogz@gmail.com

******************************************************
CUADRO RELLENO Y CUADRO CONTORNO
****************************************************** Realiza un programa en C que dibuje por pantalla un cuadrado. El programa debe tener además de la función main, los siguientes módulos: leerPar(): lee un carácter c1, un carácter c2 que debe ser 'R' o 'V' y un entero n entre 4 y 20. dibuja(): recibe como argumento los parámetros leídos en el módulo anterior y visualiza un cuadrado de lado n utilizando el carácter c1. Si el carácter c2 es 'R' el cuadrado debe estar relleno, en caso de que sea 'V' sólo debe dibujar el contorno. Este módulo debe devolver el número de caracteres dibujando y el tamaño del espacio interior (expresado como número de espacios en blanco del interior de la figura). El main() debe mostrar en pantalla el número de caracteres dibujado y el tamaño del espacio interior Ejemplo de ejecución: Introduce un carácter: * Introduce otro carácter (R/V): R Introduce un entero: 4 **** **** **** **** El número de caracteres dibujado es 14 El tamaño del espacio interior es 0 Otro ejemplo de ejecución: Introduce un carácter: + Introduce otro caracter (R/V): V Introduce un entero: 5 +++++ + + + + + + +++++ El número de caracteres dibujado es 16 El tamaño del espacio interior es 9 */ #include using namespace std; void leerPar(); void dibuja(char,char,int); int main(){ leerPar(); system("PAUSE"); } //Comprobruebo condiciones y muestro dibujo void leerPar(){ char c1,c2; int n; cout << "Introduce un caracter: "; cin >> c1; do{ cout << "Introduce otro caracter (R/V): "; cin >> c2; if(!(c2!='R' || c2!='V')){ cout << "R:relleno o V:contorno" << endl; } }while(!(c2=='R' || c2=='V')); do{ cout << "Introduce un entero: "; cin >> n; if(!(n>=4 && n<=20)){ cout << "Sólo números entre 4 y 20" << endl; } }while(!(n>=4 && n<=20)); //Muestro por pantalla el dibujo dibuja(c1,c2,n); } //Dibujo cuadro, compruebo número de caracteres y espacio interior void dibuja(char c1,char c2,int n){ int i,j; int numEspacios,numCaracteres; //Contadores "acumuladores" para espacios y caracteres numEspacios=0; numCaracteres=0; //Relleno if(c2=='R'){ for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ numCaracteres++; cout << c1; } cout << endl; } cout << "El número de caracteres dibujado es " << numCaracteres << endl; cout << "El tamaño del espacio interior es " << numEspacios << endl; } //Contorno if(c2=='V'){ for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if((i>=2 && i<=n-1)&&(j>=2 && j<=n-1)){ numEspacios++; cout << " "; }else{ numCaracteres++; cout << c1; } } cout << endl; } cout << "El número de caracteres dibujado es " << numCaracteres << endl; cout << "El tamaño del espacio interior es " << numEspacios << endl; } }

No hay comentarios:

Publicar un comentario