Eu já deixei aqui engatilhado, tá.
Slides: Grupo 7, 7B.
Vamos achar o solution. Tá ali.
Vou dar um duplo clique.
Tá abrindo.
Aqui ele tá perguntando se eu quero converter pra essa versão do Visual Studio 2019
dado que esse projeto eu tinha feito lá em
2013, 2014 ou 2000 e algo.
Eu vou converter.
Convertido está.
Aqui eu posso ver todos os arquivos, tá.
A começar pelo ProjetoOOExemplo.cpp
onde tem a função principal, a função main, ou coisa que o valha.
Parece com a _tmain.
Se eu olhar aqui, eu continuo tendo
a classe Principal lá nos headers, nos cabeçalhos.
Principal.h.
Com todos esses elementos.
Olha a ListaAlunos lá.
Eu posso até dar uma espiada se eu quiser na ListaAlunos.
Ele tá aqui, ó.
De fato ele tem
a função recuperar e limpar.
Eu posso ir ver essas funções se eu quiser.
Ir para Declaração.
Ir para Definição, então.
Ele abre automaticamente o .cpp pra mim.
No slide eu chamei gravadora de Alunos aqui eu chamei Gravação de Alunos.
O nome do slide tá melhor, vocês podem
utilizar o nome que tá lá no slide.
Recuperação de Alunos
limpaLista.
Inclusive eu tô usando o
provavelmente, lá na destrutora, o limpaLista agora,
então, tem que refazer o algoritmo.
Se você voltar no guia principal, você vai ver que tem os menus lá.
Todos os menus criados.
Inclusive o de gravação, o de recuperação.
Se você olhar a função GravarAlunos.
Definition. Ir para Definição. Tá ali, ó.
Tá chamando o graveAlunos da lista
de alunos que é o LAlunos aqui.
Bom, vamos fazer uma execução aqui.
Antes, vou compilar pra ver se funciona.
Sim, deu êxito.
Agora vamos ver se ele roda.
Bom, tá ali, né.
Se eu der uma olhadinha aqui em Executar.
Vamos executar os Alunos que tem ali.
Opa, mostrou ali, ó.
Mostrou rapidez mas mostrou, tá.
Eu vou ter que colocar um getchar a mais ali, pra ele mostrar.
Legal.
Por que que ele tem esses Alunos que ele tá mostrando ali?
Ele tem porque, se você der uma olhada...
Deixa eu sair do sistema aqui, gente.
Se der uma olhada na construtora da Principal.
Cadê a Principal?
Você vai ter o InicializaAlunos.
Bom, antes você tem alguns Alunos que são criados estaticamente, tá.
Ali nos Alunos que você vai criar dinamicamente.
Se você for no InicializaAlunos que tá aqui.
O view definition.
Ele vai ter ali, ó.
Cada endereço desses Alunos listados serão inseridos na lista também.
Porque a lista vai ter todos os Alunos, todos os criados estaticamente
e os dinamicamente.
Professor, mas eu não preciso mais criar Alunos estaticamente.
Eu optei por manter, tá, pra vocês verem a...
a convivência entre Alunos estáticos e dinâmicos.
Então tem objetos estáticos e dinâmicos.
Inclusive, antigamente não dava erro se desse um delete
em elemento estático, tá.
O compilador ele ignorava,
agora, aparentemente, ele anda sensível a isso,
A testar pra ver como é que tá esse ambiente aqui.
Ainda, se você for lá na opção
Menu de Execução. Go to definition.
E eu for listar os Alunos
pelo jeito, o professor vai precisar colocar um getchar a mais aqui, ou um system("pause").
Tem um bufferzinho de memória, aí, algum err...
algum lixo de memória no teclado... no tocante ao teclado.
Vamos dar um Recompilar, aqui.
Como de hábito.
Recompilou.
Vamos agora executar.
Se eu olhar, ali, execução, opção 2.
Se ele funcionar.
Eu acho que apertei duas coisas ao mesmo tempo aqui
ou algum caractere inválido, tá, gente.
Vou fechar ele na marra aqui.
Não é muito bonito, mas acontece.
Devo ter posso algum caractere que o cin não absorve.
Mas tudo bem.
O que é estranho, mas tudo bem.
Vamos rodar de volta.
Vamos lá. Com todo cuidado.
2 - Executar.
Agora foi.
Listar Alunos que é o 4.
Tem ali os 5 Alunos que foram inseridos,
os 5 Alunos criados estaticamente.
Agora eu vou criar mais um Aluno. 6.
Vou cadastrar.
Cadastrar Aluno, opção 4.
Sei lá eu. Vou por um exemplo aqui só, tá, que vai ser o...
...um nome bom de Aluno?
Sei lá eu.
Simon. Simon é um bom nome de Aluno.
Simon Simon, pronto.
Vou dar Enter, vai perguntar o RA dele.
Colocar um RA qualquer. 111.
Pronto. Se eu der agora aqui um
5 - Sair. For em Executar.
For listar os Alunos, opção 4,
agora aparece o Simon Simon lá, tá,
matriculado na Disciplina.
Vou dar um Sair.
Vocês vejam que agora eu vou sair do sistema, tá.
Vou sair do sistema, aquele objeto tem que persistir a existência dele a hora que eu voltar, supostamente.
Mas como é que isso é possível, professor?
Vejam aqui, ó.
Se eu for na região do projeto.
Aqui ou senão debug.
Vamos aqui por Data de modificação.
Não, não está no debug.
Talvez esteja aqui então junto ao projeto.
Data de modificação.
Em algum lugar ele teve que gravar o nosso .dat.
Tá ali, ó, alunos.dat.
Mas isso aqui é de 2019, então isso aqui não é o nosso.
Inclusive, eu vou apagar aqui pra evitar confusão.
Nós estamos em 2020.
A partir do debug.
Deixa eu ver se ele tem .dat aqui.
Bom, eu não tô muito esperto.
Deixa eu fazer aqui,
buscar ali um *.dat,
pra ver aonde isso foi parar.
Ele não criou aqui.
Será que ele reaproveitou aquele que eu apaguei na unha?
Deixa eu ver se eu consigo Ctrl+Z.
Ou ele está gravando em algum outro local
que eu não estou sabendo.
Vamos ver aqui.
De fato, esse arquivo é de 2019,
Deixa eu abrir esse camarada aqui,
pra ver se foi o que eu mexi agora.
Não, esse aqui não é o arquivo que eu mexi agora, tá.
Esse aqui é um arquivo antigo.
Boa questão.
Outra possibilidade, é que ele tenha gravado lá
no C: ou em algum outro diretório
que ele tá usando por default.
No momento das versões anteriores do C++
ele gravava no mesmo diretório do projeto,
aqui ele tá de malasarte.
Em todo o caso, vamos executar pra ver o que acontece.
Cadê nosso ambiente de execução.
Se eu for agora, ali, em Executar
o liste Alunos,
não vai aparecer,
naturalmente, o Simon Simon.
Por quê? Porque eu não fiz a recuperação.
Ele tá mostrando esses caras aí, porque ele recriou estaticamente.
Agora, vamos voltar ali.
Opção 4 - Recuperar.
4 de volta, Recuperar Alunos.
Não pus mensagem nenhuma aqui pro usuário
poderia dizer, né: "Alunos recuperados com sucesso", tá.
Façam isso, por gentileza.
Vamos executar de volta.
E ver se de fato ele recuperou os Alunos ou não.
Aqui, ó. Aqui ele tá pegando o arquivo antigo
que eu tinha feito no passado.
Por algum motivo ele não gravou os Alunos.
Ah, faz todo sentido ele não ter gravado os Alunos.
Ele não gravou os Alunos, por uma situação bem peculiar, gente.
Eu não mandei ele gravar.
Basicamente foi isso.
Acho que eu não tomei café o suficiente hoje.
Então, é natural que ele não tenha gravado, tá.
Eu não mandei ele gravar.
Que besteira, né.
Então, vamos fazer o seguinte.
Vamos sair do sistema
e agora vamos fazer uma experimentação completa.
Novamente.
Cadê?
Iniciar sem depurar.
Vou ali, Executar.
Vou listar os Alunos.
Tá, tem só os que são criados estaticamente.
6 - Sair.
1 - Cadastrar.
Cadastrar Aluno. Agora eu vou dar outro nome.
Vai ser, aqui, JeanJean.
Muito bem.
Jean Jean.
Ou em francês "João João"
Enter.
Vou por um RA ali, 333.
Se eu sair.
Agora eu vou voltar a executar ali
Vou listar os Alunos.
Aparece ali o "João João"
Agora eu vou voltar.
Vou sair
daqui da opção de execução.
Vou, agora sim, gente. Gravar.
Vou mandar gravar os Alunos, eu não tinha mandado gravar.
Agora eu tô mandando.
Ou eu tinha e não lembro mais?
Bom, a gente vai descobrir já já.
Supostamente eu tinha que gravar os Alunos,
mas certamente eu não gravei, tá.
Porque senão ele apareceria lá no diretório e eu não ia
ficar me batendo procurando arquivo.
6 - Sair.
5 - Sair.
e Alegria.
Agora eu vou olhar aqui, no debug,
ou no arquivo de diretório
o meu .dat.
Data de modificação.
Tá ali.
Agora sim, ó.
13 de julho 2020, 16 horas e 20 minutos.
Se eu abrir ele ali,
agora aparece o JeanJean, porque agora sim, eu gravei.
E agora a hora de recuperar os dados ele vai recuperar os dados correntes,
não dados antigos que estavam lá, né, armazenados desde o ano passado.
Então, vamos recuperar, né, porque se a gente gravou a gente tem que recuperar.
Aqui eu não tô rodando o sistema, tá. O sistema já tá fechado.
Eu tô.. vou recuperar ele do zero.
Iniciar sem depurar.
Se eu for executar direto, insisto, não vai tá lá,
porque ele tá só recuperando Aluno estático.
Aqui. Sair.
2 - Executar.
Não, isso daqui não me interessa nesse momento.
É o 4 que é o Recuperar.
Vou recuperar os Alunos, opção 4.
Aqui sim, ele devia ter posto a mensagem, né.
Recuperado com sucesso.
Em todos os momentos que vocês fizerem alguma operação
põem uma mensagenzinha lá pro usuário, tá.
Gravado com sucesso, Recuperado com sucesso etc e tal.
Por questões de princípios de Interface Humano Computador.
Vou voltar aqui.
Cadê o Executar? Agora que eu recuperei
ele deve ter o JeanJean.
Vejam que pra recuperar, o que ele fez? Ele apagou a lista,
ou seja, ele eliminou aqueles caras que estavam registrados estaticamente
e criou todo mundo dinamicamente.
Supostamente.
Então, tá, gente.
Aqui tá a demonstração do sistema.
O que que o exercício reza?
Ele reza o seguinte.
Permitir a persistência,
isto é, gravação/recuperação, dos dados dos objetos da classe
Disciplina, Departamento e etc.
tal qual sugere os métodos menuGravar e menuRecuperar.
da classe Principal.
De fato, cê vai lá em menuGravar ele tem lá
GravarDisciplinas, GravarDepartamentos, GravarUniversidades...
tem as opções, tá, gravarTodos.
Fazer isto primeiramente sem considerar a persistência das relações entre os objetos
e usando arquivos sequenciais,
isto é, arquivos de texto.
Bom, esse é o primeiro elemento.
Aqui você não vai se preocupar com as relações, tá,
dos objetos.
Por exemplo, eu vou registrar os Alunos
e as Disciplinas, mas não vou registrar
qual Aluno tá matriculado em qual Disciplina.
Isso já é mais difícil.
É razoavelmente tranquilo você registrar os Alunos.
Só os Alunos e só as Disciplinas.
Agora, registrar
qual Aluno tá relacionado com qual Disciplina,
é mais peculiar,
que é o segundo item do exercício.
Permitir, além da persistência dos objetos,
a persistência de suas relações também.
Por exemplo, ao gravar um objeto Disciplina em arquivo
faz-se necessário também outro arquivo para armazenar
o identificador de cada objeto Aluno relacionado.
No momento da recuperação dos objetos,
os seus relacionamentos podem então ser recuperados
por meio destas informações neste arquivo adicional.
De fato, tá, pessoal.
Vocês vão ter um arquivo lá, que vai ser o alunos.dat, por exemplo,
outro que vai ser o disciplinas.dat.
E aonde que vai tá o relacionamento entre eles?
Como é que eu sei que o, por exemplo, o Aluno
id 333 tá relacionado com a Disciplina id 2?
Eu vou ter um terceiro arquivo
que vai ser... ter em cada linha, na coluna e na primeira linha
ou na primeira coluna vai ter o id da Disciplina e na segunda coluna vai ter o id do Aluno.
Assim, em cada linha, eu tenho o relacionamento entre
Disciplina e Aluno.
E essa é uma maneira de fazer.
Inclusive, essa maneira de fazer
ela começa já a entrar nos princípios de banco de dados relacionais.
Ter um terceiro arquivo que vai correlacionar o id de Disciplinas com o id de...
relacionar, na verdade, o id de Disciplina com o id de Aluno,
ele já começa a entrar aí nos princípios de chave primária
e na tradição de bancos de dados relacionais, tá.
Que vocês vão se aprofundar depois lá na belíssima Disciplina de banco de dados.
Tem outra maneira de fazer também.
Eu posso, no momento em que eu registrar os dados
de cada objeto,
eu já registrar os dados também dos relacionamentos.
Aí, eu, por exemplo, aí, eu tô gravando os Alunos tudo num arquivo só, tá.
Mas nada impede pra cada Aluno
ou para cada Disciplina,
se eu quiser usar essa abordagem,
ter um arquivo específico pra cada um.
Mais complicado? Mais complicado.
Se eu usar um arquivo pra cada um,
eu posso, além de gravar, por exemplo, no caso da Disciplina,
num arquivo gravar os dados de um dado objeto,
também já gravar ali, em alguma posição em uma dada linha
quais que são os id's dos Alunos relacionados.
Mesmo que eu grave as Disciplinas todas num único Arquivo
usando algum conceito de linha por linha, né, cada Disciplina é uma linha.
Eu posso ter numa linha os dados da Disciplina
e, ainda, no final da linha, lá, os id's dos Alunos relacionados
que já começa a entrar um pouco no conceito mais de banco de dados OO mesmo, orientado a objetos.
Que também tem uns banco de dados que são mais orientados aos princípios da OO.
Conforme vocês notaram essa diferença que eu dei agora
dentre duas abordagens
sendo essa última aqui, um pouquinho mais OO, se parar pra refletir.
Então, isso aqui é divertido de fazer, tá.
Na verdade, se eu me recordo bem persistência até não...
não tá, necessariamente, na ementa de Técnicas de Programação,
mas eu acho que é bastante pertinente mostrar e trabalhar, tá.
Em todo o caso, nesse... no curso que eu tô fazendo aí,
como projeto de ensino, né, de programação orientada a objetos,
eu coloquei ali que a gente ia estudar um pouquinho de persistência, né,
pelo menos os princípios elementares que é isso que a gente tá vendo.
Por fim, tem esse item em vermelho, tá, bastante opcional,
mas pra quem quiser se aprofundar,
que é o seguinte.
Estudar mais sobre arquivos em C++
para, além de arquivos de texto,
ver também arquivos binários.
Como fonte de estudo, por exemplo,
há o capítulo pertinente do livro dos Deitel.
Pai e filho Deitel.
Depois deste estudo
poderia-se elaborar uma solução
para a persistência dos objetos no sistema estudados por meio de arquivos binários,
também chamados de arquivos "aleatórios', por assim dizer.
Os arquivos binários, tá.
eles têm outra maneira de registrar os dados, tá.
Eles não vão registrar os dados no formato de texto
vão registrar, justamente, no formato binário.
Sendo um pouco mais econômicos no...
na maneira de registrar os dados, tá.
E aí, eles usam algumas funções mais específicas para
para esse tipo de arquivo,
que é justamente o que tá detalhado lá no capítulo pertinente no livro dos Deitel.
Então, tem comandinhos peculiares aí pros binários.
É até legal você ler bem lá o capítulo
pra fazer essa bela distinção entre texto e binário.
Apesar de que o nome é mais ou menos autoexplicativo.
Eu usei, insisto, no exemplo que eu apresentei pra vocês aqui
arquivos de texto, né, ou sequenciais.
Pessoal, essa seria a aula de hoje.
Deixo vocês estudarem e avançarem com o aprendizado de vocês, tá,
na construção do conhecimento de vocês aí, em programação orientada a objetos.
Cada qual montando o seu Sistema Acadêmico em casa
sempre à luz do que eu vou instigando vocês aula a aula, tá,
exposição a exposição aqui dos conteúdos.
Bons estudos e até bem breve.