51
Introdução aos Computadores e Pr ogramação DI-FCT-UNL-2004/2005 Programação 5.1 Miguel Maurício [email protected] Octave Programação

Miguel Maurício [email protected] Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Embed Size (px)

Citation preview

Page 1: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.1Miguel Maurício

[email protected]

OctaveProgramação

Page 2: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.2

Instrução disp

disp(x) permite fazer o display do valor de x.

Exemplo1 Exemplo2

octave:1> y=0y = 0octave:2> x=3;octave:3> z=1:3z = 1 2 3

octave:4> disp(x)3octave:5>disp("O valor de y:"), disp(y)O valor de y:0octave:6> disp(z)1 2 3

Page 3: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.3

Instrução input (1)

O Octave tem algumas funções disponíveis para interagir com o utilizador, sendo uma delas o input.

A instrução input(prompt) emite para o terminal a prompt e fica à espera que o utilizador introduza um valor.

Page 4: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.4

Instrução input (2)

octave:1> x=input("Qual o valor de x? ");Qual o valor de x? 10octave:2> y = x^2;octave:3> disp("quadrado de x :"),

disp(y) quadrado de x :100

Page 5: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.5

Conceitos básicos

Mecanismos Sequencial

Forma de expressar através de uma linguagem que acção 1 deve ser executada antes da acção 2.

CondicionalForma de expressar uma situação onde se pretende que caso seja verificada uma condição seja executada a acção 1 e caso contrário seja executada a acção 2.

RepetiçãoForma de expressar uma situação onde existe a necessidade de executar um bloco de acções um certo número de vezes ou até que seja verificada uma condição.

Page 6: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.6

Condições

É uma expressão booleana que retorna true (1) ou false (0).

x < y verdade se x menor que y

x <= y verdade se x menor ou igual a y

x == y verdade se x igual a y

x >= y verdade se x maior ou igual a y

x > y verdade se x maior que yx != yx ~= yx <> y

verdade se x diferente de y

Page 7: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.7

Comparaçãooctave:1> x=2x = 2octave:2> x > 4ans = 0

comparação de dois valores numéricos

octave:3> [1, 2; 3,4] == [1, 2; 2, 4]ans =

1 10 1

comparação de matrizes é efectuada elemento a elemento

octave:10> [1, 2; 2,4] == 2ans =

0 11 0

neste caso o valor escalar é comparado com cada um dos elementos da matriz

octave:7> sum(x,y)!=5ans = 0

comparação em que um dos valores é retornado por uma função

Page 8: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.8

FunçõesArgumentos (1)

Exemplo Descrição

function area_circ(raio)pi*raio^2

endfunction

Esta função calcula a área de umcírculo, tem um parâmetro de entrada (raio) e retorna um valor.

Exemplo de utilização (chamada):

octave:10> a = area_circ(5)a = 78.540

Page 9: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.9

Exercicio Proposto

Pretende-se implementar uma função que calcule as raizes de um polinomio do tipo ax^2 + bx + c = 0

A função terá o seguinte esquema:

function polinomioAceitação dos valores de a,b e c inseridos pelo

utilizadorCalculo das raizes (xpos,xneg)Mostrar os resultadosendfunction

Page 10: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.10

Operadores booleanos

booleano1 || booleano2operador ou (or) o resultado é verdade se pelo menos uma das expressões for verdade (true)

booleano1 && booleano2operador e (and) o resultado é verdade se e só se todas as expressões forem verdade

! booleano1 ~ booleano1

operador negação (not) o resultado é verdade se a expressão for falsa (false)

Page 11: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.11

Instrução if

Sintaxe Exemplo Descrição

if (condição)bloco1

elsebloco2

endif

if ( x > y)maior =x

elsemaior =y

endif

se a condição for verdadeira o bloco1 é executado, senão é o bloco2

Page 12: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.12

Instrução while

Sintaxe Exemplo Descrição

while (condição)bloco1

endwhile

while ( x > y)y = y+1

endwhile

enquanto a condição for verdadeira o bloco de instruções vai ser executado, até que a condição se torne falsa.

Page 13: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.13

Instrução forSintaxe Exemplo Descrição

for var = exprbloco

endfor

for i=1:10y = y+1

endfor

O bloco de instruções (y=y+1) vai

ser executado 10 vezes(inicio do ciclo em 1 e fim em 10).

o valor da variável i vai sendo incrementado (do valor do passo, que neste caso é 1) automaticamente em cada passagem.

Page 14: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.14

Instrução break

Exemplo Descrição

for i=1:10y = y + Iif ( y == 6 )

breakendif

endforx = y

Neste exemplo, temos um ciclo que irá ser executado 10 vezes, se a condição y==6 não ocorrer. Se durante a execução do ciclo essa condição se verificar a instrução break será executada e o ciclo de for quebrado, passando a execução directamente para a instrução seguinte ao ciclo (x=y).

Page 15: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.15

Funções

A organização do código de modo a torná-lo mais versátil e estruturado deve ser um dos objectivos a ter em mente aquando da elaboração de um programa.

Exemplo Descrição

function msg_entradadisp("Hoje está um lindo dia\n");

Endfunction

A partir do momento da sua declaração é possível utilizar a função, para tal basta executar o seu nome (msg_entrada) na linha de comando.

Page 16: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.16

FunçõesArgumentos (1)

Exemplo Descrição

function ret_val = area_circ(raio)ret_val = pi*raio^2;

endfunction

Esta função calcula a área de umcírculo, tem um parâmetro de entrada (raio) e retorna um valor.

Exemplo de utilização (chamada):

octave:10> a = area_circ(5)a = 78.540

Page 17: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.17

FunçõesArgumentos (2)

Errado Correcto

function retval = avg(v)if (is_vector(v))

retval = sum(v)/length(v);

endifendfunction

function retval = avg(v)retval = 0if (is_vector(v))

retval = sum(v)/length(v);

elseprintf("erro, o

argumento deve ser um vector\n")

endifendfunction

Page 18: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.18

Ficheiros de funções (1)

É possível guardar as funções feitas em ficheiros. Deste modo é possível reutilizar as mesmas sempre que necessário.

Para o Octave detectar estes ficheiros de funções, estes devem conter como primeira linha a definição da função.

As linhas de comentário são iniciadas por # ou % (linha a linha). O Octave ao detectar um destes símbolos no início de uma linha ignora-a.

Os ficheiros terão que ter o mesmo nome que a função, isto é, por ex. uma função chamada area_circ o ficheiro deve chamar-se area_circ.m

É boa política ter um ficheiro por função.

Page 19: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.19

Ficheiros de funções (2)

# função que calcula a area de uma circunferencia

# dado o valor do seu raio.function ret_val = area_circ(raio)

ret_val = pi*raio^2endfunction

ficheiro area_circ.m

Page 20: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.20

Linha de comandos

cd <nome> , (change directory) muda de directoria Ex:

cd trabalho (a directoria corrente passa a ser a trabalho)

cd /cygdrive/a (a directoria corrente passa a ser a disquete)

pwd, (print current/working directory) mostra qual a directoria corrente

ls, (list directory contents) lista o conteúdo da directoria corrente

Page 21: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.21

Ficheiro mdc.m

function d = mdc(m,n); # M e N têm de ser positivos e M >N if m == n d = m; else if m-n >= n d = mdc(m-n,n); else d = mdc(n,m-n); endif; endif; endfunction;

Page 22: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.22

Função string_replacePretende-se implementar uma função que recebe 3 strings (a,b,c), e que substitui todas as ocorrencias de “b” por “c” em “a”.

O resultado deve ser apresentado sempre em letras maiusculas!

>> string_replace("hoje esta um lindo dia","esta","nao esta")

Pretende trocar na string :

hoje esta um lindo dia

Todas as ocorrencias de :

esta

Por :

nao esta

Depois da troca efectuada obtemos :

HOJE NAO ESTA UM LINDO DIA

Page 23: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.23

“Trocas em vectores”

>> x

x = 0 0 1 0 0

>> troca_vector(x)

O Vector inicial é :

0 0 1 0 0

O vector resultante é :

1 1 0 1 1

A função pretendida aplicada a um vector, troca o valor 0 por 1 e vice-versa!

>> a

a = Vector de zeros e uns

>> troca_vector(a)

O argumento não é um vector!

Caso o argumento não seja um vector…

Page 24: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.24

troca_vector.m

function troca_vector(x) if ~(is_vector(x)) disp("O argumento não é um vector!"); else disp("O Vector inicial é :\n"),disp(x); for i=1:length(x) if (x(1,i) == 1) x(1,i)= 0; else x(1,i)= 1; endif endfor disp("\nO vector resultante é :\n"),disp(x); endif endfunction

Page 25: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.25

Exercicio Proposto

1 - Pretende-se implementar uma função “troca” que aplicada a uma matriz (de 0’s e 1’s) a percorra e troque os valores pelo seu inverso (0↔1), apresentando inicialmente a matriz “inicial” e em seguida a matriz “transformada”.

2 – A partir da função troca crie uma função troca_2 , de modo a que seja possivel atribuir a uma variável o resultado da função (função argumento).

exemplo : >> d = troca_2(x)

Page 26: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.26

Exemplo da função troca(x)>> b

b =

0 0 1 1

0 1 1 0

1 0 0 0

1 0 0 1

>> troca(b)

A matriz inicial é :

0 0 1 1

0 1 1 0

1 0 0 0

1 0 0 1

A matriz transformada é :

1 1 0 0

1 0 0 1

0 1 1 1

0 1 1 0

Page 27: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.27

Ficheiros de entrada/saída

Muitas vezes existe a necessidade de ler dados do exterior ou armazenar.

Nestes casos podemos usar ficheiros para armazenar a informação.

Para manipular ficheiros a primeira acção a fazer é proceder a sua “abertura” (fopen). Depois de concluídas as operações de leitura e escrita nos ficheiros, estes têm que ser “fechados” (fclose).

Page 28: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.28

Instrução fopen (1)

fid = fopen(nome_fich,modo) Modo

r - abre ficheiro existente para leitura. w - abre ficheiro para escrita, o anterior conteúdo do

ficheiro é eliminado. a - abre ficheiro para escrita no final do ficheiro

(append). r+ - abre existente para leitura e escrita. w+ - abre ficheiro para leitura e escrita, o anterior

conteúdo do ficheiro é eliminado. a+ - abre ou cria ficheiro para leitura e escrita no final

do ficheiro.

Page 29: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.29

Instrução fopen (2)

fid ={id =name =mode =arch =status =}

id é um valor inteiro que apartir do momento da abertura, vai identificar o ficheiro;

name é o nome do ficheiro, deve ser igual ao parametro nome_fich;

mode é o modo como o ficheiro foi aberto;

arch é o tipo de interpretação pela arquitectura;

status indica o estado em que se encontra o ficheiro;

No caso problemas na abertura, fid toma o valor -1.

Page 30: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.30

Instrução fclose

fclose(fid) Fecha o ficheiro com o identificador fid.

Page 31: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.31

fopen / fcloseexemplos (1)

Exemplo Descrição

octave:4> f1=fopen("dados.txt","r")f1 = { id = 3name = dados.txtmode = rarch = nativestatus = open }

Abertura do ficheiro já existente para leitura, com o nome "dados.txt", que se encontra na directoria corrente.

octave:10> f2=fopen("tmp/dados2.txt","r")f2 = { id = 4name = tmp/dados2.txtmode = rarch = nativestatus = open }

Abertura de um ficheiro já existente para leitura, com o nome "dados2.txt", que se encontra na subdirectoria tmp da directoria corrente.

Page 32: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.32

fopen / fcloseexemplos (2)

Exemplo Descrição

octave:7> f3=fopen("teste.txt","r")f3 = -1

Tentativa de abertura de um ficheiro para leitura, mas em que ocorreu um problema (por exemplo ficheiro não existe).

octave:8> f4=fopen("teste.txt","w")f4 = { id = 5name = teste.txtmode = warch = nativestatus = open }

Abertura do ficheiro "teste.txt" para escrita. Neste caso o ficheiro ainda não existia, mas como foi aberto para escrita ele vai ser automaticamente criado na directoria corrente.

Page 33: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.33

Leitura e escrita simples em ficheiros (1)

Escrita fputs(fid, string) puts(string)

Leitura fgets(fid,len) fgetl(fid,len)

Page 34: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.34

Leitura e escrita simples em ficheiros (2)

Exemplo Descrição

octave:1> fid=fopen("teste.txt","w");

octave:2> str="Para teste a escrita em ficheiros\n";

octave:3> fputs(fid,str)ans = 0octave:4> fputs(fid,"segunda

linha")ans = 0 octave:5> fputs(fid,"\n")ans = 0 octave:6> fputs(fid,"outra

linha")ans = 0 octave:7> fclose(fid)ans = 0

Este exemplo abre ficheiro para escrita (se não ainda não existia cria-o) e escreve em "teste.txt", após o que fecha o ficheiro.O caracter '\n' sinaliza o fim de linha.

Analise o resultado desta acção, abrindo o ficheiro "teste.txt" com um editor de texto (por exemplo o Notepad) e observe o conteudo do ficheiro.

Page 35: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.35

Leitura e escrita simples em ficheiros (3)

Exemplo Descrição

octave:14> fid=fopen("teste.txt","r"); octave:15> str1=fgetl(fid,100); octave:16> str2=fgets(fid,100); octave:17> str3=fgets(fid,4); octave:18> fclose(fid); octave:19> str1str1 = Para teste a escrita em

ficheiros octave:20> str2str2 = segunda linha

octave:21> str3str3 = outr

Exemplo de leitura de ficheiros de texto utilizando as funções fgetl e fgets.

Page 36: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.36

Exercicio proposto

Programe uma função read_write que receba o nome de dois ficheiros de texto.

A função deve abrir o ficheiro 1 e criar uma copia deste.

Page 37: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.37

read_write

Exemplo Descrição

octave:14> read_write("teste.txt","s1.txt")

Foi criado um ficheiro de nome “s1.txt” que contêm que é uma copia exacta de “teste.txt”.

Page 38: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.38

read_write.m

function read_write(f1,f2) fr = fopen(f1,"r"); fw = fopen(f2,"w"); while !feof(fr) x = fgets(fr,100); fputs(fw,x); endwhile fclose(fr); fclose(fw); endfunction

Page 39: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.39

Leitura e escrita formatada em ficheiros (1)

Escrita printf(template,...) fprintf(fid,template,...)

Leitura (pensada em termos de matrizes) [val,count] =

fscanf(fid,template,size)

Page 40: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.40

Leitura e escrita formatada em ficheiros (2)

Templates %d – inteiro com sinal. %f – real com sinal. %s – string. %c – caracter.

Page 41: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.41

Leitura e escrita formatada em ficheiros (3)

octave:1> nome="Antonio Silva"; octave:2> num=12753;octave:3> nota=15.5; octave:4> printf("Aluno %s num: %d nota %f \

n",nome,num,nota);Aluno Antonio Silva num: 12753 nota 15.500000 octave:5> m=[1,2,3;4,5,6;7,8,9]; octave:6> printf("%d ",m); 1 4 7 2 5 8 3 6 9

Page 42: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.42

Leitura e escrita formatada em ficheiros (4)

octave:7> fid=fopen("teste.dat","w");octave:8> fprintf(fid,"%d ",m); octave:9> fprintf(fid,"%d ",m*2); octave:10> fclose(fid)ans = 0 octave:11> fid2=fopen("teste.dat","r"); octave:12> x1=fscanf(fid2,"%d ",[3,3])x1 =

1 2 34 5 67 8 9

octave:13> [x2,dim]=fscanf(fid2,"%d ",[3,3])

x2 =2 4 68 10 1214 16 18

dim = 9 octave:14> fclose(fid2);

Escrita de duas matrizes de valores num ficheiro e respectiva leitura. O terceiro argumento da função indica a dimensão da matriz.Como pode observar, no segundo exemplo de leitura, a função também retorna o número de elementos lidos.

Page 43: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.43

Leitura e escrita formatada em ficheiros (5)

octave:15> fid=fopen("teste.txt","r");

octave:16> x3=fscanf(fid,"%d ",10)‘

x3 = 1 4 7 2 5 8 3 6 9 2 octave:17> x4=fscanf(fid,"%d

",10)‘x4 = 8 14 4 10 16 6 12 18 octave:18> x5=fscanf(fid,"%d

",10)’ x5 = [](1x0) octave:19> fclose(fid);

Outro exemplo de leitura do mesmo ficheiro "teste.dat", mas agora lendo os valores para uma variável vector.

Agora o terceiro argumento indica o numero de elementos a ler. Ao chegar ao fim do ficheiro (não tendo mais elementos para ler) afecta a variável com o vector vazio [].

Se não colocar nenhum valor terceiro parametro da função, esta vai ler para um vector todos os elementos do ficheiro.

Page 44: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.44

Leitura e escrita formatada em ficheiros (6)

octave:21> m2=log(m)m2 =0.00000 0.69315 1.098611.38629 1.60944 1.791761.94591 2.07944 2.19722octave:22> printf("%.5f %.4f %.6f \

n",m2);0.00000 1.3863 1.9459100.69315 1.6094 2.0794421.09861 1.7918 2.197225octave:23>printf("%f %d %.2f \n",

[1,2;3,4]);1.000000 2 3.004.000000

Escreve no écran os valores formatados como reais.

O printf efectua um ciclo sobre o template de formatação, o que pode levar a alguma confusão (linha 23)

(O valor antes de f indica o número de casas decimais).

Page 45: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.45

Função pauta_ponderada

Pretende-se implementar uma função que receba dois ficheiros de texto, em alunos.txt podemos encontrar os nomes dos alunos e em notas.txt as notas dos mesmos (0 a 20), a função deverá produzir um ficheiro de texto com o nome do aluno e a nota no teste (0 a 5).

>>pauta_ponderada("alunos.txt","notas.txt","pauta.txt")

Page 46: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.46

pauta_ponderada.m

function pauta_ponderada(f1,f2,f3) fnome = fopen(f1,"r"); fnota = fopen(f2,"r"); fpauta = fopen(f3,"w"); while !feof(fnome) nome=fgetl(fnome); nota=fscanf(fnota,"%f","C"); fprintf(fpauta,"%s %3.1f \n", nome,

nota*5/20); endwhile fclose(fnome); fclose(fnota); fclose(fpauta); endfunction

Page 47: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.47

Exercicios propostos (1)

Crie uma função pauta_vec que analoga á função anterior que receba um ficheiro com nomes de alunos e um vector de notas e produza uma pauta de forma “nome de aluno - nota (0 a 20 )” - nota de (0 a 5).

>> v

v =

1.0e+01 *

1.20000 1.24000 1.71000 1.10000 0.97000

>> pauta_vec("alunos.txt","pauta_vec.txt",v);

Page 48: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.48

pauta_vec.m

function pauta_vec(f1,f2,vec)fnome = fopen(f1,"r");fpauta = fopen(f2,"w");i=0;while !feof(fnome)

i++;nome=fgetl(fnome);nota=vec(i);fprintf(fpauta,"%s - %3.1f - %3.1f \n", nome,nota, nota*5/20);

endwhilefclose(fnome);fclose(fpauta);

endfunction

Page 49: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.49

Exercicios propostos (2)

Crie uma funcão que receba um ficheiro com notas e calcule a media dos valores encontrados no ficheiro.

>> media_ficheiro("notas.txt")

A média das notas apresentadas nos ficheiro é de 11.08 valores!

Page 50: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.50

media_ficheiro.m

function media_ficheiro(f1)fnotas = fopen(f1,"r");i=0;nota=0;

while !feof(fnotas)i++;nota_lida=fscanf(fnotas,"%f","C");nota=nota+nota_lida;

endwhilefclose(fnotas);printf("A média das notas apresentadas nos ficheiro é de %4.2f valores! \n",nota/i);

endfunction

Page 51: Miguel Maurício mlm@di.fct.unl.pt Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação

Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005

Programação 5.51

rem_sp.m

function x = rem_sp(f_in_name, f_out_name); [f_in, msg] = fopen(f_in_name , "r"); [f_aux,msg] = fopen(f_out_name, "w"); [ch, count] = fscanf(f_in,"%1c","C"); while !feof(f_in) if ch == " " ch = setstr(160); endif; fprintf(f_aux, "%1c", ch); [ch, count] = fscanf(f_in,"%1c","C"); endwhile; fclose(f_in); fclose(f_aux); endfunction;