1
Programação 1 / Projeto AV1
« Online: Maio 04, 2019, 03:22:55 pm »
Descrição do projeto publicada com a permissão do professor Anderson Silva
Fim da descrição do projeto
AVISO: Meu projeto contém muito mais do que o que foi solicitado pelo professor e em alguns pontos não tem o que foi solicitado pelo mesmo, mas eu chequei com o professor se era aceitável antes de fazer a apresentação e ele concordou.
Por exemplo:
Menu do programa:
O projeto é constituído de seis arquivos:
Copiar e colar o conteúdo dos arquivos clientes.txt e carros.txt pode não dar certo, principalmente no casso de carros.txt, que pode requerer uma linha em branco no final para que o programa inicie. Além disso, para não deixar esta página longa demais eu decidi exibir apenas uma amostra do conteúdo desses dois arquivos. Por isso eu anexei no final do post um arquivo zip com todos os arquivos. Se quiser tentar rodar este projeto, use o conteúdo do zip e não o que está exibido aqui.
AVISO: O lugar certo para colocar carros.txt e clientes.txt depende do IDE que você está usando. No caso do Eclipse, se o nome do projeto for ProjetoAV1, os arquivos txt devem ser depositados em \eclipse-workspace\ProjetoAV1\.
Para descobrir qual o lugar correto, descomente a linha:
//System.out.println(new File(".").getAbsoluteFile());
no arquivo Principal.java.
Se ainda assim precisar de ajuda para descobrir o lugar certo no seu IDE, me pergunte isso na sala de aula.
Explicações para algumas decisões de design
Citar
Locadora de Veículos
A APS Locadora de Veículos precisa de uma sistema que organize todos os carros que estão alugados e não alugados.
Sabendo que a locadora possui 20 carros em seu pátio, sendo eles divididos da seguinte forma:
- 3 – Fiat Pálio 1.0 cor prata Totalflex – 50.000km rodados
- 2 – Hyundai HB20 1.6 cor branco Totalflex – 40.000 km rodados;
- 5 – Volkswagen Gol 1.0 cor preto Gasolina – 55.000 km rodados;
- 3 – GM Camaros 3.0 cor amarelo TotalFlex – 7.000 km rodados;
- 1 – Ford Fusion 2.0 cor preto TotalFlex – 15.000 km rodados;
- 1 – Dodge Viper 8.3 cor azul Gasolina – 5.000 km rodados;
Cada cliente da locadora APS possui um cadastro com os seguintes itens:
- Nome
- Endereço
- Telefone
- Idade
- RG
- CPF
- Carro alugado
- Data de aluguel
- Data de devolução
Os carros devem ter todos os atributos mencionados anteriormente no Slide 2;
Os carros devem possuir métodos para informar:
- A quantidade de quilômetros rodados;
Os clientes, por sua vez, devem possuir métodos para informar todos os atributos apresentados no slide 3.
O Sr. Manoel, dono da Locadora APS, deseja controlar os carros que estão atualmente alugados e os carros que estão disponíveis na locadora.
Para isso crie um sistema que tenha as Classes:
- Carro
- Cliente
Crie também os arrays:
- totalDeCarros;
- carrosAlugados;
- clientes;
- clentesAlugando.
Crie um sistema que pergunte se o cliente quer alugar um carro:
Caso a resposta seja sim, crie um novo cliente e adicione-o a liste de clientes (no máximo 20);
Ao se cadastrar, o cliente escolhe um dos carros disponíveis (devem ser apresentados apenas os carros que estejam disponibilizados, não devem ser apresentados os carros já alugados);
No menu principal o usuário também pode escolher apresentar todos os clientes juntamente com os carros que ele está alugando.
Fim da descrição do projeto
AVISO: Meu projeto contém muito mais do que o que foi solicitado pelo professor e em alguns pontos não tem o que foi solicitado pelo mesmo, mas eu chequei com o professor se era aceitável antes de fazer a apresentação e ele concordou.
Por exemplo:
- Eu ignorei as instruções para perguntar ao cliente se queria se cadastrar e depois alugar um carro, porque achei isso mais adequado para um quiosque. Optei por um design diferente, visando ser operado pelo funcionário da locadora;
- Eu não uso os mesmos nomes de arrays indicados pelo professor;
- Eu suprimi os dois arrays carrosAlugados e clientesAlugando, que tinham o objetivo de registrar as informações de aluguel e em vez disso usei atributos das classes
Menu do programa:
Citar
Digite a opcao desejada seguida de ENTER:
1 - Listar frota
2 - Listar clientes com os respectivos carros alugados - versão completa
3 - Listar clientes com os respectivos carros alugados - versão curta
4 - Adicionar cliente
5 - Editar cliente
6 - Procurar cliente pelo CPF
7 - Alugar veículo
8 - Listar veículos alugados
9 - Encerrar aluguel
0 - Sair do programa
O projeto é constituído de seis arquivos:
- Principal.java - A classe que contém a função Main e o menu
- Funcoes.java - Uma classe com todas as funções de uso geral
- Cliente.java - A classe que define o objeto Cliente com todos as funções de validação e formatação de dados
- Carro.java - Idem para o objeto Carro
- carros.txt - Banco de dados (do tipo flat-file database) com todos os carros da frota. Carregado ao iniciar o programa e salvo a cada alteração
- clientes.txt - Banco de dados (também do tipo flat-file database) com clientes fictícios, usado para testar o programa. Nomes, telefones, CPF e RG (São Paulo) são válidos mas falsos. Os endereços são verdadeiros, mas não identificam nenhuma pessoa
Copiar e colar o conteúdo dos arquivos clientes.txt e carros.txt pode não dar certo, principalmente no casso de carros.txt, que pode requerer uma linha em branco no final para que o programa inicie. Além disso, para não deixar esta página longa demais eu decidi exibir apenas uma amostra do conteúdo desses dois arquivos. Por isso eu anexei no final do post um arquivo zip com todos os arquivos. Se quiser tentar rodar este projeto, use o conteúdo do zip e não o que está exibido aqui.
AVISO: O lugar certo para colocar carros.txt e clientes.txt depende do IDE que você está usando. No caso do Eclipse, se o nome do projeto for ProjetoAV1, os arquivos txt devem ser depositados em \eclipse-workspace\ProjetoAV1\.
Para descobrir qual o lugar correto, descomente a linha:
//System.out.println(new File(".").getAbsoluteFile());
no arquivo Principal.java.
Se ainda assim precisar de ajuda para descobrir o lugar certo no seu IDE, me pergunte isso na sala de aula.
Explicações para algumas decisões de design
- Ler os dados de um arquivo externo: Misturar dados com código é uma prática deselegante. O professor não cobrou de ninguém nesse projeto o uso de algum tipo de banco de dados porque nesse estágio do curso ninguém é obrigado a saber como se usa um e muito menos saber distinguir práticas deselegantes de programação. Mas se você souber usar um, em um próximo projeto use pois isso certamente vai contar positivamente na sua nota. Além disso, colocar os dados em um arquivo externo permite sua fácil reutilização em outros projetos;
- O programa já começar com diversos clientes cadastrados - Isso não foi solicitado pelo professor mas já começar automaticamente com diversos dados reais permite acelerar o teste das funções de validação e formatação, reduzindo o número de situações em que você tem que perder tempo digitando dados efêmeros;
- As funções AdicionarCliente() e CarregarClientes() foram desenhadas para trabalhar com um objeto "cliente" intermediário antes de salvar o cliente no array. Fiz isso porque me parece uma forma mais elegante e mais robusta de lidar com objetos. Em vez de "abrir" o elemento no array e esperar pacientemente enquanto o usuário termina de preencher os campos usamos um objeto intermediário que faz todas as validações e que você só "aplica" no array quando estiver satisfeito. Isso possibilitou também incluir a oportunidade de cancelar o cadastro;
- Fiz com que todo método que requeria um Scanner recebesse o Scanner de Main() como parâmetro, para evitar criar vários objetos Scanner e o problema que era gerado ao dar um .close() em um desses objetos (o Scanner em Main() parava de funcionar também);
- Eu evito usar declarações "import" e em vez disso coloco o nome das funções externas por extenso no programa. Por exemplo, onde eu escrevo:
java.util.Scanner scan = new java.util.Scanner (System.in);
Eu poderia simplesmente escrever:
Scanner scan = new Scanner (System.in);
Se fizesse um "import java.util.Scanner".
Isso deixa várias linhas desnecessariamente longas, é verdade, mas eu prefiro dessa forma enquanto estou aprendendo Java porque basta olhar para o código para saber de onde danado vem as funções e é mais fácil reutilizá-las, porque você não precisa saber que "imports" são necessários.