informática para ciências e engenharias (b)...
TRANSCRIPT
Sumário
• Ficheiros. Ficheiros de texto e binários.
• Sistema de ficheiros.
• Operações sobre ficheiros de texto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 2
Problema da Pauta de ICE com Ficheiros [1]
• Faça um programa que produz a pauta com as notas finais de ICE por avaliação contínua, com os dados do ficheiro notasAC.txt. A pauta é escrita no ficheiro pautaAC.txt.
• O ficheiro notasAC.txt tem uma linha por aluno, com o número as notas dos dois exercícios e do trabalho e dos dois testes do aluno (nº, exer1, exer2, trab, teste1, teste2). Os números estão separados por um espaço.
• A linha termina com um caracter “fim de linha” (representado por ↵)
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
Problema da Pauta de ICE com Ficheiros [2]
• O ficheiro pautaAC.txt tem uma primeira linha com 'Numero' e 'Nota Final', separados por um tab (representado por ») . Depois, tem mais uma linha por cada aluno, com o número e a nota final por avaliação contínua do aluno (nº e notaFinal), separados por um tab.
• A notaFinal de um aluno é: • um inteiro entre 10 e 20, se o aluno aprovou; • ‘Admitido’, se o aluno tem frequência e reprovou; • ‘Excluido’, se o aluno não tem frequência.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 4
Numero»NotaFinal↵58322»16↵57413»Admitido↵55064»Excluido↵...
pautaAC.txt
Resolução – Problema [1]
1. Compreender totalmente o problema.
• Os dados de entrada e de saída estão em ficheiros de texto: notasAC.txt e pautaAC.txt.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 5
è
Numero»NotaFinal↵58322»16↵57413»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. Caracterizar o problema.
• Problema: Pauta de ICE com ficheiros.
• Entrada: nomeFichNotas, nomeFichPauta.
• Saída: nenhuma. O ficheiro nomeFichPauta é criado e escrito.
3. Generalizar o problema (sempre que for possível).
• Não é possível generalizar este problema.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 6
Resolução – Algoritmo [1]
4. Desenhar o algoritmo para resolver o problema.
a) Conceber o algoritmo, decompondo o problema em sub-problemas.
• Como produzir o ficheiro tendo nomeFichNotas e nomeFichPauta? 1. Ler os dados do ficheiro nomeFichNotas e colocá-los
numa matriz (notasAC). 2. Gerar a matriz pauta a partir da matriz notasAC. 3. Escrever os resultados no ficheiro nomeFichPauta com a
matriz pauta.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 7
Resolução – Algoritmo [2]
b) Identificar, caracterizar e generalizar cada sub-problema.
• Problema: Leitura das notas (de avaliação contínua).
• Entrada: (string) nomeFichNotas.
• Saída: matriz de números, com uma linha por aluno e seis colunas (nº, E1, E2, P, T1, T2).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 8
Resolução – Algoritmo [3]
b) Identificar, caracterizar e generalizar cada sub-problema.
• Problema: Pauta de ICE.
• Entrada: matriz de números, com uma linha por aluno e seis colunas (nº, E1, E2, P, T1, T2).
• Saída: matriz de números, com uma linha por aluno e duas colunas (nº e NF).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 9
Resolução – Algoritmo [4]
b) Identificar, caracterizar e generalizar cada sub-problema.
• Problema: Escrita da pauta.
• Entrada: (string) nomeFichPauta; matriz de números, com uma linha por aluno e duas colunas (nº e NF).
• Saída: nenhuma. O ficheiro nomeFichPauta é criado e escrito.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 10
Resolução – Algoritmo [5]
c) Conceber o algoritmo, assumindo que os sub-problemas estão resolvidos.
• Pauta de ICE com ficheiros ( nomeFichNotas, nomeFichPauta ) : • notasAC ç leNotas(nomeFichNotas). • pauta ç pautaICE(notasAC). • escrevePauta(nomeFichPauta, pauta).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 11
Resolução – Algoritmo [6]
5. Para cada sub-problema, desenhar o algoritmo para o resolver.
• Leitura das notas ( nomeFichNotas ) :
(leitura de ficheiro)
• Pauta de ICE ( notasAC ) :
(feito na aula teórica nº 4)
• Escrita da pauta ( nomeFichPauta, pauta ) :
(escrita em ficheiro)
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 12
Implementação – Que questões?
1. Como é que se lê de um ficheiro? • No problema: leNotas.
2. Como é que se escreve num ficheiro? • No problema: escrevePauta.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 13
Sumário
• Ficheiros. Ficheiros de texto e binários.
• Sistema de ficheiros.
• Operações sobre ficheiros de texto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 14
Ficheiro
• Ficheiros permitem guardar informação de forma permanente.
• Um ficheiro é um espaço de endereçamento logicamente contíguo, contendo um conjunto de dados “inter-relacionados”. É acessível através de um identificador único (nome).
• O nome de um ficheiro é uma sequência de caracteres (uma string em Matlab).
• Um ficheiro pode conter dados (texto, imagem, som, etc.) ou programas.
• O SO encarrega-se de gerir os ficheiros e os discos em que estes residem. A organização do disco é escondida aos programadores e utilizadores.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 15
Discos
• Discos rígidos (magnéticos - HD) • Mecânico: rotação do disco e
deslocamento da cabeça para ler e escrever informação.
• Discos de estado sólido (SSD) • Eletrónico: acesso imediato a
qualquer posição para ler e escrever.
• Mais rápidos que os discos rígidos (magnéticos).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 16
Tipos de ficheiros
• Ficheiros de texto • Contêm apenas bytes que podem ser interpretados como caracteres
imprimíveis: letras maiúsculas e minúsculas, algarismos e sinais de pontuação.
• A codificação usada é a ASCII ou uma derivada desta.
• Ficheiros binários • A interpretação do seu conteúdo está a cargo do programa que o
utiliza; contêm bytes que não correspondem a caracteres imprimíveis.
• Podem ser dados (inteiros, reais), programas (códigos máquina de um dado CPU), sons (segundo uma codificação como o MP3), imagens (codificadas num formato como o JPEG), filmes (no formato MPEG, por exemplo), etc.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 17
Ficheiro imprime.m
• O ficheiro imprime.m contém um programa na linguagem MATLAB (que escreve mensagens no ecrã). • Mais precisamente, repete n vezes a palavra ´hello’,
mudando de linha no final (caracter “\n”)
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 18
function imprime( n )!
!for i=1:n!! !printf(‘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. Ficheiros de texto e binários.
• Sistema de ficheiros.
• Operações sobre ficheiros de texto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 20
Sistema de ficheiros [2]
• O sistema de ficheiros está organizado hierarquicamente em forma de árvore (“invertida”). • Raiz (a diretoria do topo, da qual “descendem” as outras
diretorias e os outros ficheiros). • C:\ Windows
• Ramos (as outras diretorias). • Folhas (ficheiros).
• Cada diretoria pode conter ficheiros e outras (sub-)diretorias.
• Nesta árvore, a pesquisa de um ficheiro é eficiente.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 21
Sistema de ficheiros [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
Sistema de ficheiros [3]
• O separador (\ em Windows) é usado para indicar que subdiretorias e ficheiros estão localizados numa diretoria.
• O caminho para o ficheiro (pathname) pode ser: • absoluto – o caminho completo a partir da diretoria raiz; • relativo – o caminho a partir da diretoria corrente.
• Notações especiais (que podem ser usadas nos caminhos): • “.” representa a diretoria corrente; • “..” representa a diretoria pai da diretoria corrente.
• O comando cd <nomeDaDiretoria> muda a diretoria corrente.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 23
Sistema de ficheiros [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. Ficheiros de texto e binários.
• Sistema de ficheiros.
• Operações sobre ficheiros de texto.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 25
Ficheiros – Abertura … fecho
• Para ler ou escrever num ficheiro, é necessário começar por abrir o ficheiro.
• À medida que se lê/escreve, a posição corrente avança. • No fim das leituras/escritas, é necessário fechar o ficheiro.
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
Abertura de um ficheiro
• A função (instrução) fich = fopen( nomeFicheiro, ’r’ ) fich = fopen( nomeFicheiro, ’w’ )
permitem abrir um ficheiro nomeFicheiro para leitura (’r’, read) ou para escrita (’w’, write) e retorna: • um número não negativo, que é o identificador do ficheiro no contexto
do programa, se a operação tiver sucesso; • −1, em caso de erro.
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’);
Fecho de um ficheiro
• A função (instrução) res = fclose( fich )
permite fechar o ficheiro identificado por fich e retorna: • 0, se a operação tiver sucesso; • −1, em caso de erro.
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
• Na escrita de um ficheiro, a informação guardada na memória central é transferida para o disco.
Zona de memória com N bytes
Disco
N bytes contíguos do
ficheiro
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 29
Escrita num ficheiro de texto
• A função (instrução) res = fprintf( fich, formato, v1, v2, ..., vn )
(com n≥0) escreve a string formato, “preenchida” com os valores v1, v2, ...,vn, no ficheiro identificado por fich.
• Retorna o número de bytes escritos no ficheiro.
• NOTA: Esta função é semelhante à anterior, printf, que escreve a string formato no ecrã.
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 tipo dos valores omissos (a escrever ou a ler).
• Alguns tipos frequentes: • %d número inteiro (com sinal) ; Nota: %i é equivalente. • %f número real • %s string • %c carácter
• Alguns caracteres especiais de formatação: • \n mudança de linha • \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)
Leitura de um ficheiro
• Na leitura de um ficheiro, a informação guardada no disco é transferida para a memória central.
• Só se podem ler dados se a posição corrente do ficheiro não estiver no fim do ficheiro.
Zona de memória com N bytes
Disco
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 33
N bytes contíguos do
ficheiro
Teste ao fim de um ficheiro
• Para evitar ler um ficheiro para além do seu final (o que origina um erro) dever ser verificado se já se atingiu o seu fim com a instrução
valorLógico = feof( fich )
• Que permite testar se a posição corrente do ficheiro, identificado por fich, atingiu o seu final (eof é a abreviatura de end of file) e retorna: • true (1), se tiver chegado ao fim; • false (0), se não tiver chegado ao fim. • Tipicamente um ficheiro é lido num ciclo WHILE
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 34
while !feof(fich)! ... % ler o conteúdo do ficheiro identificado por fich! end!
Leitura de uma linha do ficheiro
• Tipicamente um ficheiro é lido linha a linha com a instrução str = fgetl( fich )
que lê todos os caracteres do ficheiro identificado por fich, da posição corrente até ao fim da linha, e retorna-os (exceto o ‘\n’) na string str.
• Se não ler nada, por haver uma linha vazia, 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), implementar o respetivo algoritmo e testar o “sub-programa”.
• Problema: Leitura das notas (de avaliação contínua). • Entrada: (string) nomeFichNotas. • Saída: matriz de números, com uma linha por aluno e seis colunas
(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!
Regra de Programação
• O código deve ser eficiente. • Os vetores e as matrizes devem ser criados com as posições
necessárias, para que não se escreva numa posição inexistente.
• A única exceção à regra anterior é quando os dados vêm de ficheiro e não sabemos prever o seu número. A alternativa seria percorrer o ficheiro duas vezes, o que seria ainda mais ineficiente.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 37
Resolução – Programa [2]
6. Para cada sub-problema (começando pelos mais simples), implementar o respetivo algoritmo e testar o “sub-programa”.
• Problema: Escrita da pauta.
• Entrada: (string) nomeFichPauta; matriz de números, com uma linha por aluno e duas colunas (nº e NF).
• Saída: nenhuma. O ficheiro nomeFichPauta é criado e escrito.
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]
• Para cada aluno escreve-se no ficheiro uma linha que começa pelo seu número e termina num valor inteiro (>= 19) ou uma das palavras ‘Admitido’ ou ‘Excluido’, consoante a nota obtida.
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 o programa pedido.
• Problema: Pauta de ICE com ficheiros. • Entrada: nomeFichNotas, nomeFichPauta. • Saída: nenhuma. O ficheiro nomeFichPauta é criado e escrito.
• que pode ser chamada diretamente da consola
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’)
Problema da Pauta de ICE com Ficheiros – versão 2
• Faça um programa que produz a pauta com as notas finais de ICE por avaliação contínua, com os dados do ficheiro notasAC_v2.txt. A pauta é escrita no ficheiro pautaAC.txt (tal como na 1ª versão).
• O ficheiro notasAC_v2.txt tem dois tipos de linhas: • <número do aluno>
As linhas que se seguem dizem respeito a este aluno. • <prova>:<nota na prova>
onde <prova> é ‘exercicio 1’, ‘exercicio 2’, ‘trabalho’, ‘teste 1’ ou ‘teste 2’.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 41
Resolução – Problema_v2
1. Compreender totalmente o problema.
• O formato das linhas dos ficheiros de dados é diferente.
• O problema é semelhante pelo que nos concentraremos no sub-problema de leitura das notas.
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↵trabalho:18.0↵teste1:15.7↵teste2:14.8↵57413↵exercicio1:12.3↵exercicio2:9.2↵trabalho:9.4↵teste1:8.7↵teste2:7.2↵(...)
notasAC_v2.txt
Resolução – Algoritmo_v2 [1]
4. Desenhar o algoritmo para resolver o problema.
• Pauta de ICE com ficheiros v2 ( nomeFichNotas, nomeFichPauta ) :
• Ler os dados do ficheiro nomeFichNotas e colocá-los numa matriz (notasAC).
• notasAC ç leNotas_v2(nomeFichNotas).
• Pauta ç pautaICE(notasAC).
• escrevePauta(nomeFichPauta, pauta).
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 43
Resolução – Algoritmo_v2 [2]
5. Para cada sub-problema, desenhar o algoritmo para o resolver.
Leitura das notas ( nomeFichNotas ) : • notas ç []. • Enquanto não se tiver chegado ao fim do ficheiro, ler uma
nova linha e extrair o tipo e o número. • tipo: 1 – nº de aluno; 2 – E1; 3 – E2; 4 – P; 5 – T1; 6 – T2. • número: o número do aluno ou a nota da prova.
• Se tipo == 1, notas ç [notas ; numero, 0, 0, 0, 0, 0]. • Se tipo ≠ 1, notas(<linha corrente>, tipo) ç número.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 44
Resolução – Algoritmo_v2 [3]
5. Para cada sub-problema, desenhar o algoritmo para o resolver.
Extrair tipo e número ( linha ) : • Encontrar as posições do ‘:’ na linha. • Se não há ‘:’ na linha: o tipo é 1; o número ocupa todas as
posições da linha. • Se há ‘:’ na linha: descobre-se o tipo comparando a string à
esquerda de ‘:’ com ‘trabalho 1’, ‘trabalho 2’ e ‘teste 1’; o número ocupa as posições à direita de ‘:’.
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 45
Resolução – Programa_v2 [1]
6. Para cada sub-problema (começando pelos mais simples), implementar o respetivo algoritmo e testar o “sub-programa”.
• Problema: Extrair tipo e número. • Entrada: (string) linha. • Saída: (inteiro) tipo, (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]
• O bloco else determina o tipo e o número a devolver.
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), implementar o respetivo algoritmo e testar o “sub-programa”.
• Problema: Leitura das notas (versão 2). • Entrada: (string) nomeFichNotas. • Saída: matriz de números, com uma linha por aluno e seis colunas
(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), implementar o respetivo algoritmo e testar o “sub-programa”.
• Problema: Leitura das notas (versão 2). • Entrada: (string) nomeFichNotas. • Saída: matriz de números, com uma linha por aluno e seis colunas
(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 o programa pedido.
• Problema: Pauta de ICE com ficheiros (versão 2). • Entrada: (string) nomeFichNotas, (string) nomeFichPauta. • Saída: nenhuma. O ficheiro nomeFichPauta é criado e escrito.
• Que pode ser chamada diretamente da consola
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’)
Para Estudar esta Aula
• Manual do Octave • Capítulo 14
• Tem várias funções que podem ser úteis • (ou confusas)
• Estas secções focam particularmente o que demos aqui: • 14.2.1 Opening and Closing Files • 14.2.3 Line-Oriented Input • 14.2.4 Formatted Output
24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 51