Sie sind auf Seite 1von 69

Programação para as

Ciências Experimentais
2009/10

Teórica 7
Resumo
 Octave

• Comandos básicos
• Scripts, Funções e Variáveis.
• Strings: texto e caracteres
• Controlo de execução

Ludwig Krippahl, 2010 2


Operação elemento a elemento
O ponto antes do operador indica que a
operação é elemento a elemento.
• M1.*M2: multiplicar cada elemento de M1
pelo correspondente em M2
• M1.^M2: elevar cada elemento de M1 pelo
correspondente em M2
• Os dois operadores têm de ter as mesmas
dimensões

Ludwig Krippahl, 2010 3


Operação elemento a elemento
 Exemplos

l=[1,2,3,4,5]
c=[1;2;3;4;5]
l*c
c*l
l.*c
l.*c’

Ludwig Krippahl, 2010 4


Séries
 No Octave podemos criar um vector
linha com uma série indicando:
 Inicio: [passo:] fim

 O passo é opcional.

• E.g. 1:2:5
[1,3,5]

Ludwig Krippahl, 2010 5


Séries
octave:29> 1:0.5:3
ans =
1.0000 1.5000 2.0000 2.5000 3.0000
octave:30> 3:-1:0
ans =
3 2 1 0
octave:31> 1:10
ans =
1 2 3 4 5 6 7 8 9 10
octave:32> 1:9.5
ans =
1 2 3 4 5 6 7 8 9
(termina no último que não ultrapassa)

Ludwig Krippahl, 2010 6


Aceder parte da matriz
 M(linhas, colunas)
 Linhas e colunas pode ser vector, e
pode ser definido por uma série.

Ludwig Krippahl, 2010 7


Aceder parte da matriz
octave:35> m=[1,2;3,4]
m=
1 2
3 4
octave:36> m(2,2)
ans = 4
octave:37> m([1,2],2)
ans =
2
4

Ludwig Krippahl, 2010 8


Funções para matrizes (ou não)
 Sem argumentos: um escalar:
octave:51> eye
ans = 1
octave:52> rand
ans = 0.22768
octave:53> zeros
ans = 0

Ludwig Krippahl, 2010 9


Funções para matrizes (ou não)
 Um argumento: matriz quadrada.
octave:54> eye(2)
ans =
1 0
0 1
octave:55> rand(3)
ans =
0.854082 0.101465 0.290800
0.510179 0.018994 0.088951
0.716649 0.855890 0.813545

Ludwig Krippahl, 2010 10


Funções para matrizes (ou não)
 Dois argumentos: linhas, colunas
octave:56> zeros(2,3)
ans =
0 0 0
0 0 0
octave:57> ones(1,10)
ans =
1 1 1 1 1 1 1 1 1 1
octave:58>

Ludwig Krippahl, 2010 11


Funções para matrizes (ou não)
 Regra geral: funções que o Octave fornece
servem para escalares e matrizes.
octave:58> sin(2)
ans = 0.90930
octave:59> sin([1,2;3,4])
ans =
0.84147 0.90930
0.14112 -0.75680

Ludwig Krippahl, 2010 12


Funções para matrizes (ou não)
octave:60> sin(0:pi/10:pi)
ans =
Columns 1 through 8:
0.00000 0.30902 0.58779 0.80902 0.95106
1.00000 0.95106 0.80902
Columns 9 through 11:
0.58779 0.30902 0.00000
octave:61>

Ludwig Krippahl, 2010 13


Sequências reutilizáveis
 Script

• Conjunto de instruções guardado num


ficheiro
• Ficheiro tem nome.m
• Quando Octave recebe um nome, se não é
variável procura o ficheiro

Ludwig Krippahl, 2010 14


Como criar
 Mudar para a pasta de trabalho:
(exemplo, confirmar no laboratório)
cd 'C:\Documents and Settings\alunopce\My Documents'

 Correro editor: edit


 Gravar o ficheiro: teste.m

 Gravar antes de correr no Octave

Ludwig Krippahl, 2010 15


Variáveis num script
 Script

(no teste.m) (no Octave)

a=2 octave:13> a=4


a=4
octave:14> teste
a=2
octave:15> a
a=2

Ludwig Krippahl, 2010 16


Sequências reutilizáveis
 Script

• Útil para guardar um pequeno programa


reutilizável, mas não é um módulo
independente.
• As variáveis no script são as mesmas que
fora do script.

Ludwig Krippahl, 2010 17


Implementação Modular
 Procedimentos e funções:
• Procedimento não devolve valores
• Função devolve valores.
• Mas no Octave é tudo function, vamos
chamar função a ambos.

Ludwig Krippahl, 2010 18


Implementação Modular
 Function

• As variáveis são locais e independentes.


• Evita “colisões”
(no Octave)
definir uma função
octave:13> a=4
function igualdois a=4
a=2 octave:14> igualdois
endfunction a=2
octave:15> a
a=4

Ludwig Krippahl, 2010 19


Implementação Modular
 Function

• As variáveis são locais e independentes.


(num ficheiro igualdois.m) (no Octave)

function igualdois octave:13> a=4


a=2 a=4
endfunction octave:14> iguadois
a=2
octave:15> a
a=4

Mesmo nome que o ficheiro

Ludwig Krippahl, 2010 20


Implementação Modular
 Function

• As variáveis são locais e independentes.

function igualdois
a=2
endfunction

A variável a da função só
existe dentro da função
Ludwig Krippahl, 2010 21
Implementação Modular
 Mas normalmente queremos um valor.

(no soma.m) (no Octave)

function res=soma(a,b) octave:16> soma(2,5)


res=a+b res = 7
endfunction ans = 7
octave:17>

Ludwig Krippahl, 2010 22


Implementação Modular
function res=soma(a,b)
res=a+b Argumentos da função
endfunction

Ludwig Krippahl, 2010 23


Implementação Modular
function res=soma(a,b)
res=a+b Nome da variável (na
endfunction função) com o valor a
devolver

Ludwig Krippahl, 2010 24


Implementação Modular
function res=soma(a,b)
res=a+b a e b são cópias dos valores
endfunction

Ludwig Krippahl, 2010 25


Implementação Modular
function x=incrementa(x)
x=x+1 x é cópia do valor
endfunction
octave:17> x=3
x=3
octave:18> incrementa(x)
x=4
ans = 4
octave:19> x
x=3

Ludwig Krippahl, 2010 26


Implementação Modular
function res=soma(a,b)
res=a+b
endfunction
(no Octave)
 Último detalhe: octave:16> soma(2,5)

• Não queremos o res res = 7


ans = 7
octave:17>

Ludwig Krippahl, 2010 27


Implementação Modular
function res=soma(a,b)
res=a+b;
endfunction
(no Octave)
 Último detalhe: octave:20> soma(2,5)

• Não queremos o res ans = 7


octave:21>
• ; resolve o problema.

Ludwig Krippahl, 2010 28


Implementação Modular
 Importante:

• Os argumentos da função são cópias locais


dos valores.
• As variáveis na função são independentes
mesmo que haja outras com o mesmo nome.
• Só “sai” da função o que vier antes do nome
da função:
function res=soma(x,y)

Ludwig Krippahl, 2010 29


Implementação Modular
 Importante:

• O Octave primeiro verifica se há uma variável


com esse nome:
octave:21> soma=0
soma = 0
octave:22> soma(2,5)
error: invalid row index = 2
error: invalid column index = 5
Ludwig Krippahl, 2010 30
Implementação Modular
 Importante:

• O Octave primeiro verifica se há uma variável


com esse nome.
• Se fosse ao contrário, um novo ficheiro .m
podia estragar um programa já existente...

Ludwig Krippahl, 2010 31


Implementação Modular
 Importante:

• A variável (ou variáveis) designada para


guardar o valor devolvido tem de ter um valor
atribuído no final da função.
function res=soma(a,b)
c=a+b;
endfunction

octave:24> a=soma(2,5)
error: value on right hand side of assignment is undefined
error: evaluating assignment expression near line 24, column 2

Ludwig Krippahl, 2010 32


Strings (texto)
 Uma string é uma sequência de caracteres,
delimitada por aspas ou plicas.
octave:67> a="string"
a = string
octave:68> b="outra string"
b = outra string
octave:69> c=string
error: `string" undefined near line 69 column 3
error: evaluating assignment expression near line
69, column 2

Ludwig Krippahl, 2010 33


Strings (texto)
 Excepção para a regra de tamanho
quando combinamos vectores:
octave:69> [a;b]
ans =
string
outra string
(linhas ajustadas acrescentando espaços)

Ludwig Krippahl, 2010 34


Funções para strings
(experimentem)
 findstr(s,t) : Encontra todas as posições de da menor na
maior.
 split(s,t) : Divide uma string num vector (coluna) de
strings separadas por t
 strrep(s, x, y) : substitui todas as ocorrências de x por y
na string s
 str2num(s) : converte um número representado numa
string para um número
 tolower(s) / toupper(s) : converte uma string para
minúsculas/maiúsculas
 strcmp(s1,s2) : compara as strings s1 com s2, se forem
iguais retorna 1, se diferentes retorna 0

Ludwig Krippahl, 2010 35


Funções para strings (exemplos)
octave:74> findstr("a","abcababba")
ans =
1 4 6 9
octave:75> findstr("abcababba","a")
ans =
1 4 6 9

Ludwig Krippahl, 2010 36


Funções para strings (exemplos)
octave:76> split("um;dois;três;quatro",";")
ans =
um
dois
três
quatro
octave:77>

Ludwig Krippahl, 2010 37


Caracteres especiais
A barra \ serve para indicar caracteres
especiais.
 E.g.

• \b -> backspace, apaga um caracter


• \t -> tab
• \n -> nova linha
• \\ -> para escrever a barra. Importante no cd.
 Só quando string com "..."

Ludwig Krippahl, 2010 38


Algoritmo
 Conjunto finito de instruções.
 No sentido estrito, operações sobre
símbolos (matemática, lógica,
programas)
 No sentido lato: receitas, procedimentos
de emergência, etc...

http://en.wikipedia.org/wiki/Algorithm

Ludwig Krippahl, 2010 39


Programação
 Resolver problemas complexos um
problema simples de cada vez
 Hierarquizar os problemas

Ludwig Krippahl, 2010 40


Exemplo: separar nomes
 Script + função

function res = palavran (texto, n)


m=split(texto, " ");
res=m(n,:);
endfunction

Ludwig Krippahl, 2010 41


Exemplo: separar nomes
 Script + função
input(mensagem) avalia expressão
input(mensagen, "s") lê uma string

disp("Separador de nomes");
n=input("Introduza o nome completo:\n", "s");
p=input("Introduza o índice da palavra que quer:\n");
palavran(n,p)

Ludwig Krippahl, 2010 42


Controlo de execução
 Comparações (Booleanos)
 Condições (if...then...else

 Ciclo condicional (while)

 Ciclo for e break.

Ludwig Krippahl, 2010 43


Comparações
 Igual

• == (ATT: um igual, =, é atribuição)


 Maior, menor, ou igual
• >, <, >=, <=
 Negação !
 Diferente

• !=

Ludwig Krippahl, 2010 44


Comparar strings
para comparar strings usar função

strcmp(s1,s2)

strcmp(“ab”,”abc”)
ans = 0

Ludwig Krippahl, 2010 45


Operadores Booleanos (e, ou)
& e
| ou

“Curto-circuito”: (só avalia o necessário)

&& A && B, se A falso não faz B


|| A II B, se A verdadeiro, não faz B

Ludwig Krippahl, 2010 46


Controlo condicional: if
 Executa o bloco de instruções se a
expressão for diferente de 0 (0 é falso)

if expressão
...
else
...
endif
Ludwig Krippahl, 2010 47
Controlo condicional: if
function r=resolvente(a,b,c)
s=b^2-4*a*c;
if s<0
r=[];
elseif s==0
r=-b/(2*a);
else
r=[(-b+sqrt(s))/(2*a),(-b-sqrt(s))/(2*a)];
endif
endfunction
Ludwig Krippahl, 2010 48
Ciclo condicional: while
 Executa o bloco de instruções enquanto
a expressão for diferente de 0

while expressão
...
...
endwhile

Ludwig Krippahl, 2010 49


Ciclo condicional: while
 Raíz quadrada, método babilónico

http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

Ludwig Krippahl, 2010 50


Ciclo condicional: while
function x1=raiz(x,prec);
x1=x/2;
x2=0.5*(x1+x/x1);
while abs(x1-x2)>prec
x1=x2;
x2=0.5*(x1+x/x1);
endwhile
endfunction

Ludwig Krippahl, 2010 51


Ciclo for
 Executa o bloco de instruções uma vez
para cada valor da variável.

for var = vector


...
...
endfor

Ludwig Krippahl, 2010 52


Ciclo for
 Exemplo: Substituir todos os caracteres
de s por *

for f = 1:length(s)
s(f) = "*";
endfor
Nota: não é preciso usar o contador
dentro do ciclo.
Ludwig Krippahl, 2010 53
Ficheiros
 Para aceder a um ficheiro temos
sempre que o identificar com um
número correspondente ao ficheiro
aberto.
 Usamos a função fopen para abrir o
ficheiro e obter o identificador, fclose
para fechar e deixar livre o ficheiro para
outras aplicações.

Ludwig Krippahl, 2010 54


Ficheiros
 fopen(nome,modo [, arquitectura])
• normalmente usamos só os primeiros dois
argumentos:
octave:7>
teste=fopen("teste.txt","w")
teste = 3

Ludwig Krippahl, 2010 55


Ficheiros
 fopen(nome,modo [, arquitectura])
• normalmente usamos só os primeiros dois
argumentos:
octave:7>
teste=fopen("teste.txt","w")
teste = 3
nome do ficheiro

Ludwig Krippahl, 2010 56


Ficheiros
 fopen(nome,modo [, arquitectura])
• normalmente usamos só os primeiros dois
argumentos:
octave:7>
teste=fopen("teste.txt","w")
teste = 3
w: write, para escrita
r: read, para leitura
Ludwig Krippahl, 2010
a: append, acrescentar
57
Ficheiros
 fopen(nome,modo [, arquitectura])
• normalmente usamos só os primeiros dois
argumentos:
octave:7>
teste=fopen("teste.txt","w")
teste = 3
Identificador

Ludwig Krippahl, 2010 58


Ficheiros
 Escrever no ficheiro
• fprintf(id,var)
• escreve o valor de var no ficheiro
• exemplo:
id=fopen(“teste.txt”,”r”)
fprintf(id,”qualquer coisa”)
fclose(id);

Ludwig Krippahl, 2010 59


Ficheiros
 Escrever no ficheiro
• exemplo:

id=fopen("teste.txt","w")
fprintf(id,"uma coisa")
fprintf(id,"outra coisa")
fclose(id);

Ludwig Krippahl, 2010 60


Ficheiros
 Escrever no ficheiro
• para não ficar tudo na mesma linha:
• \n (Linux)
• \r\n (Windows, notepad)
id=fopen(“teste.txt”,”w")
fprintf(id,"uma coisa\r\n")
fprintf(id,"outra coisa\r\n")
fclose(id);

Ludwig Krippahl, 2010 61


Ficheiros
 Ler do ficheiro
• exemplo:
id=fopen("teste.txt","r")
s=fgets(id)
s2=fgets(id)
s3=fgets(id)
fclose(id);
Nota: s3 fica -1
Ludwig Krippahl, 2010 62
Ficheiros
 Ler dados de um ficheiro:
• fgets( identificador, comprimento)
• Lê uma linha do ficheiro identificado, ou o
número de caracteres no comprimento.
• Se o comprimento é omitido, lê todos os
caracteres até ao final da linha.
• Se não há mais linhas devolve -1.
• Atenção: podem usar isstr para verificar

Ludwig Krippahl, 2010 63


Ficheiros
 Ler dados de um ficheiro:
• fgets( identificador, comprimento)
• fgetl é semelhante mas elimina \n do fim.
• Não convém usar em Windows porque sobra o \r e
pode dar problemas.
• fscanf serve para leitura formatada,
semelhante ao printf.

Ludwig Krippahl, 2010 64


Ficheiros
 Sabemos que o ficheiro chegou ao fim
com a função feof:
• feof( identificador )
• Devolve true se o ficheiro estiver no fim.

Ludwig Krippahl, 2010 65


Escrita formatada
 printf(string, v1, v2, v3...
 fprintf( fid, string, v1, v2, v3...
• Exemplo:
n=10
a="texto"
printf("numero %i e string %s!\n",n,a)

Ludwig Krippahl, 2010 66


Escrita formatada
 printf(string, v1, v2, v3...
 fprintf( fid, string, v1, v2, v3...
• %i inteiro
• %f fraccionário
• %s string
• %% %
•… (ver manual, 14.2)

Ludwig Krippahl, 2010 67


Algoritmos e técnicas
 Monte Carlo
 Bissecção
 Recursividade

Ludwig Krippahl, 2010 68


Duvidas

Ludwig Krippahl, 2010 69

Das könnte Ihnen auch gefallen