informática para ciências e engenharias (b)...

51
Informática para Ciências e Engenharias (B) 2016/17 Teórica 7

Upload: hoangdien

Post on 06-Dec-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

Informática para Ciências e Engenharias (B)

2016/17

Teórica7

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