fundamentos de la programación 4 -...
TRANSCRIPT
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
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
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:
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
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
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(){
...}
...
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
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();
...
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
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()
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
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&
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
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
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
...
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
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
...
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
...
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
Luis Hernández Yáñez
...// Prototipovoid cambio(double precio, double pago, int &euros, int ¢50,
int ¢20, int ¢10, int ¢5, int ¢2, int ¢1);
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 ¢50,int ¢20, int ¢10, int ¢5, int ¢2, int ¢1) {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
Luis Hernández Yáñez
Enlossubprogramassepuedendetectarerrores
Erroresqueimpidenrealizarloscálculos:void cambio(double precio, double pago, int &euros, int ¢50,
int ¢20, int ¢10, int ¢5, int ¢2, int ¢1) {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 ¢50,
int ¢20, int ¢10, int ¢5, int ¢2, int ¢1,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
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
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!
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
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
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
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
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
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
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
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;
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;
} ......
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
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
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
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.
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
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)
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)
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)
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
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
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
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.
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().
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.
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
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.