Programación Modular en C++
Programación Modular en C++
PROGRAMACIÓN I
C++
Introducción.
Diseño descendente.
Subprogramas.
Definición
Transferencia/Retorno
Estructura de una función.
Nombre de una función
Tipo de retorno (tipo del valor devuelto)
Valor retorno
Lista de parámetros
Paso por valor
Paso por referencia
Declaración de funciones: Prototipos.
Llamada a funciones.
Ejercicios y ejemplos.
Introducción
4
La abstracción es la herramienta mental que nos permite
analizar, comprender y construir sistemas complejos.
Identificamos y denominamos conceptos abstractos con
significado. Aplicamos Refinamientos Sucesivos.
Introducción
5
A veces, un determinado problema complejo lo podemos (y
debemos) dividir en problemas más sencillos. Estos
subproblemas se conocen como subprogramas.
Utilizamos abstracción:
NO importa como se resuelve un subproblema
Nos centramos en la funcionalidad del subprograma
Que subproblema resuelve, que datos necesita, que datos
produce
Bajo que condiciones se debe ejecutar
Transferencia
El control de ejecución se
pasa al subprograma en el
momento en que se
requieren sus servicios.
Sintaxis
<tipo_resultado> <nombre_de_la_función> ( lista_de_parámetros )
{
cuerpo_de_la_función ;
return <expresión> ;
}
Palabra reservada
... ...
int main() int main()
{ {
…. ….
llenar_matriz(); primera_funcion();
calcular_media(); segunda_funcion();
mayores_que_la_media(); funcion_3();
imprimir_mayores(); mi_funcion();
} }
return <expresión> ;
resultado = suma (6 , 8 );
Estructura de una función: Lista de parámetros
23
Las funciones trabajan con dos tipos de datos:
...
aux 1000
int cubo (int a)
int main() { Código de la
{ int aux; Función cubo
int num = 10 , res; aux = a*a*a ;
res = cubo ( num ); return aux; res 1000
cout << res; } num 10
}
Código del
* El programa principal se interrumpe para comenzar la Programa
principal
ejecución de la función …
…
* Se reserva memoria para el código de la función,
para las variables locales y para los parámetros. MEMORIA
Estructura de una función: Lista de parámetros
25
int main()
El prototipo, informa de la
Prototipo existencia de la función, el
{
... tipo de datos que devuelve y
}
los parámetros que tiene
void potencia( int x, int y, int& z)
{
definidos.
…. Codificación
}
Características importantes relativas a
funciones
31
1. La instrucción return
a) fuerza la salida inmediata de la función.
b) sirve para devolver un valor. Dicho valor puede ser constante,
variable ó una expresión.
Ejemplo:
void func(const string & nomb);
En el cuerpo de la función, el parámetro nomb, es una
constante local.
En las llamadas, el argumento tiene que ser una variable.
Se pasa la referencia de la variable.
Recomendado cuando el tipo del parámetro no es básico, y
no se necesita una variable local.
Reglas de ámbito
36
1. Un identificador es visible y accesible en la zona
comprendida entre el lugar en que se declara (creación) y
el final del bloque o cuerpo del subprograma donde ha
sido declarado (destrucción). A esta zona se le denomina
ámbito o zona de visibilidad del identificador.
putchar(c)- escribe el
void escr(char ch, int longitud)
carácter c en el output
{
while (longitud >0){ getchar()- función lee
putchar(ch); un caráter del input
longitud--;
}
}
Ejemplo: Ejecutar y ver la salida
41
//Ejemplo de parámetros por valor y referencia
#include <iostream>
using namespace std;
void dos(int x, int y, int& z)
{
z=x + y + z;
cout<<"x= "<<x<<" y= "<<y<<" z= "<<z<<endl;
}
main ()
{
int a=5,b=8,c=3;
dos(a,b,c);
cout<<" dos(a,b,c) a= "<<a<<" b= "<<b<<" c= "<<c<<endl;
dos(7,a+b+c,a);
cout<<" dos(7,a+b+c,a) a= "<<a<<" b= "<<b<<" c= "<<c<<endl;
dos (a*b, a/b,c);
cout<<" dos (a*b, a/b,c) a= "<<a<<" b= "<<b<<" c= "<<c<<endl;
system("pause");
return 0;
}
¿Cuál será la salida?
#include <iostream>
using namespace std;
int a,b,c,x,y;
void primero()
{
a=3*a;
c=c+4; void tercero(int x, int y)
} {
void segundo() x=x+4;
{ y=y+1;
int b; cout<<"a= "<<a<<" b= "<<b<<" c= "<<c<<" x= "<<x<<" y= "<<y<<endl;
b=8; }
c=a+b+c/3; main ()
} {
a=3;b=2;c=1;x=11;y=22;
} primero();
cout<<"d primero a= "<<a<<" b= "<<b<<" c= "<<c<<" x= "<<x<<" y= "<<y<<endl;
segundo();
cout<<"d de 2º a= "<<a<<" b= "<<b<<" c= "<<c<<" x= "<<x<<" y= "<<y<<endl;
tercero(a,b);
cout<<"d de tercero a= "<<a<<" b= "<<b<<" c= "<<c<<" x= "<<x<<" y= "<<y<<endl;
system("pause");
42 return 0;
Ejemplo
43
Ejercicios propuestos
44
x2 x4 x6
cos x =1 − + − + ...
2! 4! 6!
“Números Amigos”.
Dos números son amigos cuando la suma de los divisores
del primero es igual al segundo y viceversa. Escribir un
programa que permita encontrar al menos un par de
amigos.
Ejercicios propuestos
45
Ejercicio
46
Pasar de coordenadas rectangulares a polares
47
Pasar de
rectangulares
a polares
Calcular los
Leer Datos valores de las Escribir los
coordenadas resultados
Pasar de coordenadas rectangulares a polares
48
#include <iostream>
#include <math.h>
using namespace std;
void pasoPolares(float,float,float&,float&);
int main()
{
float x,y,distancia,angulo;
cout<<"Dame la x"<<endl;
cin>>x;
cout<<"Dame la y"<<endl;
cin>>y;
pasoPolares(x,y,distancia,angulo);
cout<<"("<<x<<","<<y<<")"<<"--->"<< "r= "<<distancia<<" angulo= "<<angulo<<endl;
system("pause");
return 0;
}
void pasoPolares(float coorX, float coorY, float& r,float& a)
{
const float AGRADOS=180.0/3.1416;
r=sqrt(coorX*coorX+coorY*coorY);
a=atan(coorY/coorX)*AGRADOS;
return;
}
Escribe un programa que lea un numero entero N por teclado y
dibuje un triangulo de asteriscos con altura N.
49
Por ejemplo si N = 5 deberá dibujarse:
#include <iostream>
void escribirTriangulo ( int nf)
using namespace std ; {
const char SIMBOLO = '*'; for (int f = 0; f < nf; ++f)
void escribirCaracter ( int n, char simb ) escribirFila (f, nf );
{ }
for (int i = 0; i < n; ++i) int main ()
cout << simb ; {
} cout << " Introduzca numero de filas : ";
void escribirFila ( int f, int nf)
int nFilas ;
{
escribirCaracter (nf-f-1, ' ');//escribir
cin >> nFilas ;
blancos escribirTriangulo ( nFilas );
escribirCaracter (2*f+1, SIMBOLO ); system("pause");
//asteriscos return 0;
cout << endl ;//saltar de línea }
}
Ejercicios propuestos
50
Soluciones
51
void escribirFila ( int f, int nf)
#include <iostream> {
using namespace std ; escribirCaracter (nf-f, ' ');
const int MAX_FILAS = 10; escribirAscendente (f);
void escribirCaracter ( int n, char simb ) escribirDescendente (f- 1);
{ cout << endl ;
for (int i = 0; i < n; ++i) }
cout << simb ; void escribirTriangulo ( int nf)
} {
void escribirAscendente ( int n) for (int f = 1; f <= nf; ++f)
{ escribirFila (f, nf );
for (int i = 1; i <= n; ++i) }
cout << i; int main ()
} {
void escribirDescendente (int n) cout << " Introduzca numero de filas : ";
{ int nFilas ;
for (int i = n; i >= 1; --i) cin >> nFilas ;
cout << i; if ( nFilas < MAX_FILAS )
} escribirTriangulo ( nFilas );
system("pause");
return 0;
}
Soluciones
52
void esc_fila ( int f, int nf)
#include <iostream> {
using namespace std ; esc_caracter (nf-f, ' ');
void esc_caracter ( int n, char simb ) esc_ascendente (f, 2*f- 1);
{ esc_descendente (2*f-2, f);
for (int i = 0; i < n; ++i) cout << endl ;
cout << simb ; }
}
void esc_ascendente ( int a, int b) void esc_triangulo ( int nf)
{ {
for (int i = a; i <= b; ++i) for (int f = 1; f <= nf; ++f)
cout << (i %10); esc_fila (f, nf );
} }
void esc_descendente (int a, int b) int main ()
{ {
for (int i = a; i >= b; --i) cout << " Introduzca numero de filas : ";
cout << (i %10); int n_filas ;
} cin >> n_filas ;
esc_triangulo ( n_filas );
system("pause");
return 0;
}
#include <iostream> double serie ( double x)
using namespace std ; {
const int LIMITE_FACTORIAL_UNSIGNED = 14; int i = 0;
const double LIMITE = 1e-4; double res = 1;
double potencia ( double base , int exp ) double term ;
{ do {
double res = 1; ++i;
for (int i = 0; i < exp; ++i) term = termino (x, i);
res *= base ; res += term ;
return res ; } while ( term >= LIMITE );
} return res ;
int factorial ( int n) }
{ int main ()
int res = 1; {
for (int i = 2; i <= n; ++i) cout << " Introduzca el valor de X [0..1]: ";
res *= i; double x;
return res ; cin >> x;
} if (! (x >= 0 && x <= 1))
double termino ( double x, int i) cout << " Error . Valor de X fuera de rango " << endl ;
{ else cout << " Serie : " << serie (x) << endl ;
return potencia (x, i) / double ( factorial (i )); system("pause");
} return 0;
}
53
54
void p(int n)
{
cout << n << endl;
p(n+1);
}
int main()
{
p(1);
system("pause");
return 0;
}
Recursión: ¿Cuál será la salida?
59
int main() {
int i;
cout << "numero de blancos (negativo para acabar): ";
cin >> i;
while(i>=0) {
EscribeBlancos(i);
cout << '$' << endl;
cout << "numero de blancos (negativo para acabar): ";
cin >> i;
}
system("pause");
return 0;
}
Recursión: Invertir Cadena Caracteres
64
#include <iostream>
using namespace std;
void invierte()
{
char ch;
ch= getchar();
if (ch != '\n')
{
invierte();
}
P(i,1)=1
P(i,i)=1
P(i,j)=P(i-1,j-1) + P(i-1,j) para 1<j<i
Triángulo de Pascal
67