Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Informática para as Ciências e EngenhariasVersão : C
(Engenharia Civil)Aula 7
Pedro Barahona2017 / 18
Sumário
• Ficheiros. Ficheiros de texto e binários.• Sistema de ficheiros.• Operações sobre ficheiros de texto.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 2
Problema da Pauta de ICE com Ficheiros [1]
• Faça um programa que produz a pauta com as notas finais de ICE poravaliaçã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 asnotas 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 umespaço.
• A linha termina com um caracter “fim de linha” (representado por ↵)
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 3
58322 15.5 16.4 18.0 15.7 14.8 ↵57413 12.3 9.2 9.4 8.7 7.2 ↵55064 8.0 4.5 7.2 8.1 10.2 ↵...
notasAC.txt
Problema da Pauta de ICE com Ficheiros [2]
• O ficheiro pautaAC.txt tem uma primeira linha com 'Numero' e 'NotaFinal', separados por um tab (representado por ») . Depois, tem maisuma linha por cada aluno, com o número e a nota final por avaliaçãocontí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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 4
Numero » Nota Final ↵58322 » 16 ↵5713 » 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 5
è
Numero » Nota Final ↵58322 » 16 ↵5713 » Admitido ↵55064 » Excluido ↵...
pautaAC.txt
58322 15.5 16.4 18.0 15.7 14.8 ↵57413 12.3 9.2 9.4 8.7 7.2 ↵55064 8.0 4.5 7.2 8.1 10.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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 10
Resolução – Algoritmo [5]
c) Conceber o algoritmo, assumindo que os sub-problemas estãoresolvidos.
• Pauta de ICE com ficheiros ( nomeFichNotas, nomeFichPauta ) :• notasAC ç leNotas(nomeFichNotas).• pauta ç pautaICE(notasAC).• escrevePauta(nomeFichPauta, pauta).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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)
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 13
Sumário
• Ficheiros. Ficheiros de texto e binários.• Sistema de ficheiros.• Operações sobre ficheiros de texto.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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ívelatravés de um identificador único (nome).
• O nome de um ficheiro é uma sequência de caracteres (uma string emMatlab).
• 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 eutilizadores.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 15
Discos
• Discos rígidos (magnéticos - HD)
§ Mecânico: rotação do disco edeslocamento da cabeça para ler eescrever informação.
• Discos de estado sólido (SSD)
§ Eletrónico: acesso imediato aqualquer posição para ler eescrever.
§ Mais rápidos que os discos rígidos(magnéticos).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 16
Tipos de ficheiros
• Ficheiros de texto
§ Contêm apenas bytes que podem ser interpretados comocaracteres imprimíveis: letras maiúsculas e minúsculas, algarismose 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 outiliza; contêm bytes que não correspondem a caracteresimprimíveis.
§ Podem ser dados (inteiros, reais), programas (códigos máquina deum dado CPU), sons (segundo uma codificação como o MP3),imagens (codificadas num formato como o JPEG), filmes (noformato MPEG, por exemplo), etc.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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”)
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 18
function imprime( n )for i=1:n
fprintf(‘hello\n’)end
end
imprime.m codificado em ASCII
f102
u117
n110
c99
t116
i105
o111
n110
<sp>32
I73
m109
p112
r114
i105
m109
e101
(40
<sp>32
n110
<sp>32
)41
<nl>10
<tab>9
f102
o111
r114
<sp>32
i105
=61
149
:58
n110
<nl>10
<tab>9
<tab>9
f102
p112
r114
i105
n110
t116
f102
(40
�33
h104
e101
l108
l108
o111
\92
n110
�33
)41
;59
<nl>10
<tab>9
e101
n119
d100
<nl>10
e101
n110
d100
<nl>10
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 19
Sumário
• Ficheiros. Ficheiros de texto e binários.• Sistema de ficheiros.• Operações sobre ficheiros de texto.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 21
Sistema de ficheiros [1]
x.log
Raiz C:\ WindowsDiretoria Raiz
Diretoria Ficheiro
Programs Users
Matlab Office Luis
matlab.exe word.exe
ICE AM1
fact.m20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 22
teste1.docx.m
Sistema de ficheiros [3]
• O separador (\ em Windows) é usado para indicar que subdiretorias eficheiros 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 23
Sistema de ficheiros [1]
x.log
Raiz C:\ WindowsDiretoria Raiz
Programs Users
Matlab Office Luis
matlab.exe
ICE AM1
fact.m20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 24
teste1.docx.m
Nome absoluto: C:\Users\Luis\ICE\fact.mNome 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 25
Ficheiros – Abertura … fecho
• Para ler ou escrever num ficheiro, é necessário começar por abrir oficheiro.
• À 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
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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) oupara 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 27
% abertura do ficheiro ‘notasAC.txt’% em modo de leiturafichN = fopen(‘notasAC.txt’, ‘r’;% abertura do ficheiro ‘pautaAC.txt’% em modo de leiturafichP = 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 28
% fecho do ficheiro ‘notasAC.txt’% aberto em modo de leitura% com identificador fichNresN = fclose(fichN);% fecho do ficheiro ‘pautaAC.txt’% aberto em modo de leitura% com identificador fichPresP = 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óriacom N bytes
Disco
N bytes contíguos do
ficheiro
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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, noficheiro identificado por fich.
• Retorna o número de bytes escritos no ficheiro.
• NOTA: Esta função é semelhante à anterior, printf, que escreve a stringformato no ecrã.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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 valoresomissos (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
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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 terminalx = 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 terminalNumero 50123 Nota final 17 (aprovado).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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 estiverno fim do ficheiro.
Zona de memóriacom N bytes
Disco
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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 umerro) 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 porfich, 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
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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çãostr = fgetl( fich )
que lê todos os caracteres do ficheiro identificado por fich, da posiçãocorrente 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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�.
58322 15.5 16.4 18.0 15.7 14.8 ↵57413 12.3 9.2 9.4 8.7 7.2 ↵55064 8.0 4.5 7.2 8.1 10.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).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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)];
endfclose(fich); % Fechar o ficheiro.
end
A matriz notas começa vazia poisnão se sabe o seu tamanho !
Regra de Programação
• O código deve ser eficiente.
§ Os vetores e as matrizes devem ser criados com as posiçõesnecessárias, para que não se escreva numa posição inexistente.
§ A única exceção à regra anterior é quando os dados vêm deficheiro e não sabemos prever o seu número. A alternativa seriapercorrer o ficheiro duas vezes, o que seria ainda mais ineficiente.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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
(...) endfclose(fich); % Fechar o ficheiro.
end
Resolução – Programa [2]
• Para cada aluno escreve-se no ficheiro uma linha que começa pelo seunúmero e termina num valor inteiro (>= 19) ou uma das palavras‘Admitido’ ou ‘Excluido’, consoante a nota obtida.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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 oprograma 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
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 40
function pautaICEFich( nomeFichNotas, nomeFichPauta )% documentacao em anexo
notasAC = leNotas(nomeFichNotas);pauta = pautaICE(notasAC); % como na aula 4escrevePauta(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 poravaliaçã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�.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 41
Resolução – Problema_v2
1. Compreender totalmenteo problema.
• O formato das linhas dos ficheirosde dados é diferente.
• O problema é semelhante pelo quenos concentraremos no sub-problema de leitura das notas.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 42
58322 15.5 16.4 18.0 15.7 14.8 ↵57413 12.3 9.2 9.4 8.7 7.2 ↵55064 8.0 4.5 7.2 8.1 10.2 ↵...
notasAC.txt
58322↵exercicio 1:15.5↵exercicio2:16.4↵trabalho 1:18.0↵teste 1:15.7↵teste 2:14.8↵57413↵exercicio 1:12.3↵exercicio2:9.2↵trabalho 1:9.4↵teste 1:8.7↵teste 2: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).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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çõesda linha.
§ Se há ‘:’ na linha: descobre-se o tipo comparando a string àesquerda de ‘:’ com ‘trabalho 1’, ‘trabalho 2’ e ‘teste 1’; o númeroocupa as posições à direita de ‘:’.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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>(...)
endend
Resolução – Programa_v2 [2]
• O bloco else determina o tipo e o número a devolver.
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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;endnumero = 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).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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....
endfclose(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).
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 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 oprograma 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
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 50
function pautaICEFich_v2( nomeFichNotas, nomeFichPauta )% documentacao em anexo
notasAC = leNotas_v2(nomeFichNotas);pauta = pautaICE(notasAC); % como na aula 4escrevePauta(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
20 Abril 2018 7: Sistemas de Ficheiros; Operações sobre ficheiros de texto 51