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
- Subproceso que muestra un saludo
- Función que suma dos números
- Función que determina si un número es par
- Función que devuelve el mayor de dos números
- Función para calcular un factorial
- Subproceso para cargar un vector
- Función para buscar un valor en un vector
- 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,CalcularPromediooOrdenarVector.
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
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”