Actualizado el 15 de Junio del 2021 (Publicado el 19 de Diciembre del 2018)
1.055 visualizaciones desde el 19 de Diciembre del 2018
2,2 MB
36 paginas
Creado hace 11a (03/09/2013)
Fundamentos de la programación
4
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores
Facultad de Informática
Luis Hernández Yáñez
Universidad Complutense
Diseño descendente: Tareas y subtareas
Subprogramas
Subprogramas y datos
Parámetros
Argumentos
Resultado de la función
Prototipos
Ejemplos completos
Funciones de operador
Diseño descendente (un ejemplo)
Precondiciones y postcondiciones
427
434
441
446
451
467
473
475
477
480
490
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: La abstracción procedimental
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: La abstracción procedimental
Página 427
Refinamientos sucesivos
Tareas que ha de realizar un programa:
Se pueden dividir en subtareas más sencillas
Subtareas:
También se pueden dividir en otras más sencillas...
Refinamientos sucesivos
Diseño en sucesivos pasos en los se amplía el detalle
Ejemplos:
Dibujar
Mostrar la cadena HOLA MAMA en letras gigantes
Fundamentos de la programación: La abstracción procedimental
Página 428
1.Dibujar
2.Dibujar
3.Dibujar
Misma tarea
Misma tarea
1.Dibujar
1.Dibujar
2.Dibujar
2.Dibujar
2.1. Dibujar
2.1. Dibujar
2.2. Dibujar
2.2. Dibujar
3.Dibujar
3.Dibujar
REFINAMIENTO
REFINAMIENTO
Fundamentos de la programación: La abstracción procedimental
Página 429
1.Dibujar
2.Dibujar
2.1. Dibujar
2.2. Dibujar
3.Dibujar
4 tareas, pero dos de ellas son iguales
4 tareas, pero dos de ellas son iguales
Nos basta con saber cómo dibujar:
Nos basta con saber cómo dibujar:
Fundamentos de la programación: La abstracción procedimental
Página 430
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Dibujar
Dibujar
Dibujar
Dibujar
void dibujarCirculo()
void dibujarCirculo()
{ ... }
{ ... }
void dibujarSecantes()
void dibujarSecantes()
{ ... }
{ ... }
void dibujarLinea()
void dibujarLinea()
{ ... }
{ ... }
void dibujarTriangulo()
void dibujarTriangulo()
{
{
dibujarSecantes();
dibujarSecantes();
dibujarLinea();
dibujarLinea();
Dibujar
Dibujar
}
}
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
int main() {
int main() {
dibujarCirculo();
dibujarCirculo();
dibujarTriangulo();
dibujarTriangulo();
dibujarSecantes();
dibujarSecantes();
return 0;
return 0;
}
}
Fundamentos de la programación: La abstracción procedimental
Página 431
Mostrar la cadena HOLA MAMA en letras gigantes
Mostrar HOLA MAMA
Mostrar HOLA
Espacio en blanco
Mostrar MAMA
H
O
L
A
Tareas básicas
Tareas básicas
M A
H
O
L
A
Espacio en blanco
M
Fundamentos de la programación: La abstracción procedimental
Página 432
void mostrarH() {
void mostrarH() {
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "*****" << endl;
cout << "*****" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* *" << endl << endl;
cout << "* *" << endl << endl;
void mostrarO() {
void mostrarO() {
cout << "*****" << endl;
cout << "*****" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "* *" << endl;
cout << "*****" << endl << endl;
cout << "*****" << endl << endl;
}
}
}
}
void mostrarL()
void mostrarL()
{ ... }
{ ... }
void mostrarA()
void mostrarA()
{ ...}
{ ...}
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
void espaciosEnBlanco() {
void espaciosEnBlanco() {
cout << endl << endl << endl;
cout << endl << endl << endl;
}
}
void mostrarM()
void mostrarM()
{ ...}
{ ...}
int main() {
int main() {
mostrarH();
mostrarH();
mostrarO();
mostrarO();
mostrarL();
mostrarL();
mostrarA();
mostrarA();
espaciosEnBlanco();
espaciosEnBlanco();
mostrarM();
mostrarM();
mostrarA();
mostrarA();
mostrarM();
mostrarM();
mostrarA();
mostrarA();
return 0;
return 0;
}
}
Fundamentos de la programación: La abstracción procedimental
Página 433
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: La abstracción procedimental
Página 434
Subprogramas
Pequeños programas dentro de otros programas
Subrutinas, procedimientos, funciones, acciones, ...
Unidades de ejecución independientes
Encapsulan código y datos
Se comunican con otros subprogramas (datos)
Realizan tareas individuales del programa
Funcionalidad concreta, identificable y coherente (diseño)
Se ejecutan de principio a fin cuando se llaman (invocan)
Terminan devolviendo el control al punto de llamada
Aumentan el nivel de abstracción del programa
Aumentan el nivel de abstracción del programa
Facilitan la prueba, la depuración y el mantenimiento
Facilitan la prueba, la depuración y el mantenimiento
Fundamentos de la programación: La abstracción procedimental
Página 435
Flujo de ejecución
int main()
int main()
{
{
mostrarH();
mostrarH();
mostrarO();
mostrarO();
...
...
}
}
void mostrarH()
void mostrarH()
{
{
...
...
}
}
void mostrarO()
void mostrarO()
{
{
...
...
}
}
...
...
Fundamentos de la programación: La abstracción procedimental
Página 436
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Subprogramas en C++
tipo nombre(parámetros) // Cabecera
{
Forma general de un subprograma en C++:
Tipode dato que devuelve el subprograma como resultado
Parámetrospara la comunicación con el exterior
Cuerpo: ¡Un bloque de código!
// Cuerpo
}
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: La abstracción procedimental
Página 437
Tipos de subprogramas
Procedimientos (acciones):
NO devuelven ningún resultado de su ejecución con return
Tipo: void
Llamada: instrucción independiente
Funciones:
SÍ devuelven un resultado con la instrucción return
Tipo distinto de void
Llamada: dentro de cualquier expresión
Se sustituye en la expresión por el valor que devuelve
x = 12 * y + cuadrado(20) ‐ 3;
mostrarH();
¡Ya venimos utilizando funciones desde el Tema 2!
Fundamentos de la programación: La abstracción procedimental
Página 438
Funciones
Subprogramas de tipo distinto de void
...
int menu()
{
int op;
cout << "1 – Editar" << endl;
cout << "2 – Combinar" << endl;
cout << "3 – Publicar" << endl;
cout << "0 – Cancelar" << endl;
cout << "Elija: ";
cin >> op;
return op;
}
int main()
int main()
{
{
...
...
int opcion;
int opcion;
opcion = menu() ;
opcion = menu() ;
...
...
Fundamentos de la programación: La abstracción procedimental
Página 439
Procedimientos
Subprogramas de tipo void
...
void menu()
{
int op;
cout << "1 – Editar" << endl;
cout << "2 – Combinar" << endl;
cout << "0 – Cancelar" << endl;
cout << "Opción: ";
cin >> op;
if (op == 1) {
editar();
}
else if (op == 2) {
combinar();
}
}
int main()
int main()
{
{
...
...
menu();
menu();
...
...
Fundamentos de la programación: La abstracción procedimental
Página 440
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: La abstracción procedimental
Página 441
De uso exclusivo del subprograma
tipo nombre(parámetros) // Cabecera
{
}
Declaraciones locales // Cuerpo
Declaraciones locales de tipos, constantes y variables
Dentro del cuerpo del subprograma
Parámetros declarados en la cabecera del subprograma
Comunicación del subprograma con otros subprogramas
Fundamentos de la programación: La abstracción procedimental
Página 442
Datos en los programas
Datos globales: declarados fuera de todos los subprogramas
Existen durante toda la ejecución del programa
Datos locales: declarados en algún subprograma
Existen sólo durante la ejecución del subprograma
— Ámbito de los datos globales: resto del programa
Se conocen dentro de los subprogramas que siguen
— Ámbito de los datos locales: resto del subprograma
No se conocen fuera del subprograma
— Visibilidad de los datos
Datos locales a un bloque ocultan otros externos homónimos
Ámbito y visibilidad de los datos
Tema 3
Fundamentos de la programación: La abstracción procedimental
Página 443
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
#include <iostream>
using namespace std;
const int MAX = 100;
double ingresos;
...
void proc() {
int op;
double ingresos;
...
}
int main() {
int op;
...
return 0;
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
}
Datos globales
Datos globales
opde proc()
opde proc()
es distinta
es distinta
de opde main()
de opde main()
Datos locales a proc()
Datos locales a proc()
Se conocen MAX(global), op(local)
Se conocen MAX(global), op(local)
e ingresos(local que oculta la global)
e ingresos(local que oculta la global)
Datos locales a main()
Datos locales a main()
Se conocen MAX(global), op(local)
Se conocen MAX(global), op(local)
e ingresos(global)
e ingresos(global)
Fundamentos de la programación: La abstracción procedimental
Página 444
¿Necesidad de datos externos?
Sobre el uso de datos globales en los subprogramas
NO SE DEBEN USAR datos globales en subprogramas
Define parámetros en el subprograma
Los datos externos se pasan como argumentos en la llamada
Uso de datos globales en los subprogramas:
Riesgo de efectos laterales
Modificación inadvertida de esos datos afectando otros sitios
Excepciones:
Constantes globales (valores inalterables)
Tipos globales (necesarios en varios subprogramas)
Fundamentos de la programación: La abstracción procedimental
Página 445
Fundamentos de la programación: La abstracción procedimental
Página 446
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Subprograma
Datos de entrada, datos de salida y datos de entrada/salida
Datos de entrada: Aceptados
Subprograma que dado un número
muestra en la pantalla su cuadrado:
Datos de salida: Devueltos
Subprograma que dado un número
devuelve su cuadrado:
Datos de entrada/salida:
Ace
Comentarios de: 4. La abstracción procedimental - Fundamentos de programación (0)
No hay comentarios