ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO CURSO DE … · 2020-02-07 · ECEC – ESCOLA DE...
Transcript of ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO CURSO DE … · 2020-02-07 · ECEC – ESCOLA DE...
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS
Revisão Rápida e Complementos
01.APLICAÇÃO JAVA
Qualquer aplicação orientada a objeto possui, geralmente, um programa principal,
através do qual efetua-se a chamada aos demais programas (classes).
Essas chamadas são, na maioria das vezes, instanciações das demais classes.
Considerando que a linguagem de programação seja Java, então o programa principal é o único
programa da aplicação que possui o método main.
Dessa forma, o programa principal ficará encarregado de instanciar as demais classes
(programas) da aplicação e executá-las.
Cada classe instanciada pela classe principal, por outro lado, executará um método em seu
interior que, ao ser finalizado, retornará à linha seguinte no programa principal.
Observe na figura a seguir a instanciação das classes ProgramaA e ProgramaB.
Foram criados objetos para cada um dessas classes no código do ProgramaPrincipal.
Figura 01.01
Assim, suponha que você deseja criar um programa que apresente o nome e os
telefones de uma determinada pessoa, sendo que uma pessoa poderá ter nenhum, um ou vários
telefones.
Para essa hipotética solução, você deverá criar uma classe principal (que denominaremos de
Principal), uma classe Pessoa e uma classe Fones.
A classe Pessoa armazenará os dados de uma determinada pessoa em um determinado
momento no programa.
A classe Fones referencia os telefones da referida pessoa nesse momento específico.
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS Como uma Pessoa poderá possuir um, nenhum ou mais de um telefone, teremos que incluir um
atributo na classe pessoa de tal forma que esse atributo deverá ser uma lista específica de
telefones, que denominaremos de listaFones.
Assim, esse atributo deverá ser uma coleção que deve comportar o tipo Fones.
Lembrando que uma coleção (ArrayList, Vector, List e outros) armazena objetos e possui
métodos como add (adiciona elementos na lista), remove (remove certo elemento da lista), size
(que retorna a quantidade de elementos da coleção) e outros, para manipular os seus
elementos.
Observe a representação do diagrama de classes correspondente.
Figura 01.02
O diagrama da figura 01.02 destaca alguns relacionamentos entre as classes.
Observe que a classe Pessoa se relaciona com a classe Fones através de uma linha contínua que
representa uma ligação denominada de associação.
Esse é um exemplo de um, entre vários, relacionamentos que podemos ter entre duas ou mais
classes.
No referido diagrama a classe Pessoa se relaciona com a classe Fones de tal forma que uma
pessoa poderá ter nenhum ou vários telefones.
Isso é indicado no relacionamento através da multiplicidade 0..* (ao lado da classe Pessoa).
Além disso, nesse caso, esse relacionamento, denominado de “associação”, possui uma seta
apontando para a classe Fones, indicando que só a classe Pessoa “enxerga” a classe Fones.
Como regra geral, uma associação entre duas classes exige que uma classe encapsule uma
instância da outra classe e vice-versa.
Como a classe Pessoa possui uma associação que aponta para a classe Fones, então apenas a
classe Pessoa terá como atributo uma instância da classe Fones.
Esse atributo, no entanto será uma coleção de telefones, visto que uma pessoa poderá ter
nenhum ou vários telefones.
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS Dessa forma, a classe Pessoa possui o atributo listaFones<Fones> do tipo Vector, que, nesse
caso, é uma coleção de objetos do tipo Fones.
Então, de acordo com a figura 01.02, temos os seguintes trechos de código para cada uma das
classes do diagrama:
Código da classe Fones.java
Código da classe Pessoa.java
A classe Pessoa possui o atributo listaFones do tipo Vector, que corresponde ao relacionamento
entre as classes Pessoa e Fones.
Código da classe Principal.java
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS
Observe que as outras duas classes (Pessoa e Fones) foram instanciadas dentro do programa
principal.
Observe que foi criada a variável aux, do tipo Vector, para armazenar as instâncias dos telefones
de uma pessoa.
Essa variável, posteriormente, na linha 19, é armazenada no atributo listaFones da class Pessoa.
Observe atentamente o método mostraPessoas. Qualquer dúvida em relação código desse
método, procure o professor.
Como explicado anteriormente, as classes Pessoa e Fones são denominadas de beans, que são
classes que possuem um método construtor vazio e os métodos getXxx e setXxx (denominados
de métodos getters e setters).
O Xxx no nome representa o nome de cada atributo da classe correspondente.
Um método getXxx (denominado de método acessador) retorna o valor do atributo
correspondente.
Um método setXxx (denominado de método modificador) atribui ou altera o conteúdo do
atributo correspondente.
Considerando que a classe Pessoa, do exemplo anterior, possui os atributos cpf, nome e
listaFones, então ela tem os seguintes métodos getters/setters:
getCpf(), setCpf(), getNome(), setNome(), getListaFones() e setListaFones().
A utilização dos métodos getXxx e setXxx não é um padrão. É apenas uma recomendação dos
profissionais da Sun/Oracle para facilitar o uso de certos frameworks.
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS 02. PROCESSANDO INFORMAÇÕES DE ARQUIVOS
Vamos considerar que você necessite ler informações de um arquivo na linguagem Java.
Para isso, necessita-se de utilizar o import das seguintes bibliotecas do Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
As duas primeiras se relacionam com preparação e leitura de arquivos e a terceira
importação permite tratar exceções através de try/catch.
Um bloco try permite ao programador executar instruções. Caso ocorra algum erro,
este será desviado para o bloco catch. Por enquanto, você não precisa entender detalhes de
try/catch. Isso será visto posteriormente.
Vamos ver um exemplo na prática.
Abra o Eclipse e crie o projeto Java denominado de Arquivo01.
Em seguida, crie o pacote controle.
Em seguida, crie a classe Java Principal.java dentro do pacote controle. Com isso, sua
aplicação terá a seguinte estrutura:
Figura 02.01
Como já citado anteriormente, é salutar utilizar pacotes em uma aplicação. Cada pacote deve
armazenar classes que possuem uma mesma finalidade dentro da aplicação.
Nesse exemplo, criamos apenas o pacote controle que possui o programa Principal. Para essa
aplicação utilizaremos apenas esse pacote.
Em seguida, utilize o bloco de notas e crie um arquivo com o nome MeuArquivo.txt e insira as
seguintes linhas nesse arquivo:
linha 01
linha 02
linha 03
Fim.
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS Grave esse arquivo na unidade c do seu computador.
Abra o arquivo Principal.java e digite as seguintes linhas nessa classe.
Observe que o programa utiliza try/catch que permitem o tratamento de erros. O bloco try se
inicia na linha 13 e termina na linha 20.
O bloco catch inicia na linha 22 e termina na linha 23.
Caso ocorra algum erro dentro do bloco try, ocorrerá um desvio para o bloco catch que, no
exemplo, não possui nenhuma instrução.
Não se preocupe com os detalhes de try/catch ainda. Posteriormente explicaremos essas
estruturas com mais detalhes.
Salve a aplicação e execute-a. Será apresentada uma tela de mensagem semelhante à indicada
a seguir.
Figura 02.02
Observe a saída das informações.
Analise o código e procure compreendê-lo conforme o resultado de saída apresentado pelo
JOptionPane.
03. VALIDAÇÃO DE DADOS
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS 03.01. Introdução
Qualquer Interface Gráfica do Usuário (GUI) necessita de validações. Considere, por
exemplo, uma interface de entrada de dados com o JOptionPane. Neste caso, o usuário irá
digitar em uma caixa de texto alguma informação. No entanto, essa caixa de texto aceita
qualquer tipo de caractere, visto que ela aceita conteúdo String. Assim, se o usuário for
solicitado a digitar uma data, esta deve ser verificada pela aplicação, pois o usuário poderá
digitar uma data inválida como 30/02/2013. Neste caso, o programador deverá estabelecer
validação específica para esse tipo de digitação. O mesmo poderá ocorrer se o usuário for
solicitado para informar apenas dígitos de um CPF. Neste caso, o programador deverá criar uma
validação para verificar se o usuário informou só dígitos para o CPF.
Portanto, uma GUI permite facilidades de interação entre o usuário e o sistema. Por
outro lado, uma GUI necessita de validações específicas para garantir que o usuário informe
dados corretos para que permitam uma atualização confiável no banco de dados.
03.02. Exceções – Uma noção
Uma exceção é uma indicação de um problema que ocorre durante a execução de um
programa. Lançar uma exceção é uma maneira eficaz para indicar que não é capaz de atender a
uma solicitação de um programa. O não tratamento de uma exceção fará com que o programa
termine imediatamente.
Uma exceção verificada é uma subclasse da classe Exception.
Para se capturar uma exceção em um método deve-se utilizar uma instrução try
combinada com catch, no seguinte formato:
try{
//instruções que serão verificadas
}
catch(Exception e1) {
//informe e se recupere da exceção
}
finally{...}
Quando ocorre uma exceção dentro do bloco try, a execução é então executada dentro
do bloco catch correspondente, pois pode-se ter mais de um catch. Depois que o fluxo é
completado pelo catch, o controle não retorna para a instrução que causou a exceção. Nesse
caso, o controle continua abaixo do último catch. Além do catch há também o bloco finally, que
é opcional. Se esse bloco for usado, ele será executado, ocorrendo ou não uma exceção. Em
resumo, temos:
try: é usado para um bloco de código no qual possa ocorrer alguma exceção.
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS catch: serve para tratar o possível erro.
finally:sempre será executado depois de try/catch.
Assim, try/catch servem para informar à Java Virtual Machine o que fazer quando uma
exceção ocorrer. Os blocos catch devem aparecer após o try, sendo que entre esses blocos não
deve possuir nenhuma instrução.
Como pode ocorrer a utilização de diversos blocos catch e como todas as exceções são
vinculadas à classe Exception, deve-se, caso ocorra necessidade, inserir uma exceção geral no
último catch, deixando as especificas antes desta.
Exemplo:
try{........}
catch(NumberFormatException e1){......}
catch(ArithmeticException e2){......}
catch(NullPointerException e3){.....}
.....
O trecho anterior destaca algumas exceções, como NumberFormatException (trata
formatação de números), NullPointerException (erro de referência a uma instância inexistente)
e ArithmeticException(erros em processamentos aritméticos) e outros.
03.03. Validando dados numéricos
Ao receber a entrada de uma string via JOptionPane deve-se efetuar a conversão da
string para um valor numérico (int, float, etc.) dentro de try/catch, tratando a exceção de forma
correta.
03.04. Gerando números randômicos
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS A geração de números em Java ás vezes se torna importante, como é caso de se criar
valores para testes em um programa ou, até mesmo, criar cartelas para mega-sena. Em Java, a
geração de números ocorre através da classe Random que, naturalmente, gera números
fracionários entre 0 e 1.Se você desejar gerar números inteiros deverá utilizar alguma operação
sobre o número para conseguir o resultado desejado.
Exemplo:
Para gerar números utiliza-se da classe Random que faz parte do pacote Math. Para referenciar
Random, basta utilizar Math.Random. No trecho de código anterior, a linha 11 destaca a geração
de um número randômico que é armazenado na variável double d.
Nesse caso, será gerado um número fracionário entre 0 e 1. Na linha 15 temos a seguinte
instrução:
int i = (int) (Math.Random()*10) + 1;
Neste caso, um número randômico será gerado. Em seguida, será multiplicado por 10 e
adicionado a 1 e convertido para inteiro. Esse é um exemplo de geração de números irão variar
entre 1 e 10. Visto que:
a)se for gerado um 0.0 * 10 = 0, adicionado a 1 implicará no resultado 1.
b)se for gerado um 0.9... * 10 = 9, adicionado a 1 implicará no resultado 10.
A linha 19 gerará números entre 50 e 149. Caso você deseje gerar números em intervalos
específicos deverá analisar a expressão correta que proporcionará os resultados desejados.
Exemplo de resultados do programa anterior :
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS
Com isso você poderá gerar, além de números, uma sequência de letras ou de outros caracteres,
bastando para isso utilizar o código ASCII.
ATIVIDADE PRÁTICA 01
Usando orientação a objetos, desenvolva uma mini-aplicação (com um programa principal,
usando main, e as demais classes) em Java que:
a)Leia um arquivo no formato texto (com o nome dados.txt) contendo informações de
funcionários(nome, data de nascimento,cpf e dados de seus dependentes como nome,
tipo de dependente, data de nascimento);
b)Deve-se ler o arquivo e armazenar os dados de cada funcionário em objetos da classe
Funcionário e os dados de cada dependente em objetos da classe Dependente;
c)Um funcionário poderá ter um, mais de um ou até nenhum dependente;
d)A classe Funcionario possui um atributo que é uma coleção de seus dependentes;
e)O arquivo de texto possui diversas linhas, sendo que cada linha contém os dados de
cada funcionário e de cada um de seus dependentes, caso existam;
f)O formato de cada linha do arquivo é o seguinte: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXX###########BBBBBBBBBBBBBBBBBBBBBBBBYXXXXXXXX...
Onde: AAAA...=nome do funcionário (até 30 caracteres), XXXXXXXX=Data de nascimento
do funcionário e do dependente (posições distintas), ###########=cpf, BBBB..=Nome
do dependente(até 25 caracteres), Y=tipo do dependente (1-pai, 2-mãe, 3-cônjuge, 4-
filho,5-outros). Os nomes devem ser preenchidos com letras em caixa alta (maiúsculas).
As reticências no final da linha indica que a poderá conter mais dependentes.
g)O comprimento de cada um dos campos informados devem ser rigorosamente
respeitados. Assim, se uma matricula for 135 deverá ser escrita como 00135 para ocupar
corretamente o seu espaço na linha. Se um nome de um funcionário possuir menos de
30 caracteres deve ser completado com espaços à direita, e assim por diante.
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS h)Você deve criar o seu arquivo de texto utilizando qualquer editor de texto,
respeitando os detalhes de preenchimento como explicado anteriormente. Sendo que
devem ser informados, no mínimo, 15 linhas, sendo que:
h1) 2 não devem conter dependentes;
h2) 3 devem possuir 1 dependente
h3) 4 devem possuir 2 dependentes
h4) 1 deve possuir 3 dependentes
h5) 3 devem possuir 4 dependentes
h6) o restante deve possuir mais de 4 dependentes
i)Após a leitura de todos os dados e, respectivamente, armazenados em objetos, estes
devem ser alocados em suas respectivas coleções, deve-se escrever os dados utilizando-se
System.out.print (ou println), considerando o seguinte formato de saída:
RELAÇÃO DE FUNCIONÁRIOS E SEUS DEPENDENTES
Ord. Nome do Funcionário Data Nasc. Cpf
===============================================================
0001 Aaaaaaaa Bbbbbbbbbbb Ccccccccc 99/99/9999 111.111.111-11
Dependentes: Nome Tipo Data Nasc.
Bbbbb Ccccc Ddddddddddddd cônjuge 99/99/9999
Bbbbb Ccccc Ddddddddddddd pai 99/99/9999
Bbbbb Ccccc Ddddddddddddd filho 99/99/9999
.............................................................................................................................
0002 Aaaaaaaa Bbbbbbbbbbb Ccccccccc 99/99/9999 111.111.111-11
Dependentes: Nome Tipo Data Nasc.
Bbbbb Ccccc Ddddddddddddd cônjuge 99/99/9999
Bbbbb Ccccc Ddddddddddddd mãe 99/99/9999
0003 Aaaaaaaa Bbbbbbbbbbb Ccccccccc 99/99/9999 111.111.111-11
Dependentes: (NÃO POSSUI)
j) Considerar que esse relatório deve possuir 15 linhas por página, incluindo o cabeçalho
(com 3 linhas). Quando atingir o limite de linhas, deve-se escrever o cabeçalho
novamente, simulando um salto de página e continuar a escrever os dados após o
cabeçalho. Observe que a coluna Ord. deve possuir zeros à esquerda. Note que cada
parte de cada nome deve possuir a primeira letra maiúscula e as demais minúsculas.
Quando um funcionário não possuir dependente deve-se escrever o seguinte:
Dependentes: (NÃO POSSUI)
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS k)Note ainda que o tipo de cada dependente deve ser destacado com sua descrição,
conforme o código lido no arquivo.
l)Deve-se validar cada data existente no arquivo. Caso a data seja inválida (por exemplo,
30/02/2020), deve-se apresentar um (*) após a data impressa.
m)Deve-se validar os dois números de controle finais de cada CPF. Se um determinado
CPF possuir controles inválidos, deve-se inserir um (*) após o referido CPF. Pesquisar sobre
esse cálculo e inseri-lo em um método específico da aplicação.
n)Informar, pelo menos, dois valores de CPF inválidos no arquivo e, pelo menos, três
datas inválidas no arquivo.
o)Esse mini sistema deve possuir apenas um arquivo principal (com o método main) e
os arquivos correspondentes das classes necessárias, sendo que o arquivo principal deve
possuir os métodos necessários para atender as regras estabelecidas. PORTANTO, ABUSE
DOS MÉTODOS E UTILIZE-OS NO PROGRAMA PRINCIPAL APLICANDO OS CONCEITOS
CORRETOS DE ORIENTAÇÃO A OBJETOS.
p) Note que antes da impressão de cada nome há um número sequencial. O valor inicial
dessa sequência deve ser informado pelo usuário. Esse valor inicial deve estar no
intervalo de 1 a 105. Se o usuário informar um valor fora desse intervalo, o sistema deve
apresentar mensagem de erro correspondente. O programa deverá, então, escrever
esse valor inicial e incrementar uma unidade a cada novo nome. Além disso, a
quantidade de casas de uma dessas sequências deve ser também informada pelo
usuário (variando de 3 até 6, cuja validação deve ser também apresentada com
mensagem de erro específica). Assim, esses números devem ter zeros à sua esquerda.
A preparação desses zeros deve ser efetuada em um método respeitando a quantidade
de casas inteiras informada pelo usuário e o valor inicial informado pelo usuário. Se, por
exemplo, o número for 1 e a quantidade de casas for 4, deve-se escrever 001, 002 e
assim, por diante. Se, por exemplo, o número for 50 e a quantidade de casas for 5, deve
escrever 00050, 00051 e assim por diante. Se o valor inicial for 99 e a quantidade de
casas for 4, então deve-se escrever, 0099, 0100, 0101 e assim por diante.
Dica: Note que as saídas são todas formatadas. Assim, utilize String e as funções de
manipulação de String para criar os formatos adequados para a saída de dados.
ATIVIDADE PRÁTICA 02
Considerando as mesmas regras da atividade anterior, desenvolva
uma aplicação Java que, em vez de ler um arquivo texto, permita
gerar randomicamente cada um dos atributos apresentados
anteriormente para 25 registros de funcionários e de seus
respectivos dependentes. Sendo que deve-se considerar a geração de
mais um atributo. O salário, cujo valor deve ser gerado no intervalo
de 1225.00 até 125392.15, considerando que a impressão de cada
ECEC – ESCOLA DE CIÊNCIAS EXATAS E COMPUTAÇÃO
CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA DESENVOLVIMENTO DE APLICAÇÕES CLIENTE-SERVIDOR
ATIVIDADE 04 – LEITURA DE ARQUIVO, OO, RANDOMIZAÇÃO DE DADOS
salário deve possuir o seguinte formato: R$ 999.999,99. Observe que
as casas decimais devem possuir vírgula e não ponto. O nome de um
funcionário deve possuir de 2 a 3 partes, sendo que esse número de
partes deve ser gerado randomicamente (2 ou 3), sendo que a
primeira parte deve possuir 10 caracteres e as demais 9. Completar
com espaços a 3ª parte, caso o nome seja apenas com duas partes. A
mesma regra deve também ser semelhante aos nomes dos
dependentes, sendo: 1ª parte com 8 caracteres, 2ª parte com 8
caracteres e a 3ª parte com 7 caracteres. Não esquecer de gerar cada
um dos tipos de dependência para cada dependente gerado,
conforme os valores estabelecidos. As datas de nascimento devem
ser geradas dentro do intervalo de 01/01/1980 até 31 de dezembro
do ano atual. A impressão do salário deve ser visualizada logo após a
impressão do cpf, com um espaço entre dois.