UNIVERSIDAD PRIVADA DEL NORTE CIENCIAS
Departamento de Ciencias
Sistema de Registro y Gestión de Inventario para
un Supermercado
Integrantes:
JEAN PIERRE CARLOS BROPHY MONTES
Ingeniero de Sistemas
CRISTHOFHER ANDRE JESUS ESPINOZA BENITES
Ingeniero de Sistemas
JUAN RAMIRO MENDOZA MALCA
Ingeniero de Sistemas
AUDRICK ADRIAN PRADA OTINIANO
Ingeniero de Sistemas
Docente Asesor: RITH ODDAR MANTILLA LOPEZ
2025-1
CAPÍTULO I
INTRODUCCION
El presente proyecto tiene como objetivo desarrollar una aplicación de escritorio en
lenguaje C# que permita gestionar el registro de productos y clientes de un supermercado.
Esta aplicación fue construida utilizando Windows Forms sobre el entorno .NET
Framework 4.8, y responde a la necesidad de tener un sistema que facilite el control de
inventario, evitando errores manuales, reduciendo el tiempo de atención y agilizando los
procesos de búsqueda y registro.
La gestión adecuada del inventario es un pilar esencial en toda empresa comercial. Muchos
supermercados aún dependen de registros manuales o de hojas de cálculo básicas, lo que
incrementa la probabilidad de errores humanos, pérdida de datos o ineficiencia en la toma
de decisiones. Frente a este problema, desarrollar una herramienta automatizada no solo
mejora la operatividad diaria, sino que también permite tomar decisiones informadas sobre
abastecimiento, rotación de productos y atención al cliente.
En el contexto del curso de Fundamentos de Programación Orientada a Objetos, este
trabajo permite aplicar conocimientos clave como la creación de clases, el uso de
estructuras de datos dinámicas (listas genéricas), la implementación de métodos recursivos
y el manejo de excepciones. Todos estos conceptos forman parte de los pilares de la
programación moderna y son esenciales para diseñar aplicaciones robustas, mantenibles y
escalables.
Además, el proyecto promueve el pensamiento lógico y la solución eficiente de problemas
reales mediante algoritmos y estructuras bien definidas. Permite reforzar el uso de buenas
prácticas en la escritura del código y comprender cómo una correcta arquitectura de
software puede facilitar la ampliación del sistema a futuro. La planificación del proyecto
también fue clave, ya que se diseñaron primero las entidades principales, se definieron sus
relaciones y luego se procedió con la implementación progresiva del sistema.
Este tipo de trabajos fomenta el desarrollo de competencias tanto técnicas como blandas.
Desde el punto de vista académico, fortalece la capacidad de aplicar lo aprendido en un
escenario simulado del mundo laboral. Desde el punto de vista profesional, prepara a los
estudiantes para enfrentar proyectos reales de desarrollo, trabajar en equipo, utilizar
herramientas de control de versiones, documentar adecuadamente y presentar productos
finales funcionales.
CAPÍTULO II
DESARROLLO
Presentación del equipo y metodología aplicada:
El equipo G10 estuvo conformado por los siguientes estudiantes:
Jean Pierre Carlos Brophy Montes
Cristhofher Andre Jesus Espinoza Benites
Juan Ramiro Mendoza Malca
Audrick Adrian Prada Otiniano
El desarrollo del proyecto se llevó a cabo de manera colaborativa, asignando a cada
integrante un conjunto de responsabilidades específicas, incluyendo el diseño de la
interfaz, la codificación de las clases, la implementación de las funcionalidades, la
validación de datos, y la realización de pruebas. La metodología aplicada fue de tipo
incremental, lo cual permitió construir el sistema por etapas, verificando en cada fase la
correcta integración de las funciones desarrolladas. Este enfoque facilitó una
retroalimentación constante entre los miembros del grupo, favoreciendo la detección
temprana de errores y la mejora continua del producto final.
El equipo se reunió tanto de forma virtual, organizando sesiones de trabajo semanales para
revisar el progreso individual y realizar pruebas conjuntas del sistema. Esta dinámica de
trabajo fomentó el aprendizaje colaborativo, la toma de decisiones en conjunto y el
cumplimiento de objetivos dentro del cronograma establecido.
Documentación del programa:
El sistema fue desarrollado en el lenguaje de programación C#, empleando el entorno de
desarrollo Visual Studio 2022 y el framework .NET 4.8. Su estructura está centrada en dos
clases principales: Producto y Categoría..
Clase Producto:
Esta clase representa los productos almacenados en el inventario, encapsulando sus
atributos esenciales:public class Producto
public class Producto
{
public string G10_nombre { get; set; }
public string G10_categoria { get; set; }
public decimal G10_precio { get; set; }
public int G10_cantidad { get; set; }
El prefijo G10_ en los nombres de las propiedades fue adoptado como convención para
identificar los elementos desarrollados por el grupo 10, conforme a las pautas del curso.
Clase Categoría:
Permite agrupar productos por tipo y calcular el stock total usando un método
recursivo:public class Categoría
public class Categoria
public string G10_nombre { get; set; }
public List<Producto> G10_productos { get; set; } = new List<Producto>();
public int G10_CalcularStockRecursivo(int index = 0)
if (index >= G10_productos.Count)
return 0;
return G10_productos[index].G10_cantidad + G10_CalcularStockRecursivo(index +
1);
}
Este método implementa una lógica de acumulación de cantidades a través de llamadas
recursivas, reemplazando bucles convencionales por una solución más elegante y
declarativa.
Aplicación de listas, recursividad y excepciones
Uno de los fundamentos clave del proyecto fue la utilización de listas genéricas
(List<Producto>) para gestionar dinámicamente los productos registrados. Estas listas
permiten aplicar operaciones de ordenamiento, filtrado, y búsqueda por expresiones
lambda. Por ejemplo, se implementó un método de búsqueda por nombre que responde a
coincidencias parciales:
csharp
CopiarEditar
Producto resultado = G10_listaProductos
.FirstOrDefault(p => p.G10_nombre.ToLower().Contains([Link]()));
Para el cálculo del stock total por categoría, se utilizó el método recursivo
G10_CalcularStockRecursivo, que suma los valores de la lista sin necesidad de usar
estructuras iterativas. Esta técnica promueve un pensamiento algorítmico más abstracto y
refuerza la comprensión de las funciones que se llaman a sí mismas.
En cuanto al manejo de excepciones, el sistema fue diseñado para detectar situaciones de
error comunes como campos incompletos o duplicados en el registro de productos. Esto se
logró mediante bloques try-catch como el siguiente:
try
if ([Link](nombre) || [Link](categoria))
throw new ArgumentException("Datos incompletos.");
if (G10_listaProductos.Any(p => p.G10_nombre == nombre))
throw new InvalidOperationException("Producto duplicado.");
G10_listaProductos.Add(new Producto { G10_nombre = nombre, G10_categoria =
categoria, G10_precio = precio, G10_cantidad = cantidad });
catch (Exception ex)
[Link]([Link]);
Estas validaciones garantizan que los datos ingresados al sistema cumplan con los criterios
requeridos, evitando fallas críticas durante la ejecución.
Fundamentación teórica
El uso de clases, listas, recursividad y manejo de excepciones responde a fundamentos
clave de la programación orientada a objetos. Según Deitel y Deitel (2017), “la
encapsulación de atributos dentro de clases facilita el mantenimiento y la escalabilidad del
software”. Las listas genéricas, como indica Albahari (2021), permiten gestionar
colecciones dinámicas de objetos con eficiencia y seguridad. Además, el uso de
recursividad permite reemplazar bucles iterativos, ofreciendo soluciones más elegantes a
ciertos problemas computacionales, mientras que las excepciones controlan flujos de error
sin detener la ejecución del programa (Microsoft, 2023).
CAPÍTULO III
CONCLUSIONES Y RECOMENDACIONES
El desarrollo del presente sistema de gestión de inventario para una tienda de productos
electrónicos ha representado una experiencia integral que combina la aplicación de
conocimientos teóricos con la resolución de un problema real. A lo largo del proyecto, se
fortalecieron habilidades fundamentales en el ámbito de la programación orientada a
objetos, permitiendo que los integrantes del equipo consolidaran competencias esenciales
tanto en la lógica de programación como en la estructuración de aplicaciones robustas y
funcionales.
Uno de los logros más significativos fue la correcta implementación de clases. El diseño de
estructuras como Producto y Categoría no solo permitió organizar mejor la información,
sino que también facilitó la reutilización del código, permitiendo su ampliación y
mantenimiento. Esta forma de representar entidades del mundo real en estructuras de
software es uno de los principales beneficios del paradigma orientado a objetos, y su
aplicación en este proyecto contribuyó notablemente a su claridad y eficacia.
En cuanto al uso de listas genéricas, se pudo comprobar su versatilidad en la manipulación
dinámica de datos. Gracias a ellas, fue posible implementar funcionalidades como el
ordenamiento por precio en ambas direcciones (ascendente y descendente), así como
búsquedas personalizadas basadas en coincidencias parciales de nombre. Además, las listas
permitieron almacenar grandes volúmenes de información sin afectar el rendimiento del
sistema, lo que demuestra su eficiencia como estructura de datos para aplicaciones de
gestión.
El uso de la recursividad constituyó uno de los retos conceptuales más relevantes del
proyecto. Aplicada al cálculo del stock total por categoría, esta técnica permitió reemplazar
ciclos iterativos por llamados sucesivos a un mismo método, lo que dio lugar a una
solución más limpia y directa. Esta aproximación ayudó al equipo a profundizar en el
pensamiento algorítmico y en la necesidad de controlar cuidadosamente las condiciones de
detención de una función recursiva, para evitar errores como llamadas infinitas o
desbordamiento de pila (stack overflow).
El manejo de excepciones fue otro de los componentes fundamentales del proyecto.
Gracias al uso de bloques try-catch, se logró validar los datos ingresados por el usuario,
controlando casos como campos vacíos, datos no numéricos o duplicados. Esta validación
no solo aumentó la fiabilidad del sistema, sino que también mejoró la experiencia del
usuario final, al proporcionar mensajes claros y evitar el cierre inesperado del programa.
Aprender a prever posibles errores de ejecución y a reaccionar adecuadamente ante ellos es
una de las competencias más valiosas en el desarrollo de aplicaciones de calidad.
Desde una perspectiva metodológica, el trabajo en equipo también fue clave para el éxito
del proyecto. Se promovió la comunicación constante, la división equitativa de tareas, el
uso de buenas prácticas en la escritura del código y la revisión conjunta de errores. Este
tipo de dinámica simula el trabajo colaborativo que se desarrolla en entornos reales de
desarrollo de software, y permite formar profesionales con habilidades técnicas y sociales
bien equilibradas.
Recomendaciones
Como resultado de este proceso, se pueden ofrecer algunas recomendaciones tanto para el
equipo como para futuros estudiantes que desarrollen proyectos similares:
1. Diseñar primero, codificar después: Es fundamental comenzar cualquier proyecto
con una etapa de análisis y diseño, en la que se definan claramente las clases, sus
atributos y relaciones. Esto evita errores posteriores y facilita la implementación.
2. Aprovechar al máximo las estructuras del lenguaje: Las listas genéricas, la
recursividad y las excepciones son herramientas potentes que, bien aplicadas,
aumentan la calidad y eficiencia del software. Su dominio requiere práctica
constante.
3. Aplicar validaciones desde el inicio: Es recomendable implementar manejo de
errores y validaciones desde las primeras versiones del programa. Esto previene la
acumulación de errores que luego son más difíciles de depurar.
4. Comentar y documentar el código: La documentación del código y el uso de
nombres de variables claros (como el formato G10_nombre) mejora la comprensión
y mantenimiento del sistema por parte de otros programadores o del propio equipo
en el futuro.
5. No subestimar la recursividad: Aunque es una técnica que suele parecer compleja,
la recursividad puede simplificar muchos algoritmos si se utiliza de forma
adecuada. Es importante practicarla y entender su lógica interna.
6. Buscar siempre mejorar la experiencia del usuario: Un sistema exitoso no solo debe
cumplir su función, sino también ser amigable y claro para quien lo utiliza. Esto se
logra mediante interfaces bien diseñadas, mensajes útiles y navegación intuitiva.
En conclusión, este proyecto ha representado una valiosa oportunidad de aprendizaje, tanto
a nivel técnico como humano. Ha demostrado que, con una planificación adecuada, trabajo
en equipo y aplicación de buenas prácticas, es posible construir soluciones informáticas
eficientes, funcionales y alineadas con las necesidades reales del entorno. Los
conocimientos adquiridos servirán como base sólida para afrontar futuros desafíos
académicos y profesionales en el campo del desarrollo de software.
BIBLIOGRAFIA
Microsoft. (2023). Guía de programación en C#.
[Link]
Microsoft. (2023). Handling and throwing exceptions in C#. Microsoft Learn.
[Link]
[Link] (2020). Clases, objetos y constructores | Curso de fundamentos de C#.
[Link]