viernes, 12 de octubre de 2012

Funciones (subprocesos) en PSeInt

A partir de la version 20121010 (10/Octubre/2012) PSeInt permite la posibilidad de definir funciones al que el creador del mismo bautizó como subprocesos, en este tutorial explicaremos brevemente cómo se tratan dichas funciones.

Para empezar una función no es más que un bloque de código con un determinado fin o propósito, podemos definir más de una y nos permiten ahorrar líneas código si nuestros programas son muy extensos o hay codificación redundante.


Las funciones en PSeInt se identifican por un nombre, comienzan con la palabra reservada Funcion y terminan con FinFuncion. Tambien podemos utilizar SubProceso - FinSubProceso que sería lo mismo. Siempre se declaran afuera del proceso principal para ser llamados o invocados en éste. Tambien opcionalmente pueden retornar un valor o recibir cierta cantidad de argumentos.

A continuación se muestran una serie de ejemplos para comprender mejor esta temática.

Ejemplo 1. Funcion sin parámetros y sin retorno.


En la línea 2 definimos una funcion que se llama mensaje, el fin de ésta es imprimir en pantalla el mensaje ¡Hola Mundo! (línea 4). Si nos fijamos está declarada fuera del proceso principal, para ser llamada (ejecutada) dentro de éste (línea 10). Esta funcion no tiene argumentos, porque no hay nada dentro de los paréntesis y no devuelve un valor.






Ejemplo 2. Funcion con 1 parámetro y sin retorno.


En este otro ejemplo la función mensaje recibe como parámetro (argumento) un valor en este caso una cadena de texto para visualizarla en pantalla. Cuando se llama en el proceso principal (línea 10), obligatoriamente deberemos ingresar un texto ya que sí no lo hacemos generará un error.







Ejemplo 3. Funcion sin parámetros y con retorno.


La estructura de una funcion que retorna un valor es la siguiente:

Funcion variable<-nombre()
 instrucciones...
FinFuncion

En el ejemplo 3 se crea una funcion que suma dos números y el resultado se lo vamos a asignar a la variable res. Ésta entonces contendrá un valor y lo va a retornar. En la línea 10 se llama a la funcion e imprimimos un mensaje para visualizar el resultado. La salida que imprime es: "El resultado es: 10".

Ejemplo 4. Funcion con parámetros y con retorno.

En este ejemplo la funcion suma recibe dos parámetros, en este caso dos números que se van a sumar y guardar el resultado en la variable res. Vemos que en la línea 9 se llama a la función con dos valores (5 y 3), si no se ingresan o por el contrario se agregan más valores el programa generará error. Finalmente el programa imprime: "El resultado es: 8".

Como vimos en los anteriores ejemplos, una función puede tener muchas variantes, dependiendo del caso o del problema a resolver una funcion puede o no llevar parámetros, como tambien puede o no devolver un valor, por eso es importante tener claro estos conceptos para saber cuando utilizarlos o aplicarlos en nuestros programas.

Funciones con pasaje por valor y por referencia

En PSeInt se le pasan argumentos a una funcion de dos formas por valor o por referencia. Hasta ahora en los anteriores ejemplos las funciones que recibieron argumentos fueron por valor ya veremos por que.

Cuando decimos pasaje por valor nos referimos a que los argumentos de la funcion opera con una copia de la variable o el valor que recibió en la llamada de la funcion, por lo que las acciones que se hagan dentro de ésta no afectarán al resto del programa.

La sintaxis para utilizar argumentos por valor es la siguiente:

Forma 1

Sin la palabra clave Por Valor.
Forma que utilizamos en los ejemplos.





Forma 2


Con la palabra clave Por Valor.




Ambas son válidas, depende del programador que forma quiera utilizar. Recomiendo la forma 1.

Realizaremos un ejemplo más completo para entender mejor el pasaje por valor.

Ejemplo 5. Funcion con pasaje por valor.


En la línea 1 declaramos una función llamada miFuncion que recibe un argumento. Lo que hará esta funcion simplemente es sumarle 5 al valor que reciba en el argumento (línea 3) e imprimirlo (línea 5).

En el proceso principal declaramos una variable llamada i inicializada en 20. En la línea 14 invocamos a la funcion miFuncion y le pasamos como parámetro nuestra variable i. La línea 16 imprime el valor de i.

Cuando ejecutamos el programa, la salida que produce es:

25
El valor de i es: 20

El primer valor 25 se debe a que a la funcion le estamos pasando una variable cuyo valor es 20, dentro de la funcion este valor cambia a 25 pues hace la siguiente operacion a<-20+5 e imprime el valor de a osea 25.

En la otra salida ("El valor de i es: 20"), simplemente estamos imprimiendo el valor de i para poder entender el pasaje por valor, podemos observar que conserva el mismo valor a pesar de que la funcion miFuncion lo haya modificado a 25, esto porque cómo expresamos anteriormente, las funciones que reciben argumentos por valor los cambios que ocurren dentro de ella no afectan al resto del programa. La variable i le está pasando una copia de su valor a la variable a, para que i no se vea afectada en las operaciones que se hagan con a, de manera que i siempre conservará su valor original.

Los pasajes por referencia es lo contrario a los pasajes por valor. Su sintaxis es la siguiente:


A los argumentos se le agrega la palabra clave Por Referencia.



Para comprender el pasaje por referencia realizaremos un ejemplo.

Ejemplo 6. Funcion con pasaje por referencia.


Básicamente emplearemos el mismo ejemplo que el anterior sólo que el argumento será por referencia. Reiterémos:

En la línea 1 declaramos una función llamada miFuncion que recibe un argumento. Lo que hará esta funcion simplemente es sumarle 5 al valor que reciba en el argumento (línea 3) e imprimirlo (línea 5).

En el proceso principal declaramos una variable llamada i inicializada en 20. En la línea 14 invocamos a la funcion miFuncion y le pasamos como parámetro nuestra variable i. La línea 16 imprime el valor de i.

Cuando ejecutamos el programa, la salida que produce es la siguiente:

25
El valor de i es: 25

El primer valor 25 se debe a que a la funcion le estamos pasando una variable cuyo valor es 20, dentro de la funcion este valor cambia a 25 pues hace la siguiente operacion a<-20+5 e imprime el valor de a osea 25.

En la otra salida ("El valor de i es: 25"), estamos imprimiendo el valor de i para poder captar el pasaje por referencia, podemos observar que el valor ya no es el mismo porque la funcion miFuncion lo ha modificado a 25, las funciones que reciben argumentos por referencia los cambios que ocurren dentro de ella afectan al resto del programa. De manera que i pierde por completo su valor original.

Funcion que recibe como parámetro un arreglo:

No sólo podemos pasarle parámetros númericos o cadenas de texto a una funcion, tambien podemos pasarle arreglos.

Ejemplo 7. Funcion que retorna un valor y recibe como parámetro un arreglo.


El ejemplo consiste en sumar dos números que estan almacenados en un arreglo.

Creamos la funcion suma que recibe como parámetro un arreglo y retorna un valor (línea 2).
Se crea un acumulador inicializado en cero para sumar los dos números, éste contendrá el resultado y es lo que vamos a retornar.
En la línea 5 se recorre el arreglo con un ciclo para y se suman los dos datos ingresados.
En el proceso principal es donde se crea el arreglo con un tamaño de 2 (línea 15).
En la línea 17 - 24 a través del ciclo para pedimos los dos números al usuario y lo guardamos en el arreglo.
Finalmente en la línea 26 se imprime el resultado y se invoca a la funcion pasandole como parámetro el arreglo creado: arr_num.

La anterior fue una breve guía para iniciar y dar conocer al estudiante el manejo de las funciones (subprocesos) en PSeInt, un tema muy común y utilizado en la programación.

10 comentarios:

  1. Copie el ultimo Pseudocodigo en PseInt y me marco que no di de alta "arreglo" como un Arreglo.
    Agrego la Dimensión correspondiente y aun así marca Error. Ayuda!

    ResponderEliminar
    Respuestas
    1. Amigo depende de que tipo de programacion estes ocupando en pseint, en estos ejemplos esta configurado para no declarar ninguna variable antes de usar en tu caso deberias definirlos ejemplo:

      Definir arr_num,i,num como entero;
      Dimension arr_num[2];

      En el caso de la funcion deberas definir tambien la variable Acum.

      Saludos.
      Nicolas.

      Eliminar
  2. El proceso me corrio de la siguiente manera:

    Funcion acum<-suma(arreglo)

    acum<-0

    Para i<-1 hasta 2 hacer
    acum<-acum+arreglo[i]
    FinPara

    FinFuncion


    Proceso sin_titulo

    Dimension arreglo[2]

    num<-0
    i<-1

    Para i<-1 hasta 2 hacer
    Escribir "Digitar numero", i
    Leer arreglo[i]

    FinPara

    Escribir "La suma es: " suma(arreglo)

    FinProceso

    ResponderEliminar
  3. Como Hagfo si no me da en azul fincion y finfuncion

    ResponderEliminar
  4. tengo un problema. quiero sumar dos procesos de de la función lógica "si", por ejemplo:
    quiero sacar un total de varios productos que se venden por docena y por unidad. si son diferentes precios para cada producto, como saco el total de la factura. ayuda urgente.

    ResponderEliminar
  5. Muy buena la explicacion. Se puede pasar arreglos por referencia?

    ResponderEliminar
  6. como se realiza una suma binaria en javascript

    ResponderEliminar
  7. disculpa tengo que realizar este ejercicio podras ayudarme?
    //Ingresar números en una matriz,
    //validando con una función que el número a ingresar no haya sido ingresado previamente.

    ResponderEliminar