{"id":24494788,"url":"https://github.com/rbuj-uoc/m2.010-pac2","last_synced_at":"2025-06-17T22:37:21.877Z","repository":{"id":219658718,"uuid":"749571960","full_name":"rbuj-UOC/M2.010-PAC2","owner":"rbuj-UOC","description":"PAC 2 de l'assignatura introducció al desenvolupament de programari del màster de programari lliure","archived":false,"fork":false,"pushed_at":"2024-07-15T14:08:06.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-15T04:42:46.672Z","etag":null,"topics":["cpp"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rbuj-UOC.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-29T00:02:17.000Z","updated_at":"2024-07-15T14:08:11.000Z","dependencies_parsed_at":"2024-02-02T23:28:19.304Z","dependency_job_id":"a1bf0a94-9026-4dce-85fc-582e73b6e9b1","html_url":"https://github.com/rbuj-UOC/M2.010-PAC2","commit_stats":null,"previous_names":["rbuj-uoc/uoc-m2.010-pac2","rbuj-uoc/m2.010-pac2"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rbuj-UOC/M2.010-PAC2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbuj-UOC%2FM2.010-PAC2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbuj-UOC%2FM2.010-PAC2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbuj-UOC%2FM2.010-PAC2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbuj-UOC%2FM2.010-PAC2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rbuj-UOC","download_url":"https://codeload.github.com/rbuj-UOC/M2.010-PAC2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbuj-UOC%2FM2.010-PAC2/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260452256,"owners_count":23011432,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp"],"created_at":"2025-01-21T20:17:15.206Z","updated_at":"2025-06-17T22:37:16.868Z","avatar_url":"https://github.com/rbuj-UOC.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Enunciado\nDesarrollar una aplicación, que se llamará “g_compropietarios2”, que gestiona información relativa a una pequeña comunidad de propietarios.\n\nEsta comunidad gestiona diversas fincas, donde cada finca puede tener diversos propietarios de forma indivisa (es decir, la propiedad es compartida y no se puede dividir en fincas más pequeñas) y cada finca, además, tiene un grado de participación en los ingresos y gastos generales de la comunidad.\n\nLa información de la comunidad se describe en dos ficheros:\n\n* el fichero de propiedades, “(año)-propiedades.txt”, que contiene:\n  - la lista de propietarios (con id, nombre y email)\n  - la lista de propiedades (con numfinca, nombre finca, grado de participación general en la comunidad, y lista de propietarios con su grado de participación en la finca).\n* el fichero de transmisiones, “(año)-transmisiones.txt” donde se recoge la información de las transmisiones patrimoniales (por herencia, compraventa, donación, ...) que ha sufrido la comunidad durante el año en curso. Contiene:\n  - una lista de propietarios que no estan en el año anterior.\n  - la lista de transmisiones del año\n\nEl detalle de ambos ficheros es, por tanto:\n\ndetalle fichero (año)-propiedades:\n```\n.Comentario: Fichero de propiedades y propietarios del año 2010\n#propietarios\nidPropietario; nombre y apellidos; email\n...\n#propiedades\nnumfinca; nombre finca;participación general; propietario: participación \u0026 propietario: participación ...\n```\n\ndetalle fichero (año)-transmisiones\n```\n.Comentario: Fichero de transmisiones del año 2011\n#nuevos propietarios\nidNuevoPropietario; nombre y apellidos; email\nidNuevoPropietario; nombre y apellidos; email\n...\n#transmisiones\n\u003eidPropietarioAnterior; fecha; motivo\n+datos específicos de la transmisión\nnumFinca; idNuevoPropietario: participación \u0026 idNuevoPropietario: participación numFinca; idNuevoPropietario: participación \u0026 idNuevoPropietario: participación \u003eidPropietarioAnterior; fecha; motivo\n+datos específicos de la transmisión\nnumFinca; idNuevoPropietario: participación \u0026 idNuevoPropietario: participación \u003eidPropietarioAnterior; fecha; motivo\n+datos específicos de la transmisión\nnumFinca; idNuevoPropietario: participación \u0026 idNuevoPropietario: participación\n```\n\nEn estos ficheros, hay una serie de caracteres con significado propio:\n\na) el carácter “;” (punto y coma). Se utilitza como separador de campos.\n\nb) el carácter # en el inicio de línea sirve para identificar una sección\n\nc) el carácter . (punto) en inicio de línea indica que la línea es un comentario (la línea se ignora)\n\nd) las líneas en blanco también se deben ignorar\n\ne) el carácter \u003e (mayor) en el fichero de transmisiones indica que comienza una nueva transmisión.\n\nEsta transmisión puede afectar a una o a varias fincas (son las líneas siguientes).\n\nPor otro lado, también hay que precisar que:\n- el grado de participación se expresa en forma de fracción (“1” o “1/2” o “1/3”).\nEste detalle es importante, pues las operaciones se deben implementar de la misma forma (en este caso redondear no es adecuado, pues un 0,01% de un valor de millones de euros, puede ser una cantidad significativa).\n- la lista de propietarios con su participación se expresa de la forma\n```\npropietario: participación \u0026 propietario: participación \u0026 propietario: participación\n```\n\nEs decir, Las diversas participaciones se separan por un símbolo de ampersand ( \u0026 ) y el símbolo dos puntos (:) separa el propietario del grado de participación.\n- la fecha se encuentra en formato aaaa-mm-dd, y\n- los motivos habituales de transmisiones son herencia, compraventa o donación.\n- si numFinca = 0, implica que la operación se aplica a TODAS sus fincas.\n- la lista de Nuevos Propietarios solo se refiere a propietarios que no pertenecían a la comunidad. Si ya lo eran, se debe utilizar su código correspondiente.\n\nLos datos específicos de la transmisión (las líneas que comienzan por +) dependerá del\nmotivo de ésta:\n\n- en caso de herencia, los datos específicos son el parentesco (hijo, nieto, sobrino, hermano,\nextraño, ...) y la fecha de aceptación de la herencia\n\nEl formato será:\n\n```\n+parentesco;fecha aceptación\n```\n\n- en caso de compraventa, los datos específicos son el precio pagado, y los medios de pago\n(transferencia, cheque, efectivo, ...)\n\nEl formato será:\n\n```\n+precio;medio de pago\n```\n\n- en caso de donaciones, los datos específicos son el tipo de donación (puede ser simple o\ncon obligaciones) y en el segundo caso, la descripción de la obligación (...)\n\nEl formato será:\n\n```\n+con obligaciones;ocupante podrá quedarse mientras viva\n```\n\n## Llamar a la aplicación\n\nLa aplicación g_compropietarios es llamada con los siguientes parámetros:\n```\ng_compropietarios2 año_referencia\n```\nEjemplo:\n```\ng_compropietarios 2011\n```\ndonde el año de referencia es el año que se desea generar (se genera el fichero de propiedades antes de la reunión anual de la comunidad).\n\nPor tanto, si el año de referencia es 2011, entonces:\n\n```\n2010-propiedades.txt + 2011-transmisiones.txt ---\u003e 2011-propiedades.txt\n```\n\nLa aplicación debe hacer los siguientes procesos de forma consecutiva:\n1. Leer datos (año-propietarios.txt y año-transmisiones.txt)\n2. Verificar datos participaciones, si las fracciones suman 1.\n3. Generar fichero de propietarios del año en curso (año)-propietarios\n\u003e [!NOTE]  \n\u003e A partir de (año-1)-propietarios.txt y (año)-transmisiones.txt\n4. Generar listado de propietarios con sus participaciones globales en la comunidad (año)-participaciones.txt\n5. Generar informe de transmisiones (ordenadas por número de finca y fecha) en (año)-informe.txt\n\n## Punto 1 (Leer datos)\nDebe leer los ficheros de texto de entrada (año-1)-propietarios.txt y (año)-transmisiones.txt y cargar la información en estructuras de memoria de forma organizada (como no se sabe el número de elementos, se deberá utilizar listas dinámicas o de otras formas).\n\nAl finalizar, debe mostrar un mensaje final en pantalla que dé un resumen de los elementos leídos:\n\n```\nProcesando año 2011...\nRegistros leídos:\npropietarios 2010   : xxx\npropiedades         : xxx\npropietarios nuevos : xxx\ntransmisiones       : xxx\n```\n\n## Punto 2 (Verificar datos participaciones)\nCorresponde a recorrer las listas de memoria creadas anteriormente, y verificar que los datos de las participaciones son correctos. Hay dos controles:\n\na) A nivel de comunidad: La suma de participaciones generales de cada finca debe dar 1.\n\nb) A nivel de finca: La suma de participaciones de cada finca para todos los propietarios de ésta también debe dar 1.\n\nSi alguno de los resultados es incorrecto, hay que mostrar en pantalla un mensaje de aviso indicando el error detectado. No obstante, esta situación no impedirá los listados posteriores.\n\nHay que recordar que las operaciones se deben hacer con fracciones.\n\n## Punto 3 (Generar fichero de propietarios del año en curso)\nTiene el mismo formato que el fichero de propietarios original.\n\nPaso previo: En el paso 1 se ha leído el fichero de propiedades, creando las listas de propietarios y de propiedades, y el fichero de transmisiones, creando dos listas nuevas: nuevos propietarios y transmisiones.\n\n**Proceso:**\n\nEl primer paso que se deberá hacer es añadir la lista de nuevos propietarios a la lista ya existente (se añadirán al final).\n\nEl segundo paso es aplicar la lista de transmisiones. Por tanto, se debe recorrer la lista de transmisiones que se mantiene en memoria, y para cada una de las fincas de este propietario que se encuentre se debe hacer la substitución por el nuevo propietario.\n\nEjemplo:\n\nLa finca 5 (“Cal Pep”) , con una participación general de una 1/10 parte de la comunidad, pertenece a Juan (id=16) y a Pedro (id=17) a partes iguales (es decir, participación 1/2 ).\n\nEn la lista de propiedades, tenemos:\n\n```\n5;Cal Pep;1/10;16:1/2 \u0026 17:1/2\n```\n\nSi Juan muere y le deja en herencia (el 10 de mayo) a sus hijas María (id=27), Marta\n(id=28) y Montserrat (id=29) la finca 5 a partes iguales.\n\nLa transmisión correspondería a las siguientes líneas:\n\n```\n\u003e16;10-05-2009;Herencia\n   5; 27:1/3 \u0026 28:1/3 \u0026 29:1/3\n```\n\nPor tanto, la información de la finca queda:\n\n```\n5;Cal Pep;1/10;27:1/6 \u0026 28:1/6 \u0026 29:1/6 \u0026 17:1/2\n```\n\nSi un mes más tarde, María vende a Marta su parte, la transmisión quedaría:\n\n```\n\u003e27;10-06-2009;Herencia\n   5; 28:1\n```\n\ny la información final de la finca queda:\n\n```\n5;Cal Pep;1/10;28:1/3 \u0026 29:1/6 \u0026 17:1/2\n```\n\n## Punto 4 (Generar listado de propietarios con las participaciones globales en la comunidad)\nEl listado generado recibirá el nombre de “(año)-participaciones.txt” y será de la forma:\n\n```\nidProp Nombre            Email                 NumFincas Part(fracc)   Part(%)\n-----------------------------------------------------------------------------\n 1     Juan Pi Port      jpiport@mail.com        1        1/25         4,00%\n 2     Marta Pi Port     mpiport@mail.com        1        2/25         8,00%\n 3     Francisco Pi Port fpiport@mail.com        1        2/25         8,00%\n 4     Narcíso Mont Prim nmontprim@mail.com      1        1/9          11,11%\n 5     Sandra Mont Prim  smontprim@mail.com      1        2/9          22,22%\n 6     Roberto Mont Prim rmontprim@mail.com      2        4/9          44,44%\n 7     Ricardo Pi Mont   rpimont@mail.com        1        1/45          2,22%\n-----------------------------------------------------------------------------\n 7 propietarios                           TOTAL            1           99,99%\n```\n\nLa participación (en fracción) se calcula a partir de la suma de la participación de cada propietario en todas les fincas que posea (aplicando la participación general de la finca en la comunidad).\n\nLa participación en % es una representación del cálculo anterior en fracción, redondeado a 2 decimales. Como se ha comentado anteriormente, es a efectos de comprensibilidad pero sin valor legal.\n\n\u003e [!IMPORTANT]  \n\u003e Se ha añadido una columna adicional NumFincas respecto a la PEC1.\n\n**Proceso**\n\nComo paso previo, se puede recorrer la lista de propietarios, y para cada propietario, hacer una búsqueda en la lista de fincas sumando sus participaciones (en fracción). Para cada propietario, esta suma se puede guardar en memoria dentro de la lista de propietarios. Finalizados los cálculos, se puede generar el listado pasándole sólo la lista dinámica de propietarios, que ya contiene toda la información.\n\n## Punto 5 (Generar informe de transmisiones)\nEl listado generado recibirá el nombre de “(año)-informe.txt” y será de la forma:\n\n```\nNF Fecha Tr.   Prop.Anterior      Prop.Nuevo        Motivo      Datos adicionales\n----------------------------------------------------------------------------------------------------\n 1  20.02.2011 Juan Pi Port       Ricardo Pi Mont   Herencia    Parentesco: Hijo (F.Ac: 20.05.2011)\n 1  20.05.2011 Ricardo Pi Mont    Roberto Mont Prim Compraventa Precio: 100.000 EUR (Transferencia)\n 1  30.12.2011 Roberto Mont Prim  Juan Mont Prim    Donación    Tipo: Simple\n----------------------------------------------------------------------------------------------------\n 3 transmisiones\n```\n\nEste informe contiene las siguientes columnas:\n\na) NF: Número de finca\n\nb) Fecha Transmisión: La fecha efectiva de la transmisión (el segundo campo introducido en la línea de cabecera de transmisión, es decir, la que comienza por “\u003e” ).\n\nc) El nombre del propietario anterior (no su código)\n\nd) El nombre del propietario nuevo (no su código)\n\ne) El motivo de la transmisión (herencia, compraventa o donación)\n\nf) Datos adicionales: Según el motivo de transmisión que se haya producido, esta columna contendrá:\n\n- Si es herencia, la relación de parentesco y la fecha de aceptación de la herencia\n\nEl formato será: parentesco: xxxx ( dd.mm.aaaa )\n\ndonde xxxx corresponde al parentesco (hijo, hermano, tío, sobrino, nieto, extraño, ...) y ( dd.mm.aaaa ) la fecha de aceptación de la herencia.\n\n- Si es compraventa, el precio pagado y los medios de pago\n\nEl formato será: precio: xxxx ( yyyy )\n\ndonde xxxx corresponde al precio, indicando también la moneda y ( yyyy ) el medio de pago (efectivo, transferencia, .... ).\n\n- Si es donación, el tipo de donación y, si tuviera, las obligaciones pactadas El formato será: tipo: xxxx ( yyyy )\n\ndonde xxxx corresponde al tipo (simple, con carga)\n\ny ( yyyy ) la obligación a la donación .\n\n\u003e [!NOTE]  \n\u003e En la columna “Datos adicionales” de este listado es donde se puede observar más fácilmente la aplicación del polimorfismo.\n\n\u003e [!CAUTION]\n\u003e Para simplificar se puede considerar que las entradas de datos son sintácticamente correctos.\n\n## Observaciones finales\n1. Como podéis observar, la realización de esta PEC esta concebida como evolución de la PEC anterior por lo que bastante código base puede ser común.\n\n\u003e [!CAUTION]\n\u003e Se puede tomar como base la solución de la PEC1 aportada por el consultor, aunque si lo preferís, se puede iniciar a partir de vuestra propia solución.\n\n2. Como se ha indicado, se desea valorar el uso de la orientación a objetos y la aplicación de sus propiedades. En concreto, SE DEBE aplicar herencia en la definición de las transmisiones, y posteriormente polimorfismo en el listado informe.txt.\n\nTambién se deben definir objetos para los diferentes elementos de la PEC (finca, propiedad, propietario, ...). También se debe crear una clase Fraccion donde se encapsulan las operaciones con fracciones. Por otro lado, se sugiere la creación de las clases (ListaPropiedades, listaPropietarios, ...)..\n\n3. Aunque en los apuntes sólo esté ligeramente comentado, es posible (y, por poco que podáis, recomendado) utilizar las librerías STL. Para ayudar al conocimiento de dichas librerías, os animo a que comentéis en el foro su uso y su posible aplicación (por favor, sólo a nivel de conceptos y sin utilizar código fuente del ejercicio) y evidentemente las dudas. Especialmente sencillos y útiles os pueden ser list y vector.\n\nSu uso os puede facilitar crear las listas de propietarios, de propiedades y de transmisiones.\n\n# Resposta\n\n# Entorn de desenvolupament\n\n- IDE: NetBeans 7.0.1 (C/C++)\n- SO: Mac OS X 10.6.8 + Xcode 3.2.6 + JRE 1.6 10M3425 \n- SO: Ubuntu 11.10 + gcc 4.6.1 + JRE 1.6.0-23\n\n## Per afegir o modificar els arguments del programa:\n\nEn propietats del projecte, en la secció \"Execució\" establir:\n\n```\n\"${OUTPUT_PATH}\" 2010\n```\n\non 2010 és l'any que es passa com paràmetre\n\n## Gestió de tasques amb l'IDE afegint patrons ToDo:\n\nper activar-ho: \u003e\u003eEines-\u003e Opcions C/C++\u003c\u003c Opcions del projecte: Suport per a la indexació de fitxers que no siguin ...\n```C\n// @todo: explicació\n```\n\n# Implementació de les llistes\n\nLlistes doblement enllaçades amb iteradors al següent node, amb inserció ordenada\nsegons el valor clau de l'element a afegir, utilitzant un iterador per trobar la seva\nposició en la llista abans de ser afegit en la llista.\n\nLa llista hereda control sobre el nombre d'elements de la classe ed (estructura de dades).\n\nLa classe IteradorLlista implementa els mètodes virtuals de la classe Iterador.\n\nLlistes principals:\n\n- Llista de propietaris   = Llista\u003cPropietari\u003e llista_propietaris;\n- Llista de propietats    = Llista\u003cPropietat\u003e llista_propietats;\n- Llista nous propietaris = Llista\u003cPropietari\u003e llista_nous_propietaris;\n- Llista de transmissions = Llista\u003cTransmissio_node\u003e llista_transmissions;\n\n## Llista de propietaris / Llista de nous propietaris\n\nCada node de la llista conté un Propietari amb les següents dades:\n\n- Identificador del propietari = unsigned long id;\n- Nom del propietari           = string nom;\n- Correu electrònic            = string email;\n\n### Llista de propietats\n\nCada node de la llista conté una Propietat amb les següents dades:\n\n- Identificador de propietat  = unsigned long id;\n- nom de la propietat         = string nom;\n- participació general        = Fraccio participacio;\n- Llistat de participacions   = Llista\u003cParticipacio\u003e llista_participacions;\n\n### Llistat de participacions \n\nCada node de la llista conté una participació amb les següents dades:\n\n- Identificador del propietari = unsigned long id;\n- Participació del propietari  = Fraccio f_participacio;\n\n## Llista de transmissions\n\nCada node de la llista conté una transmissió (Transmissio_node) amb les  següents dades:\n\n- Identificador de l'antic propietari       = unsigned long id;\n- Data de la transmissió                    = Data data;\n- Motiu de la transmissió                   = string motiu;\n- Llistat amb els detalls de la transmissió = LlistaTransmissions dades_transmissio;\n\n### Llistat amb els detalls de la transmissió\n\nCada node de la llista conté un tipus de transmissió (NodeTransmissio) amb les següents dades: \n\nTots els subtipus de transmissió contenen un llistat de finques Llista\u003cFinca\u003e llista_finques\n\nSi el tipus de transmissió és HERENCIA el node a demès emmagatzema les dades següents dades:\n\n- Parentesc amb l'antic propietari   = string parentesc;\n- Data de l'acceptació de l'herència = Data data_acceptacio;\n\nSi el tipus de transmissió és DONACIO el node emmagatzema les dades següents:\n\n- Si té o no obligacions       = bool amb_obligacions;\n- en cas afirmatiu els detalls = string descripcio;\n\nSi el tipus de transmissió és COMPRAVENTA el node emmagatzema les dades següents:\n\n- El preu de la compraventa = float preu;\n- El mode de pagament       = string mode_pagament;\n\n## Llistat de finques\n\nCada node de la llista conté les següents dades:\n\n- Identificador de la finca = unsigned long id;\n- Llistat de participacions = Llista\u003cParticipacio\u003e llista_participacions;\n\n### Llistat de participacions \n\nCada node de la llista conté una participació amb les següents dades:\n\n- Identificador del propietari = unsigned long id;\n- Participació del propietari  = Fraccio f_participacio;\n\n## ALTRES ...\n\nFlux d'execució:\n\n - Fitxers g_compropietarios2.cpp, compropietaris.h, compropietaris.cpp\n\nOperacions sobre fitxers:\n\n - Classe gestió bàsica de fitxers, Fitxer: fitxer.h i fitxer.cpp\n - Classe gestió fitxer any-propiedades: fitxer_propietats.h, fitxer_propietats.cpp\n - Classe gestió fitxer any-transmisiones: fitxer_transmissions.h, fitxer_transmissions.cpp\n\nClasse Fraccio: Representació i operacions bàsiques sobre fraccions\n\n - Fitxers fraccio.h, fraccio.cpp\n\nClasse Data: Representació i operacions bàsiques sobre dates\n\n - Fitxers data.h, data.cpp\n\nUtilitats:\n\n - Fitxers: util.h, util_excepcio.h, split.h\n\nConstants:\n\n - Fitxers: constants.h\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frbuj-uoc%2Fm2.010-pac2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frbuj-uoc%2Fm2.010-pac2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frbuj-uoc%2Fm2.010-pac2/lists"}