Octave
Programação
Miguel Maurício
[email protected]
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.1
Instrução disp

disp(x) permite fazer o display do valor
de x.
Exemplo1
octave:1> y=0
y=0
octave:2> x=3;
octave:3> z=1:3
z=
1 2 3
Exemplo2
octave:4> disp(x)
3
octave:5>disp("O valor de y:"), disp(y)
O valor de y:
0
octave:6> disp(z)
1 2 3
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.2
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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.3
Instrução input (2)
octave:1> x=input("Qual o valor de x? ");
Qual o valor de x? 10
octave:2> y = x^2;
octave:3> disp("quadrado de x :"), disp(y)
quadrado de x :
100
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.4
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.

Condicional
Forma 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ção
Forma 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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.5
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 y
x != y
x ~= y
x <> y
verdade se x diferente de y
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.6
Comparação
octave:1> x=2
x=2
octave:2> x > 4
ans = 0
comparação de dois valores
numéricos
octave:3> [1, 2; 3,4] == [1, 2; 2, 4]
ans =
11
01
octave:10> [1, 2; 2,4] == 2
ans =
01
10
octave:7> sum(x,y)!=5
ans = 0
comparação de matrizes é
efectuada elemento a elemento
neste caso o valor escalar é
comparado com cada um dos
elementos da matriz
comparação em que um dos
valores é retornado por uma
função
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.7
Funções
Argumentos (1)
Exemplo
function area_circ(raio)
pi*raio^2
endfunction
Descrição
Esta função calcula a área de um
cí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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.8
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 polinomio
Aceitação dos valores de a,b e c inseridos pelo
utilizador
Calculo das raizes (xpos,xneg)
Mostrar os resultados
endfunction
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.9
Operadores booleanos
booleano1 || booleano2
operador ou (or) o resultado é
verdade se pelo menos uma das
expressões for verdade (true)
booleano1 && booleano2
operador 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)
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.10
Instrução if
Sintaxe
if (condição)
bloco1
else
bloco2
endif
Exemplo
if ( x > y)
maior =x
else
maior =y
endif
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Descrição
se a condição for
verdadeira o bloco1
é executado, senão
é o bloco2
Programação 5.11
Instrução while
Sintaxe
Exemplo
while (condição)
while ( x > y)
endwhile
endwhile
bloco1
y = y+1
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Descrição
enquanto a condição
for verdadeira o
bloco de instruções
vai ser executado,
até que a condição
se torne falsa.
Programação 5.12
Instrução for
Sintaxe
for var = expr
bloco
endfor
Exemplo
for i=1:10
y = y+1
endfor
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Descrição
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.
Programação 5.13
Instrução break
Exemplo
for i=1:10
y=y+I
if ( y == 6 )
break
endif
endfor
x=y
Descrição
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).
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.14
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_entrada
disp("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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.15
Funções
Argumentos (1)
Exemplo
Descrição
function ret_val = area_circ(raio)
ret_val = pi*raio^2;
endfunction
Esta função calcula a área de um
cí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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.16
Funções
Argumentos (2)
Errado
Correcto
function retval = avg(v)
function retval = avg(v)
if (is_vector(v))
retval = sum(v)/length(v);
endif
endfunction
retval = 0
if (is_vector(v))
retval = sum(v)/length(v);
else
printf("erro, o argumento
deve ser um vector\n")
endif
endfunction
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.17
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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.18
Ficheiros de funções (2)
ficheiro area_circ.m
# 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^2
endfunction
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.19
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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.20
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;
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.21
Função string_replace
Pretende-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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.22
“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
a = Vector de zeros e uns
>> troca_vector(a)
O argumento não é um vector!
A função pretendida aplicada a
um vector, troca o valor 0 por 1
e vice-versa!
Caso o argumento não seja um
vector…
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.23
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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.24
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)
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.25
Exemplo da função troca(x)
>> b
b=
>> troca(b)
A matriz inicial é :
0
0
1
1
0
1
0
0
1
1
0
0
1
0
0
1
0
0
1
1
0
1
0
0
1
1
0
0
1
0
0
1
A matriz transformada é :
1
1
0
0
1
0
1
1
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
0
0
1
1
0
1
1
0
Programação 5.26
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).
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.27
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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.28
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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.29
Instrução fclose

fclose(fid)

Fecha o ficheiro com o identificador fid.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.30
fopen / fclose
exemplos (1)
Descrição
Exemplo
octave:4> f1=fopen("dados.txt","r")
f1 = { id = 3
name = dados.txt
mode = r
arch = native
status = 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 = 4
name = tmp/dados2.txt
mode = r
arch = native
status = open }
Abertura de um ficheiro já existente
para leitura, com o nome
"dados2.txt", que se encontra na
subdirectoria tmp da directoria
corrente.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.31
fopen / fclose
exemplos (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 = 5
name = teste.txt
mode = w
arch = native
status = 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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.32
Leitura e escrita simples em
ficheiros (1)

Escrita



fputs(fid, string)
puts(string)
Leitura


fgets(fid,len)
fgetl(fid,len)
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.33
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 = 0
octave: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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.34
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> str1
str1 = Para teste a escrita em ficheiros
octave:20> str2
str2 = segunda linha
Exemplo de leitura de ficheiros
de texto utilizando as funções
fgetl e fgets.
octave:21> str3
str3 = outr
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.35
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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.36
read_write
Exemplo
octave:14> read_write("teste.txt","s1.txt")
Descrição
Foi criado um ficheiro de nome
“s1.txt” que contêm que é
uma copia exacta de
“teste.txt”.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.37
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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.38
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)
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.39
Leitura e escrita formatada em
ficheiros (2)

Templates




%d – inteiro com sinal.
%f – real com sinal.
%s – string.
%c – caracter.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.40
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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.41
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 =
123
456
789
octave:13> [x2,dim]=fscanf(fid2,"%d ",[3,3])
x2 =
2 4 6
8 10 12
14 16 18
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.
dim = 9
octave:14> fclose(fid2);
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.42
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.
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.43
Leitura e escrita formatada em
ficheiros (6)
octave:21> m2=log(m)
m2 =
0.00000 0.69315 1.09861
1.38629 1.60944 1.79176
1.94591 2.07944 2.19722
octave:22> printf("%.5f %.4f %.6f \n",m2);
0.00000 1.3863 1.945910
0.69315 1.6094 2.079442
1.09861 1.7918 2.197225
octave:23>printf("%f %d %.2f \n",[1,2;3,4]);
1.000000 2 3.00
4.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).
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.44
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")
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.45
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
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.46
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);
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.47
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);
endwhile
fclose(fnome);
fclose(fpauta);
endfunction
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.48
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!
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.49
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;
endwhile
fclose(fnotas);
printf("A média das notas apresentadas nos ficheiro é de %4.2f valores!
\n",nota/i);
endfunction
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.50
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;
Introdução aos Computadores e Programação
DI-FCT-UNL-2004/2005
Programação 5.51
Download

Octave