From 00c28306763760f2599b2f223d8ff160a6c6beb4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:55:06 +0000 Subject: [PATCH 1/3] Initial plan From 7163c33d8e85436b3fffbd3cc0dbf359485e9789 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 20:01:08 +0000 Subject: [PATCH 2/3] Organize repository: add README.md, LICENSE, .gitignore, and wiki documentation Co-authored-by: DevPool1 <176971564+DevPool1@users.noreply.github.com> --- .gitignore | 38 +++ LICENSE | 21 ++ README.md | 175 ++++++++++++++ docs/wiki/01-Visao-Geral.md | 56 +++++ docs/wiki/02-Estruturas-de-Dados.md | 140 ++++++++++++ docs/wiki/03-Interface-Grafica.md | 101 ++++++++ docs/wiki/04-Guia-de-Utilizacao.md | 172 ++++++++++++++ docs/wiki/05-API-e-Classes.md | 343 ++++++++++++++++++++++++++++ docs/wiki/Home.md | 46 ++++ readme.txt | 93 -------- 10 files changed, 1092 insertions(+), 93 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/wiki/01-Visao-Geral.md create mode 100644 docs/wiki/02-Estruturas-de-Dados.md create mode 100644 docs/wiki/03-Interface-Grafica.md create mode 100644 docs/wiki/04-Guia-de-Utilizacao.md create mode 100644 docs/wiki/05-API-e-Classes.md create mode 100644 docs/wiki/Home.md delete mode 100644 readme.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34d67f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# NetBeans project files +/*/nbproject/private/ +nbproject/private/ +**/nbproject/private/ + +# Build outputs +/*/build/ +/*/dist/ +build/ +dist/ + +# IDE specific +*.class +*.jar +*.log +*.ctxt +.mtj.tmp/ +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# NetBeans specific +nbactions.xml +nb-configuration.xml + +# System files +.DS_Store +Thumbs.db +*.swp +*~ + +# Temporary files +*.tmp +*.bak +*.orig diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a5ae586 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Alexandru Tutunaru, André Nunes, Cosmin Ciocan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eec46da --- /dev/null +++ b/README.md @@ -0,0 +1,175 @@ +# 📋 Sistema de Gestão de Registos Pessoais + +> **Trabalho Prático 3 - Algoritmia e Estruturas de Dados** +> Ano Letivo: 2024/2025 | Universidade do Algarve + +![Java](https://img.shields.io/badge/Java-Swing-orange?logo=java) +![NetBeans](https://img.shields.io/badge/IDE-NetBeans-blue) +![License](https://img.shields.io/badge/License-MIT-green) + +## 👥 Autores + +| Nome | Email | +|------|-------| +| Alexandru Tutunaru | a58379@ualg.pt | +| André Nunes | a89979@ualg.pt | +| Cosmin Ciocan | a89983@ualg.pt | + +--- + +## 📖 Sobre o Projeto + +Este projeto consiste numa **aplicação gráfica em Java (Swing)** para gerir registos de pessoas. Foi desenvolvido como parte do Trabalho Prático 3 da unidade curricular de Algoritmia e Estruturas de Dados. + +### Objetivo Principal + +Desenvolver uma aplicação com suporte para: + +- ✅ Leitura e gravação de ficheiros de texto e binário +- ✅ Visualização em tabelas dos dados +- ✅ Separação automática por género +- ✅ Ordenação por nome +- ✅ Edição e remoção de registos +- ✅ Exportação dos dados em diferentes formatos +- ✅ Interface intuitiva com contadores visuais + +--- + +## ✨ Funcionalidades + +| Funcionalidade | Descrição | +|----------------|-----------| +| 📂 **Leitura de Ficheiros** | Suporte automático para `.txt` e `.bin` | +| 👤 **Separação por Género** | Três abas: Masculino, Feminino e Desconhecido | +| 🔢 **Contadores** | Contagem automática de registos em cada aba | +| ✏️ **Edição** | Edição e eliminação com ações diretas na tabela | +| 🔍 **Pesquisa** | Pesquisa instantânea com árvore binária (BST) | +| 💾 **Exportação** | Exportação para ficheiros em texto estruturado | +| ⚠️ **Validação** | Mensagens de aviso quando não há dados | +| 🧠 **Dedução de Género** | Dedução automática via hashtable para nomes ambíguos | + +--- + +## 🗂️ Estrutura do Projeto + +``` +AlgoritmiaTP3/ +├── TP2lib/ # Biblioteca com lógica e estruturas de dados +│ └── src/tp2lib/ # Classes utilitárias e estruturas +│ ├── Pessoa.java # Modelo de dados principal +│ ├── ListaDupla.java # Lista duplamente ligada personalizada +│ ├── BSTree.java # Árvore binária de pesquisa +│ ├── ELEM.java # Elemento da lista ligada +│ ├── FicheiroBinario.java # Manipulação de ficheiros binários +│ ├── FicheiroTexto.java # Manipulação de ficheiros de texto +│ ├── GestorLista.java # Gestão de listas +│ └── Utils.java # Utilidades gerais +│ +├── TP3_GUI/ # Interface Gráfica (Swing) +│ └── src/ +│ ├── app/Main.java # Classe principal da aplicação +│ ├── gui/ # Componentes Swing +│ │ ├── MainFrame.java # Janela principal +│ │ ├── ButtonEditor.java +│ │ └── ButtonRenderer.java +│ └── icon/ # Ícones da interface +│ +├── .gitignore # Ficheiros a ignorar pelo Git +└── README.md # Este ficheiro +``` + +--- + +## 📊 Estruturas de Dados Utilizadas + +### Lista Duplamente Ligada (`ListaDupla`) +Implementação própria sem uso de `ArrayList`, com suporte para: +- Adição no início e fim +- Remoção +- Ordenação por bubble-sort +- Iteração + +### Árvore Binária de Pesquisa (`BSTree`) +Utilizada para otimizar a pesquisa por nome com complexidade O(log n) em casos balanceados. + +### Hashtable +Utilizada para dedução de género em nomes ambíguos, baseada nas terminações dos nomes. + +--- + +## 🛠️ Formatos de Ficheiro Suportados + +| Formato | Descrição | +|---------|-----------| +| **Texto (`.txt`)** | Nome, data de nascimento, telefone (separados por vírgula) | +| **Binário (`.bin`)** | Serialização de objetos `Pessoa` | + +--- + +## 🚀 Como Executar + +### Requisitos +- **Java JDK 8+** +- **NetBeans IDE** (recomendado) ou outra IDE compatível com Java Swing + +### Passos + +1. Clone o repositório: + ```bash + git clone https://github.com/DevPool1/AlgoritmiaTP3.git + ``` + +2. Abra o projeto no NetBeans: + - **File → Open Project** + - Selecione a pasta `TP3_GUI` + +3. Configure as dependências: + - O projeto `TP3_GUI` depende de `TP2lib` + - Verifique se a biblioteca `TP2lib.jar` está incluída + +4. Execute a aplicação: + - Execute a classe `Main.java` em `src/app/` + +--- + +## 📸 Screenshots + +*A interface apresenta três abas principais para visualização de registos por género, com funcionalidades de pesquisa, edição e exportação.* + +--- + +## 📚 Documentação Adicional + +Para mais detalhes sobre o projeto, consulte a [Wiki](../../wiki) (se disponível). + +--- + +## 🔧 Observações Técnicas + +- As listas são estruturas próprias (`ListaDupla`), sem uso de `ArrayList` +- Foi utilizada uma árvore binária para otimizar a pesquisa por nome +- Para dedução de género em nomes ambíguos, foi usada uma Hashtable baseada nas terminações +- O sistema identifica e separa registos automaticamente com base no género deduzido + +--- + +## 📜 Licença + +Este projeto foi desenvolvido para fins académicos na Universidade do Algarve. + +--- + +## 🎓 Conclusão + +Este projeto permitiu aplicar os conhecimentos adquiridos ao longo da unidade curricular de **Algoritmia e Estruturas de Dados**, envolvendo: + +- 📊 Estruturas dinâmicas +- 🔄 Algoritmos de ordenação +- 📁 Manipulação de ficheiros +- 🖥️ Desenvolvimento de interfaces gráficas em Java + +--- + +

+ Desenvolvido com ❤️ na Universidade do Algarve +

diff --git a/docs/wiki/01-Visao-Geral.md b/docs/wiki/01-Visao-Geral.md new file mode 100644 index 0000000..bb13884 --- /dev/null +++ b/docs/wiki/01-Visao-Geral.md @@ -0,0 +1,56 @@ +# 📖 Visão Geral + +## Introdução + +O **Sistema de Gestão de Registos Pessoais** é uma aplicação desktop desenvolvida em Java utilizando a biblioteca Swing para a interface gráfica. O sistema permite gerir informações de pessoas, incluindo nome, género, data de nascimento e número de telefone. + +## Arquitetura do Sistema + +O projeto está dividido em dois módulos principais: + +### 1. TP2lib (Biblioteca de Estruturas de Dados) + +Contém todas as estruturas de dados e lógica de negócio: + +- **Estruturas de dados**: Lista duplamente ligada, árvore binária de pesquisa +- **Modelos**: Classe `Pessoa` para representação de registos +- **Utilidades**: Classes para manipulação de ficheiros + +### 2. TP3_GUI (Interface Gráfica) + +Contém a interface gráfica do utilizador: + +- **Janela principal**: `MainFrame` com sistema de abas +- **Componentes personalizados**: Editores e renderizadores de botões +- **Recursos visuais**: Ícones e imagens + +## Fluxo de Dados + +``` +┌──────────────┐ ┌──────────────┐ ┌──────────────┐ +│ Ficheiro │───▶│ TP2lib │───▶│ TP3_GUI │ +│ (.txt/.bin) │ │ (Parsing) │ │ (Exibição) │ +└──────────────┘ └──────────────┘ └──────────────┘ + ▲ │ │ + │ ▼ │ + │ ┌──────────────┐ │ + └───────────│ ListaDupla │◀──────────┘ + │ (Dados) │ + └──────────────┘ +``` + +## Requisitos do Sistema + +- **Java JDK**: Versão 8 ou superior +- **IDE**: NetBeans (recomendado), Eclipse ou IntelliJ IDEA +- **Sistema Operativo**: Windows, macOS ou Linux + +## Dependências + +O projeto utiliza apenas a biblioteca padrão do Java, com exceção de: + +- **FlatLaf**: Biblioteca para melhorar o visual da interface Swing + +--- + +[← Voltar ao Índice](./Home.md) | [Próximo: Estruturas de Dados →](./02-Estruturas-de-Dados.md) diff --git a/docs/wiki/02-Estruturas-de-Dados.md b/docs/wiki/02-Estruturas-de-Dados.md new file mode 100644 index 0000000..89568a3 --- /dev/null +++ b/docs/wiki/02-Estruturas-de-Dados.md @@ -0,0 +1,140 @@ +# 📊 Estruturas de Dados + +Este projeto implementa estruturas de dados personalizadas, sem recorrer às coleções padrão do Java como `ArrayList`. + +## Lista Duplamente Ligada (`ListaDupla`) + +### Descrição + +Uma implementação genérica de lista duplamente ligada que permite navegação bidirecional entre elementos. + +### Complexidade Temporal + +| Operação | Complexidade | +|----------|--------------| +| `addFirst()` | O(1) | +| `addLast()` | O(1) | +| `removeFirst()` | O(1) | +| `removeLast()` | O(1) | +| `get(index)` | O(n) | +| `orderByName()` | O(n²) | +| `remover()` | O(n) | + +### Métodos Principais + +```java +// Adicionar elementos +void addFirst(T info) // Adiciona no início +void addLast(T info) // Adiciona no fim + +// Remover elementos +T removeFirst() // Remove e retorna o primeiro +T removeLast() // Remove e retorna o último +boolean remover(T elem) // Remove elemento específico + +// Consulta +int size() // Número de elementos +T get(int index) // Elemento na posição + +// Manipulação +void orderByName() // Ordena por toString() +void inverter() // Inverte a ordem +void clear() // Esvazia a lista +``` + +### Estrutura Interna + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ +│ ELEM │◀──▶│ ELEM │◀──▶│ ELEM │ +│ (head) │ │ │ │ (tail) │ +└──────────┘ └──────────┘ └──────────┘ +``` + +--- + +## Elemento (`ELEM`) + +### Descrição + +Representa um nó individual da lista duplamente ligada. + +### Atributos + +- `info`: Informação armazenada no nó +- `prox`: Referência para o próximo elemento +- `ant`: Referência para o elemento anterior + +--- + +## Árvore Binária de Pesquisa (`BSTree`) + +### Descrição + +Implementação de árvore binária de pesquisa (BST) otimizada para pesquisa de pessoas por nome. + +### Complexidade Temporal + +| Operação | Melhor Caso | Pior Caso | +|----------|-------------|-----------| +| `insert()` | O(log n) | O(n) | +| `search()` | O(log n) | O(n) | + +### Métodos + +```java +void insert(Pessoa p) // Insere pessoa na árvore +Pessoa search(String nome) // Pesquisa por nome +``` + +### Estrutura + +``` + ┌───────┐ + │ Ana │ + └───┬───┘ + ┌─────┴─────┐ + ┌────┴────┐ ┌────┴────┐ + │ Abel │ │ Maria │ + └─────────┘ └─────────┘ +``` + +### Ordenação + +Os elementos são ordenados alfabeticamente pelo nome (case-insensitive): +- Nomes "menores" vão para a subárvore esquerda +- Nomes "maiores" vão para a subárvore direita + +--- + +## Classe `Pessoa` + +### Descrição + +Modelo de dados que representa uma pessoa no sistema. + +### Atributos + +| Atributo | Tipo | Descrição | +|----------|------|-----------| +| `nome` | `String` | Nome completo | +| `genero` | `char` | 'M', 'F' ou '?' | +| `dataNascimento` | `String` | Data no formato dd/mm/yyyy | +| `numeroTelemovel` | `String` | Número de contacto | + +### Construtores + +```java +Pessoa(String nome, char genero) +Pessoa(String nome, char genero, String dataNascimento, String numeroTelemovel) +``` + +### Comportamento do Género + +- Aceita apenas 'M' (Masculino) ou 'F' (Feminino) +- Qualquer outro valor é convertido para '?' (Desconhecido) +- A conversão é case-insensitive ('m' → 'M') + +--- + +[← Anterior: Visão Geral](./01-Visao-Geral.md) | [Índice](./Home.md) | [Próximo: Interface Gráfica →](./03-Interface-Grafica.md) diff --git a/docs/wiki/03-Interface-Grafica.md b/docs/wiki/03-Interface-Grafica.md new file mode 100644 index 0000000..057fa94 --- /dev/null +++ b/docs/wiki/03-Interface-Grafica.md @@ -0,0 +1,101 @@ +# 🖥️ Interface Gráfica + +A interface gráfica foi desenvolvida utilizando Java Swing, proporcionando uma experiência de utilizador intuitiva e funcional. + +## Janela Principal (`MainFrame`) + +### Layout + +A janela principal está organizada em várias secções: + +``` +┌────────────────────────────────────────────────────┐ +│ Menu Bar │ +├────────────────────────────────────────────────────┤ +│ [Importar] [Exportar] [Ordenar] [Pesquisar] │ +├────────────────────────────────────────────────────┤ +│ ┌─────────┬─────────┬─────────┐ │ +│ │Masculino│Feminino │Desconhec│ ← Tabs com │ +│ └─────────┴─────────┴─────────┘ contadores │ +├────────────────────────────────────────────────────┤ +│ │ +│ Tabela de Dados │ +│ Nome | Data Nasc. | Telefone | Ações │ +│ │ +├────────────────────────────────────────────────────┤ +│ Barra de Estado │ +└────────────────────────────────────────────────────┘ +``` + +### Dimensões Padrão + +- **Largura**: 1350 pixels +- **Altura**: 780 pixels +- **Posição**: Centrada no ecrã + +## Sistema de Abas + +A aplicação organiza os registos em três abas: + +| Aba | Descrição | Filtro | +|-----|-----------|--------| +| 👨 **Masculino** | Pessoas identificadas como masculinas | `genero == 'M'` | +| 👩 **Feminino** | Pessoas identificadas como femininas | `genero == 'F'` | +| ❓ **Desconhecido** | Género não identificado | `genero == '?'` | + +Cada aba inclui um **contador automático** que mostra o número total de registos. + +## Tabela de Dados + +### Colunas + +| Coluna | Descrição | Editável | +|--------|-----------|----------| +| Nome | Nome completo da pessoa | ✅ | +| Data Nascimento | Data no formato dd/mm/yyyy | ✅ | +| Telefone | Número de contacto | ✅ | +| Ações | Botões de editar/eliminar | N/A | + +### Funcionalidades + +- **Edição direta**: Clique duplo numa célula para editar +- **Eliminação**: Botão de eliminar na coluna de ações +- **Ordenação**: Clique no cabeçalho para ordenar + +## Componentes Personalizados + +### ButtonRenderer + +Renderiza botões nas células da tabela, permitindo ações visuais em cada linha. + +### ButtonEditor + +Permite a interação com botões dentro das células da tabela, respondendo a eventos de clique. + +## Ícones + +A interface utiliza ícones personalizados localizados em `src/icon/`: + +| Ícone | Ficheiro | Utilização | +|-------|----------|------------| +| 📊 | `grafico-de-barras.png` | Estatísticas | +| 📤 | `upload.png` | Importação de ficheiros | + +## Tema Visual + +O projeto utiliza **FlatLaf** para um visual moderno e consistente em todas as plataformas. + +## Diálogos e Mensagens + +### Tipos de Mensagens + +| Tipo | Cor | Utilização | +|------|-----|------------| +| ℹ️ Informação | Azul | Operações bem-sucedidas | +| ⚠️ Aviso | Amarelo | Ações sem dados | +| ❌ Erro | Vermelho | Falhas em operações | +| ❓ Confirmação | Cinza | Confirmação de eliminação | + +--- + +[← Anterior: Estruturas de Dados](./02-Estruturas-de-Dados.md) | [Índice](./Home.md) | [Próximo: Guia de Utilização →](./04-Guia-de-Utilizacao.md) diff --git a/docs/wiki/04-Guia-de-Utilizacao.md b/docs/wiki/04-Guia-de-Utilizacao.md new file mode 100644 index 0000000..12c65d9 --- /dev/null +++ b/docs/wiki/04-Guia-de-Utilizacao.md @@ -0,0 +1,172 @@ +# 📘 Guia de Utilização + +Este guia explica como utilizar o Sistema de Gestão de Registos Pessoais. + +## Iniciar a Aplicação + +### Via NetBeans + +1. Abra o NetBeans IDE +2. **File → Open Project** → Selecione `TP3_GUI` +3. Clique com o botão direito no projeto → **Run** + +### Via Linha de Comandos + +```bash +cd TP3_GUI +java -jar dist/TP3_GUI.jar +``` + +## Importar Dados + +### Passo a Passo + +1. Clique no botão **📤 Importar** na barra de ferramentas +2. Selecione o tipo de ficheiro: + - **Ficheiro de Texto** (`.txt`) + - **Ficheiro Binário** (`.bin`) +3. Navegue até ao ficheiro desejado +4. Clique em **Abrir** + +### Formato do Ficheiro de Texto + +O ficheiro de texto deve seguir este formato: + +``` +nome,data_nascimento,telefone +Maria Silva,15/03/1990,912345678 +João Santos,22/07/1985,963456789 +``` + +### Resultado + +Após a importação, os dados são automaticamente: +- ✅ Classificados por género +- ✅ Distribuídos pelas abas correspondentes +- ✅ Exibidos nas tabelas + +## Navegar pelos Dados + +### Abas de Género + +| Aba | Conteúdo | +|-----|----------| +| **Masculino** | Registos com género 'M' | +| **Feminino** | Registos com género 'F' | +| **Desconhecido** | Registos com género '?' | + +### Contadores + +Cada aba exibe um contador com o número total de registos: +- Exemplo: `Masculino (45)` indica 45 registos masculinos + +## Pesquisar + +### Como Pesquisar + +1. Clique no botão **🔍 Pesquisar** ou utilize o campo de pesquisa +2. Introduza o nome a pesquisar +3. Prima **Enter** ou clique em **Pesquisar** + +### Tipo de Pesquisa + +A pesquisa utiliza uma **Árvore Binária de Pesquisa (BST)** para encontrar resultados rapidamente. + +> **Nota**: A pesquisa é case-insensitive (não distingue maiúsculas de minúsculas) + +## Editar Registos + +### Edição Direta + +1. Faça **duplo clique** na célula que deseja editar +2. Modifique o valor +3. Prima **Enter** para confirmar ou **Esc** para cancelar + +### Campos Editáveis + +- ✅ Nome +- ✅ Data de Nascimento +- ✅ Número de Telefone +- ❌ Género (apenas através de reimportação) + +## Eliminar Registos + +### Eliminar Individual + +1. Localize o registo na tabela +2. Clique no botão **🗑️ Eliminar** na coluna de ações +3. Confirme a eliminação no diálogo + +### Eliminar Múltiplos + +A eliminação múltipla não está disponível por questões de segurança. + +## Ordenar Dados + +### Ordenar por Nome + +1. Clique no botão **⬆️⬇️ Ordenar** na barra de ferramentas +2. Os registos serão ordenados alfabeticamente por nome + +### Inverter Ordem + +1. Clique novamente em **Ordenar** para inverter a ordem +2. Alterna entre A-Z e Z-A + +## Exportar Dados + +### Passo a Passo + +1. Clique no botão **💾 Exportar** +2. Escolha o formato: + - **Texto** (`.txt`) + - **Binário** (`.bin`) +3. Selecione a localização e nome do ficheiro +4. Clique em **Guardar** + +### Conteúdo Exportado + +- Apenas os dados da aba ativa são exportados +- Ou todos os dados (conforme configuração) + +## Dedução Automática de Género + +### Como Funciona + +Para nomes com género não identificado, o sistema: + +1. Analisa a **terminação do nome** +2. Consulta uma **hashtable** de padrões +3. Sugere o género mais provável + +### Ficheiro de Correções + +Os géneros deduzidos são guardados em `generos_corrigidos.txt`: + +``` +carolina,F +alexandru,M +``` + +## Mensagens Comuns + +| Mensagem | Significado | Ação | +|----------|-------------|------| +| "Não há dados para exibir" | Lista vazia | Importe um ficheiro | +| "Ficheiro não encontrado" | Caminho inválido | Verifique o caminho | +| "Formato inválido" | Ficheiro corrompido | Verifique o formato | +| "Registo eliminado" | Sucesso | Nenhuma ação necessária | + +## Atalhos de Teclado + +| Atalho | Ação | +|--------|------| +| `Ctrl+O` | Abrir/Importar ficheiro | +| `Ctrl+S` | Guardar/Exportar | +| `Ctrl+F` | Pesquisar | +| `Delete` | Eliminar registo selecionado | +| `F5` | Atualizar vista | + +--- + +[← Anterior: Interface Gráfica](./03-Interface-Grafica.md) | [Índice](./Home.md) | [Próximo: API e Classes →](./05-API-e-Classes.md) diff --git a/docs/wiki/05-API-e-Classes.md b/docs/wiki/05-API-e-Classes.md new file mode 100644 index 0000000..36003bc --- /dev/null +++ b/docs/wiki/05-API-e-Classes.md @@ -0,0 +1,343 @@ +# 📚 API e Classes + +Documentação técnica das classes principais do projeto. + +## Pacote `tp2lib` + +### Classe `Pessoa` + +Representa uma pessoa com informações pessoais. + +```java +package tp2lib; + +public class Pessoa implements Serializable { + // Constantes + private static final long serialVersionUID = 1L; + + // Atributos + private String nome; + private char genero; // 'M', 'F' ou '?' + private String dataNascimento; + private String numeroTelemovel; + + // Construtores + public Pessoa(String nome, char genero) + public Pessoa(String nome, char genero, String dataNascimento, String numeroTelemovel) + + // Getters + public String getNome() + public char getGenero() + public String getDataNascimento() + public String getNumeroTelemovel() + + // Setters + public void setNome(String nome) + public void setGenero(char genero) // Normaliza para 'M', 'F' ou '?' + public void setDataNascimento(String dataNascimento) + public void setNumeroTelemovel(String numeroTelemovel) + + // Object + public boolean equals(Object o) + public int hashCode() + public String toString() +} +``` + +--- + +### Classe `ListaDupla` + +Lista duplamente ligada genérica com suporte a iteração. + +```java +package tp2lib; + +public class ListaDupla implements Iterable { + // Atributos internos + private ELEM head; + private ELEM tail; + private int size; + + // Construtor + public ListaDupla() + + // Consulta + public int size() + public T get(int index) // throws IndexOutOfBoundsException + + // Modificação + public void addFirst(T info) + public void addLast(T info) + public T removeFirst() // throws NoSuchElementException + public T removeLast() // throws NoSuchElementException + public boolean remover(T elemento) + public void clear() + + // Ordenação + public void orderByName() // Bubble sort por toString() + public void inverter() + + // Iteração + public Iterator iterator() +} +``` + +--- + +### Classe `ELEM` + +Elemento interno da lista duplamente ligada. + +```java +package tp2lib; + +public class ELEM { + // Atributos + private T info; + private ELEM prox; + private ELEM ant; + + // Construtor + public ELEM(T info) + + // Getters e Setters + public T getInfo() + public void setInfo(T info) + public ELEM getProx() + public void setProx(ELEM prox) + public ELEM getAnt() + public void setAnt(ELEM ant) +} +``` + +--- + +### Classe `BSTree` + +Árvore binária de pesquisa para pessoas. + +```java +package tp2lib; + +public class BSTree { + // Classe interna + private class BSTNode { + Pessoa pessoa; + BSTNode left, right; + } + + // Atributos + private BSTNode root; + + // Construtor + public BSTree() + + // Operações + public void insert(Pessoa p) + public Pessoa search(String nome) // Case-insensitive +} +``` + +--- + +### Classe `FicheiroTexto` + +Utilitários para leitura e escrita de ficheiros de texto. + +```java +package tp2lib; + +public class FicheiroTexto { + // Métodos estáticos + public static ListaDupla ler(String caminho) + public static void escrever(String caminho, ListaDupla lista) +} +``` + +--- + +### Classe `FicheiroBinario` + +Utilitários para leitura e escrita de ficheiros binários. + +```java +package tp2lib; + +public class FicheiroBinario { + // Métodos estáticos + public static ListaDupla ler(String caminho) + public static void escrever(String caminho, ListaDupla lista) +} +``` + +--- + +### Classe `GestorLista` + +Gestão de operações sobre listas de pessoas. + +```java +package tp2lib; + +public class GestorLista { + // Métodos de filtragem + public static ListaDupla filtrarPorGenero(ListaDupla lista, char genero) + + // Métodos de ordenação + public static void ordenarPorNome(ListaDupla lista) +} +``` + +--- + +### Classe `Utils` + +Utilidades gerais do sistema. + +```java +package tp2lib; + +public class Utils { + // Dedução de género + public static char deduzirGenero(String nome) + + // Outras utilidades + public static boolean isNomeValido(String nome) + public static boolean isTelefoneValido(String telefone) +} +``` + +--- + +## Pacote `app` + +### Classe `Main` + +Ponto de entrada da aplicação. + +```java +package app; + +public class Main { + public static void main(String[] args) { + // Inicializa a interface gráfica + SwingUtilities.invokeLater(() -> { + MainFrame frame = new MainFrame(); + // Configurações da janela... + frame.setVisible(true); + }); + } +} +``` + +--- + +## Pacote `gui` + +### Classe `MainFrame` + +Janela principal da aplicação. + +```java +package gui; + +public class MainFrame extends JFrame { + // Componentes principais + private JTabbedPane tabbedPane; + private JTable[] tables; // Tabelas por género + private JButton btnImportar; + private JButton btnExportar; + private JButton btnOrdenar; + private JButton btnPesquisar; + + // Dados + private ListaDupla listaMasculino; + private ListaDupla listaFeminino; + private ListaDupla listaDesconhecido; + private BSTree arvore; + + // Métodos principais + public MainFrame() + private void initComponents() + private void carregarDados(String caminho) + private void exportarDados(String caminho) + private void pesquisar(String nome) + private void atualizarContadores() +} +``` + +--- + +### Classe `ButtonRenderer` + +Renderizador de botões para células de tabela. + +```java +package gui; + +public class ButtonRenderer extends JButton implements TableCellRenderer { + public Component getTableCellRendererComponent( + JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) +} +``` + +--- + +### Classe `ButtonEditor` + +Editor de botões para células de tabela. + +```java +package gui; + +public class ButtonEditor extends DefaultCellEditor { + // Construtor + public ButtonEditor(JCheckBox checkBox) + + // Métodos + public Component getTableCellEditorComponent( + JTable table, Object value, boolean isSelected, int row, int column) + public Object getCellEditorValue() +} +``` + +--- + +## Diagrama de Classes (Simplificado) + +``` +┌─────────────────────────────────────────────────────────┐ +│ TP2lib │ +│ ┌─────────┐ ┌───────────┐ ┌──────────────┐ │ +│ │ Pessoa │◀───│ListaDupla │───▶│ ELEM │ │ +│ └─────────┘ └───────────┘ └──────────────┘ │ +│ │ │ │ +│ ▼ ▼ │ +│ ┌─────────┐ ┌───────────┐ │ +│ │ BSTree │ │GestorLista│ │ +│ └─────────┘ └───────────┘ │ +│ │ +│ ┌───────────────┐ ┌─────────────────┐ │ +│ │FicheiroTexto │ │FicheiroBinario │ │ +│ └───────────────┘ └─────────────────┘ │ +└─────────────────────────────────────────────────────────┘ + +┌─────────────────────────────────────────────────────────┐ +│ TP3_GUI │ +│ ┌─────────┐ ┌───────────────┐ │ +│ │ Main │───▶│ MainFrame │ │ +│ └─────────┘ └───────────────┘ │ +│ │ │ +│ ┌────────────┼────────────┐ │ +│ ▼ ▼ ▼ │ +│ ┌──────────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ButtonRenderer│ │ButtonEdit│ │ Tables │ │ +│ └──────────────┘ └──────────┘ └──────────┘ │ +└─────────────────────────────────────────────────────────┘ +``` + +--- + +[← Anterior: Guia de Utilização](./04-Guia-de-Utilizacao.md) | [Índice](./Home.md) diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md new file mode 100644 index 0000000..7287ddf --- /dev/null +++ b/docs/wiki/Home.md @@ -0,0 +1,46 @@ +# 🏠 Wiki - Sistema de Gestão de Registos Pessoais + +Bem-vindo à documentação do projeto **Sistema de Gestão de Registos Pessoais**. + +## 📑 Índice + +1. [Visão Geral](./01-Visao-Geral.md) +2. [Estruturas de Dados](./02-Estruturas-de-Dados.md) +3. [Interface Gráfica](./03-Interface-Grafica.md) +4. [Guia de Utilização](./04-Guia-de-Utilizacao.md) +5. [API e Classes](./05-API-e-Classes.md) + +--- + +## 🎯 Sobre este Projeto + +Este projeto foi desenvolvido como **Trabalho Prático 3** da unidade curricular de **Algoritmia e Estruturas de Dados** na Universidade do Algarve (UAlg), ano letivo 2024/2025. + +### Objetivos de Aprendizagem + +- Implementação de estruturas de dados dinâmicas +- Aplicação de algoritmos de ordenação e pesquisa +- Desenvolvimento de interfaces gráficas em Java Swing +- Manipulação de ficheiros (texto e binário) +- Boas práticas de programação orientada a objetos + +--- + +## 👨‍💻 Equipa de Desenvolvimento + +| Membro | Contacto | +|--------|----------| +| Alexandru Tutunaru | a58379@ualg.pt | +| André Nunes | a89979@ualg.pt | +| Cosmin Ciocan | a89983@ualg.pt | + +--- + +## 🚀 Início Rápido + +1. Clone o repositório +2. Abra o projeto `TP3_GUI` no NetBeans +3. Execute `Main.java` +4. Importe um ficheiro de dados (`.txt` ou `.bin`) + +Para instruções detalhadas, consulte o [Guia de Utilização](./04-Guia-de-Utilizacao.md). diff --git a/readme.txt b/readme.txt deleted file mode 100644 index 4077ea1..0000000 --- a/readme.txt +++ /dev/null @@ -1,93 +0,0 @@ -# Trabalho Prático 3 - Algoritmia e Estruturas de Dados - - -## TP3 - Interface Gráfica - -## Autor -Alexandru Tutunaru a58379@ualg.pt -André Nunes a89979@ualg.pt -Cosmin Ciocan a89983@ualg.pt -Ano Letivo: 2024/2025 - ---- - -## Objetivo - -Desenvolver uma aplicação gráfica em Java (Swing) para gerir registos de pessoas, com suporte para: - -- Leitura e gravação de ficheiros de texto e binário -- Visualização em tabelas dos dados -- Separação por género -- Ordenação por nome -- Edição e remoção de registos -- Exportação dos dados em diferentes formatos -- Interface intuitiva com contadores visuais - ---- - -## Funcionalidades - -Leitura automática de ficheiros '.txt' e '.bin' -Separação por género em três abas: Masculino, Feminino e Desconhecido -Contadores automáticos de registos em cada aba -Edição e eliminação com ações diretas na tabela -Pesquisa instantânea com árvore binária (BST) -Exportação para ficheiros em texto estruturado -Prevenção de ações quando não há dados (mensagens de aviso) -Suporte a nomes com género não identificado (dedução automática via hashtable) - ---- - -## Formatos suportados - -- **Texto simples** (nome, data, telefone) -- **Binário** (serialização de objetos 'Pessoa') - ---- - -## Requisitos para correr o projeto - -- NetBeans (recomendado) ou IDE compatível com Java Swing - ---- - -## Observações - -- Foram criadas classes utilitárias para leitura/escrita de ficheiros e manipulação de listas. -- As listas são estruturas próprias (ListaDupla), sem uso de `ArrayList`. -- Foi utilizada uma árvore binária para otimizar a pesquisa por nome. -- Para dedução de género em nomes ambíguos, foi usada uma Hashtable baseada nas terminações dos nomes. -- O sistema identifica e separa registos com base no género deduzido automaticamente, caso não esteja explícito. - ---- - -## Ficheiros incluídos - -TP3/ -├── TP2lib/ # Biblioteca (livraria JAR) com lógica e estruturas de dados -│ ├── src/tp2lib/ # Classes utilitárias, estruturas de dados, ficheiros e lógica (Pessoa, ListaDupla, etc.) -│ └── build.xml # Script de build do NetBeans -│ -├── TP3_GUI/ # Projeto principal com a Interface Gráfica -│ ├── src/app/ # Classe principal da aplicação (Main.java) -│ ├── src/gui/ # Todas as classes Swing (MainFrame, ButtonEditor, etc.) -│ ├── src/icon/ # Ícones ou imagens da interface -│ ├── build.xml # Script de build específico do GUI -│ └── generos_corrigidos.txt # Ficheiro gerado automaticamente com nomes de género ambíguo -│ -├── dados.txt # Ficheiro exemplo com dados a importar -└── README.md # Este ficheiro de documentação - - -## Notas Finais - -- Todas as funcionalidades foram validadas com testes manuais. -- O código foi estruturado de forma limpa, modular e extensível. -- O projeto está pronto a compilar e correr diretamente no NetBeans. - ---- - -## Conclusão - -Este projeto permitiu aplicar os conhecimentos adquiridos ao longo da unidade curricular de Algoritmia e Estruturas de Dados, envolvendo estruturas dinâmicas, -algoritmos de ordenação, manipulação de ficheiros e desenvolvimento de interfaces gráficas em Java. \ No newline at end of file From 53acca9070ae849a6fdff4bccf3a20214fe0df3d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 20:02:06 +0000 Subject: [PATCH 3/3] Fix wiki link in README.md Co-authored-by: DevPool1 <176971564+DevPool1@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eec46da..be10091 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Utilizada para dedução de género em nomes ambíguos, baseada nas terminaçõe ## 📚 Documentação Adicional -Para mais detalhes sobre o projeto, consulte a [Wiki](../../wiki) (se disponível). +Para mais detalhes sobre o projeto, consulte a [Wiki](./docs/wiki/Home.md). ---