Coruniversitaria, Corporación Universitaria de Ibagué
Facultad de Ingeniería de Sistemas

Estructuras de Programación

Inicio

Generalidades

Ejercicios

Talleres

Proyecto

 

 

 Funciones/Métodos con paso de parámetros

  En los lenguajes de programación se contemplan dos formas de paso de argumentos a las funciones. El primer método se denomina llamada por valor. Este método copia el valor de un argumento en el parámetro formal de la subrutina o función. En este caso, los cambios realizados sobre el parámetro no afectan al argumento.

 La llamada por referencia es la segunda forma de paso de argumentos a funciones. Con este método se copia la dirección del argumento en el parámetro. Dentro de la función se usa la dirección para acceder realmente al argumento usado en la llamada. Esto significa que los cambios sufridos por el parámetro se reflejan en el argumento.

 Con unas pocas excepciones, el lenguaje C utiliza la llamada por valor para el paso de argumentos. Esto significa, en general, que el código de la función no puede alterar los argumentos usados en la llamada a la función.

 Aunque el convenio de paso de parámetros de C es la llamada por valor, se puede crear una llamada por referencia pasando un puntero al argumento, en lugar de pasar el propio argumento. Como lo que se pasa a la función es la dirección del argumento, el código de la función puede cambiar el valor del argumento externo a la función. Los punteros o apuntadores se pasan a las funciones como cualquier otro argumento, pero declarando los parámetros como de tipo puntero.

  • Codificar los siguientes programas de computación en Lenguaje C/C++ utilizando FUNCIONES con paso de parámetros:

#include "iostream.h"
#include "conio.h"
#define lp clrscr()
// Comparación de llamada a una función por valor y
//  llamada por referencia.

int CuadradoPorValor(int);           // Prototipos de función
void CuadradoPorRefer(int &);

int main(){
    int x=3, y=4; lp;
    cout << "x= "<<x<<" antes de llamar la funcion   CuadradoPorValor()"<<endl;
// Paso de parámetro por valor. Entrega el valor de x
    cout << "Valor devuelto por la funcion -> "<<   CuadradoPorValor(x)<<endl;
    cout << "x= "<<x<<" despues de llamar la funcion  CuadradoPorValor()"<<endl<<endl;
    cout << "y= "<<y<<" antes de llamar la funcion  CuadradoPorRefer()"<<endl;
    // Paso de parámetro por referencia. Entrega  la dirección de y
    CuadradoPorRefer(y);
    cout << "y= "<<y<<" despues de llamar la funcion "<<endl;
    getch();
    return 0;
}

int CuadradoPorValor(int x)   // La función recibe una copia del valor
{  x *= x;             // equivale a   x = x * x;
    return(x);          // El parámetro del llamador no es modificado
}

void CuadradoPorRefer(int &y)   // La función recibe una dirección 
{
    y *= y;             // El parámetro del llamador se modifica
}

 

  • Escriba un programa modular con un ciclo indeterminado para leer el sueldo de los empleados de la empresa "CompuTAR S.A." y determinar e imprimir: a) Número de empleados de la empresa,  b) Total de nómina,  c) cantidad de mujeres y de hombres,  d) sueldo promedio de mujeres y de hombres,  e) sueldo promedio de los ingenieros de sistemas.

#include "iostream.h"
#include "conio.h"
#include "ctype.h"
#define lp clrscr()
// Programa ejemplo de un bucle (ciclo) indeterminado y
// llamado de funciones con paso de parámetros por valor

float promedio(float, int);    // Prototipos de función
void imprimir(float,float,float,float,int,int,int,int);
void titular();

void main(){
float sueldo; char sexo,sis;
int conte,contm,conth,contis;      // contadores
float acuse,acusm,acush,acusis;  // acumuladores
conte=contm=conth=contis=acuse=acusm=acush=acusis=0;
titular();
cin >> sueldo;
while(sueldo > 0){
       cout << "Sexo(F/M) -> ";
       cin >> sexo;
       sexo=toupper(sexo); // conversion de minuscula a mayuscula
       cout << "Es Ingeniero(a) de Sistemas?(S/N) -> ";
       cin >> sis;
       conte = conte + 1;
       acuse = acuse + sueldo;
       if (sexo == 'F'){
          acusm=acusm + sueldo;
          contm++;}
       else{
             acush=acush + sueldo;
             conth++;}
       if (sis == 'S' || sis == 's'){
           acusis=acusis + sueldo;
           contis++;}
       titular();
       cin >> sueldo;
}
if (contis > 0)
    imprimir(acuse,acusm,acush,acusis,conte,contm,conth,contis);
else
    cout << "No se procesaron sueldos!";
getch();
}

void imprimir(float acuse,float acusm,float acush,float acusis,int conte,int contm,int conth,int contis)
{
   lp;
   cout << "Número de empleados en CompuTAR S.A. :"<< conte <<endl;
   cout << "Total nomina de la empresa $"<< acuse <<endl;
   cout << "Mujeres :"<< contm <<endl;
   cout << "Sueldo promedio de mujeres $"<<  promedio(acusm,contm)<<endl;
   cout << "Hombres :"<< conth <<endl;
   cout << "Sueldo promedio de hombres $"<< promedio(acush,conth)<<endl;
   cout << "Ingenieros de Sistemas :"<< contis <<endl;
   cout << "Sueldo promedio Ing. de Sistemas $"<<  promedio(acusis,contis)<<endl;
}

float promedio(float acum, int cont) // La funcion recibe copia de valores
{
    return(acum/cont);   // devuelve el promedio
}

void titular()
{
    lp;
    cout << "CompuTAR S.A."<<endl;
    cout << "Sueldos de empleados..." << endl<< endl;
    cout << "Digite un $ueldo. Para salir, teclee 0 -> ";
}

--------------------------------------------------------------------

La implementación de un programa como conjunto de funciones es buena desde el punto de vista de la ingeniería de software, pero las llamadas de función generan más carga en tiempo de ejecución. C++ ofrece una mejora con las funciones inline, especialmente en el caso de funciones pequeñas. El siguiente es un ejemplo de una Función en Línea:

#include "iostream.h"
#include "conio.h"
#define lp clrscr()
// Cálculo del volumen de una esfera 
const float PI = 3.14159;
inline float VolEsfera(const float  r){           // Funcion en linea
    return(4.0 / 3.0  * PI * r * r * r);}

 
int main(){
    float  radio; lp;
    cout << "Digite la longitud del radio de la esfera:  ";   
    cin >> radio;
    cout << "El volumen de la esfera con radio "<<radio<<" es  "<< VolEsfera(radio);  // llamado de la función en línea
    getch();
    return 0;
}

  • Programación modular en Pascal: Escribir un programa para determinar y visualizar el más grande de dos números dados (diferentes). Utilizar un procedimiento Mayor con parámetros por valor y por variable.

program NUMAYOR;
uses crt;
var   
   x,y,grande  :  real;

procedure Mayor(a,b : real;  var max : real);
   begin
       if a > b then
               max := a
       else 
               max := b
   end;

BEGIN    
   clrscr;
   repeat
       Write('Por favor, digite dos números -> '); 
        ReadLn(x,y);        
        Mayor(x,y,grande);  { llamada al procedimiento}
        WriteLn('El mayor es ', grande :4:2);  

   until x = 0; 

   ReadLn;   { detiene la ejecucion del programa }
END.

{ El mismo ejemplo anterior, pero ahora utilizando una función }

program NUMAYOR;
uses crt;
var   
   x,y,grande  :  real;

function Mayor(a,b : real) : real;
var
   max : real;

 begin
       if a > b then
               max := a
       else 
               max := b
 end;

BEGIN    
   clrscr;
   repeat
       WriteLn('Por favor, digite dos números: '); 
        ReadLn(x,y);        
        grande := Mayor(x,y);  { llamada a la función }
        WriteLn('El mayor es ', grande :4:2);  

   until x = 0; 

   ReadLn;   { detiene la ejecucion del programa }
END.

______________________________________________

Métodos con paso de parámetros en lenguaje Java:

-------------------------------------------------------------------------

/**
* Pinguino.java
*
*
* @author vGus
* @version 1.00 2008/10/18
*/
import javax.swing.JOptionPane;

class Penguin {
   private float peso;
   public Penguin() {
       peso=0;
   }
   public float getpeso() {
       return peso;
   }
   public void setpeso(float peso) {
       this.peso=peso;
   }

}

public class Pinguino{
   public static void main(String arg[]){
       Penguin P = new Penguin();
       String cadpeso;
       float peso;
       cadpeso = JOptionPane.showInputDialog("Peso del pingüino?");
       peso = Float.parseFloat(cadpeso);
       P.setpeso(peso);
       JOptionPane.showMessageDialog(null,"Peso del pingüino => "+P.getpeso());
   }
}

 

Ejercicios "amistosos"

  1. El parqueadero público "PingüiMóvil" cobra una tarifa mínima de $1200 por estacionarse hasta tres horas; luego cobra $500 adicionales por cada hora o fracción a partir de las tres horas. La tarifa máxima por período de 24 horas es de $10000. Suponga que ningún carro se estaciona por más de 24 horas a la vez. Escriba un programa que calcule e imprima las cuentas por parqueo de tres clientes que dejaron allí sus autos ayer. Digite las horas de parqueo de cada cliente e imprima los resultados en forma tabular (Carro, Horas, Costo) y el total de los recibos de ayer. El programa deberá llamar la función CalcularCosto para determinar el valor a pagar  por cliente.

  2. Escriba una función Potencia(base, exponente) que devuelva el valor de base^exponente. Por ejemplo, Potencia(3, 4) = 3 * 3 * 3 * 3. Suponga que exponente es un entero positivo diferente de cero y que base es un entero. La función Potencia debería utilizar for o while para controlar el cálculo. No utilice funciones de la biblioteca matemática.

  3. Escriba un programa que acepte como entrada una serie de enteros y los pase, uno a la vez, a la función ParNon para determinar si un entero es par. La función deberá devolver 1 si el número es par y 0 si no lo es.

  4. Escriba un programa que utilice una función inline para calcular el área de un círculo.

  5. Escriba una función que presente en el margen izquierdo de la pantalla un cuadrado de asteriscos cuyo lado esté especificado en el parámetro entero L. Por ejemplo, si L es 4, la función visualizará 

          * * * *
          * * * *
          * * * *
          * * * *

   6.  Escriba una función que tome el tiempo como tres argumentos enteros (horas, minutos y segundos) y devuelva el número de segundos transcurridos desde que el reloj "dió las 12". Calcule el tiempo en segundos entre dos horas, ambas comprendidas dentro de un ciclo de 12 horas del reloj.

7. Escriba segmentos de programa que realicen lo siguiente: a) Calcule la parte entera del cociente cuando el entero x se divida entre el entero y.  b) Calcule el residuo cuando el entero x se divida entre el entero y. c) Utilice las partes de programa desarrolladas en a) y b) para escribir una función que acepte un entero entre 1 y 32767 y lo imprima como una serie de dígitos, separando cada uno con dos espacios. Por ejemplo, el entero 4562 deberá imprimirse como 4  5  6  2 

8. Escriba una función que devuelva el menor de tres números reales.

9. Implemente las siguientes funciones: a) La función Celsius devuelve el equivalente en grados centígrados de una temperatura Fahrenheit.  b) La función Fahrenheit devuelve el equivalente en grados fahrenheit de una temperatura en grados centígrados.

10.) Escriba una función que tome un valor entero y devuelva el número con sus dígitos en reversa. Por ejemplo, dado el número 2718, la función deberá devolver 8172.

11). El máximo común divisor de dos enteros es el mayor entero que divide ambos números. Escriba una función que devuelva el máximo común divisor de dos enteros.

12). Un número entero es primo si sólo se puede dividir entre 1 y entre sí mismo. Por ej. 2, 3, 5, 7...  Escriba la función para determinar si un número es primo.

12+1). Los computadores juegan cada vez más un papel importante en la educación. Escriba un programa que ayude a un estudiante de primaria a aprender a multiplicar. Mediante la función rand genere dos enteros de un dígito. Después deberá desplegar una pregunta como

¿Cuánto es 3 veces 7?

El estudiante  tecleará  la respuesta. Su programa deberá llamar la función Respue para revisar la respuesta. Si es correcta, imprimir "Muy bien!!!" y presentar otro problema. Si está equivocada, visualizar "No. Por favor, intente de nuevo!" y permitir que el estudiante responda la misma pregunta hasta que esté correcta.



Inicio | Biografía | Cursos | Para pensar... | Para reflexionar... | Para reir | Enlaces

 
Profesor Gustavo Martínez Villalobos
Email: gustavo.martinez@unibague.edu.co
Facultad de Ingeniería de Sistemas, Coruniversitaria
Ibagué, Tolima, COLOMBIA