Funciones y subprocesos en PSeInt: ejemplos resueltos paso a paso

Aprendé a usar funciones y subprocesos en PSeInt para dividir problemas complejos, reutilizar código y organizar mejor tus algoritmos, con ejemplos resueltos paso a paso.


Cuando un programa empieza a crecer, intentar resolver todo dentro de un único algoritmo hace que el código sea más difícil de leer, probar y corregir. Una de las ideas más importantes de la programación es separar un problema complejo en problemas más pequeños.

En PSeInt podemos hacerlo mediante subprocesos. Un subproceso encapsula una tarea concreta para poder ejecutarla cuando la necesitemos. Si además devuelve un valor, cumple el papel de una función.

Dividir un programa en partes permite reducir la complejidad, reutilizar código, evitar repeticiones y localizar errores con mayor facilidad. En lugar de pensar en todo el problema al mismo tiempo, podemos resolver pequeñas tareas independientes y luego combinarlas.

¿Para qué sirven las funciones y subprocesos?

  • Separar responsabilidades: cada bloque resuelve una tarea concreta.
  • Reutilizar código: una misma operación puede utilizarse varias veces.
  • Evitar repeticiones: no necesitamos copiar las mismas instrucciones en distintos lugares.
  • Facilitar las pruebas: podemos comprobar cada parte por separado.
  • Mejorar la lectura: el algoritmo principal queda más corto y expresa mejor la lógica general.

Subproceso y función en PSeInt

Un subproceso puede recibir parámetros y ejecutar una serie de instrucciones. Cuando necesitamos obtener un resultado, podemos definir un valor de retorno:

SubProceso resultado <- NombreFuncion(parametros)
    // instrucciones
    resultado <- valor
FinSubProceso

También existen subprocesos que simplemente realizan una acción y no necesitan devolver ningún valor:

SubProceso MostrarMensaje()
    Escribir "Hola"
FinSubProceso

Índice de ejemplos

  1. Subproceso que muestra un saludo
  2. Función que suma dos números
  3. Función que determina si un número es par
  4. Función que devuelve el mayor de dos números
  5. Función para calcular un factorial
  6. Subproceso para cargar un vector
  7. Función para buscar un valor en un vector
  8. Programa dividido en varios subprocesos

1. Subproceso que muestra un saludo

Empezamos con el caso más simple: separar una acción que no necesita devolver ningún valor.

SubProceso Saludar()
    Escribir "Hola desde un subproceso"
FinSubProceso

Algoritmo EjemploSaludo
    Escribir "Inicio del programa"
    Saludar()
    Escribir "Fin del programa"
FinAlgoritmo

El algoritmo principal solamente indica qué quiere hacer. Los detalles de cómo se muestra el saludo quedan dentro de Saludar.

2. Función que suma dos números

Cuando necesitamos obtener un resultado, definimos una variable de retorno.

SubProceso resultado <- Sumar(a, b)
    resultado <- a + b
FinSubProceso

Algoritmo EjemploSuma
    Definir n1, n2, total Como Real

    Escribir "Ingrese el primer numero:"
    Leer n1

    Escribir "Ingrese el segundo numero:"
    Leer n2

    total <- Sumar(n1, n2)

    Escribir "Resultado: ", total
FinAlgoritmo

a y b son parámetros. La función recibe los valores, calcula la suma y devuelve el resultado al algoritmo principal.

3. Función que determina si un número es par

Una función también puede devolver un valor lógico.

SubProceso respuesta <- EsPar(numero)
    Si numero MOD 2 = 0 Entonces
        respuesta <- Verdadero
    Sino
        respuesta <- Falso
    FinSi
FinSubProceso

Algoritmo EjemploPar
    Definir numero Como Entero

    Escribir "Ingrese un numero:"
    Leer numero

    Si EsPar(numero) Entonces
        Escribir "El numero es par"
    Sino
        Escribir "El numero es impar"
    FinSi
FinAlgoritmo

El algoritmo principal ya no necesita conocer cómo se determina la paridad. Solo pregunta si EsPar(numero) devuelve verdadero o falso.

4. Función que devuelve el mayor de dos números

SubProceso mayor <- ObtenerMayor(a, b)
    Si a > b Entonces
        mayor <- a
    Sino
        mayor <- b
    FinSi
FinSubProceso

Algoritmo EjemploMayor
    Definir n1, n2 Como Real

    Escribir "Ingrese dos numeros:"
    Leer n1
    Leer n2

    Escribir "El mayor es: ", ObtenerMayor(n1, n2)
FinAlgoritmo

Una ventaja de esta separación es que ObtenerMayor puede utilizarse muchas veces sin repetir la comparación.

5. Función para calcular un factorial

SubProceso resultado <- Factorial(numero)
    Definir i Como Entero

    resultado <- 1

    Para i <- 1 Hasta numero Hacer
        resultado <- resultado * i
    FinPara
FinSubProceso

Algoritmo EjemploFactorial
    Definir numero, resultado Como Entero

    Escribir "Ingrese un numero entero no negativo:"
    Leer numero

    Si numero >= 0 Entonces
        resultado <- Factorial(numero)
        Escribir "Factorial: ", resultado
    Sino
        Escribir "El numero debe ser mayor o igual a cero"
    FinSi
FinAlgoritmo

La validación queda en el algoritmo principal y el cálculo específico se delega a la función Factorial.

6. Subproceso para cargar un vector

Los subprocesos son especialmente útiles cuando trabajamos con vectores. En este ejemplo separamos la carga de datos del resto del programa.

SubProceso CargarVector(numeros, cantidad)
    Definir i Como Entero

    Para i <- 1 Hasta cantidad Hacer
        Escribir "Ingrese el valor ", i, ":"
        Leer numeros[i]
    FinPara
FinSubProceso

Algoritmo EjemploCargaVector
    Definir numeros Como Entero
    Dimension numeros[5]

    CargarVector(numeros, 5)

    Escribir "Vector cargado correctamente"
FinAlgoritmo

Mantenemos la convención utilizada en los demás ejercicios del sitio: las posiciones del vector comienzan en 1.

7. Función para buscar un valor en un vector

Podemos aislar la lógica de búsqueda para que el algoritmo principal no tenga que recorrer el vector directamente.

SubProceso posicion <- BuscarValor(numeros, cantidad, buscado)
    Definir i Como Entero
    Definir encontrado Como Logico

    i <- 1
    encontrado <- Falso
    posicion <- -1

    Mientras i <= cantidad Y NO encontrado Hacer
        Si numeros[i] = buscado Entonces
            encontrado <- Verdadero
            posicion <- i
        Sino
            i <- i + 1
        FinSi
    FinMientras
FinSubProceso

Algoritmo EjemploBusqueda
    Definir numeros, buscado, posicion Como Entero
    Dimension numeros[5]

    numeros[1] <- 10
    numeros[2] <- 20
    numeros[3] <- 30
    numeros[4] <- 40
    numeros[5] <- 50

    Escribir "Ingrese el valor a buscar:"
    Leer buscado

    posicion <- BuscarValor(numeros, 5, buscado)

    Si posicion <> -1 Entonces
        Escribir "Encontrado en la posicion ", posicion
    Sino
        Escribir "El valor no se encuentra en el vector"
    FinSi
FinAlgoritmo

En este caso usamos -1 como valor de retorno para indicar que el elemento no fue encontrado. Como las posiciones válidas del vector van de 1 a 5, no existe ambigüedad con un índice real.

8. Programa dividido en varios subprocesos

La ventaja se vuelve más evidente cuando varias tareas se combinan. El algoritmo principal puede quedar reducido a una secuencia de operaciones de alto nivel.

SubProceso CargarVector(numeros, cantidad)
    Definir i Como Entero

    Para i <- 1 Hasta cantidad Hacer
        Escribir "Ingrese el valor ", i, ":"
        Leer numeros[i]
    FinPara
FinSubProceso

SubProceso MostrarVector(numeros, cantidad)
    Definir i Como Entero

    Para i <- 1 Hasta cantidad Hacer
        Escribir numeros[i]
    FinPara
FinSubProceso

SubProceso suma <- SumarVector(numeros, cantidad)
    Definir i Como Entero

    suma <- 0

    Para i <- 1 Hasta cantidad Hacer
        suma <- suma + numeros[i]
    FinPara
FinSubProceso

Algoritmo ProgramaModular
    Definir numeros Como Entero
    Dimension numeros[5]

    CargarVector(numeros, 5)

    Escribir "Valores cargados:"
    MostrarVector(numeros, 5)

    Escribir "Suma total: ", SumarVector(numeros, 5)
FinAlgoritmo

El algoritmo principal ahora expresa claramente tres operaciones: cargar, mostrar y sumar. Cada una tiene su propia implementación.

Variables locales y parámetros

Las variables declaradas dentro de un subproceso se utilizan para resolver esa tarea concreta. Esto ayuda a evitar que todos los datos del programa estén mezclados en un único lugar.

Los parámetros permiten enviar información desde el algoritmo principal hacia el subproceso. De esta manera una misma función puede trabajar con valores diferentes cada vez que se la invoca.

¿Cuándo conviene separar un problema?

No hace falta crear una función para cada línea de código. Conviene modularizar cuando una tarea:

  • tiene una responsabilidad claramente identificable;
  • se utiliza más de una vez;
  • requiere varias instrucciones y complica el algoritmo principal;
  • puede probarse de forma independiente;
  • representa una operación con un nombre claro, como BuscarValor, CalcularPromedio o OrdenarVector.

La idea central es que el algoritmo principal muestre la estructura general del problema, mientras que cada subproceso se ocupa de los detalles de una parte específica.

Seguí practicando PSeInt

Para seguir practicando, podés consultar los 20 ejercicios resueltos de PSeInt con vectores, los 20 ejercicios de ciclos y condicionales y los ejercicios básicos resueltos en PSeInt.


¿Te sirvió este contenido? ☕

Si esta guía te ayudó, podés apoyar a Club Programador con el monto que quieras. Tu aporte ayuda a mantener el contenido gratuito y a seguir publicando nuevos ejercicios.

🇦🇷 Apoyar desde Argentina

☕ Invitame un café con Mercado Pago

🌎 Apoyar desde otro país

☕ Apoyar con PayPal


Descubre más desde Club Programador

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Un comentario en “Funciones y subprocesos en PSeInt: ejemplos resueltos paso a paso”

Deja un comentario

Descubre más desde Club Programador

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo