02 arquivos
TRANSCRIPT
![Page 1: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/1.jpg)
Arquivos
Estruturas de Dados II – Vanessa Braganholo
![Page 2: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/2.jpg)
Entidades } Aplicações precisam armazenar dados sobre as mais
diversas entidades, que podem ser concretas ou abstratas } Funcionário de uma empresa (concreto) } Carros de uma locadora de veículos (concreto) } Contas-corrente dos clientes de um banco (abstrato) } Ligações telefônicas dos clientes de uma empresa de telefonia
(abstrato)
![Page 3: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/3.jpg)
Atributos } Cada uma dessas entidades pode ser descrita por um
conjunto de atributos } Funcionário: nome, CPF, data-nascimento, salário } Carro: marca, modelo, ano-fabricação, placa } Conta-Corrente: agência, conta, saldo } Ligações Telefônicas: data, origem, destino, duração
} Os atributos também podem ser chamados de campos
![Page 4: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/4.jpg)
Registros } Indivíduos dessas entidades possuem um valor para cada
um desses atributos (chamados de pares atributo-valor)
} Um conjunto de pares atributo-valor que identifica um indivíduo de uma entidade é chamado de registro
![Page 5: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/5.jpg)
Exemplos de Registros } Funcionário: <nome, João>, <CPF, 012345678-90>, <data-nascimento,
10/04/1980>, <salário, 3000> } Carro <marca, Honda>, <modelo, Fit>, <ano-fabricação, 2010>,
<placa, XYZ0123> } Conta-Corrente <agencia, 0123>, <conta, 123456>, <saldo, 2000> } Ligação Telefônica <data, 01/07/2010>, <origem, 21-2598-3311>, <destino,
21-2589-3322>, <duração, 10’36”>
![Page 6: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/6.jpg)
Tabela } Uma tabela é um conjunto ordenado de registros. Uma
tabela pode ser armazenada em memória principal ou em memória secundária (disco)
} Nesse segundo caso, também costuma ser chamada de arquivo
![Page 7: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/7.jpg)
Exemplo: Arquivo de Funcionários
Nome CPF Data-‐Nascimento Salário
João 012345678-‐90 10/04/1980 3000
Maria 234567890-‐12 25/07/1978 5000
Lúcia 345678901-‐23 27/04/1981 1500
IMPORTANTE: Todos os registros de uma mesma tabela possuem a mesma estrutura (mesmo conjunto de atributos/campos)
![Page 8: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/8.jpg)
Problema: encontrar registros } Problema comum de diversas aplicações: encontrar um ou
mais registros em uma tabela } Encontrar o empregado Maria } Encontrar todos os empregados que ganham 3000 } Encontrar todos os empregados que nasceram em 27/04/1981
![Page 9: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/9.jpg)
Conceito de Chave } Dados usados para encontrar um registro: chave } Chave: subconjunto de atributos que identifica um
determinado registro
![Page 10: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/10.jpg)
Chave Primária e Secundária } Chave primária: subconjunto de atributos que identifica
unicamente um determinado registro Exemplo: CPF do funcionário ou RG do funcionário } Na hipótese de uma chave primária ser formada por uma
combinação de campos, essa combinação deve ser mínima (não deve conter campos supérfulos)
} Eventualmente, podemos encontrar mais de uma combinação mínima de campos que forma uma chave primária
} Chave secundária: subconjunto de atributos que identificam um conjunto de registros de uma tabela Exemplo: Nome do funcionário
![Page 11: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/11.jpg)
Tabelas } Aplicações reais lidam com várias tabelas, cada uma delas
representando uma entidade
} Uma aplicação de controle bancário precisaria de quais tabelas?
![Page 12: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/12.jpg)
Aplicação Bancária } Uma aplicação de controle bancário precisaria de
quais tabelas? } Cliente } Agência } Conta-Corrente
![Page 13: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/13.jpg)
Certa redundância é necessária } Neste caso, é necessário correlacionar os dados, para que
seja possível saber que conta pertence a que agência, e que conta pertence a que cliente
} Para isso, é usual repetir algum dado (um código,por exemplo) no outro arquivo
} Cliente: CodCliente, Nome, CPF, Endereço } Agência: CodAgencia, NumeroAgencia, Endereco } Conta-Corrente: CodAgencia, CodCliente, CodConta,
NumeroConta, Saldo
![Page 14: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/14.jpg)
Certa redundância é necessária } Neste caso, é necessário correlacionar os dados, para que
seja possível saber que conta pertence a que agência, e que conta pertence a que cliente
} Para isso, é usual repetir algum dado (um código,por exemplo) no outro arquivo
} Cliente: CodCliente, Nome, CPF, Endereço } Agência: CodAgencia, NumeroAgencia, Endereco } Conta-Corrente: CodAgencia, CodCliente, CodConta, Numero
Conta, Saldo
Quais são as chaves primárias e secundárias deste exemplo?
![Page 15: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/15.jpg)
Aplicação Financeira } Chaves primárias:
} Cliente: CodCliente } Agência: CodAgencia } Conta-Corrente: CodAgencia E CodConta
} Chaves primárias alternativas: } Cliente: CPF } Agência: NumeroAgencia } Conta-Corrente: NumeroConta
} Chaves secundárias: } Cliente: Nome } Agência: Endereço } Conta-Corrente: CodAgencia, CodCliente, Saldo
![Page 16: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/16.jpg)
Discussão sobre chaves } Por quê não usar CPF como chave primária de cliente?
Por quê os atributos artificiais (código)?
![Page 17: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/17.jpg)
Exercício Deseja-se automatizar uma locadora de automóveis. A locadora possui filiais espalhadas por todo país. Cada filial possui um código que a identifica, um telefone e um endereço. Cada filial da locadora sedia um conjunto de veículos que ela aluga. O veículo é identificado por um número sequencial que o distingue dos demais veículos da filial. Para o veículo é importante saber a placa, data de vencimento do seguro, nome do modelo, número de portas e se possui ar-condicionado ou não. Quando um veículo é alugado é fechado um contrato de aluguel. Cada contrato possui um número identificador, uma data de saída do veículo, uma data de retorno provável, para veículos ainda não retornados, e uma data de retorno efetivo, para veículos já retornados. O contrato é feito para um veículo e um cliente. Para os clientes é preciso armazenar seu nome, CPF, endereço, o telefone, bem como o número e data de expiração de seu cartão de crédito.
![Page 18: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/18.jpg)
Exercício } Para o cenário das locadoras, identificar:
} Entidades } Atributos } Chaves primárias
![Page 19: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/19.jpg)
Discussão } Por que não usar uma única tabela?
![Page 20: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/20.jpg)
Banco de Dados } Esse conjunto de arquivos pode ser considerado um
banco de Dados?
![Page 21: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/21.jpg)
Características de um Sistema de Gerência de Banco de Dados
} Natureza auto-descritiva do sistema de banco de dados: banco de dados possui um catálogo onde estão descritas as estruturas e tipos de dados de cada tabela e suas restrições – ex. quais são as chaves primárias de cada tabela
} Isolamento entre os programas e os dados, e a abstração dos dados: em programação com arquivos a estrutura dos arquivos é embutida dentro das aplicações. Isso não acontece quando se usa banco de dados.
} Suporte para as múltiplas visões dos dados: usuários diferentes podem ver porções diferentes dos dados
} Compartilhamento de dados e processamento de transações multi-usuários
![Page 22: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/22.jpg)
Características de um Sistema de Gerência de Banco de Dados
} Natureza auto-descritiva do sistema de banco de dados: banco de dados possui um catálogo onde estão descritas as estruturas e tipos de dados de cada tabela e suas restrições – ex. quais são as chaves primárias de cada tabela
} Isolamento entre os programas e os dados, e a abstração dos dados: em programação com arquivos a estrutura dos arquivos é embutida dentro das aplicações. Isso não acontece quando se usa banco de dados.
} Suporte para as múltiplas visões dos dados: usuários diferentes podem ver porções diferentes dos dados
} Compartilhamento de dados e processamento de transações multi-usuários NÃO É O NOSSO FOCO
NESSA DISCIPLINA!
![Page 23: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/23.jpg)
Níveis de Organização das tabelas/arquivos
} Organização Lógica dos dados: é a visão que o usuário tem dos dados, com base em entidades, seus atributos e seus relacionamentos
} Organização Física dos dados: é a maneira pela qual as informações ficam armazenadas nos dispositivos periféricos (disco, pen-drive, etc.)
![Page 24: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/24.jpg)
Dependência entre programas e dados } Os programas de computador são mais ou menos
dependentes da organização física dos dados } Eles podem ser classificados em quatro categorias
![Page 25: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/25.jpg)
Categoria 1: Programas Dependentes dos Dados
} Programas têm acesso aos dados especificando endereços absolutos de células de armazenamento
} Se os dados mudarem de lugar, os programas que os acessam precisam ser modificados
} Ocorre nas chamadas de baixo nível dos sistemas operacionais
} Exemplo: informação sobre espaço livre em um arquivo em um sistema operacional pode ser guardada em um bloco particular do disco
![Page 26: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/26.jpg)
Categoria 2: Independência Física dos Dados
} Programas acessam a memória pelo nome e não por endereço (memória primária), ou pela posição relativa ao início do arquivo (memória secundária)
} O mapeamento (nome → endereço) é feito pelo sistema operacional
} Exemplo: programas escritos em linguagens de Terceira Geração que só precisam conhecer a organização lógica dos dados (C, Java, Pascal...)
} Programas dependem da estrutura lógica dos arquivos
![Page 27: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/27.jpg)
Categoria 3: Independência Lógica Parcial dos Dados
} Programas desta categoria podem operar sobre diversos arquivos (com estruturas diferentes) sem serem modificados.
} Estes programas buscam a estrutura dos dados nas informações disponíveis no meio do armazenamento e fazem uma adaptação em tempo de execução do programa.
} Caso a adaptação ocorresse em tempo de compilação, seria o caso de programas de categoria 2
} Exemplo de operação: ler o próximo registro de um arquivo
![Page 28: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/28.jpg)
Categoria 4: Independência Lógica dos Dados
} Programas dessa categoria armazenam a descrição dos dados junto com eles
} Por isso, os programas não necessitam definir a estrutura dos dados
} Exemplo: programas que utilizam SGBDs
![Page 29: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/29.jpg)
Operações sobre arquivos } Programas que lidam com arquivos realizam os seguintes
tipos de operações sobre eles: } Criação: alocação e inicialização da área de dados, assim como
de seus descritores } Destruição: liberação da área de dados e descritores usados na
representação da tabela } Inserção: inclusão de novo registro na tabela } Exclusão: remoção de um registro da tabela } Alteração: modificação dos valores de um ou mais atributos/
campos da tabela } Consulta: obtenção dos valores de todos os campos de um
registro, dada uma chave de entrada
![Page 30: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/30.jpg)
Refrescando a memória…
![Page 31: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/31.jpg)
Tutorial sobre Manipulação de Arquivos em Java
Fonte: http://download.oracle.com/javase/tutorial/essential/io
![Page 32: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/32.jpg)
IDE Java: NetBeans
![Page 33: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/33.jpg)
I/O Stream } Um I/O Stream em Java representa uma fonte de entrada ou
saída destino } Um stream pode representar diferentes tipos de fonte ou
destino: } Arquivos em disco } Dispositivos } Outros programas } Estruturas em memória } …
} Suportam diferentes tipos de dados: } Bytes } Tipos primitivos de dados (inteiros, strings, …) } Caracteres } Objetos
![Page 34: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/34.jpg)
I/O Stream } Independente de como funcionam internamente, todos os
streams seguem um modelo simples de interação com programas
} Um stream é uma sequencia de dados } Para leitura: input stream } Para gravação: output stream
![Page 35: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/35.jpg)
I/O Input Stream } Um programa utiliza um Input Stream para ler dados
de uma fonte, um item de cada vez
![Page 36: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/36.jpg)
I/O Output Stream } Um programa utiliza um Output Stream para gravar
dados em um destino, um item de cada vez
![Page 37: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/37.jpg)
Na nossa disciplina } Fonte e destino são arquivos } Exemplo de arquivo a ser manipulado
xanadu.txt
In Xanadu did Kubla Khan A stately pleasure-dome decree: Where Alph, the sacred river, ran Through caverns measureless to man Down to a sunless sea.
![Page 38: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/38.jpg)
Byte Streams } Permitem realizar entrada e saída de bytes de 8bits
![Page 39: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/39.jpg)
ByteStream: Como funciona…
![Page 40: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/40.jpg)
Exemplo } Ver arquivo CopyBytes.java
} NOTA: Método read() retorna um int ao invés de um byte } Isso acontece para que seja possível o método retornar -1 quando o stream terminar
![Page 41: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/41.jpg)
Considerações sobre o exemplo } Sempre feche os streams utilizados
} Ao fechá-los, vc libera a memória consumida por eles
} Pode ocorrer erro ao abrir o InputStream ou o OutputStream (ou ambos) } Por isso é importante testar se são diferentes de null antes de
fechá-los
![Page 42: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/42.jpg)
ByteStream } Muito baixo nível } Existem outros tipos de stream para tratar outros tipos
de dados
} Mas são importantes porque todos os outros são construídos sobre ele
} Nosso arquivo exemplo é um arquivo de texto, então vamos modificar o programa um pouco para tratar isso
![Page 43: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/43.jpg)
Character Stream } Mesmo princípio de funcionamento do ByteStream } Faz conversão automática da representação dos
caracteres em Java (que usa Unicode) para o enconding de caracteres local
} Ver aquivo CopyCharacter.java
} Principais diferenças entre este exemplo e o anterior: } Uso de FileReader ao invés de FileInputStream } Uso de FileWriter ao invés de FileOutputStream
![Page 44: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/44.jpg)
Entrada e Saída } Neste exemplo, o disco é acessado para ler cada
caractere do arquivo, e depois novamente para gravar cada caractere } MUITO LENTO!!
} Solução: utilizar BufferedStreams } O sistema operacional faz I/O apenas quando o Buffer está
vazio
![Page 45: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/45.jpg)
I/O Orientada a linhas } Para arquivos texto, é possível ler linhas inteiras de uma
só vez, usando um buffer: BufferedReader (para leitura) e PrintWriter (para gravação)
} Linha: } delimitada por um CR ou LF ("\r\n") } delimitada por CR ("\r") } delimitada por LF ("\n")
} Ver arquivo CopyLines.java
![Page 46: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/46.jpg)
Foco da disciplina } Arquivos binários ao invés de arquivos texto
} Como implementar um programa que grava registros de funcionários, e depois lê esses registros?
} Usar DataStreams } Possuem métodos específicos para ler/gravar tipos específicos
(inteiro, string, etc)
![Page 47: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/47.jpg)
DataStreams } Exemplo do funcionário
} Primeiro problema: em Java não existe o conceito de registro
} Solução de contorno: } Criar uma classe Funcionário com os atributos do funcionário
![Page 48: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/48.jpg)
Classe Funcionário public class Funcionario { public int codFuncionario; public String nome; public String cpf; public String dataNascimento;
public float salario; }
NOTA IMPORTANTE: não é uma boa prática de programação utilizar atributos públicos nas classes. Na disciplina, vamos adotar esta opção apenas para simplificar os exemplos. O correto seria implementar métodos get e set para cada atributo.
![Page 49: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/49.jpg)
Manipulação } DataStream detecta final de arquivo lançando uma
exceção java.io.EOFException } Lógica para testar final de arquivo agora não é mais baseada no
teste de valor -1 } Capturar a exceção e fechar o DataStream
} Ver arquivo ManipulaFuncionario.java
![Page 50: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/50.jpg)
Exercício } Alterar a classe ManipulaFuncionario para ler os dados do
funcionário a ser gravado do teclado (atenção: criar uma nova classe! Não sobre-escrever a classe!)
} A cada funcionário informado, perguntar se deseja ler os dados de mais um funcionário } Se sim, ler mais um funcionário } Se não, gravar todos os funcionários lidos
![Page 51: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/51.jpg)
Orientação a objetos } Exemplo anterior fere os princípios de orientação a
objetos } Ideal é dar a responsabilidade de ler registro e gravar registro à
classe Funcionário
} Ver arquivo FuncionarioOO.java } Ver arquivo ManipulaFuncionarioOO.java
![Page 52: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/52.jpg)
Flush } Os métodos que utilizam buffer para gravação só fazem a
gravação em disco quando o buffer está cheio } Às vezes é necessário ter mais controle sobre quando os
dados realmente serão gravados } AutoFlush: Algumas classes buffered output (ex. PrintWriter)
possuem um atributo autoFlush. Quando este atributo está ligado (true), o buffer é gravado em disco a cada vez que uma operação println é executada
} Alternativa: Método flush força gravação do buffer em disco
![Page 53: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/53.jpg)
Fonte } http://download.oracle.com/javase/tutorial/essential/io
![Page 54: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/54.jpg)
Pratique! } Execute os códigos dos exemplos deste tutorial em casa
![Page 55: 02 arquivos](https://reader030.vdocuments.com.br/reader030/viewer/2022013105/55aae5d31a28ab8a1b8b481d/html5/thumbnails/55.jpg)
Exercício } Modifique as classes para lidar com registros de conta-
corrente } Dois arquivos:
} Agência (Cod, Nome, Gerente) } Conta-Corrente (Cod, CodAgencia, Saldo)
} Usuário deve poder escolher o que quer cadastrar } Dados devem ser lidos do teclado } Aplicação deve ter opção de Cadastrar, Ler ou Sair