48
4 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Fundamentos de la programación Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Diseño descendente: Tareas y subtareas 427 Subprogramas 434 Subprogramas y datos 441 Parámetros 446 Argumentos 451 Resultado de la función 467 Prototipos 473 Ejemplos completos 475 Funciones de operador 477 Diseño descendente (un ejemplo) 480 Precondiciones y postcondiciones 490

Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

4

GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware

GradoenIngenieríadeComputadores

LuisHernándezYáñez

FacultaddeInformáticaUniversidadComplutense

Fundamentos de la programaciónLuis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental

Diseño descendente: Tareas y subtareas  427Subprogramas 434Subprogramas y datos 441Parámetros 446Argumentos 451Resultado de la función 467Prototipos 473Ejemplos completos 475Funciones de operador 477Diseño descendente (un ejemplo) 480Precondiciones y postcondiciones 490

Page 2: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 427Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

RefinamientossucesivosTareasquehaderealizarunprograma:

Sepuedendividirensubtareasmássencillas

Subtareas:

Tambiénsepuedendividirenotrasmássencillas...

Refinamientossucesivos

Diseñoensucesivospasosenlosseamplíaeldetalle

Ejemplos:

Dibujar

MostrarlacadenaHOLAMAMAenletrasgigantes

Página 428Fundamentos de la programación: La abstracción procedimental

Page 3: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

1.Dibujar

2.Dibujar

3.Dibujar

Página 429Fundamentos de la programación: La abstracción procedimental

1.Dibujar

2.Dibujar

2.1.Dibujar

2.2.Dibujar

3.Dibujar

1.Dibujar

2.Dibujar

2.1.Dibujar

2.2.Dibujar

3.Dibujar

REFINAMIENTOREFINAMIENTO

MismatareaMismatarea

Luis Hernández Yáñez

1.Dibujar

2.Dibujar

2.1.Dibujar

2.2.Dibujar

3.Dibujar

Página 430Fundamentos de la programación: La abstracción procedimental

4 tareas, pero dos de ellas son iguales

Nos basta con saber cómo dibujar:

4 tareas, pero dos de ellas son iguales

Nos basta con saber cómo dibujar:

Page 4: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 431Fundamentos de la programación: La abstracción procedimental

Dibujar  Dibujar 

Dibujar  Dibujar Dibujar 

Dibujar 

void dibujarCirculo(){ ... }

void dibujarSecantes(){ ... }

void dibujarLinea(){ ... }

void dibujarTriangulo(){

dibujarSecantes();dibujarLinea();

}

int main() {dibujarCirculo();dibujarTriangulo();dibujarSecantes();return 0;

}

void dibujarCirculo(){ ... }

void dibujarSecantes(){ ... }

void dibujarLinea(){ ... }

void dibujarTriangulo(){

dibujarSecantes();dibujarLinea();

}

int main() {dibujarCirculo();dibujarTriangulo();dibujarSecantes();return 0;

}

Luis Hernández Yáñez

MostrarlacadenaHOLAMAMAenletrasgigantes

Página 432Fundamentos de la programación: La abstracción procedimental

H O L A M A

Mostrar HOLA Espacio en blanco Mostrar MAMA

Mostrar HOLA MAMA

MH O L A Espacio en blanco 

TareasbásicasTareasbásicas

Page 5: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 433Fundamentos de la programación: La abstracción procedimental

void mostrarH() {cout << "*   *" << endl;cout << "*   *" << endl;cout << "*****" << endl;cout << "*   *" << endl;cout << "*   *" << endl << endl;

}

void mostrarO() {cout << "*****" << endl;cout << "*   *" << endl;cout << "*   *" << endl;cout << "*   *" << endl;cout << "*****" << endl << endl;

}

void mostrarL(){ ... }

void mostrarA(){ ...}

void mostrarH() {cout << "*   *" << endl;cout << "*   *" << endl;cout << "*****" << endl;cout << "*   *" << endl;cout << "*   *" << endl << endl;

}

void mostrarO() {cout << "*****" << endl;cout << "*   *" << endl;cout << "*   *" << endl;cout << "*   *" << endl;cout << "*****" << endl << endl;

}

void mostrarL(){ ... }

void mostrarA(){ ...}

void espaciosEnBlanco() {cout << endl << endl << endl;

}

void mostrarM(){ ...}

int main() {mostrarH();mostrarO();mostrarL();mostrarA();espaciosEnBlanco();mostrarM();mostrarA();mostrarM();mostrarA();

return 0;}

void espaciosEnBlanco() {cout << endl << endl << endl;

}

void mostrarM(){ ...}

int main() {mostrarH();mostrarO();mostrarL();mostrarA();espaciosEnBlanco();mostrarM();mostrarA();mostrarM();mostrarA();

return 0;}

Luis Hernández Yáñez

Página 434Fundamentos de la programación: La abstracción procedimental

Page 6: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

SubprogramasPequeñosprogramasdentrodeotrosprogramas

Unidadesdeejecuciónindependientes

Encapsulancódigoydatos

Secomunicanconotrossubprogramas(datos)

Subrutinas,procedimientos,funciones,acciones,...

Realizantareasindividualesdelprograma

Funcionalidadconcreta,identificableycoherente(diseño)

Seejecutandeprincipioafincuandosellaman(invocan)

Terminandevolviendoelcontrolalpuntodellamada

Página 435Fundamentos de la programación: La abstracción procedimental

AumentanelniveldeabstraccióndelprogramaFacilitanlaprueba,ladepuraciónyelmantenimientoAumentanelniveldeabstraccióndelprogramaFacilitanlaprueba,ladepuraciónyelmantenimiento

Luis Hernández Yáñez

Flujodeejecución

Página 436Fundamentos de la programación: La abstracción procedimental

int main()

{

mostrarH();

mostrarO();

...

}

void mostrarH(){

...}

void mostrarO(){

...}

...

int main()

{

mostrarH();

mostrarO();

...

}

void mostrarH(){

...}

void mostrarO(){

...}

...

Page 7: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

SubprogramasenC++FormageneraldeunsubprogramaenC++:

tipo nombre(parámetros) // Cabecera{

// Cuerpo}

Tipo dedatoquedevuelveelsubprogramacomoresultado

Parámetros paralacomunicaciónconelexterior

Cuerpo:¡Unbloquedecódigo!

Página 437Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

TiposdesubprogramasProcedimientos(acciones):

NOdevuelvenningúnresultadodesuejecuciónconreturnTipo:voidLlamada:instrucciónindependientemostrarH();

Funciones:SÍdevuelvenunresultadoconlainstrucciónreturnTipodistintodevoidLlamada:dentrodecualquierexpresiónx = 12 * y + cuadrado(20) ‐ 3;Sesustituyeenlaexpresiónporelvalorquedevuelve

¡YavenimosutilizandofuncionesdesdeelTema2!

Página 438Fundamentos de la programación: La abstracción procedimental

Page 8: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

FuncionesSubprogramasdetipodistintodevoid

...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;

}

Página 439Fundamentos de la programación: La abstracción procedimental

int main()

{

...

int opcion;

opcion = menu() ;

...

int main()

{

...

int opcion;

opcion = menu() ;

...

Luis Hernández Yáñez

ProcedimientosSubprogramasdetipovoid

...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();}

}

Página 440Fundamentos de la programación: La abstracción procedimental

int main()

{

...

menu();

...

int main()

{

...

menu();

...

Page 9: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 441Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

Deusoexclusivodelsubprogramatipo nombre(parámetros) // Cabecera{

Declaraciones locales // Cuerpo}

Declaracioneslocalesdetipos,constantesyvariables

Dentrodelcuerpodelsubprograma

Parámetrosdeclaradosenlacabeceradelsubprograma

Comunicacióndelsubprogramaconotrossubprogramas

Página 442Fundamentos de la programación: La abstracción procedimental

Page 10: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Datosenlosprogramas Datosglobales:declaradosfueradetodoslossubprogramas

Existendurantetodalaejecucióndelprograma

Datoslocales:declaradosenalgúnsubprogramaExistensólodurantelaejecucióndelsubprograma

Ámbitoyvisibilidaddelosdatos Tema3— Ámbitodelosdatosglobales:restodelprograma

Seconocendentrodelossubprogramasquesiguen

— Ámbitodelosdatoslocales:restodelsubprogramaNoseconocenfueradelsubprograma

— VisibilidaddelosdatosDatoslocalesaunbloqueocultanotrosexternoshomónimos

Página 443Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

#include <iostream>using namespace std;

const int MAX = 100;double ingresos;

...void proc() {

int op;double ingresos;...

}

int main() {int op;...return 0;

}

Página 444Fundamentos de la programación: La abstracción procedimental

DatosglobalesDatosglobales

Datoslocalesaproc()Datoslocalesaproc()

Datoslocalesamain()Datoslocalesamain()

SeconocenMAX (global),op (local)eingresos (localqueocultalaglobal)SeconocenMAX (global),op (local)eingresos (localqueocultalaglobal)

SeconocenMAX (global),op (local)eingresos (global)SeconocenMAX (global),op (local)eingresos (global)

op deproc()esdistintadeop demain()

op deproc()esdistintadeop demain()

Page 11: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

SobreelusodedatosglobalesenlossubprogramasNOSEDEBENUSARdatosglobalesensubprogramas

¿Necesidaddedatosexternos?

Defineparámetrosenelsubprograma

Losdatosexternossepasancomoargumentosenlallamada

Usodedatosglobalesenlossubprogramas:

Riesgodeefectoslaterales

Modificacióninadvertidadeesosdatosafectandootrossitios

Excepciones:

Constantesglobales(valoresinalterables)

Tiposglobales(necesariosenvariossubprogramas)

Página 445Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

Página 446Fundamentos de la programación: La abstracción procedimental

Page 12: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Datosdeentrada,datosdesalidaydatosdeentrada/salida

Datosdeentrada:AceptadosSubprogramaquedadounnúmeromuestraenlapantallasucuadrado:

Datosdesalida:DevueltosSubprogramaquedadounnúmerodevuelvesucuadrado:

Datosdeentrada/salida:AceptadosymodificadosSubprogramaquedadaunavariablenuméricalaelevaalcuadrado:

Página 447Fundamentos de la programación: La abstracción procedimental

Subprograma

Subprograma

Subprograma

cuadrado()xx

55

cuadrado()xx y (=x2)y (=x2)

55

cuadrado()xx xx

Luis Hernández Yáñez

DeclaracióndeparámetrosSólodosclasesdeparámetrosenC++:

— Sólodeentrada(porvalor)

— Desalida(sólosalidaoE/S)(porreferencia /porvariable)

ListadeparámetrosformalesEntrelosparéntesisdelacabeceradelsubprograma

tipo nombre(parámetros)

Página 448Fundamentos de la programación: La abstracción procedimental

identificadortipo

,

parámetrosparámetros

DesalidaDesalida&

Page 13: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Recibencopiasdelosargumentosusadosenlallamada

int cuadrado(int num)

double potencia(double base, int exp)

void muestra(string nombre, int edad, string nif)

void proc(char c, int x, double a, bool b)

Recibensusvaloresenlallamadadelsubprograma

Argumentos:Expresionesengeneral

Variables,constantes,literales,llamadasafunción,operaciones

Sedestruyenalterminarlaejecucióndelsubprograma

¡Atención!Losarrayssepasanporvalorcomoconstantes:double media(const tArray lista)

Página 449Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

Mismaidentidadquelavariablepasadacomoargumento

void incrementa(int &x)

void intercambia(double &x, double &y)

void proc(char &c, int &x, double &a, bool &b)

Recibenlasvariablesenlallamadadelsubprograma:¡Variables!

Losargumentospuedenquedarmodificados

¡Nousaremosparámetrosporvalorenlasfunciones!

Sóloenprocedimientos

¡Atención! Losarrayssepasanporreferenciasinutilizar&void insertar(tArray lista, int &contador, double item)

Elargumentodelista (variabletArray)quedarámodificado

Página 450Fundamentos de la programación: La abstracción procedimental

&&

PuedehabertantoporvalorcomoporreferenciaPuedehabertantoporvalorcomoporreferencia

Page 14: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 451Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

nombre(argumentos)

— Tantosargumentoscomoparámetrosyenelmismoorden

— Concordanciadetiposargumento‐parámetro

— Porvalor:Expresionesválidas(sepasaelresultado)

— Porreferencia:¡Sólovariables!

Secopianlosvaloresdelasexpresionespasadasporvalorenloscorrespondientesparámetros

Sehacencorresponderlosargumentospasadosporreferencia(variables)consuscorrespondientesparámetros

Página 452Fundamentos de la programación: La abstracción procedimental

Page 15: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Expresionesválidasconconcordanciadetipo:

void proc(int x, double a) proc(23 * 4 / 7, 13.5);

double d = 3; proc(12, d);

double d = 3; int i = 124; proc(i, 33 * d);

double d = 3; int i = 124; proc(cuad(20) * 34 + i, i * d);

Página 453Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

void proc(int x, double a)

{ ... }

int main()

{

int i = 124;

double  d = 3;

proc(i, 33 * d);

...

return 0;

}

Página 454Fundamentos de la programación: La abstracción procedimental

Memoria

i 124

d 3.0

...

...

x 124

a 99.0

...

Page 16: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

void proc(int &x, double &a)

{ ... }

int main()

{

int i = 124;

double  d = 3;

proc(i, d);

...

return 0;

}

Página 455Fundamentos de la programación: La abstracción procedimental

Memoria

i 124

d 3.0

...

xx

aa

Luis Hernández Yáñez

Dadaslassiguientesdeclaraciones:int i;

double d;

void proc(int x, double &a);

¿Quépasosdeargumentossoncorrectos?¿Porquéno?

proc(3, i, d);

proc(i, d);

proc(3 * i + 12, d);

proc(i, 23);

proc(d, i);

proc(3.5, d);

proc(i);

Página 456Fundamentos de la programación: La abstracción procedimental

Nºdeargumentos≠NºdeparametrosNºdeargumentos≠Nºdeparametros

Parámetroporreferencia ¡variable!Parámetroporreferencia ¡variable!

¡Argumentodouble paraparámetroint!¡Argumentodouble paraparámetroint!

¡Argumentodouble paraparámetroint!¡Argumentodouble paraparámetroint!

Nºdeargumentos≠NºdeparametrosNºdeargumentos≠Nºdeparametros

Page 17: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

...void divide(int op1, int op2, int &div, int &rem) {// Divide op1 entre op2 y devuelve el cociente y el resto

div = op1 / op2;rem = op1 % op2;

}

int main() {int cociente, resto;for (int j = 1; j <= 4; j++) {

for (int i = 1; i <= 4; i++) {divide(i, j, cociente, resto);cout << i << " entre " << j << " da un cociente de "

<< cociente << " y un resto de " << resto << endl;}

}

return 0;}

Página 457Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

...void divide(int op1, int op2, int &div, int &rem) {// Divide op1 entre op2 y devuelve el cociente y el resto

div = op1 / op2;rem = op1 % op2;

}

int main() {int cociente, resto;for (int j = 1; j <= 4; j++) {

for (int i = 1; i <= 4; i++) {divide(i, j, cociente, resto);...

}}

return 0;}

Página 458Fundamentos de la programación: La abstracción procedimental

Memoria

cociente ?

resto ?

i 1

j 1

...

Page 18: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

...void divide(int op1, int op2, int &div, int &rem) {// Divide op1 entre op2 y devuelve el cociente y el resto

div = op1 / op2;rem = op1 % op2;

}

int main() {int cociente, resto;for (int j = 1; j <= 4; j++) {

for (int i = 1; i <= 4; i++) {divide(i, j, cociente, resto);...

}}

return 0;}

Página 459Fundamentos de la programación: La abstracción procedimental

Memoria

cociente ?

resto ?

i 1

j 1

...

divdiv

remrem

op1 1

op2 1

...

Luis Hernández Yáñez

...void divide(int op1, int op2, int &div, int &rem) {// Divide op1 entre op2 y devuelve el cociente y el resto

div = op1 / op2;rem = op1 % op2;

}

int main() {int cociente, resto;for (int j = 1; j <= 4; j++) {

for (int i = 1; i <= 4; i++) {divide(i, j, cociente, resto);...

}}

return 0;}

Página 460Fundamentos de la programación: La abstracción procedimental

Memoria

cociente 1

resto 0

i 1

j 1

...

divdiv

remrem

op1 1

op2 1

...

Page 19: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 461Fundamentos de la programación: La abstracción procedimental

Memoria

cociente 1

resto 0

i 1

j 1

...

...void divide(int op1, int op2, int &div, int &rem) {// Divide op1 entre op2 y devuelve el cociente y el resto

div = op1 / op2;rem = op1 % op2;

}

int main() {int cociente, resto;for (int j = 1; j <= 4; j++) {

for (int i = 1; i <= 4; i++) {divide(i, j, cociente, resto);...

}}

return 0;}

Luis Hernández Yáñez

...void intercambia(double &valor1, double &valor2) {// Intercambia los valores

double tmp; // Variable local (temporal)tmp = valor1;valor1 = valor2;valor2 = tmp;

}

int main() {double num1, num2;cout << "Valor 1: ";cin >> num1;cout << "Valor 2: ";cin >> num2;intercambia(num1, num2);cout << "Ahora el valor 1 es " << num1 

<< " y el valor 2 es " << num2 << endl;return 0;

}

Página 462Fundamentos de la programación: La abstracción procedimental

Memoria temporaldel procedimiento

tmp ?

...

Memoria de main()

num1 13.6

num2 317.14

...

valor1valor1

valor2valor2

Page 20: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

...// Prototipovoid cambio(double precio, double pago, int &euros, int &cent50,

int &cent20, int &cent10, int &cent5, int &cent2, int &cent1);

int main() {double precio, pago;int euros, cent50, cent20, cent10, cent5, cent2, cent1;cout << "Precio: ";cin >> precio;cout << "Pago: ";cin >> pago;cambio(precio, pago, euros, cent50, cent20, cent10, cent5, cent2,

cent1);cout << "Cambio: " << euros << " euros, " << cent50 << " x 50c., "

<< cent20 << " x 20c., " << cent10 << " x 10c., "<< cent5 << " x 5c., " << cent2 << " x 2c. y "<< cent1 << " x 1c." << endl;  

return 0;}

Página 463Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

void cambio(double precio, double pago, int &euros, int &cent50,int &cent20, int &cent10, int &cent5, int &cent2, int &cent1) {if (pago < precio) { // Cantidad insuficiente

cout << "Error: El pago es inferior al precio" << endl;}else {

int cantidad = int(100.0 * (pago ‐ precio) + 0.5);euros  = cantidad / 100;cantidad = cambio % 100;cent50 = cantidad / 50;cantidad = cantidad % 50;cent20 = cantidad / 20;cantidad = cantidad % 20;cent10 = cantidad / 10;cantidad = cantidad % 10;cent5  = cantidad / 5;cantidad = cantidad % 5;cent2  = cantidad / 2;cent1  = cantidad % 2;

}}

Página 464Fundamentos de la programación: La abstracción procedimental

ExplicaciónenellibrodeAdams/Leestma/NyhoffExplicaciónenellibrodeAdams/Leestma/Nyhoff

Page 21: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Enlossubprogramassepuedendetectarerrores

Erroresqueimpidenrealizarloscálculos:void cambio(double precio, double pago, int &euros, int &cent50,

int &cent20, int &cent10, int &cent5, int &cent2, int &cent1) {if (pago < precio) { // Cantidad insuficiente

cout << "Error: El pago es inferior al precio" << endl;}...

¿Debeelsubprogramanotificaralusuariooalprograma?

Mejornotificarloalpuntodellamadayallídecidirquéhacervoid cambio(double precio, double pago, int &euros, int &cent50,

int &cent20, int &cent10, int &cent5, int &cent2, int &cent1,bool &error) {if (pago < precio) { // Cantidad insuficiente

error = true;}else {

error = false;...

Página 465Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

Alvolverdelallamadasedecidequéhacersihahabidoerror...

¿Informaralusuario?

¿Volverapedirlosdatos?

Etcéteraint main() {

double precio, pago;int euros, cent50, cent20, cent10, cent5, cent2, cent1;bool error;cout << "Precio: ";cin >> precio;cout << "Pago: ";cin >> pago;cambio(precio, pago, euros, cent50, cent20, cent10, cent5, cent2,

cent1, error);if (error) {

cout << "Error: El pago es inferior al precio" << endl;}else {

...

Página 466Fundamentos de la programación: La abstracción procedimental

cambio.cppcambio.cpp

Page 22: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 467Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

UnafunciónhadedevolverunresultadoLafunciónhadeterminarsuejecucióndevolviendoelresultado

Lainstrucciónreturn:

— Devuelveeldatoqueseindicaacontinuacióncomoresultado

— Terminalaejecucióndelafunción

Eldatodevueltosustituyealallamadadelafunciónenlaexpresión

int cuad(int x) { int main() {

return x * x; cout << 2 * cuad(16);

x = x * x;

} return 0;

}

Página 468Fundamentos de la programación: La abstracción procedimental

256256EstainstrucciónnoseejecutaránuncaEstainstrucción

noseejecutaránunca

Page 23: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Factorial (N) = 1  x  2  x  3  x ... x  (N‐2)  x  (N‐1)  x  Nlong long int factorial(int n); // Prototipo

int main() {int num;cout << "Num: ";cin >> num;cout << "Factorial de " << num << ": " << factorial(num) << endl;return 0;

}

long long int factorial(int n) {long long int fact = 1;if (n < 0) {

fact = 0;}else {

for (int i = 1; i <= n; i++) {fact = fact * i;

}}return fact;

}

Página 469Fundamentos de la programación: La abstracción procedimental

factorial.cppfactorial.cppLuis Hernández Yáñez

Página 470Fundamentos de la programación: La abstracción procedimental

int compara(int val1, int val2) {// ‐1 si val1 < val2, 0 si iguales, +1 si val1 > val2

if (val1 == val2) {return 0;

}else if (val1 < val2) {

return ‐1;}else {

return 1;}

}

int compara(int val1, int val2) {// ‐1 si val1 < val2, 0 si iguales, +1 si val1 > val2

if (val1 == val2) {return 0;

}else if (val1 < val2) {

return ‐1;}else {

return 1;}

}

¡3puntosdesalida!¡3puntosdesalida!

Page 24: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 471Fundamentos de la programación: La abstracción procedimental

int compara(int val1, int val2) {// ‐1 si val1 < val2, 0 si iguales, +1 si val1 > val2

int resultado;

if (val1 == val2) {resultado = 0;

}else if (val1 < val2) {

resultado = ‐1;}else {

resultado = 1;}

return resultado;}

int compara(int val1, int val2) {// ‐1 si val1 < val2, 0 si iguales, +1 si val1 > val2

int resultado;

if (val1 == val2) {resultado = 0;

}else if (val1 < val2) {

resultado = ‐1;}else {

resultado = 1;}

return resultado;}

PuntodesalidaúnicoPuntodesalidaúnico

Luis Hernández Yáñez

Procedimientos(tipovoid):

— Alencontrarlallavedecierrequeterminaelsubprogramao— Alencontrarunainstrucciónreturn (sinresultado)

Funciones(tipodistintodevoid):

— SÓLOalencontrarunainstrucciónreturn (conresultado)

Nuestrossubprogramassiempreterminaránalfinal: Nousaremosreturn enlosprocedimientos

Funciones:sólounreturn yestaráalfinal

Página 472Fundamentos de la programación: La abstracción procedimental

Parafacilitarladepuraciónyelmantenimiento,codificalossubprogramasconunúnicopuntodesalidaParafacilitarladepuraciónyelmantenimiento,codificalossubprogramasconunúnicopuntodesalida

Page 25: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 473Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

¿Dóndelosponemos?¿Antesdemain()?¿Despuésdemain()?

Lospondremosdespuésdemain()

¿Soncorrectaslasllamadasasubprogramas?Enmain() oenotrossubprogramas

— ¿Existeelsubprograma?

— ¿Concuerdanlosargumentosconlosparámetros?

Debenestarlosprototiposdelossubprogramasantesdemain()

Prototipo:cabeceradelsubprogramaterminadaen;void dibujarCirculo();void mostrarM();void proc(double &a);int cuad(int x);...

Página 474Fundamentos de la programación: La abstracción procedimental

main() eselúnicosubprogramaquenohayqueprototiparmain() eselúnicosubprogramaquenohayqueprototipar

Page 26: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

#include <iostream>using namespace std;

void intercambia(double &valor1, double &valor2); // Prototipo

int main() {double num1, num2;cout << "Valor 1: ";cin >> num1;cout << "Valor 2: ";cin >> num2;intercambia(num1, num2);cout << "Ahora el valor 1 es " << num1 

<< " y el valor 2 es " << num2 << endl;return 0;

}

void intercambia(double &valor1, double &valor2) {double tmp; // Variable local (temporal)tmp = valor1;valor1 = valor2;valor2 = tmp;

}

Página 475Fundamentos de la programación: La abstracción procedimental

intercambia.cppintercambia.cpp

AsegúratedequelosprototiposcoincidanconlasimplementacionesAsegúratedequelosprototiposcoincidanconlasimplementaciones

Luis Hernández Yáñez

#include <iostream>using namespace std;

// Prototiposlong long int factorial(int n);int sumatorio(int n);

int main() {int num;cout << "Num: ";cin >> num;cout << "Factorial de "

<< num << ": "<< factorial(num)<< endl<< "Sumatorio de 1 a "<< num << ": "<< sumatorio(num)<< endl;

return 0;}

long long int factorial(int n) {long long int fact = 1;

if (n < 0) {fact = 0;

}else {

for (int i = 1; i <= n; i++) {fact = fact * i;

}}

return fact;}

int sumatorio(int n) {int sum = 0;

for (int i = 1; i <= n; i++) {sum = sum + i;

}

return sum;}

Página 476Fundamentos de la programación: La abstracción procedimental

mates.cppmates.cpp

Page 27: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 477Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

Notacióninfija(deoperador)

operandoIzquierdo operadoroperandoDerechoa + b

Seejecutaeloperadorconlosoperandoscomoargumentos

Losoperadoresseimplementancomofunciones:

tipo operatorsímbolo(parámetros)

Siesunoperadormonariosólohabráunparámetro

Siesbinariohabrádosparámetros

Elsímbolo esunsímbolodeoperador(unoodoscaracteres):+,‐,*,/,‐‐,<<,%,...

Página 478Fundamentos de la programación: La abstracción procedimental

Page 28: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

tMatriz suma(tMatriz a, tMatriz b);

tMatriz a, b, c;

c = suma(a, b);

tMatriz operator+(tMatriz a, tMatriz b);

tMatriz a, b, c;

c = a + b;

¡Laimplementaciónseráexactamentelamisma!

Mayoraproximaciónallenguajematemático

Página 479Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

Página 480Fundamentos de la programación: La abstracción procedimental

Page 29: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Especificacióninicial(Paso0).‐

Desarrollarunprogramaquehagaoperacionesdeconversióndemedidashastaqueelusuariodecidaquenoquierehacermás

Análisisydiseñoaumentandoelniveldedetalleencadapaso

¿Quéoperacionesdeconversión?

Paso1.‐

Desarrollarunprogramaquehagaoperacionesdeconversióndemedidashastaqueelusuariodecidaquenoquierehacermás

Pulgadasacentímetros

Librasagramos

GradosFahrenheitacentígrados

Galonesalitros

Página 481Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

Paso2.‐

Desarrollarunprogramaquemuestrealusuariounmenúconcuatrooperacionesdeconversióndemedidas:

Pulgadasacentímetros

Librasagramos

GradosFahrenheitacentígrados

Galonesalitros

Ylealaeleccióndelusuarioyprocedaconlaconversión,hastaqueelusuariodecidaquenoquierehacermás

6grandestareas:Menú,cuatrofuncionesdeconversiónymain()

Página 482Fundamentos de la programación: La abstracción procedimental

Page 30: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Paso2.‐

Página 483Fundamentos de la programación: La abstracción procedimental

Menú Libras a gr. Galones a l.Pulgadas a cm. ºF a ºC

Conversiones

main()

Luis Hernández Yáñez

Paso3.‐

Menú:MostrarlascuatroopcionesmásunaparasalirValidarlaentradaydevolverlaelegida

Pulgadasacentímetros:Devolverelequivalenteencentímetrosdelvalorenpulgadas

Librasagramos:Devolverelequivalenteengramosdelvalorenlibras

GradosFahrenheitacentígrados:DevolverelequivalenteencentígradosdelvalorenFahrenheit

Galonesalitros:Devolverelequivalenteenlitrosdelvalorengalones

Programaprincipal(main())

Página 484Fundamentos de la programación: La abstracción procedimental

Page 31: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Paso3.‐ Cadatarea,unsubprograma

Comunicaciónentrelossubprogramas:

Página 485Fundamentos de la programación: La abstracción procedimental

Función Entrada Salida Valor devuelto

menu() ― ― int

pulgACm() double pulg ― double

lbAGr() double libras ― double

grFAGrC() double grF ― double

galALtr() double galones ― double

main() ― ― int

Luis Hernández Yáñez

Paso4.‐ Algoritmosdetalladosdecadasubprograma Programar

Página 486Fundamentos de la programación: La abstracción procedimental

......

#include <iostream>using namespace std;// Prototiposint menu();double pulgACm(double pulg);double lbAGr(double libras);double grFAGrC(double grF);double galALtr(double galones);

int main() {double valor;int op = ‐1;while (op != 0) {

op = menu();switch (op) {case 1:

{cout << "Pulgadas: ";cin >> valor;cout << "Son " << pulgACm(valor) << " cm." << endl;

}break;

#include <iostream>using namespace std;// Prototiposint menu();double pulgACm(double pulg);double lbAGr(double libras);double grFAGrC(double grF);double galALtr(double galones);

int main() {double valor;int op = ‐1;while (op != 0) {

op = menu();switch (op) {case 1:

{cout << "Pulgadas: ";cin >> valor;cout << "Son " << pulgACm(valor) << " cm." << endl;

}break;

Page 32: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 487Fundamentos de la programación: La abstracción procedimental

......

case 2:{

cout << "Libras: ";cin >> valor;cout << "Son " << lbAGr(valor) << " gr." << endl;

}break;

case 3:{

cout << "Grados Fahrenheit: ";cin >> valor;cout << "Son " << grFAGrC(valor) << " ºC" << endl;

}break;

case 4:{

cout << "Galones: ";cin >> valor;cout << "Son " << galALtr(valor) << " l." << endl;

}break;

}}return 0;

}

case 2:{

cout << "Libras: ";cin >> valor;cout << "Son " << lbAGr(valor) << " gr." << endl;

}break;

case 3:{

cout << "Grados Fahrenheit: ";cin >> valor;cout << "Son " << grFAGrC(valor) << " ºC" << endl;

}break;

case 4:{

cout << "Galones: ";cin >> valor;cout << "Son " << galALtr(valor) << " l." << endl;

}break;

}}return 0;

}

Luis Hernández Yáñez

Página 488Fundamentos de la programación: La abstracción procedimental

int menu() {int op = ‐1;

while ((op < 0) || (op > 4)) {cout << "1 ‐ Pulgadas a Cm." << endl;cout << "2 ‐ Libras a Gr." << endl;cout << "3 ‐ Fahrenheit a ºC" << endl;cout << "4 ‐ Galones a L." << endl;cout << "0 ‐ Salir" << endl;cout << "Elige: ";cin >> op;if ((op < 0) || (op > 4)) {

cout << "Opción no válida" << endl;}

}

return op;}

double pulgACm(double pulg) {const double cmPorPulg = 2.54;return pulg * cmPorPulg;

}

int menu() {int op = ‐1;

while ((op < 0) || (op > 4)) {cout << "1 ‐ Pulgadas a Cm." << endl;cout << "2 ‐ Libras a Gr." << endl;cout << "3 ‐ Fahrenheit a ºC" << endl;cout << "4 ‐ Galones a L." << endl;cout << "0 ‐ Salir" << endl;cout << "Elige: ";cin >> op;if ((op < 0) || (op > 4)) {

cout << "Opción no válida" << endl;}

}

return op;}

double pulgACm(double pulg) {const double cmPorPulg = 2.54;return pulg * cmPorPulg;

} ......

Page 33: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 489Fundamentos de la programación: La abstracción procedimental

double lbAGr(double libras) {const double grPorLb = 453.6;return libras * grPorLb;

}

double grFAGrC(double grF) {return ((grF ‐ 32) * 5 / 9);

}

double galALtr(double galones) {const double ltrPorGal = 4.54609;return galones * ltrPorGal;

}

double lbAGr(double libras) {const double grPorLb = 453.6;return libras * grPorLb;

}

double grFAGrC(double grF) {return ((grF ‐ 32) * 5 / 9);

}

double galALtr(double galones) {const double ltrPorGal = 4.54609;return galones * ltrPorGal;

}

......

conversiones.cppconversiones.cppLuis Hernández Yáñez

Página 490Fundamentos de la programación: La abstracción procedimental

Page 34: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

IntegridaddelossubprogramasCondicionesquesedebendarantesdecomenzarsuejecución

Precondiciones

Quienllamealsubprogramadebegarantizarquesesatisfacen

Condicionesquesedaráncuandoterminesuejecución

Postcondiciones

Enelpuntodellamadasepuedendarporgarantizadas

Aserciones:

Condicionesquesinosecumpleninterrumpenlaejecución

Funciónassert()

Página 491Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

PrecondicionesPorejemplo,norealizaremosconversionesdevaloresnegativos:double pulgACm(double pulg) {

assert(pulg > 0);

double cmPorPulg = 2.54;

return pulg * cmPorPulg;}

Lafuncióntieneunaprecondición:pulg debeserpositivo

assert(pulg > 0); interrumpirálaejecuciónsinoescierto

Página 492Fundamentos de la programación: La abstracción procedimental

Page 35: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

PrecondicionesEsresponsabilidaddelpuntodellamadagarantizarlaprecondición:

int main() {double valor;int op = ‐1;while (op != 0) {

op = menu();switch (op) {case 1:

{cout << "Pulgadas: ";cin >> valor;if (valor < 0) {

cout << "¡No válido!" << endl;}else { // Se cumple la precondición...

...

Página 493Fundamentos de la programación: La abstracción procedimental

Luis Hernández Yáñez

PostcondicionesUnsubprogramapuedegarantizarcondicionesalterminar:

int menu() {int op = ‐1;while ((op < 0) || (op > 4)) {

...cout << "Elige: ";cin >> op;if ((op < 0) || (op > 4)) {

cout << "Opción no válida" << endl;}

}assert ((op >= 0) && (op <= 4));return op;

}

Elsubprogramadebeasegurarsedequesecumpla

Página 494Fundamentos de la programación: La abstracción procedimental

Page 36: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.

Estedocumentotieneestablecidaslassiguientes:

Pulsaenlaimagendearribaaladerechaparasabermás.

Fundamentos de la programación: La abstracción procedimental Página 495

Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.

Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.

Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.

Page 37: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

4A

GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware

GradoenIngenieríadeComputadores

LuisHernándezYáñez

FacultaddeInformáticaUniversidadComplutense

Fundamentos de la programaciónLuis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo)

Archivos como parámetros 498La función main() 501Argumentos implícitos 504Sobrecarga de subprogramas 508

Page 38: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 498Fundamentos de la programación: La abstracción procedimental (Anexo)

Luis Hernández Yáñez

#include <iostream>using namespace std;#include <fstream>

void sumatorio_archivo(ifstream &arch, double &suma);

int main() {double resultado;ifstream archivo;archivo.open("datos.txt");if (!archivo.is_open()) {

cout << "ERROR DE APERTURA" << endl;}else {

sumatorio_archivo(archivo, resultado)cout << "Suma = " << resultado << endl;archivo.close();

}

return 0;}

Página 499Fundamentos de la programación: La abstracción procedimental (Anexo)

Page 39: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

void sumatorio_archivo(ifstream &arch, double &suma) {double dato;

suma = 0;arch >> dato;

while (dato != ‐1) {suma = suma + dato;arch >> dato;

}}

Página 500Fundamentos de la programación: La abstracción procedimental (Anexo)

LosarchivossiempresepasanporreferenciaLosarchivossiempresepasanporreferencia

Luis Hernández Yáñez

Página 501Fundamentos de la programación: La abstracción procedimental (Anexo)

Page 40: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

ComunicaciónconelsistemaoperativoParámetrosopcionalesdelafunciónmain():

int main(int argc, char *argv[])

Paraobtenerdatosproporcionadosalejecutarelprograma:C:\>prueba cad1 cad2 cad3

Ejecutaprueba.exe contresargumentos(cadenas)

Parámetrosdemain():

— argc:númerodeargumentosqueseproporcionan

4enelejemplo(primero:nombredelprogramaconsuruta)— argv:arrayconlascadenasproporcionadascomoargumentos

Página 502Fundamentos de la programación: La abstracción procedimental (Anexo)

Luis Hernández Yáñez

¿Cómohaidolafunción?Lafunciónmain() devuelvealS.O.uncódigodeterminación

— 0:TodoOK

— Distintode0:¡Hahabidounerror!

Silaejecuciónllegaalfinaldelafunciónmain(),todoOK:

...

return 0; // Fin del programa

}

Página 503Fundamentos de la programación: La abstracción procedimental (Anexo)

Page 41: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 504Fundamentos de la programación: La abstracción procedimental (Anexo)

Luis Hernández Yáñez

ValorespredeterminadosparaparámetrosporvalorValorpordefectoparaunparámetro:

Trasun=acontinuacióndelnombredelparámetro:void proc(int i = 1);

Sinoseproporcionaargumento,elparámetrotomaesevalorproc(12); i tomaelvalorexplícito12

proc(); i tomaelvalorimplícito(1)

Sólopuedehaberargumentosimplícitosenlosparámetrosfinales:void p(int i, int j = 2, int k = 3); // CORRECTO

void p(int i = 1, int j, int k = 3); // INCORRECTO

Página 505Fundamentos de la programación: La abstracción procedimental (Anexo)

Una vez asignado un valor implícito, todos los que siguenhan de tener también valor implícito

Una vez asignado un valor implícito, todos los que siguenhan de tener también valor implícito

Page 42: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Parámetrosyargumentosimplícitos

void p(int i, int j = 2, int k = 3);

Secopianlosargumentosenlosparámetrosdelprimeroalúltimo

losquenotengancorrespondenciatomaránlosimplícitos

void p(int i, int j = 2, int k = 3);

...

p(13); // i toma 13, j y k sus valores implícitos

p(5, 7); // i toma 5, j toma 7 y k su valor implícito

p(3, 9, 12); // i toma 3, j toma 9 y k toma 12

Página 506Fundamentos de la programación: La abstracción procedimental (Anexo)

Losargumentosimplícitossedeclaranenelprototipo(preferible)oenlacabeceradelsubprograma,peroNOenambos

Luis Hernández Yáñez

#include <iostream>using namespace std;

double f(double x, double y, int signo = 1, double delta = 1.0);

int main() {double x, y;cout << "X = ";cin >> x;cout << "Y = ";cin >> y;cout << "signo y delta por defecto: " << f(x, y) << endl;cout << "signo ‐1 y delta por defecto: " << f(x, y, ‐1) << endl;cout << "signo y delta concretos: " << f(x, y, 1, 1.25) << endl;

return 0;}

double f(double x, double y, int signo, double delta) {return signo * delta * x / y;

}

Página 507Fundamentos de la programación: La abstracción procedimental (Anexo)

Pordefecto,signo+

Pordefecto,Δ es1

Pordefecto,signo+

Pordefecto,Δ es1

Nopodemosdejarsigno pordefectoyconcretardeltaNopodemosdejarsigno pordefectoyconcretardelta

Page 43: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

Página 508Fundamentos de la programación: La abstracción procedimental (Anexo)

Luis Hernández Yáñez

Igualnombre,distintosparámetrosFuncionesoprocedimientosconigualnombreydistintosparámetros:int abs(int n);

double abs(double n);

long int abs(long int n);

Seejecutarálafunciónquecorrespondaaltipodeargumento:abs(13)  // argumento int ‐‐> primera función

abs(‐2.3)  // argumento double ‐‐> segunda función

abs(3L)  // argumento long int ‐‐> tercera función

Página 509Fundamentos de la programación: La abstracción procedimental (Anexo)

Paraindicarqueesunliterallong int,enlugardeintParaindicarqueesunliterallong int,enlugardeint

Page 44: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Luis Hernández Yáñez

#include <iostream>using namespace std;

void intercambia(int &x, int &y);void intercambia(double &x,

double &y);void intercambia(char &x, char &y);

void intercambia(int &x, int &y) {int tmp;tmp = x;x = y;y = tmp;

}

void intercambia(double &x,double &y) {

double tmp;tmp = x;x = y;y = tmp;

}

void intercambia(char &x, char &y) {char tmp;tmp = x;x = y;y = tmp;

}

int main() {int i1 = 3, i2 = 7;double d1 = 12.5, d2 = 35.9;char c1 = 'a', c2 = 'b';cout << i1 << " ‐ " << i2 << endl;cout << d1 << " ‐ " << d2 << endl;cout << c1 << " ‐ " << c2 << endl;intercambia(i1, i2);intercambia(d1, d2);intercambia(c1, c2);cout << i1 << " ‐ " << i2 << endl;cout << d1 << " ‐ " << d2 << endl;cout << c1 << " ‐ " << c2 << endl;return 0;

}

Página 510Fundamentos de la programación: La abstracción procedimental (Anexo)

inter.cppinter.cppLuis Hernández Yáñez

LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.

Estedocumentotieneestablecidaslassiguientes:

Pulsaenlaimagendearribaaladerechaparasabermás.

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 511

Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.

Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.

Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.

Page 45: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Fundamentos de la programación    Ejercicios del Tema 4  —  Pág. 1 

Facultad de Informática – Universidad Complutense 

Fundamentos de la programación Curso 2013–2014 

HojadeejerciciosdelTema4

1. DadoelsiguientecódigodeC++(suponiendoincluidalabibliotecaiostream):

int main() {    int a = 1, b = 2, c = 3;    otro(a, b, c);    cout << "main dice: ";    cout << "a = " << a << " b = " << b << " c = " << c << endl;    otro(b, a ,c);    cout << "main dice: ";    cout << "a = " << a << " b = " << b << " c = " << c << endl;    return 0; }  void otro(int a, int &b, int c) {    c= a + b;    b = a;    a = c;    cout << "otro dice: ";    cout << "a = " << a << " b = " << b << " c = " << c << endl; } 

Indica,sinusaruncompilador,cuálserálasalidadelprograma.

2. DadoelsiguienteprogramaenC++:

int main() {    char a = 'B', b = 'C', c = 'A', d = 'D';    vueltas(a, b, c, d);   // 1ª llamada    vueltas('A', b, c, a); // 2ª llamada    vueltas('D', c, c, a); // 3ª llamada    return 0; }  void vueltas (char a, char &b, char &d, char &c) {    b = a;    c = d;    d = 'B'; } 

Rellena la siguiente tabla con el valor de las variables del programa principaldespuésdecadallamadaalprocedimientovueltas().

Page 46: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Fundamentos de la programación    Ejercicios del Tema 4  —  Pág. 2 

a  b  c  d 

Valorinicial 'B'  'C'  'A'  'D' 

Despuésdela1ªllamada

Despuésdela2ªllamada

Despuésdela3ªllamada

3. Escribe un procedimiento en C++ que tenga como entrada un número enteropositivoyqueescribaenlapantallaunatablacomolasiguiente,enlaquesehasupuestoqueelargumentoutilizadoparallamaralprocedimientoes4.

    1    2    3    4     10     2    4    6    8     20     3    6    9   12     30     4    8   12   16     40 

En la última columna se muestra el resultado de sumar todos los elementosanterioresdelafilacorrespondiente.

4. EscribeunprocedimientoenC++queencuentreymuestretodoslosnúmerosdetres cifras en los que la suma de los cubos de sus dígitos sea igual al propionúmero.Ejemplo:15313+53+33=1+125+27

5. Escribe una funciónlecturaConLimites() que reciba comoparámetros dosvaloresdetipoint.Lafunciónpediráalusuarioqueintroduzcaunnúmeroenterotantasvecescomoseanecesariohastaqueelnúmerosuministradoseencuentredentrodelintervalodeterminadoporlosdatosdeentrada(puededarlepistas).Lafuncióndevolveráelúltimonúmeroleído.Escribeunprogramaprincipalqueusedichafunciónparapediralusuariounnúmeroentre10y20.

6. Escribeuna funciónenC++queacepteunvalorde tipodouble ydevuelvaelnúmeroredondeadoalacentésimamáscercana.Escribeunprogramaprincipalquepidaalusuariounnúmerorealylomuestreenlapantallaredondeado.

7. EscribeunprogramaenC++quecalculecuántosnúmerosperfectos hayenunarchivodetextodatos.txtconenteros(cadanúmeroenunalíneayterminadoen0comocentinela).Sedicequeunnúmero(enteropositivo)nesperfecto,silasumadelosdivisoresdenentre1yn‐1esigualan.Porejemplo,6esunnúmeroperfecto,puessusdivisores,incluyendoel1peronoelpropio6,son1,2y3,ysumadosdan6.Enelejercicio21deltemaanteriorvimosloquesonlosnúmerostriangulares.

8. Matemáticamente se puede demostrar que todos los números perfectos son,además, triangulares. Escribe un programa en C++ que compruebe empírica‐mentequeestoesciertoparatodoslosnúmerosperfectosmenoresde100.000.Enlahojadeltemaanteriorvimosloquesonlosnúmerostriangulares.

Page 47: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Fundamentos de la programación    Ejercicios del Tema 4  —  Pág. 3 

9. ImplementaunafunciónesPrimo(int  n)quedevuelvatruesíysólosinesprimo.Utilizalafunciónimplementadapara:

a. Escribirtodoslosnúmerosprimosquehayentredosnaturalesdados.

b. Escribirelprimernúmeroprimomayorqueunnaturaldado.

c. Contarlosprimosmenoresqueunnaturaldado.

Creaunsubprogramaparacadaopciónyunmenúparalaaplicación.

10. Escribeunafuncióninverso()quedevuelvaelresultadodeinvertirelenteropositivoquereciba.Seentiendeporinvertirdarlavueltaalosdígitosdelnúmero(hallarsuimagenespecular);así,elinversode3952es2593.

Escribe una función capicua() que, haciendo uso de la función inverso(),devuelvaunvalorbooleanoqueindiquesielnúmeroenteropositivoquerecibeesonocapicúa.

Escribeunprogramaprincipalquesolicitenúmerosenterospositivoseindiquesisononocapicúas.Elprogramasolicitaránúmeroshastaqueseintroduzcaunonegativo.

11. Escribe un programa en C++ que permita manejar una lista de hasta 100cantidades reales positivas. El programa empezará leyendo de un archivolista.txtlosvaloresqueinicialmentevaacontener(‐1comocentinelafinal).Acontinuaciónpermitiráalusuariorealizarlassiguientesaccionesconlalista:

Insertarunanuevacantidadalfinaldelalista

Insertarunanuevacantidadalprincipiodelalista

Eliminarunacantidaddadasuposiciónenlalista

Localizarunacantidad(indicandolaposiciónenqueseencuentra)

Mostrarlalistadecantidades(unaencadalíneaprecedidadesuposición)

Guardarenelarchivolista.txtlalista

Cadaopciónseimplementaráconunsubprogramayhabráunmenúdeopciones.Habráunafunciónqueindiquesilalistaestállena.

12. Encombinatoria,elnúmerodevariacionesdexelementosdeordeny,Vx,y,(x>0,0<yx),elnúmerodepermutacionesdexelementos,Px,(x>0)yelnúmerodecombinaciones de x elementos de orden y, Cx,y, (x >0, 0 < y x) se obtienenmediantelassiguientesfórmulas:

)1()2(...)2()1(, yxyxxxxV yx

,, y

yxyx P

VC

)1()2(...321 xxxPx

Page 48: Fundamentos de la programación 4 - UCMolimpiadas.informatica.ucm.es/files/fp/04-AbstraccionProcedimental… · 3.Dibujar REFINAMIENTO Misma tarea Luis Hernández Yáñez 1.Dibujar

Fundamentos de la programación    Ejercicios del Tema 4  —  Pág. 4 

Implementaunafunciónvariaciones()querecibadosnúmerosenterosxeyycalculeydevuelvaelenteroquerepresentaVx,y.Otrafunciónpermutaciones()querecibaunnúmeroenteroxycalculeydevuelvaelenteroquerepresentaPx.Yotrafuncióncombinaciones()querecibadosnúmerosenterosxeyycalculeydevuelva(haciendousodelasdosfuncionesanteriores)elenteroquerepresentaCx,y.

Implementa un programa principal que solicite al usuario parejas de enterospositivosxeymientrasquenoseanambos0yqueparacadaparejacompruebequecumplenlascondicionesnecesariasparapodercalcularVx,y,Px yCx,y(x>0,0<yx)ysiesasíloscalculen,haciendousodelossubprogramasanteriores,ylosmuestrenenlapantalla.

NOTA:Las tres funcionesnecesitanque losnúmeros que reciben comoentradacumplan las condiciones necesarias para poder calcular los valorescorrespondientes.Usalafunciónassert()duranteladepuración.