Informáca para as Ciências e Engenharias Versão : C...
Transcript of Informáca para as Ciências e Engenharias Versão : C...
Informá(caparaasCiênciaseEngenhariasVersão:C
(EngenhariaCivil)Aula7
PedroBarahona2016/17
Sumário
• Ficheiros.Ficheirosdetextoebinários.• Sistemadeficheiros.• Operaçõessobreficheirosdetexto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 2
ProblemadaPautadeICEcomFicheiros[1]
• FaçaumprogramaqueproduzapautacomasnotasfinaisdeICEporavaliação conWnua, comos dados do ficheiro notasAC.txt. A pauta éescritanoficheiropautaAC.txt.
• O ficheiro notasAC.txt tem uma linha por aluno, com o número asnotasdosdoisexercíciosedotrabalhoedosdoistestesdoaluno(nº,exer1, exer2, trab, teste1, teste2). Os números estão separados porumespaço.
• Alinhaterminacomumcaracter“fimdelinha”(representadopor↵)
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 3
5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...
notasAC.txt
ProblemadaPautadeICEcomFicheiros[2]
• OficheiropautaAC.txt temumaprimeira linhacom 'Numero'e 'NotaFinal',separadosporumtab(representadopor») .Depois,temmaisumalinhaporcadaaluno,comonúmeroeanotafinalporavaliaçãoconWnuadoaluno(nºenotaFinal),separadosporumtab.
• AnotaFinaldeumalunoé:§ uminteiroentre10e20,seoalunoaprovou;§ ‘Admi(do’,seoalunotemfrequênciaereprovou;§ ‘Excluido’,seoalunonãotemfrequência.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 4
Numero»NotaFinal↵58322»16↵5713»Admitido↵55064»Excluido↵...
pautaAC.txt
Resolução–Problema[1]
1. Compreendertotalmenteoproblema.• Os dados de entrada e de saída estão em ficheiros de texto:
notasAC.txtepautaAC.txt.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 5
è
Numero»NotaFinal↵58322»16↵5713»Admitido↵55064»Excluido↵...
pautaAC.txt
5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...
notasAC.txt
Resolução–Problema[2]
2. Caracterizaroproblema.•Problema: PautadeICEcomficheiros.•Entrada: nomeFichNotas,nomeFichPauta.•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.
3. Generalizaroproblema(semprequeforpossível).• Nãoépossívelgeneralizaresteproblema.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 6
Resolução–Algoritmo[1]
4. Desenharoalgoritmopararesolveroproblema.a) Conceberoalgoritmo,decompondooproblemaemsub-problemas.
• ComoproduziroficheirotendonomeFichNotasenomeFichPauta?1. Ler os dados do ficheiro nomeFichNotas e colocá-los numa
matriz(notasAC).2. Geraramatrizpautaapar(rdamatriznotasAC.3. EscreverosresultadosnoficheironomeFichPautacomamatriz
pauta.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 7
Resolução–Algoritmo[2]
b) Iden(ficar,caracterizaregeneralizarcadasub-problema.•Problema: Leituradasnotas(deavaliaçãoconWnua).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseis
colunas(nº,E1,E2,P,T1,T2).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 8
Resolução–Algoritmo[3]
b) Iden(ficar,caracterizaregeneralizarcadasub-problema.•Problema: PautadeICE.•Entrada: matrizdenúmeros,comumalinhaporalunoeseis
colunas(nº,E1,E2,P,T1,T2).•Saída: matrizdenúmeros,comumalinhaporalunoeduas
colunas(nºeNF).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 9
Resolução–Algoritmo[4]
b) Iden(ficar,caracterizaregeneralizarcadasub-problema.•Problema: Escritadapauta.•Entrada: (string)nomeFichPauta;matrizdenúmeros,comuma
linhaporalunoeduascolunas(nºeNF).•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 10
Resolução–Algoritmo[5]
c) Conceber o algoritmo, assumindo que os sub-problemas estãoresolvidos.
• PautadeICEcomficheiros(nomeFichNotas,nomeFichPauta):• notasACçleNotas(nomeFichNotas).• pautaçpautaICE(notasAC).• escrevePauta(nomeFichPauta,pauta).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 11
Resolução–Algoritmo[6]
5. Paracadasub-problema,desenharoalgoritmoparaoresolver.• Leituradasnotas(nomeFichNotas): (leituradeficheiro)• PautadeICE(notasAC): (feitonaaulateóricanº4)• Escritadapauta(nomeFichPauta,pauta): (escritaemficheiro)
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 12
Implementação–Quequestões?
1. Comoéqueselêdeumficheiro?§ Noproblema:leNotas.
2. Comoéqueseescrevenumficheiro?§ Noproblema:escrevePauta.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 13
Sumário
• Ficheiros.Ficheirosdetextoebinários.• Sistemadeficheiros.• Operaçõessobreficheirosdetexto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 14
Ficheiro
• Ficheirospermitemguardarinformaçãodeformapermanente.• Um ficheiro é um espaço de endereçamento logicamente conWguo,
contendo um conjunto de dados “inter-relacionados”. É acessívelatravésdeumiden(ficadorúnico(nome).
• Onomedeumficheiroéumasequênciadecaracteres(umastringemMatlab).
• Um ficheiro pode conter dados (texto, imagem, som, etc.) ouprogramas.
• O SO encarrega-se de gerir os ficheiros e os discos em que estesresidem. A organização do disco é escondida aos programadores eu(lizadores.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 15
Discos
• Discosrígidos(magné(cos-HD)§ Mecânico: rotação do disco e
deslocamentodacabeçaparalereescreverinformação.
• Discosdeestadosólido(SSD)
§ Eletrónico: acesso imediato aqualquer posição para ler eescrever.
§ Mais rápidosqueosdiscos rígidos(magné(cos).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 16
Tiposdeficheiros
• Ficheirosdetexto§ Contêm apenas bytes que podem ser interpretados como
caracteresimprimíveis: letrasmaiúsculaseminúsculas,algarismosesinaisdepontuação.
§ AcodificaçãousadaéaASCIIouumaderivadadesta.• Ficheirosbinários
§ Ainterpretaçãodoseuconteúdoestáacargodoprogramaqueou(liza; contêm bytes que não correspondem a caracteresimprimíveis.
§ Podemserdados(inteiros,reais),programas(códigosmáquinadeum dado CPU), sons (segundo uma codificação como o MP3),imagens (codificadas num formato como o JPEG), filmes (noformatoMPEG,porexemplo),etc.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 17
Ficheiroimprime.m
• O ficheiro imprime.m contém um programa na linguagem MATLAB(queescrevemensagensnoecrã).§ Maisprecisamente, repetenvezesapalavra ´hello’,mudandode
linhanofinal(caracter“\n”)
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 18
function imprime( n )!
!for i=1:n!! !fprintf(‘hello\n’)!!end!
end!
imprime.m codificado em ASCII
f 102
u 117
n 110
c 99
t 116
i 105
o 111
n 110
<sp> 32
I 73
m 109
p 112
r 114
i 105
m 109
e 101
( 40
<sp> 32
n 110
<sp> 32
) 41
<nl> 10
<tab> 9
f 102
o 111
r 114
<sp> 32
i 105
= 61
1 49
: 58
n 110
<nl> 10
<tab> 9
<tab> 9
f 102
p 112
r 114
i 105
n 110
t 116
f 102
( 40
‘ 33
h 104
e 101
l 108
l 108
o 111
\ 92
n 110
‘ 33
) 41
; 59
<nl> 10
<tab> 9
e 101
n 119
d 100
<nl> 10
e 101
n 110
d 100
<nl> 10
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 19
Sumário
• Ficheiros.Ficheirosdetextoebinários.• Sistemadeficheiros.• Operaçõessobreficheirosdetexto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 20
Sistemadeficheiros[2]
• Osistemadeficheirosestáorganizadohierarquicamenteemformadeárvore(“inver(da”).§ Raiz(adiretoriadotopo,daqual“descendem”asoutrasdiretorias
eosoutrosficheiros).« C:\Windows
§ Ramos(asoutrasdiretorias).§ Folhas(ficheiros).
• Cadadiretoriapodeconterficheiroseoutras(sub-)diretorias.• Nestaárvore,apesquisadeumficheiroéeficiente.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 21
Sistemadeficheiros[1]
x.log
Raiz C:\ Windows Diretoria Raiz
Diretoria Ficheiro
Programs Users
Matlab Office Luis
matlab.exe word.exe
ICE AM1
fact.m 24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 22
teste1.doc x.m
Sistemadeficheiros[3]
• Oseparador(\emWindows)éusadoparaindicarquesubdiretoriaseficheirosestãolocalizadosnumadiretoria.
• Ocaminhoparaoficheiro(pathname)podeser:§ absoluto–ocaminhocompletoapar(rdadiretoriaraiz;§ rela(vo–ocaminhoapar(rdadiretoriacorrente.
• Notaçõesespeciais(quepodemserusadasnoscaminhos):§ “.”representaadiretoriacorrente;§ “..”representaadiretoriapaidadiretoriacorrente.
• Ocomandocd<nomeDaDiretoria>mudaadiretoriacorrente.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 23
Sistemadeficheiros[1]
x.log
Raiz C:\ Windows Diretoria Raiz
Programs Users
Matlab Office Luis
matlab.exe
ICE AM1
fact.m 24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 24
teste1.doc x.m
Nome absoluto: C:\Users\Luis\ICE\fact.m Nome relativo: ICE\fact.m
Diretoria corrente: C:\Users\Luis
Sumário
• Ficheiros.Ficheirosdetextoebinários.• Sistemadeficheiros.• Operaçõessobreficheirosdetexto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 25
Ficheiros–Abertura…fecho
• Para lerouescrevernumficheiro,énecessário começarporabriroficheiro.
• Àmedidaqueselê/escreve,aposiçãocorrenteavança.• Nofimdasleituras/escritas,énecessáriofecharoficheiro.
Posição corrente
Início Fim
Posição corrente após a leitura
Leitura de N bytes do ficheiro. Ao deslocamento corrente é somado N.
N
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 26
Aberturadeumficheiro
• Afunção(instrução)fich = fopen( nomeFicheiro, ’r’ )
fich = fopen( nomeFicheiro, ’w’ )
permitem abrir um ficheiro nomeFicheiro para leitura (’r’, read) ouparaescrita(’w’,write)eretorna:§ um número não nega(vo, que é o iden(ficador do ficheiro no
contextodoprograma,seaoperação(versucesso;§ −1,emcasodeerro.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 27
% abertura do ficheiro ‘notasAC.txt’ % em modo de leitura fichN = fopen(‘notasAC.txt’, ‘r’; % abertura do ficheiro ‘pautaAC.txt’ % em modo de leitura fichP = fopen(’pautaAC.txt’, ’w’);
Fechodeumficheiro
• Afunção(instrução)res = fclose( fich )
permitefecharoficheiroiden(ficadoporficheretorna:§ 0,seaoperação(versucesso;§ −1,emcasodeerro.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 28
% fecho do ficheiro ‘notasAC.txt’ % aberto em modo de leitura % com identificador fichN resN = fclose(fichN); % fecho do ficheiro ‘pautaAC.txt’ % aberto em modo de leitura % com identificador fichP resP = fclose(fichP);
Memória central (RAM)
Escrita num ficheiro
• Naescritadeumficheiro,ainformaçãoguardadanamemóriacentralétransferidaparaodisco.
Zona de memória com N bytes
Disco
N bytes contíguos do
ficheiro
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 29
Escritanumficheirodetexto
• Afunção(instrução)res = fprintf( fich, formato, v1, v2, ..., vn )
(comn≥0)escrevea string formato, “preenchida”comosvaloresv1, v2, ..., vn,noficheiroiden(ficadoporfich.
• Retornaonúmerodebytesescritosnoficheiro.
• NOTA: Esta função é semelhante à anterior, prin:, que escreve astringformatonoecrã.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 30
% Escrita de uma linha (no ficheiro aberto com % identificador fichP) contendo os números 50123 e 17, % separados por um tab. fprintf(fichP, ’%d\t%d\n’, 50123, 17); % o numero de bytes escritos é “desprezado”
Formatos
• Um formato é uma string com informação sobre o (po dos valoresomissos(aescreveroualer).
• Alguns(posfrequentes:§ %d númerointeiro(comsinal);Nota:%iéequivalente.§ %f númeroreal§ %s string§ %c carácter
• Algunscaracteresespeciaisdeformatação:§ \n mudançadelinha§ \t tab
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 31
Formatos–Exemplo
>> num = 50123;!>> nota = 17;!>> fichE = fopen(’exemplo.txt’, ’w’);!fichE = 23 % o id retornado pode ser outro!>> str = ’aprovado’;!>> x = fprintf(fichE, ’Numero %d\tNota final %d (%s).\n’, ...!num, nota, str) !% é escrita uma linha no ficheiro sem eco no terminal!x = 39!>> close(fichE)!% podia-se ter verificado se o ficheiro foi bem fechado...!>> printf(’Numero %d\tNota final %d (%s).\n’, ...!num, nota, str) !% a mesma ordem de escrita mas para o terminal!Numero 50123 Nota final 17 (aprovado).!
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 32
Memória central (RAM)
Leituradeumficheiro
• Na leitura de um ficheiro, a informação guardada no disco étransferidaparaamemóriacentral.
• Sósepodemlerdadosseaposiçãocorrentedoficheironãoes(vernofimdoficheiro.
Zona de memória com N bytes
Disco
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 33
N bytes contíguos do
ficheiro
Testeaofimdeumficheiro
• Para evitar ler umficheiro para alémdo seu final (o que origina umerro)deverserverificadosejásea(ngiuoseufimcomainstrução
valorLógico = feof( fich )
• Quepermitetestarseaposiçãocorrentedoficheiro,iden(ficadoporfich,a(ngiuoseufinal(eoféaabreviaturadeendoffile)eretorna:§ true(1),se(verchegadoaofim;§ false(0),senão(verchegadoaofim.§ TipicamenteumficheiroélidonumcicloWHILE
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 34
while !feof(fich)! ... % ler o conteúdo do ficheiro identificado por fich! end!
Leituradeumalinhadoficheiro
• Tipicamenteumficheiroélidolinhaalinhacomainstruçãostr = fgetl( fich )
quelêtodososcaracteresdoficheiroiden(ficadoporfich,daposiçãocorrenteatéaofimdalinha,eretorna-os(excetoo‘\n’)nastringstr.
• Senãolernada,porhaverumalinhavazia,retorna−1.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 35
% leitura de linha do ficheiro de notas!>> linha = fgetl(fichN); !
% Se fosse a primeira linha lida, a variável linha seria a string!
% ’58322 15.5 16.4 18.0 17.7 14.8’.!
5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...
notasAC.txt
Resolução–Programa[1]
6. Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.
•Problema: Leituradasnotas(deavaliaçãoconWnua).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseiscolunas(nº,
E1,E2,P,T1,T2).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 36
function notas = leNotas( nomeFich ) % documentacao em anexo notas = []; % Criar uma matriz notas vazia. fich = fopen(nomeFich, 'r'); % Abrir o ficheiro para leitura. while ~feof(fich) linha = fgetl(fich); % Ler uma linha do ficheiro. notas = [notas ; str2num(linha)]; end fclose(fich); % Fechar o ficheiro. end
Amatriznotascomeçavaziapoisnãosesabeoseutamanho!
RegradeProgramação
• Ocódigodevesereficiente.§ Os vetores e as matrizes devem ser criados com as posições
necessárias,paraquenãoseescrevanumaposiçãoinexistente.§ A única exceção à regra anterior é quando os dados vêm de
ficheiro e não sabemos prever o seu número. A alterna(va seriapercorreroficheiroduasvezes,oqueseriaaindamaisineficiente.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 37
Resolução–Programa[2]
6. Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.
•Problema: Escritadapauta.•Entrada: (string)nomeFichPauta;matrizdenúmeros,comumalinhapor
alunoeduascolunas(nºeNF).•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 38
function escrevePauta( nomeFich, pauta ) % documentacao em anexo fich = fopen(nomeFich, 'w'); % Abrir o ficheiro para escrita. fprintf(fich, 'Numero\tNota Final\n'); % Escrever a 1ª linha. numAlunos = size(pauta, 1); for i = 1 : numAlunos % Escrever uma linha por aluno (...) end fclose(fich); % Fechar o ficheiro. end
Resolução–Programa[2]
• Paracadaalunoescreve-senoficheiroumalinhaquecomeçapeloseunúmero e termina num valor inteiro (>= 19) ou uma das palavras‘Admi(do’ou‘Excluido’,consoanteanotaob(da.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 39
... for i = 1 : numAlunos numero = pauta(i, 1); nota = pauta(i, 2); if nota >= 10 fprintf(fich, '%d\t%d\n', numero, nota); elseif nota >= 0 fprintf(fich, '%d\tAdmitido\n', numero); else fprintf(fich, '%d\tExcluido\n', numero); end end ...
Resolução–Programa[3]
7. Implementar o algoritmo que resolve o problema e testar oprogramapedido.
•Problema: PautadeICEcomficheiros.
•Entrada: nomeFichNotas,nomeFichPauta.•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.
• Quepodeserchamadadiretamentedaconsola
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 40
function pautaICEFich( nomeFichNotas, nomeFichPauta )
% documentacao em anexo
notasAC = leNotas(nomeFichNotas);
pauta = pautaICE(notasAC); % como na aula 4
escrevePauta(nomeFichPauta, pauta);
end
>> pautaICEFich(‘notasAC.txt’, ‘pautaAC.txt’)
ProblemadaPautadeICEcomFicheiros–versão2
• FaçaumprogramaqueproduzapautacomasnotasfinaisdeICEporavaliaçãoconWnua,comosdadosdoficheironotasAC_v2.txt.ApautaéescritanoficheiropautaAC.txt(talcomona1ªversão).
• OficheironotasAC_v2.txttemdois(posdelinhas:§ <númerodoaluno>
Aslinhasqueseseguemdizemrespeitoaestealuno.§ <prova>:<notanaprova>
onde<prova>é‘exercicio1’,‘exercicio2’,‘trabalho’,‘teste1’
ou‘teste2’.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 41
Resolução–Problema_v2
1. Comp r e ende r t o t a lmen t eoproblema.
• O formato das linhas dos ficheirosdedadosédiferente.
• Oproblemaésemelhantepeloquenos concentraremos no sub-problemadeleituradasnotas.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 42
5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...
notasAC.txt
58322↵exercicio1:15.5↵exercicio2:16.4↵trabalho1:18.0↵teste1:15.7↵teste2:14.8↵57413↵exercicio1:12.3↵exercicio2:9.2↵trabalho1:9.4↵teste1:8.7↵teste2:7.2↵(...)
notasAC_v2.txt
Resolução–Algoritmo_v2[1]
4. Desenharoalgoritmopararesolveroproblema.• PautadeICEcomficheirosv2(nomeFichNotas,nomeFichPauta):
• LerosdadosdoficheironomeFichNotasecolocá-losnumamatriz(notasAC).
• notasACçleNotas_v2(nomeFichNotas).
• PautaçpautaICE(notasAC).
• escrevePauta(nomeFichPauta,pauta).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 43
Resolução–Algoritmo_v2[2]
5. Paracadasub-problema,desenharoalgoritmoparaoresolver.Leituradasnotas(nomeFichNotas):§ notasç[].§ Enquanto não se (ver chegado ao fim do ficheiro, ler uma nova
linhaeextrairo(poeonúmero.« (po:1–nºdealuno;2–E1;3–E2;4–P;5–T1;6–T2.« número:onúmerodoalunoouanotadaprova.
§ Se(po==1,notasç[notas;numero,0,0,0,0,0].§ Se(po≠1,notas(<linhacorrente>,(po)çnúmero.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 44
Resolução–Algoritmo_v2[3]
5. Paracadasub-problema,desenharoalgoritmoparaoresolver.ExtrairIpoenúmero(linha):§ Encontrarasposiçõesdo‘:’nalinha.§ Senãohá‘:’nalinha:o(poé1;onúmeroocupatodasasposições
dalinha.§ Se há ‘:’ na linha: descobre-se o (po comparando a string à
esquerdade‘:’com‘trabalho1’,‘trabalho2’e‘teste1’;onúmeroocupaasposiçõesàdireitade‘:’.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 45
Resolução–Programa_v2[1]
6. Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.
•Problema: Extrair(poenúmero.•Entrada: (string)linha.•Saída: (inteiro)(po,(inteiro)número.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 46
function [tipo, numero] = extraiTipoENum(linha) % documentacao em anexo
posicoes = findstr(linha, ':');
if length(posicoes) == 0 % Formato linha: <numero do aluno>
tipo = 1;
numero = str2num(linha);
else % Formato da linha: <prova>:<nota na prova>
(...)
end end
Resolução–Programa_v2[2]
• Oblocoelsedeterminao(poeonúmeroadevolver.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 47
else % Formato da linha: <prova>:<nota na prova> pos = posicoes(1); prova = linha(1 : pos−1); if strcmp(prova, ’exercicio 1') == 1 tipo = 2; elseif strcmp(prova, ’exercicio 2') == 1 tipo = 3; elseif strcmp(prova, ’trabalho') == 1 tipo = 4; elseif strcmp(prova, 'teste 1') == 1 tipo = 5; else % strcmp(prova, 'teste 2') == 1 tipo = 6; end numero = str2num( linha(pos+1 : end) ); end
Resolução–Programa_v2[3]
6. Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.
•Problema: Leituradasnotas(versão2).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseiscolunas(nº,
E1,E2,P,T1,T2).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 48
function notas = leNotas_v2( nomeFich ) % documentacao em anexo notas = []; % Criar uma matriz notas vazia. fich = fopen(nomeFich, 'r'); % Abrir o ficheiro para leitura. while ~feof(fich)
linha = fgetl(fich); % Ler uma linha do ficheiro.
... end fclose(fich); % Fechar o ficheiro. end
Resolução–Programa_v2[4]
6. Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.
•Problema: Leituradasnotas(versão2).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseiscolunas(nº,
E1,E2,P,T1,T2).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 49
... while ~feof(fich) linha = fgetl(fich); % Ler uma linha do ficheiro. [tipo, numero] = extraiTipoENum(linha); if tipo == 1 % acrescenta uma linha notas = [notas ; numero, 0, 0, 0, 0, 0]; else % insere a nota na coluna = tipo notas(end, tipo) = numero; end end ...
Resolução–Programa_v2[3]
7. Implementar o algoritmo que resolve o problema e testar oprogramapedido.
•Problema: PautadeICEcomficheiros(versão2).•Entrada: (string)nomeFichNotas,(string)nomeFichPauta.•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.
• Quepodeserchamadadiretamentedaconsola
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 50
function pautaICEFich_v2( nomeFichNotas, nomeFichPauta )
% documentacao em anexo
notasAC = leNotas_v2(nomeFichNotas);
pauta = pautaICE(notasAC); % como na aula 4
escrevePauta(nomeFichPauta, pauta);
end
>> pautaICEFich_v2(‘notasAC_v2.txt’, ‘pautaAC_v2.txt’)
ParaEstudarestaAula
• ManualdoOctave§ Capítulo14
« Temváriasfunçõesquepodemserúteis
• (ouconfusas)
« Estassecçõesfocampar(cularmenteoquedemosaqui:
• 14.2.1OpeningandClosingFiles
• 14.2.3Line-OrientedInput
• 14.2.4Forma�edOutput
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 51