04-leccion10y16-MToledo

download 04-leccion10y16-MToledo

of 60

Transcript of 04-leccion10y16-MToledo

  • 8/2/2019 04-leccion10y16-MToledo

    1/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-1

    CONTENIDO DE LA LECCIN 10

    CONOCIMIENTOS BSICOS SOBRE FUNCIONES

    1. Introduccin 22. Funciones que regresan un solo valor:funciones sinvoid

    3

    2.1. Formato de funciones definidas por el usuario 42.2. Encabezado de la funcin 42.3. La clase de datosreturn 52.4. El nombre de la funcin 52.5. Lista de parmetros 62.6. Ejemplo 10.1 72.7. Seccin de enunciado 72.8. Ejemplos 10.2, 10.3 82.9. Llamada a las funciones sin void 92.10. Argumentos reales en comparacin con parmetros formales 102.11. Retorno de un resultado al programa que invoca a la funcin 112.12. Ejemplo 10.4 112.13. Examen breve 27 52

    3. Funciones void 123.1. Parmetros de valor en comparacin con parmetros de referencia 133.2. Parmetros de valor 133.3. Ejemplos 10.5, 10.6, 10.7, 10.8, 10.9 143.4. Parmetros de referencia 173.5. Ejemplos 10.10, 10.11 19

    4. Localizaciones de las funciones dentro de su programa 205. Examen breve 28 52

    6. Prototipo de funciones 226.1. Ejemplos 10.12, 10.13 23

    7. Solucin de problemas en accin:Programacin estructurada, ley de Ohm 257.1. Problema 257.2. Definicin del problema 257.3. Planeacin de la solucin 267.4. Codificacin del programa 28

    8. Solucin de problemas en accin:Estado de cuenta de una cuenta de ahorros 368.1. Problema 368.2. Definicin del problema 368.3. Planeacin de la solucin 368.4. Codificacin del programa 40

    9. Examen breve 29 5210. Lo que necesita saber 4211. Preguntas y problemas 44

    11.1. Preguntas 4411.2. Problemas 47

  • 8/2/2019 04-leccion10y16-MToledo

    2/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-2

    LECCIN 10

    CONOCIMIENTOS BSICOS SOBRE FUNCIONES

    INTRODUCCIN

    Cuando los programas se vuelven ms complejos, los programadores descomponen el

    programa en pequeos subprogramas llamados funciones. Cadafuncin debe realizar una tareaespecfica. Cuando el programa requiere de la tarea, llama a lafuncin, proporcionndole todala informacin que requiera para llevar a cabo la tarea.

    Objetivos de esta leccin:

    Aprender a construir programas de manera modular, a partir de piezas pequeas llamadasfunciones.

    Crear funciones nuevas. Entender los mecanismos para pasar informacin entre funciones. Comprender lasclases de retorno de una funcin. Crearprototipos de funciones.

    En lecciones anteriores se ha presentado el diseo estructurado usando el refinamientosucesivo (paso a paso) y las funcionesestndar de C++. Tambin se han desarrollado diseosdescendentes de programas estructurados, pero se ha empleado una programacin linealcuando se codifican estos diseos. Como resultado, hemos estado codificando programas C++que consisten en una seccin principaldefinida por la funcin main() Es tiempo de aprendercmo codificar diseos estructurados usando un programa C++ estructurado que empleafunciones. Como se sabe, las funciones son la base de la programacin estructurada en ellenguaje C++. Adems, las funciones proporcionan el nico mtodo de comunicacin conobjetos en programacin orientada a objetos. Por lo tanto, esta leccin es importante para

    aprender laprogramacin estructurada y laorientada a objetosen el lenguaje C++.

    Ya se han utilizadofuncionesestndar preconstruidas opredefinidas, en los programas.Todas estas funciones forman parte de los diversos archivos de encabezado incluidos en C++.Ahora es momento de desarrollar sus propiasfunciones y emplearlas para crear programas C++bien estructurados y modulares, as como sus propias clases y objetos cuando estudie laprogramacin orientada a objetos. Lasfunciones que se crean para uso propio en un programase conocen con el nombre defunciones definidas por el usuario. En este sentido, el usuario esusted, elprogramador.

    Unafuncin definida por el usuario es unbloque de enunciados o unsubprograma, que

    se escribe para realizar una tarea especfica requerida por el programador.

    Lasfunciones en C++ tienen la misma estructura del programamain() que ha utilizado alo largo de estas lecciones:

    claseRetorno nombreFuncion(listaParametros){

    declaracinVariables;enunciados;

    }

  • 8/2/2019 04-leccion10y16-MToledo

    3/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-3

    A unafuncin se la da unnombre y se le llama o invocausando sunombre cada vez quese va a realizar la tarea dentro del programa. El programa que llama o invoca unafuncin sueleconocerse con el nombre deprograma llamador.

    Las funciones eliminan la necesidad de duplicar enunciados dentro de un programa.Dada una tarea que se va a realizar ms de una vez, los enunciados, se escriben slo una vez parala funcin. Entonces se llama a la funcin cada vez que se desee realizar la tarea. Adems, eluso de lasfunciones mejora la claridad y la legibilidad de la lista del programa. Y lo que es msimportante, el uso de las funciones dentro de un lenguaje estructurado, como C++, permitesolucionar problemas complejos y muy largos usando un enfoque de diseo de programacin dearriba-abajo, as como la construccin de clases y objetos en programacin orientada aobjetos. En C++ es posible hacer que unafuncin sirva para dos propsitos. Puede hacerse unafuncin para que regrese un solo valor al programa llamador. En C++, este tipo defuncin seconoce comosinvoid. Tambin es posible escribir funciones que realicen tareas especficas sinque regrese valor alguno o regrese varios valores, a estas funciones se les conocen con elnombre defuncionesvoid.

    FUNCIONES QUE REGRESAN UN SOLO VALOR:funciones sinvoid

    Ya se cuenta con alguna experiencia en funciones que regresan un valor en C++.Recuerde las funciones estndar que se utilizaron antes como sqrt(), sin() y cos(), pormencionar algunas. Vimos que C++ incluye funciones para el manejo de cadenas y funcionesmatemticas, as como funciones para el manejo de E/S. Sin embargo, suponga que quiererealizar alguna operacin que no es una funcinpredefinida en C++, por ejemplo elevar alcubo. Debido a que C++ no incluye ninguna funcin estndar para tal operacin, es posiblecodificar en el programa la operacin con un enunciado como el siguiente:

    cubo =x *x * x

    Despus, insertar este enunciado dentro del programa cada vez que se quiera elevar alcubo el valor dex. Sin embargo, no sera ms sencillo insertar el comando cubo(x) cada vez quese quiera elevarx al cubo, de tal manera que C++ sepa qu hacer al igual que sabe cmo ejecutarsqrt(x)? Puede hacer esto definiendo su propiafuncincubo(x). A estafuncin se le conoce conel nombre defuncin definida por el usuario, por razones obvias.

    Unafuncin definida por el usuario es un subprograma que, cuando se invoca, realizaalguna tarea o regresa un solo valor que se asigna al nombre de la funcin en cualquier parteque se utilice el nombre en el programa llamador. De esta manera, si cubo(x) es una funcin definida por el usuario que calcular un valor, por decir, x, el enunciado cout

  • 8/2/2019 04-leccion10y16-MToledo

    4/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-4

    FORMATO DE FUNCIONES DEFINIDAS POR EL USUARIO

    // Encabezado de la funcin

    ()

    {//Empieza el bloque de enunciados de la funcin

    //Variables y constantes locales

    //Enunciados de la funcin o cuerpoenunciado #1;enunciado #2;.......................................enunciado #n;return ;

    }// Final del bloque de enunciados de la funcin

    El formato de la definicin de una funcin consiste en tres secciones principales: unalnea de encabezado de la funcin, cualquier variable localuobjetos constantes requeridos porlafuncin y una seccin de enunciados.

    ENCABEZADO DE LA FUNCIN

    El encabezado de la funcin proporciona la interfaz de datos para la funcin. Unainterfaz de funcin o encabezado de la funcin es un enunciado que forma un marco comnentre lafuncin y su programa llamador. Esta idea se muestra en lafigura 10.1. Observe que elencabezado indica quedatos de la funcin aceptarndesde el programallamador y qudatos de la funcin regresarn al programa llamador. Cuando desarrolle los encabezados de lasfunciones, su perspectiva necesita ser relativa a lafuncin. Deber preguntarse dos cosas:

    1. Qu datos debe aceptar la funcin desde el programa llamador para realizar la tarea

    designada?

    2. Qu datos , si los hay, debern regresar la funcin al programa llamador para cumplir latarea designada?

    Programa llamador Encabezado Cuerpo de lade la funcin

    funcin [proceso][interfaz]

    Figura 10.1. El encabezado de la funcin forma la interfaz entre elprograma llamador y lafuncin

    Acepta

    Regresa

  • 8/2/2019 04-leccion10y16-MToledo

    5/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-5

    En general, el encabezado de lafuncin consiste en las tres partes siguientes:

    Laclase de dato que regresar la funcin, si lo hay. Elnombre de la funcin. Una lista de parmetros.

    LA CLASE DE DATOSreturn

    Lo primero que aparece en el encabezado de la funcines la clase de datos del valorregresado. Recuerde que lafuncin puederegresar un solo valor que reemplace elnombre de lafuncin en donde aparece el nombre en el programa llamador. El valor que reemplaza elnombre de lafuncin en el programa llamador se conoce con el nombre de valor de retornooderegreso. Cuando se usa unafuncin para este propsito, laclase de datos del valor de regresose deber especificar en elencabezado de la funcin. Por ejemplo, suponga que nuestra funcincubo()regresa elcubo de un entero. Debido a que el cubo de un entero es un entero, lafuncinregresar un valor entero. Como resultado, la clase de datos del valor regresado deber ser int yespecificarse en el encabezado de la funcin, como sigue:

    intcubo()

    De otra manera, si nuestra funcincubo() fuera el cubo de un valor de punto flotante, laclase regresada deber serfloat y el encabezado deber verse como sigue:

    floatcubo()

    Cuando unafuncin no regresa ningn valor al programa llamador deber usar la palabrareservada voidcomo la clase de regreso, como se muestra a continuacin:

    voidfuncionMuestra()

    Lasfunciones que no regresan ningn valor al programa llamador se usan para realizar

    tareas especficas, comoE/S.

    EL NOMBRE DE LA FUNCIN

    Elnombre de la funcin puede ser cualquier identificadorlegal en C++. Sin embargo, el nombre de la funcin no deber empezar con un subguin (guin bajo), porque algunosdepuradores colocan unsubguin frente alnombre de la funcin si se encuentra un error en lafuncin. El nombre de la funcin describir la operacin que la funcin realiza, al igual quecubo() describe el cubo de un valor. Cuando invoque la funcin dentro de un programallamador, usar estenombre.

    Cada funcin que cree dentro de su programa debe de tener un nombre nico. Comoocurre con los nombres de variables, los nombres de las funciones deben corresponder con latarea que realiza. Por ejemplo:

  • 8/2/2019 04-leccion10y16-MToledo

    6/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-6

    Nombre de la funcin Propsito de la funcin

    imprimirCalificacion Imprimir calificacin de los alumnos.cuentasPorPagar Procesa las deudas de una compaa.pedirNombre Solicita el nombre del usuario.imprimirDocumento Imprime el archivo correspondiente al

    documento.

    calcularImpuesto Calcula el impuesto del cliente.

    Recuerde dos cosas:

    1. El nombre de la funcin nunca se puede usar dentro de la funcin. En otras palabras, elsiguiente enunciado dentro de la funcincubo() generar un error:

    cubo =x *x *x;

    Hay una excepcin a esta regla que se llamarecursividad, la cual se explicar en la siguienteleccin.

    2. El identificador de la funcin nunca se usar del lado izquierdo del smbolo de asignacin fuera de la funcin. Por tanto, el siguiente enunciado causar un error en el programa

    llamador:

    cubo =x *x *x;

    LISTA DE PARMETROS

    La lista de parmetros de la funcin incluye variables, llamadas parmetros, quepasarn desde el programa llamador y sern evaluados por lafuncin. Piense en unparmetrocomo una variable de lafuncin que espera recibir un valor desde el programa llamador cuandose invoca lafuncin. Para determinar los parmetros de la funcin, pregntese qu datosdeberaceptar lafuncin para realizar su tarea? Suponga que nuestra funcincubo() elevar alcubo valores enteros. La funcin deberaceptar un valor entero desde el programa llamador yregresar un valor entero al programa llamador. De esta manera, nuestra interfaz defuncin sepuede describir como sigue:

    Funcincubo(): Un entero al cubo.Acepta: Un valorentero.Regresa: Un valorentero.

    Vamos a disear x como un objeto entero que aceptar la funcin. En C++, unparmetro dado deber especificarse en el encabezado de la funcin indicando suclase de datosseguido por su identificador. Como resultado, la lista de parmetros apropiados para lafuncin

    cubo() deber ser(

    intx). Colocando todo junto, el encabezado de la funcin deber ser:

    intcubo(intx)

    Clase regreso Parmetro de la funcin

    Nombre de la funcin

    S la funcincubo() elevara al cubo valores de punto flotante, el encabezado de lafuncin apropiado deber ser:

  • 8/2/2019 04-leccion10y16-MToledo

    7/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-7

    floatcubo(float x)

    Clase regreso Parmetro de la funcin

    Nombre de la funcin

    Ejemplo10.1

    Suponga que quiere escribir una funcin definida por el usuario paracalcular el voltaje en un circuito decdusando la ley de Ohm. Escriba el encabezado de la funcin:

    Para desarrollar el encabezado de la funcin, trataremos a lafuncin como a una caja negra y nos haremoslas siguientes preguntas: (1) Qu dato deber aceptar la funcin desde el programa llamador pararealizar la tarea de aplicacin? (2) Qu deber regresar al programador llamador? Las respuestas aestas preguntas dictarn elencabezado de la funcinointerfaz. Para contestar la primera pregunta, pienseen qu deber evaluar lafuncin. Para calcular el voltaje usando la ley de Ohm, la funcin deber evaluardos cosas: corrienteyresistencia. As que utilicemos las palabras corriente y resistencia como nuestrosparmetros. De esta manera, la funcin deber aceptar un valor de punto flotante de corriente y un valorde punto flotante deresistencia,

    Despus, deber decidir qu datos regresar la funcin al programa llamador. Debido a que la funcinevala valores de punto flotante, tiene sentido matemtico que el valorregresado tambin deba ser un valorde punto flotante.

    Ahora, la interfazdefuncin se puede describir como sigue:

    Funcin voltaje(): Calcula el voltaje usando la ley de Ohm.Acepta: Un valor de punto flotante paracorriente y un valor de punto

    flotante pararesistencia.Regresa: Un valor de punto flotante para voltaje.

    Una vez que se ha decidido lo que acepta y lo que regresa la funcin, el encabezado de la funcin seconstruye fcilmente con la sintaxis de C++ como sigue:

    floatvoltaje(floatcorriente,floatresistencia)

    SECCIN DE ENUNCIADO

    La seccin de enunciado de la funcin incluye aquellas operaciones que la funcindeber realizar pararegresar un valor al programa llamador. Observe otra vez el formato generalpara la funcin definida por el usuario. Como puede observar, la seccin de enunciadocompleta est enmarcada dentro de llaves. Despus de abrir una llave, deber empezar laseccin de enunciado declarando cualquier objeto constante y definiendo objetos variables que seusarn dentro de la funcin. Cualquier objeto constante o variable listado aqu se llama local,porque se definen slo para uso local dentro de la misma funcin. Las constantes y variables

    localesnotienen significado fuera de lafuncin en la cual se definen. Noduplique ninguno de sus parmetros defuncinaqu. Liste solamente constantes o variables adicionales que lafuncin requiera durante su ejecucin. Un ejemplo comn de una variablelocales uncontadorde ciclo que se emplea como parte de un ciclowhile, do/whileofor dentro de la funcin. Enrealidad, puede declararconstanteslocales ydefinirvariableslocales en cualquier lugar dentrode lafuncin siempre y cuando se listen antes de usarlas. Sin embargo, el buen estilo dicta questas sean declaradas o definidas al principio de la seccin de enunciado de lafuncin.

  • 8/2/2019 04-leccion10y16-MToledo

    8/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-8

    No confunda las variableslocales con losparmetros de lafuncin. Una variablelocalse define despus de abrir la llave de una funcin para usarle dentro de sta. Un parmetro defuncin se define en el encabezado de la funcin como un lugar que mantiene el espacio paralos valores del argumento que pasan a la funcin cuando se llama a la misma. Tambin seusar dentro de lafuncin para suministrar datos desde el programa llamador a lafuncin.

    Los enunciados ejecutables de la funcin siguen a cualquier enunciado o definicinlocal. El ltimo enunciado en unafuncin sin voides elreturn. Este se usa cuando seregrese unsolo valor al programa llamador. As, si nuestrafuncincubo() regresa el cubo de x, unenunciado deregreso apropiado deber ser:

    return (x *x *x);

    Combinando el encabezado de la funcin y la seccin de enunciado para la funcincubo(), dar lafuncin completa como sigue:

    intcubo(int x){

    return(x *x *x);

    }// Fin de cubo()

    Obviamente, sta es unafuncin relativamente sencilla que no requiere ningn enunciadode definicin local o ejecutable que no sea el enunciadoreturn.

    Ejemplo10.2

    Complete la funcin voltaje() cuyo encabezado se desarroll en elejemplo10.1

    Solucin

    La ley de Ohm requiere la funcin para multiplicar la corriente por la resistencia para obtener el voltaje.De esta manera, el nico enunciado requerido en la funcin es un enunciado return que regresar elproducto decorriente yresistencia. Colocando todo junto, lafuncin completa se convierte en:

    floatvoltaje(floatcorriente,floatresistencia){

    return (corriente *resistencia);}// Fin de voltaje()

    Una fuente comn de error durante la codificacin de una funcin sin void es hacer la asignacin alnombre de lafuncin dentro de sta, como sigue:

    floatvoltaje(floatcorriente,floatresistencia){

    returnvoltaje =corriente *resistencia;}// Fin de voltaje()

    Esto siempre causar un error de compilacin, porque se intenta regresar elnombre de lafuncin. Deberregresar un valor que, en este caso, es el producto decorrienteyresistencia.

    Ejemplo10.3

    Escriba una funcin que regrese la suma de todos los enteros desde 1 a algn valormximo entero,llamadomaximo. Lafuncin deberobtener el valor demaximo desde el programa llamador.

  • 8/2/2019 04-leccion10y16-MToledo

    9/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-9

    Solucin

    Vamos a llamar a esta funcinsuma(). Ahora, lafuncin deberaceptar un valor entero llamadomaximodesde el programa llamador. Debido a que la funcin es para sumar todos los enteros desde 1 hastamaximo, sta regresar un valor entero. De esta manera nuestra interfaz de funcin se puede describircomo sigue:

    Funcinsuma(): Suma todos los enteros desde 1hastamaximo.

    Acepta: Un valor entero: maximo.Regresa: Un valor entero.

    Utilizando esta informacin, elencabezado de la funcinse convierte en:

    intsuma(intmaximo)

    El siguiente paso es determinar si hay alguna variable localrequerida por los enunciados de lafuncin. Sepuede usar unciclofor para calcular la suma de enteros desde 1 hastamaximo. Sin embargo, el enunciadofor requiere una variablecontador. Esta es una aplicacin clsica para una variable local. Vamos a llamar aesta variable utilizada como contador localcontador. Despus, tambin necesita una variable temporaldentro delciclofor para mantener un subtotal de la suma cada vez que el ciclo se ejecuta. Denominaremosa esta variable localsubTotal. De acuerdo con lo anterior, la funcin es:

    intsuma(intmaximo){

    intsubTotal= 0;

    for(intcontador = 1;contador

  • 8/2/2019 04-leccion10y16-MToledo

    10/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-10

    En estos casos, lafuncin es la variableaelevada al cubo, donde aa se le ha asignadopreviamente el valor2. De esta manera el valor de a o2,pasa a la funcin. En nuestrafuncincubo() elparmetroxtoma el valor dea.

    Las funciones tambin pueden ser llamadas como parte de expresiones aritmticas oenunciados relacionales. Por ejemplo, nuestra funcincubo() puede ser llamada como parte deuna expresin aritmtica, como sta:

    inta = 1;y = 1 +cubo(a) * 2;

    Qu se asignar a y? Bien, primero C++ evale la funcincubo() para obtener 8,despus realiza la operacin de multiplicacin para obtener 16 y por ltimo suma 1 a 16 paraobtener 17.

    Tambin puede usarfunciones como parte de operaciones relacionales, como sta:

    if(cubo(a) >= 27)

    Cundo ser verdadera la relacin? Cuandoa sea mayor o igual a3, correcto? Cuando

    a es mayor o igual a3, elcubo(a) es mayor o igual a27. Recuerde que cuando unafuncin sedisea para regresar un solo valor al programa llamador, el valor regresadoreemplaza elnombre de la funcindonde quiera que se use elnombreen el programallamador.

    Generalmente se llamarn las funciones sin void dentro de su programa usando unenunciado de asignacin, un objeto cout o como parte de una operacin aritmtica. Recuerdepensar en la llamada defuncin como un valor. Esto es, un valor reemplaza la llamada defuncin donde sta aparece en el programa. Pregntese: Tiene sentido un valor aqu? Porejemplo, todos los siguientes enunciados tienen sentido, porque un valor puede sustituirse

    fcilmente por la llamadadefuncin:

    resultado =cubo(a):cout

  • 8/2/2019 04-leccion10y16-MToledo

    11/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-11

    Las variables deargumento realse debern definir en el programa llamador. Estar en la funcinmain(), a menos que las funciones sean llamadas por otras funciones.

    La clase de datos de losargumentos reales correspondientes y losparmetros formales debern serlos mismos.

    Los parmetros formales mantienen el espacio para los valores del argumento realdurante laejecucin de la funcin. Losparmetros formales siempre se listan en la seccin de parmetros delencabezado de la funcin.

    El nmero deargumentos reales usado durante la llamada de funcin deber ser el mismo que elnmero de parmetros formales listados en el encabezado de la funcin , excepto cuando se usanparmetros predeterminados. Losparmetros predeterminados se explicarn posteriormente.

    La correspondencia entreargumentos reales yparmetros formales se establece sobre las bases deuno a uno de acuerdo con el orden de la lista respectiva.

    Aunque las variables delargumento realy delparmetro formala menudo tienen diferentes nombresde variable, pueden ser las mismas. Cuando ste es el caso, los objetos variables respectivos debern

    definirse en el programa llamador y tambin tendrn que aparecer en la listade parmetros de lafuncin.

    RETORNO DE UN RESULTADO AL PROGRAMA QUE INVOCA A LA FUNCIN

    En algunas ocasiones la funcin ejecutar cierto tipo de clculos. La funcinposteriormentedevolver este valor a quin la llama. Cuando unafuncinregresa un valor, debeindicarle a C++ la clase del valor que devuelve, tal como int, float, char y as sucesivamente.Para informarle a C++ de la clase deretorno de lafuncin, simplemente preceda alnombre dela funcin con la clase correspondiente. Por ejemplo, la siguiente funcinsumaValores sumados nmeros enteros y regresa un resultado entero.

    Ejemplo10.4

    El siguiente programa SUMAVAL.CPP, utiliza la funcinsumaValores, para sumar valores diferentes:

    /* El siguiente programa: SUMAVAL.CPP, llama a una funcin llamadasumaValores,la cual calcula la suma de dos nmeros enteros.*/

    #include //Para cout

    intsumaValores(inta, intb){

    return (a+b);}//Fin de sumaValores()

    voidmain(void){

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    12/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-12

    FUNCIONESvoid

    Lasfunciones quenoregresan un solo valor al programa llamador a menudo se escribenpara realizar alguna tarea especfica. Estas se llamanfuncionesvoid.

    Cuando una funcin no regresa un solo valor al programa llamador, se deber usar lapalabra reservada voidcomo elregreso de la clase de datos. Adems, estas funcionespueden o no requerirparmetros. Cuando no se requierenparmetros, simplemente deje la lista deparmetros enblanco para indicar al compilador que lafuncin no necesita recibir ningn valordesde el programa llamador. Las funciones que no regresen un valor o no requieran ningnparmetro son del tipo de funciones ms simples en C++. Por ejemplo, suponga que quiereescribir una funcin que mostrar el siguiente encabezado en la pantalla cada vez que se lellama:

    NOMBRE CALLE DIRECCIN ESTADO CIUDAD CDIGO POSTAL

    Vamos a llamar a esta funcinmuestraEncabezado() Para desarrollar el encabezado dela funcin, pregntese que deberaceptar lafuncin para realizar la tarea diseada y que deber

    regresar. En este caso, la funcin simplemente muestra la informacin constante de la lnea deencabezado y no necesitaaceptar niregresar ningn dato. De esta manera, nuestra interfaz defuncin puede escribirse como sigue:

    FuncinmuestraEncabezado(): Muestra la informacin fija del encabezado.Acepta: Nada.Regresa: Nada.

    Usando esta informacin, el encabezado de la funcin se convierte en:

    voidmuestraEncabezado(void)

    Observe el encabezado de la funcin y ver que se usa la palabra voidcomo la clase deregreso. Lapalabra reservadavoidse emplea aqu para indicar al compilador que no hay valorderegreso. Tambin, note que no hayparmetros requeridos para esta funcin, porque la listade parmetros tambin contiene void o se deja en blanco. En otras palabras, la funcin noregresa un valor y no requiere ningn argumento para evaluar. Simplemente realiza una tareadeterminada, en este caso mostrando un encabezado. Para mostrar el encabezado, lo que necesitaes un enunciadocout en elcuerpo de lafuncin. Colocando todo junto, lafuncin se convierteen:

    voidmuestraEncabezado(void){

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    13/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-13

    Ningnargumento realse lista en la llamada de lafuncin, porque lafuncin no evalaningnargumento.

    Cuando llame una funcin void, simplemente liste el nombre de la funcin y losargumentos requeridos como un enunciado sencillo dentro de su programa. No llame unafuncinvoidcon unoperador de asignacin u objetocout como lo hace para lasfunciones sinvoid. La siguiente llamadamuestraEncabezado() deber causar un error de compilacin.

    encabezado =muestraEncabezado(); // Errorcout

  • 8/2/2019 04-leccion10y16-MToledo

    14/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-14

    voidpasaValor(int x, inty);{

    //Incrementa y decrementa parmetros formales++x;--y;

    //Muestra los valores del parmetro formalcout

  • 8/2/2019 04-leccion10y16-MToledo

    15/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-15

    Ejemplo10.6

    El siguiente programa, DOSMSJ.CPP, utiliza las funcionesmuestraTitulo() y muestraLeccion() paravisualizar informacin acerca de las lecciones:

    Para incrementar la capacidad de las funciones, C++ le permite a sus programas pasarinformacin (argumentos) a sus funciones. Cuando una funcin utiliza parmetros, debeindicarle a C++ la clase de cada uno de los parmetros, tales como int, float, char y assucesivamente.

    /* El siguiente programa:MSTRMSJ.CPP, crea una funcinmuestraMensaje(), paravisualizar un mensaje.

    */

    #include //Para cout

    voidmuestraMensaje(void)

    {cout

  • 8/2/2019 04-leccion10y16-MToledo

    16/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-16

    Ejemplo10.7

    El siguiente programa: USOPAR.CPP, utiliza lafuncinmostrarNumero, varias veces, en cada ocasin sele pasa un valor diferente.

    En la mayora de los casos, sus programas pueden pasar varios valores a lafuncin. Paracada valor pasado, sufuncin debedeclarar sunombreyclase.

    Ejemplo10.8

    El siguiente programa: GDEPEQ.CPP, utiliza la funcinmostrarGdeYPeq para visualizar el nmero msgrande y el ms pequeo de tres enteros que recibe.

    /* El siguiente programa: USOPAR.CPP, elabora una funcin que muestra los diferentesparmetros que le son enviados.

    */

    #include //Para cout

    voidmostrarNumero(intvalor){

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    17/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-17

    Ejemplo10.9

    El siguiente programa: MSTEMP.CPP, utiliza la funcin mostrarEmpleado para visualizar la edad de unempleado (clase int) y su salario (clasefloat)

    PARMETROS DE REFERENCIA

    Losparmetrosdereferencia, algunas veces llamados parmetrosdevariable, difierede los de valor en que stos proporcionan una combinacin en dos sentidos entre el programallamador y lafuncin, como se ilustra en lafigura10.2b.

    Programa llamador Funcin

    Figura 10.2b. Paso deparmetros mediantereferencia

    voidmain (void){

    mostrarGdeYPeq (1, 2,3);cout

  • 8/2/2019 04-leccion10y16-MToledo

    18/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-18

    Unparmetrodereferencia proporciona una comunicacin de idayvuelta de datos entreel programa llamador y la funcin. Observe el camino de comunicacin de ida y vuelta: losvalores de los argumento realespasan a losparmetrosformales en lafuncin y despus losvalores deparmetrosformalesregresan a los argumentos reales. Esto permite a la funcincambiarlosvaloresdeargumento realen el programa llamador. Recuerde que unparmetrodevalor es simplemente unacopia del valordelargumento real; por lo tanto, cualquier operacinsobre elparmetro dentro de lafuncinno tiene efecto en el valordelargumento original. Deotra manera, unparmetrodereferencia representa ladireccindelvalordeargumento realenlamemoria. Como resultado, cualquier cambio que se haga alparmetrodereferencia dentro delafuncin cambiar lo que est almacenado en esadireccin. Esto obviamentemodificaelvalororiginaldelargumento realen el programa llamador.

    Para crear unparmetrodereferencia, simplemente inserte un ampersand(&) antes delos identificadoresdeparmetro apropiados en el encabezado de la funcin. Vamos a cambiarnuestro ejemplopasaValor() para usarparmetrosdereferencia, como sigue:

    voidpasaReferencia(int&x, int &y);{

    // Incrementa y decrementa parmetros formales++x;--y;

    // Muestra los valores del parmetro formal

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    19/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-19

    Como puede ver, los nuevos valores de xyypasande regreso aa yb respectivamente.Usamos la expresin pasan de regreso para describir la accin. Sin embargo, recuerde que enrealidad nada pasa de regreso, porque la funcin est simplemente operando sobre lasdirecciones de losargumentos realesayb.

    Ejemplo10.10

    Qu se mostrar como resultado del siguiente programa?

    voidmain(void){

    //Define variables de argumento realint a = 0;intb = 0;

    //Llama a la funcinmuestraParametros(a,b);

    //Muestra los valores de argumento realcout

  • 8/2/2019 04-leccion10y16-MToledo

    20/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-20

    Ejemplo10.11

    Escriba una funcin llamada intercambio() que acepte dos objetos enteros desde el programa llamador yregrese los objetos con sus valores intercambiados.

    Solucin

    Esta es una aplicacin ideal paraparmetros de referencia porque, para intercambiar los valores, el procesode intercambio dentro de la funcin deber tener un efecto sobre los valores original en el programallamador. As, la funcin deber aceptar dos objetos enteros y regresar los mismos dos objetos con losvalores intercambiados. A continuacin se muestra una descripcin de la interfaz de lafuncin:

    Funcin intercambio(): Intercambia los valores de dos objetos enteros.Acepta: Dos objetos enteros.Regresa: Los mismos dos objetos enteros.

    Debido a que lafuncin deberregresar las mismas dos variables enteras que los que acepta, ambos sernparmetros de referencia. Vamos a etiquetar losparmetros comoobjeto1yobjeto2. El encabezado de lafuncin entonces se convierte en:

    voidintercambio(int &objeto1, int&objeto2)

    Observe el uso de ampersandpara indicar que losparmetros sonparmetros de referencia. Debido a queobjeto1yobjeto2 sonparmetros de referencia, se intercambiarn los valores de los objetos de argumentorealusados en la llamadade lafuncin. Ahora, para intercambiar los dos valores dentro de la funcin,deber crear un objeto variable local temporalpara que no se pierda uno de los valores. De acuerdo conesta idea, la funcin completa es:

    voidintercambio(int&objeto1, int&objeto2){

    //Define como local la variable temporalinttemp;

    //Intercambia los valores

    temp =objeto1;objeto1 =objeto2;objeto2 =temp;

    }// Fin de intercambio()

    Para llamar a estafuncin en un programa, simplemente liste el nombre de lafuncin y proporcione dosobjetos variables para intercambiar, por ejemplo:

    intercambio(a, b)

    Por supuesto, ay b debern definirse e inicializarse con valores dentro del programa llamador, en algnlugar antes de esta llamadade lafuncin.

    LOCALIZACIN DE LAS FUNCIONES DENTRO DE SU PROGRAMA

    Antes de que su programa pueda llamar a unafuncin, C++ debe saber la clase de valorque la funcinregresa y el nmero y clase de parmetros que la funcin utiliza. En losejemplos antes presentados las definiciones de las funciones preceden a las llamadas que sehacen a las mismas.

    Sin embargo, en muchos casos, las funciones pueden aparecer en diversos lugares de suprograma fuente, por ejemplo, despus de cerrar la llave de lafuncinmain() No hay lmite en el

  • 8/2/2019 04-leccion10y16-MToledo

    21/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-21

    nmero defuncionesdefinidas por el usuario que se puedan usar en un programa. Para llamarunafuncin queregresa un valor, deber insertar elnombrede lafuncin donde se quiera queregrese el valor. Para llamarunafuncinvoid, simplemente liste sunombre como un enunciadodentro del programa llamador. En ambos casos, losargumentos reales requeridos por lafuncindeber listarse dentro de parntesis despus del nombre de lafuncin cuando sta se llama.Adems, el nmero deargumentos reales que se utilizan en la llamadadefuncin deber ser elmismo que el nmero de parmetros formales definidos en el encabezado de la funcinrespectiva, a menos que se usenparmetros predeterminados.

    La colocacin de las funciones en un programa C++ se resume en la figura 10.3.Observe la estructura en bloques de un programa general. La funcinmain() forma el bloqueexterno general del programa y las funciones definidas por el usuario forman los bloquesinternos que se anidan dentro de lafuncinmain() por medio de las llamadasde lasfunciones.Esta es la razn de que C++ sea conocido como lenguaje estructurado en bloques. De ahora enadelante, cuando desarrollemos programas C++, intentaremos dividir el problema deprogramacin general en un grupo de subproblemas ms sencillos cuya solucin combinadasoluciona el problema original. Cmo se codificarn estos subproblemas? Ya sabe, Cmofunciones! Esta es la esencia de la programacin estructurada y diseo descendente de software.

    Figura 10.3. Lasfunciones por lo general se colocan despus demain() en un programa C++

    prototipofuncion1();prototipofuncion2();

    voidmain(void){

    Llamada a lafuncion1();Llamada a lafuncion2();

    }// Fin de main()

    funcion1(){

    enunciado1;enunciado2;...................;enunciadoN;

    }// Fin de la funcion1()

    funcion2(){

    enunciado1;enunciado2;

    ...................;enunciadoN;

    }// Fin de la funcion2()

    EXAMEN BREVE 28

  • 8/2/2019 04-leccion10y16-MToledo

    22/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-22

    PROTOTIPO DE FUNCIONES

    Para asegurarse de que C++ conoce las caractersticas de cada funcin que utiliza suprograma, debe colocarprototiposde lasfunciones al principio de su programa fuente, algunasveces, se conoce como un enunciado defuncin; es unmodelo de interfaz para lafuncin queusa el compilador para verificar el nmero apropiado de argumentos y las clases de datos de losargumentos en las llamadasde lafuncin.

    Losprototipos fuerzan al compilador a realizar verificaciones adicionales a sus llamadasdefuncin, de esta manera ayudan en la deteccin de errores de programacin asociados conllamadas de funcin. Por ejemplo, si una funcin espera recibir un valor entero y elprogramador trata de pasar una cadena de caracteres, el compilador puede detectar el errorporque C++ requiere que lafuncinprototipo se especifiqueantes de la llamada de lafuncin.Dado que losprototipos obligan al compilador a verificar errores durante la compilacin, esto noafecta el tamao ni la velocidad del tiempo de ejecucin del programa. Aunque tome al

    compilador ligeramente ms tiempo en realizar esta tarea de verificacin de errores, cualquiererror detectado por medio de los prototipos puede ahorrar horas de depuracin, que serannecesarias si no se emplearan los prototipos. Por estas razones, el lenguaje C++ requiere las

    funcionesprototipo. Sin embargo, conviene saber que la funcinprototipo es opcional en ellenguaje C.

    En la definicin anterior de prototipo, se infiere que ste proporciona un modelo deinterfaz para lafuncin. Bien, la interfaz de la funcin es el encabezado de la funcin; por lotanto, el prototipode lafuncin es slo unacopiadelencabezado de la funcin que utiliza elcompilador para verificar las llamadas a lafuncin. As elprototipo dicta las clases de datos queaceptar lafuncin desde el programa llamador y las que regresar la funcin al programallamador.

    Los prototipos defuncin se localizan antes de la funcinmain(). El prototipo de

    funcin puede ser slo una copiadelencabezado de la funcin seguida por un punto y como,como lo que sigue:

    voidestudiante(intnumero,floatpromedio,charcalificacion);

    Aqu, elprototipo le dice al compilador que lafuncinestudiante()no regresar un valoral programa llamador. Adems, estudiante() espera recibir tresparmetros cuando se le llama.El primerparmetro se interpretar como un entero, el segundo como un valor de punto flotantey el tercero como un carcter. Si se hace un llamadode lafuncin con ms o menos el nmerode parmetros listados en el prototipo, el compilador generar un error, a menos que seespecifiquen parmetrospredeterminados. Si se llama a lafuncin con parmetros que

    pertenecen a clases de datos diferentes que las listadas en elprototipo, losparmetros se tratarncomo si stos fueran la lista de clases de datos respectivos.

    En general unprototipodefuncin, contiene informacin acerca del tipo de retorno y desus parmetros. Los siguientes enunciados ilustran prototipo defuncin para varias de lasfunciones ya utilizadas:

  • 8/2/2019 04-leccion10y16-MToledo

    23/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-23

    voidmuestraMensaje(void);voidmostrarNumero(int);voidmostrarEmpleado(int,float);intsumaValores(int, int);floatvalorPromedio(int, int);

    Ejemplo10.12

    El siguiente programa:ESTUDIANTE.CPP, utiliza lafuncinestudiante() cuyoprototipo ya se mostr:

    La salida generada por este programa es:

    Hay5exmenes, que dan como resultado unpromedio de 85.6y unacalificacin alfabtica deB.

    Cmo puede observar, los argumentos reales en la llamada de lafuncin pasaron a estudiante() y seutilizaron para construir el enunciadocout. Si se han utilizado ms o menosparmetros en la llamadade lafuncin, el resultado ser un error de compilacin. Pero, qu pasara si las clases de datos delargumentono fueran las mismas que las listadas en elprototipo? Considere la siguiente llamada a lafuncin:

    estudiante(B, A, 67);

    Esta llamada no deber producir un error de compilacin, porque el nmero deparmetros es correcto. Sinembargo, el compilador interpretar el primer parmetro como un entero, el segundo como un valor depunto flotante y el tercero como un valor carcter. El resultado que genera la llamadadefuncin ser:

    Hay66 exmenes, que dan como resultado unpromediode65.0y unacalificacinalfabtica deC.

    Advierte lo que sucede? La funcin us el equivalente entero del carcter B para el primerparmetro,el equivalente a punto flotante del carcter Apara el segundoparmetro y el equivalente del carcter del

    /*El siguiente programa:ESTUDIANTE.CPP, ilustra una funcin que muestra elnmerode exmenes realizados, elpromedio y lacalificacin alfabtica del estudiante.

    */

    #include //Para cout

    // Prototipo de la funcin

    voidestudiante(intnumeroExamenes,floatpromedio,charcalificacion);

    voidmain(void){

    estudiante(5, 85.6, 'B');}// Fin del main()

    /***********************************************************************************Esta funcin mostrar un promedio del estudiante y su calificacin.***********************************************************************************/voidestudiante(intnumeroExamenes,floatpromedio,charcalificacion)

    {cout.setf(ios::fixed);cout.precision(1);

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    24/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-24

    entero 67 para el tercer parmetro. Desde luego, estas equivalencias se derivan del cdigo de caracteresASCII. As, la leccin aqu es asegurarse que la clase de datos de losargumentos coincida con las clases dedatos de losparmetros formales, de lo contrario obtendr resultados impredecibles.

    Observe nuevamente elprototipode funcinestudiante() y ver que slo es unacopiadelencabezado de lafuncin. Debido a esto, los prototipos son fcilmente codificados en su programa usando la caractersticade copia de bloque de su editor. Una vez que ha codificado una funcin, simplemente marque elencabezado de la funcin ycpiela al reaprototipo justo antes de lafuncinmain() No olvide aadir un

    punto y coma al final delprototipo, porque el encabezado de la funcin copiado no la tiene.

    Tambin puede listar susprototipodefunciones sin ningn identificadordeparmetros, como el siguiente:

    voidestudiante(int,float,char)

    Despus de todo, al compilador no le interesan los nombres de los parmetros, slo el nmero deparmetros y susclases de datos. Un punto final: si olvida incluir unprototipopara unafuncin obtendrun error familiar: prototypeexpectedcuando compile su programa. Tambin obtendr este error si olvidaincluir un archivo de encabezadopara una funcin estndar en su programa debido a que los prototipospara lasfunciones estndar en C++ estn incluidos en losarchivos de encabezado.

    Ejemplo10.13

    El siguiente programa,PROTO.CPP, ilustra el uso deprototipo defuncin.

    Como hemos dicho una de las caractersticas de losprototipos defuncin es forzar a quelos argumentos sean del tipo adecuado. Estas conversiones pueden producir resultados

    incorrectos si no se siguen lasreglas de asignacin de tipos deC++. Dichas reglas especifican lamanera de convertir un tipo de datos a otro sin perder informacin. Las reglas de asignacin se

    aplican a expresiones que contienen valores de dos o ms clases de datos; tales expresionestambin se conocen como expresiones de tipo mixto. El tipo de cada valor de una expresin detipo mixto sepromueve al tipoms alto de la expresin (de hecho, se crea una versin temporalde cada valor que se utiliza para la expresin; los valores originales permanecen sin cambio)

    Otro uso comn de la promocin es cuando el tipo de un argumento para una funcin no es igual

    al tipo de parmetro especificado en la definicin de la funcin. En la tabla10.1 se listan en lostipos de datos integrados, desde eltipo mas alto altipo ms bajo.

    /* El siguiente programa:PROTO.CPP, ilustra el uso deprototipos */

    #include //Para cout

    floatvalorPromedio(int, int); // Prototipo funcin

    voidmain(void){

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    25/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-25

    La conversin de valores hacia tipos menores puede dar como resultado valores

    incorrectos. Por lo tanto, slo puede convertirse un valor de un tipo menor asignando

    especficamente dicho valor a una variable de menor tipo o empleando un operador deconversin mediante cast. Los valores de los argumentos de las funciones se convierten a los

    tipos de parmetros de un prototipo de funcin como si se estuvieran asignando directamente a

    variables dichos tipos.

    Clase de datoslongdoubledoublefloatunsignedlongint (sinnimo deunsignedlong)longint (sinnimo delong)unsignedint (sinnimo deunsigned)Intunsignedshortint (sinnimo deunsignedshort)shortint (sinnimo deshort)

    unsignedcharShortChar

    Tabla 10.1.Jerarqua depromociones de las clases de datos estndar de C++

    SOLUCIN DE PROBLEMAS EN ACCIN:Programacin estructurada LEY DE OHM

    PROBLEMA

    En lecciones anteriores, hemos desarrollado un programa de la ley de Ohm que maneja mens, controlado

    por un ciclo. Sin embargo, aunque desarrollamos un diseo estructurado, empleamos una implementacinlinealpara codificar el diseo. Es tiempo de hacer lo correcto y emplear programacin estructurada por

    medio de las funciones para instrumentar el diseo estructurado. Esta es la definicin del problema quedesarrollamos anteriormente:

    DEFINICIN DEL PROBLEMA

    Salida: El men que pida al usuario seleccionar una opcin de clculo devoltaje,corriente oresistencia.Se necesita un mensaje para entradas no vlidas.

    Un valor de voltaje,corriente oresistencia, dependiendo de la opcin delprograma que el usuario seleccione.

    Entrada: Una respuesta del usuario almen (V, C,R oS)Si selecciona V: el usuario escribe los valores para corriente yresistencia.Si selecciona C: el usuario escribe los valores paravoltaje yresistencia.Si seleccionaR: el usuario escribe los valores paravoltaje ycorriente.Si selecciona S: el programatermina.

    Procesamiento: Calcula la opcin seleccionada.CaseV: Voltaje = Corriente xResistencia.Case C: Corriente = Voltaje /Resistencia.CaseR:Resistencia = Voltaje /Corriente.CaseS: Termina el programa.

    Elmen se repite hasta que el usuario decideterminar el programa

  • 8/2/2019 04-leccion10y16-MToledo

    26/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-26

    PLANEACIN DE LA SOLUCIN

    Con el uso del diseo de programacin estructurada, dividiremos el problema en subproblemasindividuales para solucionar el problema general. Hay dos tareas importantes que surgen directamente a

    partir de la definicin del problema:

    Mostrar elmen y leer la opcin del usuario. Realizar los clculos seleccionados ymostrar los resultados.

    Primero, el programa deber mostrar un men de selecciones al usuario. El usuario escribir su eleccin

    desde el men y dependiendo de su opcin, se har uno de los tres clculos para determinar la cantidad

    solicitada. Eldiagrama de estructura en lafigura 10.4 muestra eldiseo descendente.

    opcin

    opcin

    Figura 10.4.Diagrama de estructura para el problema de la ley de Ohm

    Observe que hay ahora tres niveles de solucin del problema. En el primer nivel ohm(), llama a unafuncin para mostrar el men y obtener la seleccin del usuario. La funcinmuestraMenu() realiza estatarea y enva la seleccin del usuario deregreso amain() como se indica en el diagrama. La funcinohm ()enviar la seleccin a lafuncin llamada leyDeOhm(), que llamar una de las tresfunciones, dependiendode la seleccin, para realizar los clculos requeridos. Ahora, la descripcin del proceso requiere que

    agreguemos al programa una caracterstica de control del ciclo. Aqu se muestra el conjunto de algoritmos

    revisados a travs del primer nivel de refinamiento

    ALGORITMO INICIAL

    ohm ()INICIO

    hacerLlama a la funcinmuestraMenu().Llama a la funcinleyDeOhm().

    mientras (opcin != s Yopcin != S)FIN.

    El primer nivel de refinamiento muestra el contenido demuestraMenu() y leyDeOhm(), como sigue:

    ohm()Llama amuestraMenu()Llama a leyDeOhm()

    muestraMenu()Muestra elmen y obtiene

    la opcin del usuario

    leyDeOhm()Realiza elclculo seleccionado

    y muestra los resultados

    calculaVoltaje()

    si opcin V: calcula ymuestra elvoltaje.

    calculaCorriente()

    si opcin C: calcula ymuestra lacorriente

    calculaResistencia()

    si opcinR: calcula ymuestra laresistencia

  • 8/2/2019 04-leccion10y16-MToledo

    27/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-27

    PRIMER NIVEL DE REFINAMIENTO

    muestraMenu()Inicio

    Muestra el men del programa que pide al usuario seleccionar la opcin devoltaje (V),corriente (I),resistencia (R) osalir (S).Leer(opcion).

    Fin..

    leyDeOhm()Inicio

    CasoV:Llama a la funcincalculaVoltaje().CasoC:Llama a la funcincalculaCorriente().CasoR:Llama a la funcincalculaResistencia().CaseS: Termina el programa.sino: escribir(Entrada no vlida, seleccionar de nuevo).

    Fin.

    Observe que la caracterstica de control del ciclo se adiciona al nivel del algoritmo inicial ohm () Losalgoritmos muestraMenu()y leyDeOhm() del primer nivel de refinamiento no han cambiado respecto denuestra solucin anterior. As es que, enfoqumonos en el control del ciclo en ohm () Recordemos que la

    funcinmuestraMenu()obtiene la opcin del men del usuario. Si el usuario introduce una s o S para salirdel programa, se romper el ciclo y el programa termina. Pero, hay algn error aqu? La seudocodificacindice si el usuario introduce una so S el programa se termina, sin embargo, la verificacin del cicloemplea la operacin Y. Entonces, por qu se utiliza la operacin Yen lugar de la operacin O para realizaresta verificacin? Este es un candidato clsico para explicar en el escritorio la lgica del algoritmoantes decodificar el programa. Pregntese cundo se romper el ciclo? Un ciclodo/while se rompe cuando elestado verificado es falso, correcto? Recuerde que el resultado de una operacin Yes falso cuando algunode sus estados es falso. Como resultado, el ciclo se romper cuando opcion sea una s o unaS. El ciclocontinuar cuando sean verdaderos ambos lados de la operacin Y. Por tanto, el ciclo continuar siempre ycuando opcion no sea una s y opcion no sea S. No es esto lo que queremos hacer? Qu pasara sierrneamente usara la operacin Oen la prueba del ciclo anterior? Una operacin O produce un resultadoverdadero cuando alguna de sus condiciones es verdadera. Una de estas condiciones podra ser siempre

    verdadera, dado queopcin no puede sers y S. El resultado de este descuido ser unciclo infinito.

    Necesitamos hacer otra aclaracin aqu. Esta aplicacin es un candidato clsico para el ciclodo/while envez de un ciclo while, porque siempre querr que el men se muestre por lo menos una vez para permitirleal usuario la seleccin de unaopcin.

    Ahora, necesitamos un segundo nivel de refinamiento para mostrar el contenido de las funciones de

    clculo:

    SEGUNDO NIVEL DE REFINAMIENTO

    calculaVoltaje()Inicio

    Escribir(Favor de introducir un valor para la corriente).

    Leer(corriente).Escribir(Favor de introducir un valor para la resistencia).Leer(resistencia).siresistencia < 0

    escribir(Entrada no vlida, ejecutar el programa de nuevo).sino

    Calcula voltaje =corriente xresistencia.escribir(voltaje).

    Fin.

    calculaCorriente()Inicio

  • 8/2/2019 04-leccion10y16-MToledo

    28/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-28

    Escribir(Favor de introducir un valor para el voltaje).Leer(voltaje).Escribir(Favor de introducir un valor para la resistencia).Leer(resistencia).siresistencia

  • 8/2/2019 04-leccion10y16-MToledo

    29/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-29

    acepta una(s) variable(s), cambia y regresa la(s) variable(s) modificada(s) al programa llamador. En otraspalabras, si eldiagrama de estructura indica que lafuncin produce un valor sencillo, utilice una funcinsin void. Si el diagrama de estructura indica que la funcin no acepta ni regresa nada, o si la funcinacepta y regresa una variable determinada, utilice una funcin void. Estos lineamientos se resumen en latabla 10.1. Debido a que nuestrafuncinmuestraMenu() no acepta nada, pero regresa la opcin del mendel usuario, deber ser unafuncin sin void. As, la clase deregreso deber serchar, porque laopcin delusuario ser uncarcter desde el men.

    TABLA 10.1CLASE DEREGRESO DE LAFUNCIN

    Regresa Clase de datosreturn

    Un valor sencillo Sin voidNada voidValores mltiples void

    Despus, decidiremos los parmetros de lafuncin. La tabla 10.2 proporciona las pautas para determinar siun parmetro determinado deber ser un valor o unparmetro dereferencia.

    TABLA 10.2PARMETROS DEFUNCIONES

    Acepto o regresa Parmetro

    No acepta NingunoAceptasin regresar Valor(en un sentido)

    Acepta y regresa Referencia(en dos sentidos)

    Ningn parmetro se requiere paramuestraMenu(), porque no acepta nada, de esta manera la interfaz dela funcin es solamente:

    charmuestraMenu(void)

    Ahora, simplemente colocamos el cdigomuestraMenu(void) desarrollado al principio dentro de lafuncin. Aqu est lafuncin completa:

    charmuestraMenu(){

    // Define la variable local opcion

    charopcion = S;

    // Genera el men y obtiene la opcin del usuario

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    30/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-30

    Observe que nuestra variable opcion ahora est definida como una variable local dentro de la funcin.Adems, un enunciadoreturn se coloca al final de lafuncin para regresaropcion a sufuncin de llamadaohm ().

    Despus, vamos a desarrollar la funcin leyDeOhm(). Empecemos a desarrollar la interfaz de la funcin.En eldiagrama de estructura es fcil de ver lo siguiente:

    Funcin leyDeOhm(): Realiza el clculo de la opcin y muestra los resultados.

    Acepta: La entrada opcin del men, obtenida desdemain().Regresa: Nada.

    A partir de la descripcin de la interfaz, es fcil ver que se deber usar unafuncinvoidporque la funcinno regresa nada. Aunque la funcin muestre los resultados, no est regresando ningn valor a su funcinde llamadaohm (). Sin embargo, esta funcin necesita aceptar la opcin del men desde ohm (). Estosignifica que necesitamos unparmetro defuncin. Ahora la pregunta es: Elparmetro es de valor o dereferencia?. Bien, si es de un sentidodentro de lafuncin, el parmetro deber ser de valor. Si es endossentidos, entrada y salida de lafuncin, deber ser unparmetro de referencia. Debido a que acepta esteparmetro, perono loregresa, deber ser unparmetro de valor, correcto? Elparmetro necesario es uncarcter, as la interfaz de la funcin se convierte en:

    voidleyDeOhm(charopcion)

    Ahora, al insertar nuestro cdigo de enunciado de intercambio en elcuerpo de lafuncin, se obtendr:

    voidleyDeOhm(charopcion){

    // Establecer la precisin de la salida.

    cout.setf(ios::fixed);cout.precision(2);

    switch(opcion){

    case 'v'case 'V':

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    31/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-31

    Observe que la funcin emplea el enunciadoswitch, que acta en laseleccin del usuario, opcion, que serecibe como unparmetro desde lafuncin de llamada, ohm (). Despus, veremos que cada caso de la leyde Ohm llama a otra funcin como parte de un enunciado cout para calcular el voltaje, corriente oresistencia requeridos, dependiendo del valor deopcion. Cadafuncin de la ley de Ohmregresar un valorsencillo de voltaje, corriente o resistencia, dependiendo del case que se ejecute. Esto le sugiere el tipo defunciones (void o sin void)? Por ltimo, observe que no hay enunciado return en nuestra funcinleyDeOhm() porque es unafuncinvoid.

    Enseguida se presentan las descripciones de interfaz para cada una de lasfunciones de la ley de Ohm:

    FuncincalculaVoltaje(): Obtiene del usuario lacorriente yresistencia y usa le ley de Ohm paracalcular el voltaje.

    Acepta: Nada.Regresa: Voltaje.

    FuncincalculaCorriente(): Obtiene del usuario el voltaje yresistencia y usa la ley de Ohm paracalcular lacorriente.

    Acepta: Nada.Regresa: Corriente.

    FuncincalculaResistencia(): Obtiene del usuario el voltaje ycorriente y usa la ley de Ohm para

    calcular laresistencia.Acepta: Nada.Regresa: Resistencia.

    Cada una de estasfunciones tendr la misma interfaz, excepto, desde luego, para elnombre de lafuncin.Cada funcin ser una funcin sin void, porque la funcin produce y regresa un solo valor. Ningnparmetro se requiere, porque ninguna de las funciones necesita aceptar ningn dato de la funcin dellamada leyDeOhm(). Probablemente piense que cada una de las funciones necesita las dos cantidadesdesconocidas en la ecuacin de la ley de Ohm para hacer el clculo necesario. Sin embargo, estas

    cantidades se obtienen del usuario dentro de cada una de las funciones y no desde la funcin de llamadaleyDeOhm(). A continuacin se dan las interfaces de lafuncin resultante:

    floatcalculaVoltaje(void);

    floatcalculaCorriente(void);floatcalculaResistencia(void);

    Ahora, todas lasfunciones completas:

    floatcalculaVoltaje(){

    // Define variables locales

    floatcorriente = 0.0; // Corriente en miliamperesfloatresistencia = 0.0; // Resistencia en Kilo-ohms.

    // Obtiene la corriente y la resistencia

    cout >corriente;cout >resistencia;

    // Verifica que la resistencia sea < 0 y calcula el voltaje

    if(resistencia < 0){

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    32/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-32

    returncorriente *resistencia;

    }// Fin de calculaVoltaje()

    floatcalculaCorriente(){

    // Define variables locales

    floatvoltaje = 0.0; // Voltaje en volts

    floatresistencia = 0.0; // Resistencia en kilo-ohms

    // Obtiene el voltaje y resistencia

    cout > voltaje;cout >resistencia;

    // Verifica que la resistencia sea

  • 8/2/2019 04-leccion10y16-MToledo

    33/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-33

    Estamos listos para combinar todo en un programa completo. Es el siguiente:

    /* El siguiente programa:MENU.CPP, muestra el concepto deprogramacin estructurada */

    Salida: Unmen del programa le pide al usuario seleccionar una opcin paracalcular el Voltaje, Corriente oResistencia.

    Se debe enviar un mensaje en el caso de hacer una seleccin invlida.Mostrar un valor del Voltaje, Corriente oresistencia dependiendo dela opcin que el usuario seleccione.

    Entrada: Una respuesta del usuario almen (V, C,R o S). Si se seleccionaV: escribe un valor para lacorriente y laresistencia. Si seleccionaC: escribe un valor para voltaje yresistencia. si seleccionaR: escribe un valor para voltaje ycorriente. Si seleccionaS: elprograma termina.

    Procesamiento: Clculo de la opcin seleccionadaCase V: Voltaje = Corriente xResistencia.Case C: Corriente = Voltaje /Resistencia.CaseR:Resistencia = Voltaje /Corriente.Case S: Termina el programa.

    */

    #include // Para cin y cout.// Funciones prototipo

    char muestraMenu(void); // Muestra el men de la ley de Ohm

    voidleyDeOhm(charopcion); // Obtiene la opcin del men y llama la funcin// de la ley de Ohm necesaria

    floatcalculaVoltaje(void); // Calcula el voltajefloatcalculaCorriente(void); // Calcula la corrientefloatcalculaResistencia(void); // Calcula la resistencia

    voidmain(void)

    {// Definicin de variables argumentos de la funcin.

    charopcion = 'S'; // Entrada del usuario desde el men.

    // Muestra el mensaje de la descripcin del programa.

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    34/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-34

    // Genera el men y obtiene la opcin del usuario

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    35/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-35

    // Obtiene la corriente y resistencia

    cout >corriente;cout >resistencia;

    // Verifica que la resistencia sea < 0 y calcula el voltaje

    if(resistencia < 0){

    cout resistencia;

    // Verifica que la resistencia sea

  • 8/2/2019 04-leccion10y16-MToledo

    36/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-36

    Lo primero que se ve en la parte superior del programa son las funciones prototipo. Estas slo se copiarondel encabezado de la funcin agregando un punto y coma al final de cada una. El buen estilo dice que cadaprototipo deber comentarse de acuerdo con el propsito de la funcin. Recuerde que C++ requiere unprototipo para cada funcin para que pueda verificar la precisin de las llamadas de la funcin. Acontinuacin, se sorprender de la simplicidad de la funcinmain(). Todo lo que hace es escribir unmensaje de descripcin del programa y llamar nuestras dos funciones principales dentro de un ciclo decontrol del programa. La mayor parte del trabajo real del programa se hace dentro de las funciones. Estoes la programacin estructurada! El resto del programa contiene cada una de las funciones que hemosexplicado anteriormente.

    SOLUCIN DE PROBLEMAS EN ACCIN:Estado de cuenta de una cuenta de ahorros.

    En la leccin 4, empleamos elrefinamiento sucesivo ( paso a paso) para disear una solucin para unaaplicacin de cuentas de ahorro. Codificamos la solucin usando implementacin linealporque, en esemomento, no se conoca cmo aplicar un diseo estructurado usando lasfuncionesC++. Vamos a revisaresta aplicacin con nuestro reciente conocimiento de funciones. Aqu est el enunciado del problema otravez:

    PROBLEMA

    Su banco local lo contrat para disear un programa estructurado que procese datos de las cuentas deahorro. Desarrolle una serie de algoritmos relacionados con el uso del mtodo de diseo estructurado de

    arriba-abajo (descendente) que se pueda codificar en un lenguaje de programacin estructurada.

    DEFINICIN DEL PROBLEMA

    Salida El programa debe generar unreporte que muestre lastransacciones (balancedel mes anterior,depsitos y retiros del mes actual) de la cuenta y elbalanceactual para una cuenta de ahorro en un mes determinado.

    Entrada Supondremos que el usuario ingresar la informacin de las transaccionesmensualmente e incluir elbalance del mes anterior, losdepsitos yretiros delmes actual.

    Procesamiento El programa debe agregar albalance del mes anterior losdepsitos, restar los

    retiros , calcular y agregar el inters del mes para determinar el balanceactual.

    PLANEACIN DE LA SOLUCIN

    Con el uso del diseo estructurado, empezaremos en dividir el problema en subproblemas para solucionar

    el problema bancario. Trate de identificar las tareas individuales para solucionar el problema. Primero, el

    usuario debe ingresar los datos de la transaccin requerida, las cuales incluirn el balance del mes anterior,

    depsitos y retiros del mes actual. Una vez que se ingresan los datos de la transaccin, el programa debe

    adicionar los depsitos al balance de la cuenta, restar los retiros de la cuenta, calcular el inters y generar el

    reporte necesario. Como resultado, podemos identificar cinco tareas del programa como sigue:

    // Verifica que la corriente sea == 0 y calcula la resistencia

    if(corriente == 0){

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    37/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-37

    Obtener del usuario losdatos de la transaccin. Agregar losdepsitos al balance anterior de la cuenta. Restar losretiros del balance anterior de la cuenta. Calcular el inters de la cuenta. Generar elreporte mensual de la cuenta.

    La figura 10.5 muestra el diagrama de la estructura en donde se ven los bloques necesarios para elprograma:

    Figura 10.5.Diagrama de estructura para elproblema bancario.

    Debido a que usaremos la tcnica estructurada de bloques para disear el programa, debemos emplear el

    refinamiento paso a paso para desarrollar el algoritmo. El nivel de algoritmo inicial, main(), reflejar ladefinicin del problema y llama a los mdulos de los subprogramas individuales o funciones como sigue:

    ALGORITMO INICIAL

    estadoCuenta()INICIO

    Llamar a la funcinobtenerDatos() para obtener los datos de la transaccin.Llamar a la funcin agregarDepositos() para adicionar los depsitos en lacuenta.

    Llamar a la funcinrestarRetiros() para restar los retiros de la cuenta.Llamar a la funcincalcularInteres para calcular el inters de la cuenta.Llamar a la funcingenerarReporte() para mostrar el reporte de la cuenta.

    FIN.

    El primer nivel de refinamiento requiere que mostremos un algoritmo detallado para cada mdulo del

    subprograma o funcin. Estos son como sigue:

    PRIMER NIVEL DE REFINAMIENTO

    obtenerDatos()Inicio

    Escribir (Introducir balance del mes anterior).Leer(balanceAnterior).Escribir (Introducir los depsitos del mes actual).Leer(depositos).Escribir (Introducir los retiros del mes actual).Leer(retiros).

    Fin.

    estadoCuenta()Determinacin del balance mensual de una cuenta de ahorros

    obtenerDatos()

    Obtencin de los datos

    de las transacciones

    agregarDepositos()

    Adicin de los depsitos

    restarRetiros()

    Substraccin de retiros

    calcularInteres()

    Clculo del interes

    generarReporte()

    Generar el reporte

  • 8/2/2019 04-leccion10y16-MToledo

    38/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-38

    agregarDepositos()Inicio

    CalcularbalanceActual=balanceAnterior +depositos.Fin.

    restarRetiros()Inicio

    CalcularbalanceActual=balanceActual retiros.

    Fin.

    calcularInteres()Inicio

    CalcularbalanceActual=balanceActual+ (balanceActual* interes).Fin.

    generarReporte()Inicio

    Escribir(balanceActual).Escribir(depositos).Escribir(retiros).

    Fin.

    Con nuestro conocimiento de funciones podemos modificar el diagrama de estructura, como se muestraen lafigura 10.6. Observe lo que se ha adicionado. Primero, el cuadro en la parte superior est etiquetadocomo estadoCuenta () y simplemente llama a las funciones individuales en el orden en que stas senecesitan para solucionar el problema. Segundo, los objetos de datos que pasan a las funciones, o desdestas, se muestran en las lneas que conectan a estadoCuenta() con lasfunciones. Los objetos queaceptalafuncin se muestran a la izquierda de la lnea de conexin y los objetos que regresa la funcin semuestran a la derecha de la lnea como sigue:

    Si un objeto dedatos va en un sentidodentro de lafuncin, es unparmetro de valor. Si un objeto dedatos va en unsentidofuera de lafuncin, es un valor de regreso. Si un objeto dedatos va en dos sentidosdentro yfuera de lafuncin, es unparmetro de

    referencia.

    Para construir el diagrama estructurado extendido, deber considerar una definicin de problema paracadafuncin describiendo la interfaz defuncin en trminos de lo queaceptayregresa. Vamos a empezarcon lafuncinobtenerDatos().

    FuncinobtenerDatos(): Obtiene del usuario elbalance actualde la cuenta,depositos yretiros.Acepta: Conserva el lugar para un objeto variable parabalance,depositos yretiros.Regresa: Balance,depositos yretiros.

    La funcin obtenerDatos() deber obtener entradas del usuario y regresarlas al programa llamadorestadoCuenta(). Como resultado, lafuncin deberaceptar un lugar para unobjeto variable colocado paracada entrada del usuario. Lafuncin obtendr del usuario un valor para llenar cada lugar para la variable ydespusregresar la variable a estadoCuenta(). Esta descripcin de interfaz se representa en eldiagramade estructura de lafigura 10.6, mediante la muestra de las variables balance, depositos y retiros que van

    dentro yfuera del mdulo de lafuncinobtenerDatos(). Esto significa que los tres debern serparmetrosde referencia, dando origen a una interfaz de funcin de:

    voidobtenerDatos(float&balance,float&depositos,float&retiros)

  • 8/2/2019 04-leccion10y16-MToledo

    39/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-39

    Figura 10.6. Diagrama de estructura extendido que muestra los elementos de datos fluyendo hacia o desde lasfunciones de la cuenta bancaria.

    La interfaz de funcinagregarDepositos() se puede describir como sigue:

    FuncinagregarDepositos(): Aade losdepositos albalance actual.Acepta: El balance y los depositos de la cuentaactual.

    Regresa: Unnuevo balance de cuenta.

    Estafuncin necesita que reciba el balance y losdepositos actuales de la cuenta para calcular yregresar elnuevo balance. Como resultado, la funcinaceptabalance y depositos; balance entoncescambia por laadicin de los depositos y balanceregresa a estadoCuenta (), como se muestra en el diagrama deestructura. Observe quebalance va en dos sentidos,dentro yfuera de lafuncin, mientras quedepositosva solamente en un sentido, dentro de lafuncin. Esto significa que balance deber ser un parmetro dereferencia ydepositos, unparmetro de valor. Por lo tanto, lafuncin interfaz resultante ser:

    voidagregarDepositos(float&balance,floatdepositos)

    La funcin restarRetiros() recibe el balance y el retiro actual de la cuenta, resta los retiros y regresa elnuevobalance de la cuenta. Con esta informacin, esta interfaz se puede describir como sigue:

    FuncinrestarRetiros(): Resta losretiros delbalance actual.Acepta: Elbalance y losretiros actuales de la cuenta.Regresa: Un nuevobalance de la cuenta.

    Eldiagrama de estructura ejemplifica esta informacin mostrandobalance que va en dos sentidos,dentroyfuerade lafuncin, mientrasretiros va solamente en un sentido, dentrode lafuncin. De esta manera,balance ser un parmetro de referencia, y retiros un parmetro de valor. La interfaz de lafuncinresultante es:

    voidrestarRetiros(float&balance,floatretiros)

    Despus, lafuncincalcularInteres()recibe elbalance de la cuenta, calcula el inters mensual lo adicionaalbalance y regresa elbalance. Estafuncin se puede describir como sigue:

    FuncincalcularInteres(): Adiciona el inters mensual al balance de lacuenta

    Acepta: Elbalance actual de la cuenta.Regresa: Un nuevobalance de la cuenta.

    obtenerDatos()

    Obtencin de los datos

    de transacciones

    agregarDepositos()

    Adicin de los depsitos

    restarRetiros()

    Substraccin de retiros

    calcularInteres()

    Clculo del interes

    generarReporte()

    Generar el reporte

    estadoCuenta()

    Determinacin del balance mensual de una cuenta de ahorros

    balancedepositosretiros

    balanceDepositosRetiros

    balancedepositos

    balance balanceretiros

    balance balance balance balanceDepositosretiros

  • 8/2/2019 04-leccion10y16-MToledo

    40/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-40

    Aqu, la funcin acepta el balance de la cuenta, que ha cambiado por la adicin del inters mensual yregresa a estadoCuenta () por medio de la funcin. Transcribiendo esta informacin al diagrama deestructura, se encuentra que balance va dentro y fuera del mdulo de la funcin calcularInteres(). Lainterfaz resultante es:

    voidcalcularInteres(float&balance)

    Por ltimo, lafuncingenerarReporte() recibe elbalance,depositosyretiros de la cuenta para generar el

    informe de la cuenta. Por lo tanto, estafuncin se describe como sigue:

    FuncingenerarReporte(): Genera elinforme de la cuenta.Acepta: Elbalance,depositos yretiros de la cuenta.Regresa: Nada.

    Para generar el informe de la cuenta, la funcin debe recibir el balance,depositos y retiros de la cuentadesdeestadoCuenta (). Sin embargo, estosvalores no se modifican ni regresan; slo se muestran comoparte del informe por medio de la funcin. De esta manera, el diagrama de estructura indica balance,depositos yretiros en un solo sentido, dentro del mdulo de lafuncin. Esto significa que stos debern serparmetros de valor, correcto? La interfazde lafuncin resultante es:

    voidgenerarReporte(floatbalance,floatdepositos,floatretiros)

    Cercirese de ver cmo se muestra la descripcin en el diagrama de estructura de la interfaz para cada

    funcin y cmo se traduce el diagrama de estructura directamente al cdigo interfaz C++. Si un objeto dedatos solamente se presenta fuera de la funcin, es un valor de regreso. Observe que no hay variables que

    slo estn presentes fuera de cualquiera de las funciones. Como resultado, todas las funciones tienen clases

    de regreso void. Si un objeto slo va dentro de la funcin, es un parmetro de valor. Si un objeto est dentroy fuera de la funcin, es un parmetro de referencia y debe estar precedido de un smbolo ampersand en el

    prototipo.

    Por ltimo, empleando las interfaces de la funcin, los algoritmos y combinando todo, obtenemos elsiguiente cdigo:

    CODIFICACIN DEL PROGRAMA

    La solucin del problema anterior se puede codificar fcilmente en cualquier lenguaje de programacin

    estructurada. A continuacin los algoritmos anteriores se codifican en C++.

    /* El siguiente programa:ESTRUC1.CPP, muestra la naturaleza estructurada en bloquesde C++.

    */

    #include // Para cin y cout.

    // Define INTERES como una constante global.

    constfloatINTERES = 0.001; // Impuesto mensual actual.

    // Prototipo de funciones.

    voidobtenerDatos(float&,float&,float&);voidagregarDepositos(float&,float);voidrestarRetiros(float&,float);voidcalcularInteres(float&);voidgenerarReporte(float,float,float);

  • 8/2/2019 04-leccion10y16-MToledo

    41/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-41

    voidmain(void){

    // Define las variables del argumento de la funcin

    floatbalance = 0.0; // Balance de la cuenta.floatdepositos = 0.0; // Depsitos mensuales.floatretiros = 0.0; // Retiros mensuales.// Muestra el mensaje de descripcin del programa.

    cout retiros;

    }// Fin obtenerDatos()

    // Esta funcin adiciona los depsitos mensuales al balance de la cuenta.

    voidagregarDepositos(float&balance,floatdepositos){

    balance =balance +depositos;

    }// fin agregarDepositos()/ Esta funcin sustrae los retiros mensuales desde el balance de la cuenta.voidrestarRetiros(float&balance,floatretiros)

    {balance =balance -retiros;

    }// Fin restarRetiros()

    // Esta funcin adiciona los intereses mensuales al balance de la cuenta.

    voidcalcularInteres(float&balance){

    balance =balance + (balance *INTERES);}// Fin calcularInteres()

    // Esta funcin muestra el reporte mensual de la cuenta.

    voidgenerarReporte(floatbalance,floatdepositos,floatretiros){

    cout

  • 8/2/2019 04-leccion10y16-MToledo

    42/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-42

    Eso es todo! Ahora debe tener el conocimiento para comprender todas las facetas de este problema, desdeeldiseo estructurado alprograma estructuradoC++.

    LO QUE NECESITA SABER

    Antes de continuar con la siguiente leccin, asegrese de haber comprendido los

    siguientes conceptos:

    !!!!"La mejor manera de desarrollar y dar mantenimiento a un programa grande es dividirlo en variosmdulos ms pequeos, que son ms fciles de manejar que el programa completo. Los mdulos seescriben en C++como clases y funciones.

    !!!!"Conforme sus programas se hacen ms complejos, puede dividirlos en partes ms pequeas llamadas

    funciones.

    !!!!"Una funcin se invoca por medio de una llamada de funcin. Dicha llamada menciona la funcin por

    su nombre y proporciona la informacin (en forma de argumentos) que necesita para realizar su tarea.

    !!!!"El propsito de la ocultacin de informacin es que las funciones tengan acceso nicamente a lainformacin que necesitan para completar su tarea. Esta es una manera de implementar el principio de

    menor privilegio, uno de los ms importantes para la buena ingeniera de software.

    !!!!"Las funciones se invocan normalmente en los programas escribiendo su nombre seguido de sus

    argumentos entre parntesis.

    !!!!"Todas las funciones definidas por el usuario que se usan en main() se definen despus de cerrar lallave demain().

    !!!!"La funcin se define escribiendo un encabezado defuncin, que incluye la clase de regreso, elnombre de lafuncin y una lista de parmetros. El cuerpo o seccinde enunciadode lafuncinsigue al encabezadode lafuncin.

    !!!!"Cadafuncin debe de tener unnombre nico.

    !!!!"Lasfunciones puedenregresar un valor al programa llamador y puedenrecibir informacin llamadas

    parmetros.!!!!"Si unafuncinregresa un valor, debe definir el tipo del valor regresado ( int, char , etc.) antes del

    nombrede lafuncin; en caso contrario tiene que preceder alnombrede lafuncinconvoid.

    !!!!"Si lafuncin recibeparmetros, debe definir unnombre nico para cadaparmetro as como su tipo.Si lafuncinno recibeparmetros, debe colocar la palabra reservada voiddentro de los parntesis quesiguen alnombrede lafuncin.

    !!!!"C++ debe saber el tipo de valor que regresa la funcin y el nmero y tipo de parmetros que lafuncin recibe. Si la definicin de lafuncin se encuentra posteriormente a la utilizacin de la misma,debe de colocar unprototipo defuncin al principio de su programa fuente.

    !!!!"A diferencia del lenguaje C, el lenguaje C++ necesita que cada funcin tenga un prototipo. Losprototipos de lasfunciones deben listarse antes quemain() e incluir las clases de datos de regreso delafuncin, elnombre de lafuncin y una lista de las clases de datosdeparmetro.

    !!!!"Losprototipos se usan por el compilador para verificar el nmero apropiado de argumentos cuando sellama a lafuncin.

    !!!!"Las funciones en C++ se pueden hacer para regresar un valor sencillo para el programa llamador orealizar algunatarea especfica.

    !!!!"Cuando se disea una funcin para regresar un valor sencillo al programa llamador, el valorregresado reemplaza elnombre de lafuncin en donde se use elnombre en el programa llamador. Deesta manera, el nombre de lafuncin puede aparecer como parte de un operador de asignacin, unenunciadocout, un operador aritmtico o una verificacin de enunciado.

    EXAMEN BREVE 29

  • 8/2/2019 04-leccion10y16-MToledo

    43/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-43

    !!!!"Cuando se disea una funcin para realizar una tarea especfica, se llama a la funcin empleando elnombre de lafuncin (seguido por una lista de argumentos reales) como un enunciado en elprograma.

    !!!!"Los argumentos reales son datos que pasan a la funcin cuando se llama a la funcin. Losparmetros formales se definen dentro del encabezadode lafuncin y toman el (los) valor (valores)de losargumentos reales cuando se llama a lafuncin.

    !!!!"Los parmetros pueden pasar entre el programa llamador y la funcin por medio de valor oreferencia. Cuando pasanparmetros por medio de valor, los argumentos reales en el programallamador no se afectan por las operaciones sobre los parmetros formales dentro de la funcin.Cuando pasan los parmetros por medio de referencia, los argumentos reales en el programallamador reflejarn cualquier cambio a losparmetros formales dentro de lafuncin.

    !!!!"De esta manera, el paso de los parmetros por medio de valor es una comunicacin de datos en unsentido desde el programa llamador a la funcin. El paso de los parmetros por referencia es unacomunicacin de datos en dos sentidos desde el programa llamador a la funcin y de regreso alprograma llamador.

    !!!!"Losargumentos de unafuncin pueden serconstantes, variables y expresiones.

    !!!!"Las variables localesslo son conocidas dentro de la definicin de una funcin. No se permite que lasfunciones conozcan los detalles de implementacin de las demsfunciones (incluyendo sus variableslocales).

    !!!!"El formato general de una definicin defuncin es:

    claseValorDevueltonombreFuncion(listaParametros)

    {

    cuerpoFuncion;

    }

    La claseValorDevuelto es la clase del valor que se le devuelve al invocador. Si una funcin nodevuelve un valor, claseValorDevuelto se declara void. El nombreFuncion es cualquier identificadorvlido. La listaParametros es una lista separada por comas que contiene las declaraciones de lasvariables que se pasarn a la funcin. Si la funcin no recibe valores, listaParametros se declara comovoid. ElcuerpoFuncion es el conjunto de declaraciones e instrucciones que constituyen la funcin.

    !!!!"Elnmero,claseyorden de los argumentos pasados a una funcin debe ser iguales a losparmetrosde la definicin de lafuncin.

    !!!!"Cuando un programa llega a una funcin, el controlsetransfiere desde el punto de invocacin a lafuncinllamada, se ejecuta dichafuncin y elcontrolse devuelve al indicador.

    !!!!"Lasfuncionesllamadas pueden devolverle el controlal llamador de cualquiera de tres formas. Si lafuncinnodevuelve un valor, elcontrolsedevuelve al llegar a la llave derecha de terminacin de lafuncin, o ejecutando la instruccin:

    return;

    Si lafuncindevuelve un valor, la instruccin:

    returnexpresin;

    devuelve el valor de expresin.

    !!!!"Las funciones que nodevuelven un valor se declaran con una clase de devolucin void. Cualquierintento por devolver un valor desde la funcin o por emplear el resultado de la invocacin de lafuncin en lafuncin invocadora genera un error de sintaxis.

    !!!!"Las listas deparmetros vacas se especifican con parntesis vacos o con voidentre ellos.

    !!!!"Losprototipos defuncin declaran laclase de devolucin de lafuncin y elnmero,clase yorden delosparmetros que espera recibir lafuncin.

    !!!!"Los prototipos de funcin le permiten al compilador verificar que las funciones se llamencorrectamente.

    !!!!"Elcompilador ignora losnombres de variables que se mencionen en elprototipo defuncin.

  • 8/2/2019 04-leccion10y16-MToledo

    44/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-44

    !!!!"Cada biblioteca estndar tiene un archivo de encabezado correspondiente, el cual contiene losprototipos de funcin de todas sus funciones, as como las definiciones de varias constantessimblicas requeridas por dichasfunciones.

    !!!!"Los programas en C++no se compilan a menos que se haya indicado un prototipo de funcin paracadafuncin o que se defina lafuncin antes de utilizarla.

    !!!!"Losprogramadores pueden y deben crear e incluir sus propiosarchivos de encabezado.

    !!!!"Al pasar unargumento utilizando una llamada por valor, se copia el valor de la variable parapasarla

    a lafuncinllamada. Los cambios a la copia que sucedan en dicha funcin no afectan el valor de lavariable original.

    !!!!"En C++, losparmetros de referencia se definen usando un signo ampersand(&), antes delnombredelparmetro en el encabezado de la funcin.

    !!!!"C++ ofrece una forma directa de llamada por referencia, empleandoparmetrosdereferencia. Paraindicar que el parmetro de una funcin se pasa por referencia, ponga en el prototipo de funcin,despus del tipo deparmetro, un &. En la llamada de lafuncin, mencione pornombre a la variabley serpasada como una llamada por referencia. En lafuncinllamada, la mencin de la variable consu nombre localen realidad hace referencia a la variable original del invocador. Por lo tanto, lafuncinllamada puede modificar la variable original.

    !!!!"Tambin se pueden crear parmetros de referencia para utilizarlos localmente como alias de otrasvariables dentro de unafuncin. Las variables dereferencia deben inicializarse en sus declaraciones yno se pueden reasignar como alias de otras variables. Una vez declarada una variable de referenciacomo alias de otra variable, todas las operaciones supuestamente efectuadas sobre el alias en realidadse llevan a cabo en la variable.

    PREGUNTAS Y PROBLEMAS

    PREGUNTAS

    1. Cules son las tres cosas que se deben especificar en el encabezado de una funcin?

    2. Explique la diferencia entre unargumento realy unparmetro formal.

    3. Llene los siguientes espacios en blanco:

    a) Loscomponentes de los programas C++ se llaman ______________ y _____________.b) Lasfunciones se llaman por medio de _____________________.

    c) Las variables que slo son conocidas dentro de la funcin en la que se definen se llaman______________________.

    d) La instruccin ________________ en una funcin llamada sirve para devolverle el valor de unaexpresin al invocador.

    e) La palabraclave ___________ sirve en los encabezados de funcin para indicar que la funcinnodevuelve un valor que sta no contieneparmetros.

    f) El _________________ de un identificador es la parte delprograma en la que dicho identificador puedeutilizarse.

    g) Las tres maneras de devolverle elcontrolal invocador desde unafuncin llamada son ____________,_________________ y __________________.

    h) Un ____________ le permite alcompilador revisar elnmero,clase yorden de losargumentospasados a lafuncin.

    4. Cules de las siguientes encabezado de funcionesno son vlidas? Explique por qu no son vlidas.

    a. floatpromedio(num1,num2)b. intmasGrande(x, y: int)c. floatmasPequeno(floata,b)d. stringresultado (charcarcter)

    5. Escribir el encabezado apropiado para las siguientes funciones:

    a. inverso dex: 1/x

  • 8/2/2019 04-leccion10y16-MToledo

    45/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-45

    b. tan(x)c. Convierta un valor entero a una letra de calificacin.d. Conviertagrados Fahrenheit agrados Celsius.e. Calcule elfactorialde cualquier enteroN(N!).f. Calcule el promedio de tres enteros.g. Lafuncin hipotenusa, que toma dosargumentosde punto flotante de doble precisin, lado1 y lado2, y

    devuelve unresultado de punto flotante de doble precisin.h. La funcinmasPequea(), que tomatresenteros, x,yy z, y devuelve unentero.

    i. La funcin instrucciones(), queno recibe ningn argumento y no devuelve ningn valor. (Nota: talesfunciones sirven por lo general para desplegarle instrucciones al usuario).

    j. La funcinflotante(), que toma unargumentoentero,numero, y devuelve unresultado de punto flotante.

    6. D los prototipos defuncin de la pregunta 4.

    7. Verdadero o falso: Cuando una funcin no tiene una clase de datos de regreso, deber indicar esto con lapalabra reservadanull.

    8. Explique la diferencia entre unparmetro de valor y unparmetro de referencia.

    9. Cuandopasa un parmetro por referencia a unafuncin.

    a. Elargumento realtoma el valor delparmetro formal.b. Elparmetro formaltoma el valor delargumento real.c. Elargumento realrefleja cualquier cambio alparmetro formaldespus de la ejecucin de lafuncin.d. a yb

    e. b y cf. a yc

    10. Cundo usa un operador de asignacin para llamar a una funcin, la funcin debe incluir un enunciado________________.

    11. Cules de los siguientesprototipo defuncionesno son vlidas? Explique por qu no son vlidas.

    a. voidimprimeEncabezado();b. interror(floatnum1,charnum2);c. voidobtenDato(&intcantidad,charfecha);d. floatpromedio(intnumero,floattotal);e. charmuestra(int,char,float);

    12. Verdadero o falso: Un objeto variable definido en main() es visible en todas las funciones llamadas por

    main().13. Cules de los siguientes sonparmetros de valores y cules sonparmetros de referencia?

    a. charprobA(char&A,char&B,floatX, intY);b. intprobB(intnum1, intnum2, intnum3,float&prom);c. floatprobC(int,float,char&);

    14. Escriba el encabezado apropiado para las siguientesfunciones:

    a. Una llamada de funcinmuestra() que deber regresar un valor depunto flotante y recibir un entero, unvalor depunto flotante y uncarcter (en ese orden) cuando se llama.

    b. Una llamada a la funcin saltar() que har que la impresora salte un determinado nmero de lneas,donde el nmero de lneaspara saltar se obtiene desde elprograma llamador.

    c. Una llamada a la funcin intercambiar() que intercambiarlosvalores dedos variables enteras obtenidasdesde elprograma llamador y regresar los valoresintercambiados alprograma llamador.

    d. Una llamada de funcin hipot() que regresar la hipotenusa de un tringulo rectngulo , dados losvalores de loscatetos desde elprograma llamador.

    15. Escribaprototipos para lasfunciones en la pregunta 12.

    16. EscribaenunciadosC++ que llamarn las cuatrofunciones de la pregunta 12.

    17. Dada la siguientefuncin:

    voidintercambia(int&x, int&y){

    inttemp;temp =x;x = y;

  • 8/2/2019 04-leccion10y16-MToledo

    46/60

    MIGUEL . TOLEDO MARTNEZ

    FUNCIONES - LECCIN - 10 10-46

    y =temp;} // Fin de intercambia()

    Determ