Professional Documents
Culture Documents
---+++
Departamento de Engenharia
Software SciLab
5.4.0
Londrina
2013
Algoritmo-Pseudocdigo com Scilab
2
FACULDADE PITGORAS DE LONDRINA - PR
PROGRAMA DE GRADUAO EM ENGENHARIA
DEPARTAMENTO DE ENGENHARIA
LONDRINA-PR
2013
Sumrio
1
Introduo ............................................................................................................................. 7
Objetivos ....................................................................................................................... 8
Console ........................................................................................................................ 10
3.1.1
3.1.2
3.1.3
Ajuda ................................................................................................................... 12
3.1.4
3.1.5
3.1.6
3.1.7
3.1.8
3.1.9
3.1.10
3.1.11
3.2
Editor - SciNote............................................................................................................ 18
3.2.1
3.3
4
4.1.1
4.1.2
4.1.3
4.1.4
4.1.5
4.1.6
4.1.7
4.1.8
4.1.9
Nmeros complexos............................................................................................ 29
4.1.10
STRINGS ............................................................................................................... 30
5
4.1.11
4.1.12
4.1.13
4.1.14
4.2
Exerccios ..................................................................................................................... 34
4.2.1
5
5.2
5.2.1
5.2.2
5.3
5.3.1
5.3.2
5.3.3
5.3.4
6.2
6.3
6.4
6.5
6.6
6.6.1
O comando IF ...................................................................................................... 52
6.6.2
6.6.3
Aninhamento ....................................................................................................... 54
6.7
6.7.1
LAOS .................................................................................................................. 61
6.7.2
6.7.3
6.7.4
Matrizes............................................................................................................................... 71
7.1
VETORES ...................................................................................................................... 71
7.2
6
7.3
7.4
7.5
7.6
7.7
7.8
7.9
7.10
Operador $ .................................................................................................................. 82
7.11
7.12
7.13
7.14
7.15
7.15.1
7.15.2
7.15.3
7.16
8
1 Introduo
Scilab um ambiente voltado para o desenvolvimento de software para resoluo de
problemas numricos.
O tutorial materializa a ensinar usurios iniciantes a desfrutar dos principais recursos do
pacote de software SciLab, que possui poderosas ferramentas matemticas para diversos
nveis, de alunos a profissionais.
Scilab uma linguagem de programao associada a uma rica coleo numrica de algoritmos
que cobrem muitos aspectos de problemas de computao.
Do ponto de vista do software, Scilab uma linguagem interpretada. Isto geralmente acelera o
processo de desenvolvimento, pois o usurio, atingi um alto nvel na utilizao da linguagem,
com um rico conjunto de recursos fornecidos pela biblioteca.
A linguagem Scilab pode compilar dinamicamente e vincular outras linguagens como Fortran e
C: desta forma, bibliotecas externas podem ser utilizados como se fosse uma parte do Scilab
construdo com recursos. Scilab tambm utiliza uma interfaces LabVIEW, uma plataforma e
ambiente de desenvolvimento para uma linguagem de programao visual.
Do ponto de vista de licena, o Scilab um software livre no sentido de que o usurio no
pagar por isso e Scilab um software de cdigo aberto.
Do ponto de vista cientfico, Scilab vem com muitos recursos. No prprio incio do Scilab, os
recursos foram concentrados na lgebra linear. Mas, rapidamente, o nmero de
funcionalidades foi expandido para cobrir muitas reas de computao cientifica. A seguir uma
pequena lista de suas capacidades:
1.
2.
3.
4.
5.
Nesta seo, fazemos os nossos primeiros passos com Scilab e apresentar algumas tarefas
simples que podemos realizar com o intrprete.
Existem vrias maneiras de utilizar Scilab e os pargrafos seguintes apresentam trs mtodos:
1. usando o console no modo interativo,
2. usando a funo exec em um arquivo texto,
3. usando processamento em lote.
Apresentamos tambm a gesto das janelas grficas com o sistema de ancoragem.
Por fim, apresentamos duas principais caractersticas do Scilab: localizao do Scilab, que
fornece mensagens e pginas de ajuda no idioma do usurio.
10
3.1 Console
figura 02 - Console
O primeiro caminho usar o Scilab de forma interativa, digitando comandos no console, fazer
anlise dos resultados e continuar o processo at que o resultado seja calculado.
Este documento feito de modo que os exemplos Scilab que so impressos aqui podem ser
copiados para o console. O objetivo que o aluno aprenda a usar Scilab.
Podemos observar o prompt inicial, representado pelo smbolo -->, que faz a marcao da
linha de comando e o cursor, ao lado do prompt. Nesse espao, podem ser realizados clculos
e compilados programas sem serem salvas alteraes. atravs dele tambm que pode ser
acessado o help do programa, atravs do comando help digitado no prompt, ser aberto uma
janela depois de o comando ser executado (apertando - se a tecla ENTER), contento uma lista
de todas as funes presentes.
Portanto, as operaes aritmticas so digitadas aps o smbolo e em seguida tecla-se
[ENTER].
Exemplo:
-->2+3 [ENTER]
ans =
5.
Outros exemplos:
-->5+6/2
ans =
8.
-->4^2 // 4 elevado a potncia de 2
ans =
16.
11
12
0.5306283 0.5877867 0.6418539 0.6931472
Se terminarmos uma linha com ponto e vrgula, o Scilab no escreve a sada do comando no
monitor.
O Scilab trata todas as variveis como uma matriz. Um escalar, real ou complexo, visto como
uma matriz 1x1. Um vetor linha com n elementos visto como uma matriz 1xn. Um vetor
coluna como uma matriz nx1. O Scilab lida com matrizes de nmeros, polinmios, booleanas e
cadeias de caracteres (Springs).
13
Estas variveis no podem ser apagadas, nem alteradas.
Um exemplo:
-->%eps
%eps =
2.220D-16
Temos mais duas importantes variveis: as variveis de localizao de diretrios SCI e PWD.
Para entend-las, digite-as no prompt de comandos.
SCI: diretrio onde o Scilab foi instalado.
PWD: diretrio onde o Scilab foi chamado, isto , de onde seu script est rodando.
Existem ainda funes para manipular arquivos e diretrios. A funo pwd mostra qual o
diretrio est sendo usado e chdir muda o diretrio de trabalho. importante lembrar que,
depois de usada chdir, o valor de pwd muda, mas PWD permanece inalterado.
Todas as variveis criadas durante os trabalhos no ambiente podem ser armazenadas em um
arquivo. O comando save usado para tal, com a seguinte sintaxe:
save (nome_do_arquivo.dat,variveis)
Para recuperar os valores das variveis, usa se o comando load e o comando clear usado
para limpar variveis no protegidas:
load (nome_do_arquivo,variveis)
O comando help, quando digitado sem caracterizao, abre uma listagem com todas as
funes presentes no programa. Se caracterizado, abre a mesma janela, porm com a funo
j aparecendo diretamente.
Alm de armazenar variveis, possvel criar uma memria de clculo,
salvando os comandos digitados em um arquivo, atravs do comando diary:
diary (nome_do_arquivo);
diary (0) // Fecha o comando
3.1.5 Formato dos nmeros
O Scilab no requer o prvio dimensionamento das variveis e separa a parte inteira da
decimal com um ponto. Por efeito os nmeros tm dez posies (incluindo o ponto).
Para aumentar este valor e passar a ter uma varivel longa usa-se format(n); varivel.
Por exemplo:
-->format (15);%pi
14
%pi =
3.14159265359
3.1.6 Operadores aritmticos e relacionais
+ soma
- subtrao
* multiplicao
/ diviso
^ potncia. 3^2=9
< menor que
<= menor ou igual que
> maior que
>= maior ou igual que
<> ou ~= diferente de
Alm dos operadores atrs introduzidos, o Scilab tem outros que sero apresentados adiante.
Os operadores agrupam-se em sete grupos de igual prioridade. Se um operador tem maior
prioridade que outro executado primeiro. Os sete grupos de prioridade dos operadores do
Scilab ordenados por ordem decrescente so:
( , .)
(^)
(* , / , \ , .* , ./ , .\ , .*. , ./. , .\. )
(+,-)
( == , > , < , <= , >= ,~= )
(&)
(|)
A prioridade inata aos operadores pode ser alterada com recurso a parnteses.
Por exemplo, 1+2^2=5 e
15
(1+2)^2 =9.
Do mesmo modo, 18/2+4=13 e
18/(2+4)=3.
3.1.8 Funes bsicas
16
17
0.7263507 0.5442573 0.2164633
0.6623569 0.2320748 0.1985144
3.1.9 Na linha de comandos
Para se mover o cursor na linha de comandos usar as teclas com setas como num processador
de texto. As teclas home (ou a combinao Ctrl-a) e end (ou a combinao Ctrl-e) levam ao
princpio e fim da linha respetivamente. As teclas de apagar texto usa se como no processador
de texto.
Ctrl+p chama a ltima linha de comando introduzida.
Se colocarmos o cursor no prompt e pressionarmos a tecla U a linha ou qualquer regio da
janela de comandos pode ser selecionada usando o mouse, copiada e colada no prompt ativo
ou noutro documento.
Uma linha de comandos que termine com um ponto e vrgula (;) no mostra ou no ecoa o
resultado na janela de comandos. Sem ponto e vrgula ecoa a operao, como se ilustrou atrs.
Uma alternativa a estas instrues usar o menu Edit e clicar em History.
Podem-se inserir comentrios precedidos de //.
Exemplo de insero de um comentrio, sem sada do resultado (; no fim do comando):
-->exp (1); //exponencial de 1
Num comando com vrias linhas, estas terminam com trs pontos, at ao Enter final. Numa
linha, pode-se introduzir mais de um comando, separados por ponto e vrgula.
-->a=2; b=5; z=a +b
z=
7.
Nos comandos anteriores crimos trs variveis, a, b, z. Os nomes de variveis podem comear
por uma letra ou %, seguido de outras letras, algarismos, ou caracteres especiais, como #. No
devem ter mais de 24 caracteres.
3.1.10 Manipulao e informao sobre o espao de trabalho
Quando trabalhamos no Scilab, alm das janelas visveis, o software guarda numa rea da
memria, chamada workspace (espao de trabalho) informao sobre as variveis e funes
existentes. Muitas vezes, em programas muito extensos, necessrio verificar que informao
existe no espao de trabalho para evitar repeties. Para esta finalidade, o Scilab disponibiliza
os seguintes comandos:
clc() limpa a janela dos comandos.
clc(n) limpa n linhas acima da atual linha de comandos e move o cursor para l.
clear() remove todas as variveis da memria.
Algoritmo-Pseudocdigo com Scilab
18
clear x y remove as variveis x e y da memria.
whos lista as variveis longas.
who lista as variveis.
3.1.11 Lidar com pastas
Para lidar com ficheiros (abrir, guardar), mudar de diretrio e imprimir, a forma mais comum
de faz-lo usar o menu file, como num processador de texto, e selecionar o comando
desejado.
3.2
3.3 Editor - SciNote
19
Existe muitas caractersticas que vale a pena mencionar neste editor. A maioria dos recursos
mais usados esto sob o menu Executar.
1. Carrega para o Scilab, executa os comandos do arquivo atual, como se fizssemos uma
copiar e colar. "Isto implica que as declaraes que no terminam com o ponto e
vrgula";" , o processo ir produzir uma sada no console.
2. Avalia o arquivo, executa as instrues que esto atualmente selecionadas.
3. Executa o Arquivo no Scilab, executa arquivo, como se ns usamos a funo exec. Os
resultados que so produzidos na console so apenas aqueles que esto associados
com as funes de impresso, tais como, por exemplo, disp.
particularmente adequado para uma sequncia de comandos interligados num algoritmo
com um determinado propsito, programas e funes definidas pelo desenvolvedor. Aqui as
instrues so previamente escritas no SciNotes o processador de texto do SciLab.
Trabalhar com o SciNotes no oferece nenhuma dificuldade a quem esteja familiarizado com
um processador de texto. Se passar o mouse sobre os seus cones surge a informao da
funo de cada um (abrir uma nova entrada de texto, abrir, abrir um arquivo C, salvar, etc.).
Podem ter-se vrios arquivos abertos e passar de um para outro, clicando o separador
respectivo.
3.3.1 Docking - Ancorar
Vamos abordar um procedimento de arranjo da interface grfica, denominado ancoragem
(docking). Como se pode verificar na figura 4, a janela do SciNotes uma barra azul. Se clicar
nela e arrastar, o SciNotes pode ser alojado no espao da console. Ali alojado, a mesma barra,
direita, passa a ter uma seta, que permite tirar o SciNotes para fora, e torn-lo novamente
uma janela independente, e o usual boto (X) de fechar, que permite encerrar o SciNotes.
Ver as figuras 3 e 4.
20
21
22
23
24
-> A = 2
A=
2.
-> a = 1
a=
1.
-> A
A=
2.
-> a
a=
1.
-> c=A+a
c=
3
4.1.3 Comentrio e linha de continuao
Qualquer linha que comea com duas barras "/ /" considerado por Scilab como um
comentrio e ignorada. No h possibilidade de comentar um bloco de linhas, como por
exemplo com o "/ * ... * /" comentrios na linguagem C.
Quando uma instruo executvel longa demais para ser escrito em uma nica linha, as
linhas subseqentes so chamados de linhas de continuao. No Scilab, qualquer linha que
termina com dois pontos considerada ser o incio da prxima linha de comando.
Exemplos:
-> / / Este o meu comentrio.
-> x = 1 ..
->+ 2 ..
-> +3 ..
-> +4
x=
10.
25
4.1.4 Variveis matemticas pr-definidas
No Scilab, diversas variveis matemticas so variveis pr-definidas, cujos nomes comeam
com um carter "%" por cento. As variveis que tm um significado matemtico esto
resumidos na figura 7.
26
X^(2*sin(y))
2+3*tan(x)+K^2
figura 8 - Matemtica
Exemplos:
-->cos(2*%pi) // coseno de 2 vezes PI
ans =
1.
-->%e^2 // 2,718281828 ao quadrado
ans =
7.389056098931
-->abs(-5) // valor absoluto
ans =
5.
27
-->modulo(8,3) // Resto da diviso entre 8 e 3
ans =
2.
-->modulo(6,3)
ans =
0.
-->sign(-4)
ans =
- 1.
-->sign(5)
ans =
1.
4.1.7 Funes de Arredondamento
As principais funes de arredondamento do Scilab so mostradas na figura 9.
28
Outros exemplos so mostrados no quadro a seguir:
29
4.1.9 Nmeros complexos
Scilab fornece nmeros complexos, que so armazenados como pares de nmeros de ponto
flutuante.
A varivel pr-definida % i representa o nmero matemtico imaginrio i que satisfaz a
equao = -1. Todas as funes elementares previamente apresentadas antes, como sin, por
exemplo, so sobrecarregados para nmeros complexos. Isto significa que, se for feito calculo
com nro. complexo a sada ser nro. complexo. A Figura 11 apresenta funes que trata
nmeros complexos.
(1 + i) (1 - i) = 1 -
=2
-->x*y
ans =2.
30
Mais exemplos:
4.1.10 STRINGS
Strings so usados para toda e qualquer informao composta de caracteres alfanumricos
e/ou caracteres especiais (exemplo, #, $, &, %, ?, !, @, <, ~, etc). Os strings so envolvidos
por aspas duplas ou simples.
Exemplos:
-->a = "abcd"
a=
abcd
-->b = 'efgh'
b=
efgh
-->c = "Maria e Jose"
c=
Maria e Jose
Um das atividades mais comuns em programao a concatenao de strings. Concatenao
a juno de dois ou mais strings. Isto pode ser feito com o operador +.
-->a + b // Concatena abcd com efgh
ans =
abcdefgh
-->n = "Pedro"
n=
Pedro
-->m = "Paulo"
m=
Paulo
Algoritmo-Pseudocdigo com Scilab
31
-->m + n // Concatena Paulo com Pedro sem ans = // espao entre eles.
PauloPedro
-->m + " e " + n // Concatena Paulo com Pedro
ans = // inserindo espaos entre eles.
Paulo e Pedro
Muitas vezes precisamos armazenar informaes que contm as aspas. Isto pode ser feito
repetindo as aspas.
Exemplos:
-->n = "O orculo disse ""conhea-te a ti mesmo"" para Socrtes."
n=
O orculo disse "conhea-te a ti mesmo" para Socrtes.
Algumas funes para manipulao de strings so mostradas da figura 12.
32
1244.
33
-->sqrt(3)
ans =
1.73
Para aumentar os nmeros de posies para 16, usa-se
-->format(16)
-->sqrt(3)
ans =
1.7320508075689
A raiz de 3 foi mostrada ocupando 16 posies (sendo uma posio para o ponto, um espao
reservado para o sinal, uma posio para a parte inteira e 13 posies para a parte fracionria).
O comando format ('e') mostra os nmeros em notao cientfica.
Por exemplo,
-->format('e')
-->2*%pi/10
ans =
6.283185307E-01
6.283185307E-01 significa :
Para retornar ao formato inicial usa-se,
-->format('v')
que chamado de formato de varivel. Vejamos outras formas de usar o comando
format:
-->format('v',10)
mostra os nmeros em formato de varivel com 10 posies.
-->format('e',8)
mostra os nmeros em notao cientfica com 8 posies.
4.1.14 Varivel ANS
Sempre que fazemos um clculo e no armazenar o resultado em uma varivel de sada, o
resultado armazenado na varivel padro ANS. Uma vez que definido, podemos usar esta
varivel como qualquer outra varivel Scilab.
Na sesso seguinte, calculamos exp (3) de modo a que o resultado armazenado na varivel
ans. Ento ns usamos o seu contedo como uma varivel regular.
-->exp (3)
ans =
20.08553692318766792368
-->t = log(ans)
t=
3.
34
Em geral, a varivel ans deve ser utilizada apenas em um processo interativo, para progredir
no clculo sem uma nova varivel.
Na seo a seguir alguns exemplos, para serem feitos e treinados.
4.2 Exerccios
4.2.1 Fazendo operaes com nmeros reais.
1. Criar 3 varveis (a,b,c) e depois, calculamos uma expresso numrica com elas.
A expresso numrica ser:
35
3. A soma dos quadrados dos nmeros 3.5, 2/3, 0.5 obtm-se facilmente:
7. Por sua vez, o comando modulo proporciona o resto da diviso de um nmero por
outro:
modulo (dividendo, divisor)
36
-->a=-5+3*%i; b=-2+3*5*%i;c=6-2*%i;
-->A=(a+2*b)^3/(c*b-a)
A=
- 213.51146 - 369.06334i
13. Alternativamente podemos usar o comando imult:
-->2+imult(5)
37
ans =
2. + 5.i
14. Separemos a parte real da imaginria, de A, com os comandos real e imag:
-->real(A)
ans =
- 213.51146
-->imag(A)
ans =
- 369.06334
38
19. Considere as variveis A=11, B=5, C=-4 e D=2. Calcule as expresses abaixo.
a) 3*modulo(A,3)-C
b) 2^(2*abs(C))/8
c) (A/B-fix(A/B)+sign(C)+2.8)^(15/B)
d) sqrt(cos(A)^2+sin(A)^2) + sin(D*%pi/4)
e) (A+C)/A * round(sign(C)+D/4)-fix(D/1.5)
20. Qual a primeira operao a ser executada em cada um dos comandos abaixo.
a) R + S - W d) X + Y + C * D
b) W1 + W2 / C ^ 2 e) A + D + B ^ 2 + E * 3
c) NOTA + MEDIA/N f) A * B / C * D
21. (Precedncia de operadores) Quais os resultados dos calculos a seguir (pense sobre isto
antes de fazer o SciLab) ?
2*3+4
2+3*4
2/3+4
2+3/4
22 (Pareteses) Quais os resultados dos calculos a seguir (pense sobre isto antes de fazer o
SciLab) ?
2 * (3 + 4)
(2 + 3) * 4
(2 + 3) / 4
3 / (2 + 4)
39
2.3 (Exponenciao) Quais os resultados dos calculos a seguir (pense sobre isto antes de fazer
o SciLab) ?
1.23456789 d10
1.23456789 e10
1.23456789e -5
2.4 (Funes) Quais os resultados dos calculos a seguir (pense sobre isto antes de fazer o
SciLab) ?
sqrt (4)
sqrt (9)
sqrt ( -1)
sqrt ( -2)
exp (1)
log(exp (2))
exp(log (2))
10^2
log10 (10^2)
10^ log10 (2)
sign (2)
sign ( -2)
sign (0)
2.4 (Trigonometria) Quais os resultados dos calculos a seguir (pense sobre isto antes de fazer o
SciLab) ?
cos (0)
sin (0)
cos(%pi)
sin(%pi)
cos(%pi /4) - sin(%pi /4)
40
A segunda forma do comando input usada para solicitar dados do tipo string ao usurio. Sua
forma :
<varivel> = input(<string>,"s");
Exemplo:
-->a = input("Digite alguma coisa","s")
Digite alguma coisa-->Ol
a=
Ol
41
42
-->printf("Al\nmundo");
Al
mundo
43
-->nome = "Joao";
-->altura = 1.65;
-->printf("A altura de %s %g",nome, altura);
A altura de Joao 1.65
44
Criamos um arquivo de script, digitando comandos no editor:
O usurio pode criar novos arquivos de script selecionando a opo ARQUIVO NOVO. Os
passos para executar um script so mostrados na seo seguinte.
45
Se houver erros de digitao no script, ento poder ocorrer erros na sua execuo. Neste
caso, retorne ao editor e corrija o erro. Em seguida, siga os mesmos passos descritos
anteriormente: salve o script (selecione ARQUIVO SALVAR) e ento execute o script (tecle
Ctrl+Shift+E ou selecione EXECUTAR).
46
Exerccio resolvido 1. Escreva um programa Scilab para calcular a distncia entre dois pontos
.x1; y1/ e .x2; y2/ no plano cartesiano. Os pontos so digitados pelo usurio.
A distncia entre dois pontos dada por:
Soluo:
Exerccio resolvido 2. Elabore um programa Scilab para calcular a resistncia equivalente entre
dois registores R1 e R2 em paralelo. Lembre-se que a resistncia equivalente entre dois
registores em paralelo dado por:
Soluo
47
48
-->cd c:\exemplos; // altera o diretrio corrente
-->exec("farenheit.sce"); // executa o script
Digite os graus Farenheit-->50
Equivale a 10 graus Celsius.
Use o comando pwd para visualizar o diretrio de trabalho do Scilab:
-->pwd
ans =
c:\exemplos
Mesmo pertencendo a uma pasta diferente do diretrio atual, um script ainda pode ser
executado, desde que fornecido o caminho (do ingls, path) da pasta do script. Por
exemplo:
-->cd c:\outrodir // alterao do diretrio atual
-->exec('c:\exemplos\farenheit.sce');
Digite os graus Farenheit-->50
Equivale a 10 graus Celsius.
O comando unix_w permite a execuo de qualquer comando comum do DOS (no windows)
ou do shell (no Linux/Unix). Por exemplo, o comando DIR do DOS (utilizado para visualizar o
diretrio de trabalho) pode ser executado do seguinte modo:
-->unix_w('dir')
49
6 Estruturas de controle
Os programas desenvolvidos no captulo anterior basicamente liam (e/ou escreviam) variveis
e avaliavam expresses aritmticas atribuindo o resultado a uma varivel. Os comandos de tais
programas eram executados sequencialmente na ordem em que foram escritas, isto , de cima
para baixo e da esquerda para a direita. Vale dizer, porm, que bem poucos programas teis
podem ser construdos desta forma. De fato, necessrio adicionar dois mecanismos para
tornar os programas flexveis e poderosos:
1. As estruturas de seleo;
2. As estruturas de repetio.
50
A estrutura de seleo ser estudada neste captulo e a estrutura de repetio no captulo
seguinte. O uso das estruturas de seleo requer o domnio das expresses booleanas
estudadas na seo seguinte.
51
Erro comum de programao: programadores principiantes costumam confundir o operador
Igual a (==) com o operador de atribuio (=).
Por exemplo, considere as seguintes atribuies A = 5, B = 1, C = 2, D = 8 e E = 3
Ento temos:
A > B | D > E Verdadeiro
~(A > B) Falso
A + 3 == 8 & A > B Verdadeiro
52
Comentrio. Este programa escreve a mdia do aluno, mas s executa a linha 6 se sua nota for
maior que 7.
53
6.6.2 A SELEO BIDIRECIONAL IF-ELSE-END
Caracteriza-se por selecionar entre duas sequncias de comandos quando certas condies,
representadas por expresses booleanas, forem satisfeitas. A seleo bidirecional tem a
seguinte forma:
if <expresso booleana>
<primeira sequncia de comandos>
else
<segunda sequncia de comandos>
end
A primeira sequncia de comandos ser executada se a expresso booleana devolver um valor
verdadeiro, caso contrrio a segunda sequncia de comandos ser executada. Os seguintes
exemplos ilustram o comando de seleo bidirecional.
Exerccio resolvido 2. Elaborar um programa para ler quatro notas, calcular a mdia e informar
se o aluno passou de ano (aprovado) ou no (reprovado). A mdia para passar de ano 6.
Soluo:
Comentrio. O comando IF testa se a mdia maior que 6,0. Se sim, o programa executa o
comando da linha 9 que escreve Aluno aprovado. Caso contrrio, o programa executa a linha
11 que escreve Aluno reprovado.
54
6.6.3 Aninhamento
Comandos de seleo podem ser aninhados de diversas formas criando ampla variedade de
construes como mostra os exemplos a seguir.
Exerccio resolvido 1. Elaborar um programa para escrever a situao do aluno. O aluno com
mdia maior ou igual a 7,0 ser aprovado. O aluno com mdia entre 5,0 e 7,0 ficar em
recuperao. Com mdia abaixo de 5,0, o aluno ser reprovado.
Soluo:
Comentrio.
Se a mdia for maior ou igual que 7 o programa escreve Aprovado (linha 11). Caso contrrio o
programa executa o segundo IF (aps o else). Aqui, temos um novo teste IF (aninhado dentro
55
de primeiro IF) que far o programa escrever Recuperao se mdia for maior ou igual a 5
(linha 14) ou, caso contrrio, Reprovado (linha 16).
Exerccio resolvido 2. Escreva um programa que leia trs nmeros e escreva o menor deles.
Soluo:
56
Comentrio. Aps a leitura das medidas a, b e c (linhas 2-4), o programa verifica, na linha 6, se
estas medidas satisfazem a desigualdade triangular. Se sim, o programa classifica o tringulo
formado por a, b, e c (linhas 8-16) do seguinte modo. Na linha 8, se a expresso booleana a ==
b & b == c retornar verdadeiro ento todos os lados so iguais e portanto o tringulo
equiltero. Caso contrrio, o programa segue adiante para classificar o tringulo em issceles
ou escaleno. Se, porm, as medidas no satisfazem a desigualdade triangular da linha 6, ento
o programa no executa as linhas 8-16, e simplesmente escreve que a medidas no formam
um tringulo (linha 19).
Exerccio resolvido 4. (Equao do segundo grau). Dados os trs coeficientes a, b, c de uma
equao do segundo grau
, elaborar um algoritmo para calcular suas raizes
razes. O discriminante da equao dado por
57
Soluo
58
59
negativo ento a raiz quadrada gera um erro. Por exemplo, em C uma declarao equivalente a
esta
x1 = -b/(2*a) + sqrt(disc)/(2*a);
x2 = -b/(2*a) - sqrt(disc)/(2*a);
produzia um erro se o valor da varivel disc fosse negativo. O Scilab no gera erro ao calcular a
raiz quadrada de um nmero negativo. Ao invs disso, o Scilab produz um nmero complexo
automaticamente. A seguir mostrado uma outra verso do programa do exemplo anterior
(desta vez sem se preocupar se o discriminante negativo ou no):
Comentrio. O comando de sada de dados disp (linhas 28 e 30) foi usado porque o comando
printf no imprime nmeros complexos. Para saber se as razes so reais ou complexas, foi
utilizado uma funo especial isreal() do Scilab que devolve verdadeiro (%t) se seu argumento
for um nmero real, ou falso (%f) se seu argumento for um nmero complexo.
Exemplos:
-->isreal(1+3*%i)
ans =
60
F
-->isreal(3)
ans =
T
Portanto, as linhas 31-34 deste exemplo:
if isreal(x1)
printf("As razes so reais");
else
printf("As razes so complexas");
end
escreveram As razes so reais se x1 for um nmero real, caso contrrio, escreveram As
razes so complexas.
61
62
2.
-->i = i + 1
i=
3.
-->i = i + 1
i=
4
Note que cada vez que a expresso i = i + 1 executada o valor da varivel i incrementado de
um. A varivel i da expresso i = i + 1 chamada de contador. Os exemplos a seguir ilustram o
uso do contador em laos while.
Exerccio resolvido 1. Calcular a mdia das notas de cinco alunos.
Soluo: este programa realiza a tarefa de ler as notas de um aluno e calcular a sua mdia. O
programa dever repetir esta tarefa cinco vezes (usando while). O contador usado para
contar o nmero de repeties.
63
Comentrio.
O programa comea inicializando a varivel i com o valor um (linha 1). Por causa disso, a
expresso i <= 5 do lao while verdadeira. Ento o corpo do lao executado pela primeira
vez (primeira iterao). O lao while incrementa o valor da varivel i com o valor de um toda
vez que o corpo do lao (linhas 3-9) executado. Depois que o corpo do lao tem sido
executado cinco vezes (ou seja, aps cinco iteraes) a varivel i possui valor seis e a expresso
i <= 5 falsa. Por causa disso o lao termina e o programa passa a executar a linha seguinte
imediatamente aps o fim do lao (que a linha 11).
Agora, considere os seguintes clculos executados no console do Scilab:
-->soma = 20
soma =
20.
-->x = 2.5
x=
2.5
-->soma = 0
soma =
0.
-->soma = soma + x
soma =
2.5
-->soma = soma + x
soma =
5.
Qual o valor da varivel soma aps repetir a execuo do ltimo comando mais duas vezes? A
varivel soma da expresso soma = soma + x chamada de acumulador. Vejamos um exemplo.
64
Exerccio resolvido 2. Elaborar um programa para calcular a soma de todos os inteiros entre 1 e
100.
Soluo:
65
Exerccio resolvido 1. Elabore um programa para escrever todos os nmeros pares inteiros
entre 1 e 50.
Soluo:
Comentrio. O primeiro nmero par 2, logo o varivel de controle deve iniciar com 2. Porque
os nmeros devem ser escritos de dois em dois, o passo deve ser igual a 2. O valor final na
varivel de controle , obviamente, 50.
Exerccio resolvido 2. Elabore um programa para calcular 5 (fatorial de 5).
Soluo:
Comentrio. Note que a cada interao do lao, a varivel fat assume os seguintes valores:
Soluo:
66
Soluo: note que h uma relao entre numerador e denominador da seguinte forma:
Usaremos esta relao para calcular cada termo da srie no seguinte programa:
67
Seguindo este algoritmo manualmente, com um lpis e papel, possvel calcular o M.D.C.
entre 544 e 119, escrevendo a seguinte tabela:
Comentrio. A cada iterao a varivel valormax armazena o maior valor dos nmeros
digitados at ento. Portanto, no final, valormax armazenar o maior valor do conjunto.
68
Pede-se que escreva todos os elementos da srie de Fibonacci menor ou igual a N. O valor de
N fornecido pelo teclado.
Soluo:
69
Comentrio. Este programa solicita ao usurio o nmero de linhas. Neste exemplo, o usurio
digitou 5 linhas. O programa, ento, escreve 5 linhas e em cada linha ele repete 4 vezes o
caractere x do seguinte modo. Inicialmente, o varivel i assume o valor 1 na linha 2. Em
seguida, a varivel j assume o valor 1. O lao interno das linhas 3-5 repetido 4 vezes
escrevendo 4 xs, ou seja, xxxx. Quando o lao interno termina (aps 4 repeties), o comando
printf("\n") da linha 6 cria uma nova linha. Em seguida, o end da linha 7 encontrada e o
programa retorna para a linha 2. Na linha 2, o valor da varivel i atualizado para 2. Em
seguida, o programa executa novamente o lao interno e o programa escreve novamente xxxx.
Novamente, o programa executa o comando printf("\n") gerando uma nova linha e o
programa retorna a linha 2, onde a varivel i atualizado para 3. Este lao continua at a
varivel i ser igual a 5.
O prximo programa escreve a tabuada de 1 at 10. Este programa usa o string de formatao
%f em vez de %g para que os dados permaneam alinhados na tabela da tabuada. O string de
formatao %f permite especificar o nmero de caracteres que ser ocupado pelo dado escrito
com printf e tambm o nmero de dgitos depois do ponto decimal. Por exemplo, o string
%5.2f escreva um nmero ocupando cinco caracteres com dois dgitos depois do ponto
decimal. Exemplo:
-->a = 223.345547867783;
-->printf("%5.2f",a);
23.35
O seguinte exemplo escreve a varivel a ocupando 10 caracteres com dois dgitos aps o ponto
decimal:
-->printf("%10.2f",a);
23.35
Usando cinco dgitos aps o ponto decimal:
-->printf("%10.5f",a);
23.34555
Exerccio resolvido 4.5.2. Elaborar um programa para escrever a tabuada de 1 at 10.
70
71
7 Matrizes
Na linguagem Scilab, matrizes desempenham um papel central. Nesta seo, introduzimos
Matrizes Scilab e apresentam como criar e consultar matrizes. Ns tambm analisamos como
para acessar aos elementos de uma matriz, ou elemento por elemento.
7.1 VETORES
Matrizes unidimensionais so chamadas de vetores. Em um vetor possvel armazenar vrios
itens em uma nica varivel. Na Figura 18 mostrada uma varivel nota contendo as notas de
alunos. Os itens contidos em um vetor so chamados de elementos do vetor. Portanto, o vetor
nota possui dez elementos. Seus elementos podem ser acessados individualmente. Por
exemplo, nota(4) refere-se ao quarto elemento do vetor nota. O valor entre os parnteses de
nota(4) chamado de ndice ou subscrito e usado para individualizar um elemento do vetor.
Vetores podem ser construdos usando os colchetes [ e ]. Os elementos so envolvidos por
colchetes e separados por espaos (ou vrgula).
figura 18 - Vetor
-->nota(1) + nota(2) + nota(3)
ans =
22.5
Uma aplicao de vetores armazenar variveis indexadas da matemtica. Por exemplo, as
variveis indexadas x1 D 2, x2 D 4, x3 D 2 e x4 D 3 so armazenadas como:
-->x(1) = 2;
-->x(2) = 4;
-->x(3) = 2;
-->x(4) = 3;
Algoritmo-Pseudocdigo com Scilab
72
ou equivalentemente como
-->x = [2 4 2 3];
Expresses matemticas tais como .x1 C x3/=x2 so efetuados do seguinte modo:
-->(x(1)+x(3))/x(2)
ans =
1.
Se o vetor for grande, pode-se usar o smbolo .. para continuar escrevendo da linha
seguinte. Exemplo:
-->b = [2 3 7 ..
-->9 8 4]
b=
! 2. 3. 7. 9. 8. 4. !
Comentrio. Para somar os elementos do vetor, cada elemento foi acessado individualmente
e adicionado, um por vez, em um acumulador soma, atravs do lao for...end (linhas 3 a 5).
73
Exerccio resolvido 2. Ler dois vetores A e B de 10 elementos. Construir um vetor C tal que cada
elemento de C seja o dobro da soma entre os elementos correspondentes de A com B.
Escrever o vetor C.
Comentrio. O lao for...end, das linhas 1 a 3, faz a leitura de um elemento do vetor a de cada
vez. A leitura controlada pelo ndice que faz com que cada leitura seja armazenada em um
elemento diferente do vetor a. No lao for...end das linhas 7 a 9, o clculo de cada elemento
do vetor c controlado pelo ndice que faz com que seja somando os elementos
correspondentes de a e b.
Comentrio. A funo modulo (resto de uma diviso) verifica se o ndice do vetor C mpar ou
par porque se resto da diviso entre um nmero qualquer e dois diferente de zero ento ele
mpar (no divisvel por dois).
74
75
Esta sintaxe exclui o contedo de uma matriz, de modo que a memria associada libertada.
-->a = zeros (5,5)
a =
0. 0. 0. 0.
0. 0. 0. 0.
0. 0. 0. 0.
0. 0. 0. 0.
0. 0. 0. 0.
0.
0.
0.
0.
0.
76
-->nr = size (a,"*") retorna o nro de elementos de uma matriz, ou seja, o produto de linha
pela coluna
nr =
25.
Um elemento de uma matriz pode ser acessado diretamente com a sintaxe de A (i, j), desde
que i e j so ndices vlidos.
Ressaltamos que, por padro, o subscrito primeiro de uma matriz 1. Isto contrasta com
outras linguagens, tais como a linguagem C, por exemplo, onde o subscrito primeiro 0. Por
exemplo, suponha que A uma matriz nr X nc, onde nr o nmero de linhas e nc o nmero
de colunas. Portanto, o valor de A (i, j) tem um nico sentido se o subscrito i subscrito e j
satisfazerem 1 i nr e 1 j nc. Se o ndice no so vlido, gerado um erro, como a
seguir.
-->A = ones (2 ,3)
A=
1. 1. 1.
1. 1. 1.
77
-->A(1 ,1)
ans =
1.
-->A(12 ,1)
!-- error 21
Invalid index .
-->A(0 ,1)
!-- error 21
Invalid index .
O acesso direto aos elementos da matriz com a sintaxe de A (i, j), deve ser usada somente
quando no h outros comandos de nvel mais alto no Scilab que possam ser usados. Na
verdade, o Scilab fornece muitas caractersticas que produzem clculos mais simples e mais
rpido, com base na vetorizao. Uma dessas caractersticas o operador, sinal de ":", que
muito importante na em situaes prticas.
78
Note-se que o ltimo valor do vector v i ns + = 9, que menor do que j = 10. A seguir,
apresentamos dois exemplos em que o passo negativo. No primeiro caso, o operador :, gera
decrescendo 10 para 4. No segundo exemplo, o operador do clon gera uma matriz vazia,
porque no existem valores inferiores a 3 e superior a 10, ao mesmo tempo.
-->v = 10: -2:3
v=
10. 8. 6. 4.
-->v = 3: -2:10
v=
[]
Com um vetor de subscritos, podemos acessar os elementos de uma matriz.
A (i: j, k: l)
onde i, j, k, l esto comeando e terminando subscritos. A sintaxe complexa
A (i: l s: j, k:: t),
onde s e t so as etapas.
Por exemplo, suponha que A uma matriz 5 X 5, e que ns queremos para acessar o lementos
ai, j para i = 1, 2 e j = 3, 4. Com a linguagem Scilab, isto pode ser feito em apenas uma
instruo, utilizando a sintaxe A (1:2,3:4), como mostra o seguinte exemplo.
-->A = testmatrix (" hilb " ,5)
A =
17. 24. 1.
8.
23. 5.
7.
14. 16.
4.
6.
15.
9.
-->A(1:2,3:4)
ans =
1. 8.
7. 14.
79
Existem muitas variaes sobre esta sintaxe, a figura 21 apresenta algumas das combinaes
possveis.
-->B([1 2] ,:)
ans =
8. 1. 6.
3. 5. 7.
-->B([2 1] ,:)
ans =
3. 5. 7.
8. 1. 6.
-->B([1 2] ,:) = B([2 1] ,:)
B =
3. 5. 7.
8. 1. 6.
80
4. 9. 2.
Poderamos igualmente trocar as colunas da matriz B, com a indicao B (:, [3 1 2]).
-->b = eye(a)
b =
1. 0. 0.
0. 1. 0.
0. 0. 1.
81
Finalmente, pode-se usar a sintaxe do eye (m, n) a fim de criar uma matriz de identidade com
m linhas e n colunas.
-->c=eye(2,3)
c =
1. 0. 0.
0. 1. 0.
82
Ns tambm podemos alterar a forma da matriz, com a funo matrix. A funo matrix
remodela uma matriz de origem em uma matriz alvo com um tamanho diferente. A
transformao realizada a cada coluna, por empilhamento dos elementos da matriz de
origem. No exemplo seguinte, remodelar a matriz A, que tem 3 X 2 = 6 elementos em um vetor
linha com 6 colunas.
-->a = [1 2 3; 4 5 6]
a =
1. 2. 3.
4. 5. 6.
-->b = matrix(a,1,6)
b =
1. 4. 2. 5. 3. 6.
7.10 Operador $
Normalmente, utiliza-se de subscrito para fazer referncia a partir do incio de uma matriz. Por
oposio, o operador dlar, "$" referncia elementos do fim da matriz.
O operador "$" substitui "o ndice correspondente ltima" linha ou coluna, dependendo do
contexto.
Vrios usos do operador dlar so apresentados na figura 21.
83
4. 9. 2.
-->A($ -1,$ -2)
ans =
3.
O operador dlar "$" adiciona elementos dinamicamente no final de matrizes,noexemplo
seguinte, adicionar uma linha no final da matriz de Hilbert.
-->A($+1 ,:) = [1 2 3]
A =
8. 1. 6.
3. 5. 7.
4. 9. 2.
1. 2. 3.
Quando realizar uma adio de duas matrizes, se um operando for uma matriz 1 x 1 (ou seja,
um escalar), o valor de este escalar adicionado a cada um dos elementos da segunda matriz.
Esta caracterstica mostrada no exemplo seguinte:
-->A = [1 2
-->3 4]
A=
84
1. 2.
3. 4.
-->A + 1
ans =
2. 3.
4. 5.
85
Pede-se:
a) Colocar a matriz A na memria do computador.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
b) Preencher a terceira coluna da matriz A com o valor zero.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
for i=1:5
a(i,3) = 0
end
c) Calcular a soma dos elementos da diagonal principal da matriz A e escrever o resultado.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
soma = 0;
for i=1:4
soma = soma + a(i,i);
end
printf("soma = %g\n",soma);
d) Calcular a soma dos quadrados dos elementos da segunda linha de A e escrever o resultado.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
soma = 0;
for i=1:4
soma = soma + a(2,i)^2;
end
printf("soma = %g\n",soma);
86
e) Somar de todos os elementos de A.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
soma = 0;
for i=1:5
for j=1:4
soma = soma + a(i,j);
end
end
f) Armazenar a soma de cada linha de A no vetor S
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
for i=1:5
soma = 0;
for j=1:4
soma = soma + a(i,j);
end
s(i) = soma;
end
g) Trocar a segunda linha com quarta linha.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
for j=1:4
aux = a(2,j)
a(2,j) = a(4,j);
a(4,j) = aux;
end
h) Escrever a matriz A.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
for i=1:5
87
for j=1:4
printf("%3.0f ",a(i,j));
end
printf("\n");
end
i) Ler uma matriz B de mesma dimenso que A. Efetuar a soma matricial A C B e armazenar o
resultado na matriz C.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
for i=1:5
for j=1:4
b(i,j) = input("Digite um nmero");
end
end
for i=1:5
for j=1:4
c(i,j) = a(i,j) + b(i,j);
end
end
j) Ler uma matriz B de mesma dimenso que A. Escrever IGUAIS se A for uma
matriz igual B. Caso contrrio, escrever DIFERENTES.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
for i=1:5
for j=1:4
b(i,j) = input("Digite um nmero");
end
end
iguais = %t;
for i=1:5
88
for j=1:4
if a(i,j) <> b(i,j)
iguais = %f;
end
end
end
if iguais
printf("Iguais\n");
else
printf("Diferentes\n");
end
Exerccio 5.2.2. Elabore um programa para ler a matriz A, trocar a segunda linha com terceira
linha e escrever a matriz A.
89
Comentrio. Porque a varivel nunmes contm o nmero do ms, o comando printf capaz
de escrever o nome do ms atravs do elemento mes(nunmes).
Exerccios
O que este programa escreve?
Esta abordagem no resolve o problema proposto porque precisamos comparar se cada nota
digitada maior que a mdia. Mas vale notar que as notas j foram perdidas no momento que
calculado a mdia na ltima linha (exceto a ltima nota que no foi perdida porque est
armazenada na varivel nota). Deste modo, no podemos comparar as mdia com as notas
(que foram perdidas). Portanto, a fim de evitar a perda das notas, necessrio armazenar cada
nota digitada em uma varivel diferente.
90
Suponha que, ao invs de uma turma com quatro alunos, houvessem uma turma com cinco
alunos, ento teramos:
Suponha uma turma com cinco alunos. Elaborar um programa que leia as cinco notas dos
alunos e seus respectivos nomes e escreva apenas os nomes com a nota acima da mdia.
A soluo deste problema seria similar ao programa anterior, apenas acrescentando algumas
linhas (e.g., para ler a quinta nota). A soluo seria:
91
Novamente, suponha que, ao invs de uma turma com cinco alunos, houvesse uma turma com
dez alunos. Neste caso, um programa, para ler 10 notas, iria crescer bastante em tamanho (em
relao programa anterior) porque seria preciso ler 10 variveis para as notas (i.e., nota1,
nota2, ..., nota10) e 10 para os nomes de alunos, totalizando 20 variveis. Do mesmo modo,
para uma turma com 20 alunos, seria preciso ler 40 variveis, sendo as 20 notas e os 20 nomes
dos alunos.
Considere a situao que fosse preciso ler as notas de todas as turmas de um colgio com
10000 alunos. Ou seja, Suponha uma colgio com 10000 alunos. Elaborar um programa que
leia as 10000 notas dos alunos e seus respectivos nomes e escreva apenas os nomes com a
nota acima da mdia.
Este programa assume proporo gigantesca porque preciso ler 20000 variveis (10000 para
as notas e 10000 para os nomes de aluno) tornando-o impraticvel de ser programado (do
modo como foi feito antes). Note que as variveis, nota1, nota2, nota3, ... podem ser
substitudas por os elementos de um vetor, por exemplo,
nota(1), nota(2), nota(3), ....
Neste caso, cada elemento do vetor nota seria lida, uma de cada vez, por um lao for...end
atravs dos seus ndices. Vejamos a soluo usando vetores.
92
93
Passo B.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os dois elementos.
a = [3 2 4 5 6]
Novamente no houve troca.
C) Repetio a iterao (porque o vetor no est ordenado)
Passo C.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos.
a = [2 3 4 5 6]
Houve troca do nmero 3 com o nmero 2.
Passo C.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos.
a = [2 3 4 5 6]
No houve troca.
Passo C.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos.
a = [2 3 4 5 6]
No houve troca.
Passo C.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os dois elementos.
a = [2 3 4 5 6]
No houve troca.
D) Repetio a iterao.
(a) Passo D.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos.
a = [2 3 4 5 6]
No houve troca.
(b) Passo D.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos.
a = [2 3 4 5 6]
No houve troca.
(c) Passo D.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos.
a = [2 3 4 5 6]
No houve troca.
(d) Passo D.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os elementos.
a = [2 3 4 5 6]
No houve troca.
E) Se no houve troca na ltima iterao ento pare porque o vetor j est ordenado.
O seguinte trecho de programa implementa o algoritmo da bolha para ordenar a vetor
a (supondo que o vetor a j foi lido e est na memria).
94
95
-->rand()
ans =
.6868068
// A transposta importante!
96
seguir, usamos a instruo break, a fim de calcular a soma dos nmeros inteiros de 1 a 10.
Quando a varivel i maior do que 10, o ciclo interrompido.
s=0
i=1
while ( %t )
if ( i > 10 ) then
break
end
s=s+i
i=i+1
end
No fim do algoritmo o valor da variveis so:
s=
55.
i=
11.
A instruo continue faz o interpretador de ir para o prximo ciclo, de modo que as
declaraes no corpo do lao no so executadas neste momento. Quando a instruo
continue executada, Scilab ignora as outras declaraes e volta diretamente para a instruo
WHILE ou FOR e continua o ciclo.
No exemplo a seguir, vamos calcular a soma s = 1 + 3 + 5 + 7 + 9 = 25. A funo, mdulo (i, 2)
retorna 0 se o nmero i 2. Nesta situao, o script vai para o prximo ciclo.
s=0
i=0
while ( i< 10 )
i=i+1
if ( modulo ( i , 2 ) == 0 ) then
continue
end
s=s+i
end
97
O algoritmo anterior pode ser realizado em uma chamada de funo s. Na verdade, o script a
seguir usa a funo sum, combinado com o operador pontos ":" e produz o mesmo resultado.
s = sum (1:2:10);
8 FUNES
8.1
INTRODUO
8.2
As funes recebem dados por meio de uma lista de parmetros de entrada, e retorna
resultados por uma lista de parmetros de sada. Por exemplo, a funo cos(x) recebe
um valor e retorna um valor, logo tem um parmetro de entrada e um de sada. A
funo,
modulo(x,y) recebe dois valores (o numerador e o denominador) e retorna um valor (o
98
resto). Logo, modulo(x,y) tm dois parmetros de entrada e um de sada. A funo
size(x), tem um parmetro de entrada e dois de sada. Por exemplo,
74
7.3 Funes Definidas pelo Usurio / UFRN-DCA - 13 de Junho de 2011 75
-->a = [1 2 3; 4 5 6]
a=
! 1. 2. 3. !
! 4. 5. 6. !
-->[l c] = size(a)
c=
3.
l=
2.
porque recebe uma matriz e devolve dois valores (o nmero de linhas e colunas).
o cabealho da funo e serve, entre outras coisas, para dar o nome da funo e
definir
a lista de parmetros de entrada e sada (tambm chamados de parmetros formais).
Quando h apenas um parmetro de sada, os colchetes podem ser omitidos. Por
exemplo, a seguinte funo tem apenas um parmetro de sada e um parmetro de
entrada.
Esta funo calcula o fatorial de um nmero:
1 function y = fat(n)
2 p = 1;
3 for i = n:-1:2
4 p = p*i;
5 end
6 y = p;
7 endfunction
99
o valor contido no parmetro de sada y, ou seja, 120.
comum criarmos functions em um arquivo de script separado para ser utilizado em
vrios programas. Para isto digitamos a funo em um arquivo com extenso .SCI. Por
exemplo, fatorial.sci. Em seguida, usamos a funo exec() do Scilab para carregar o
arquivo fatorial.sci para dentro do Scilab. Por exemplo:
--> exec("fatorial.sci");
Neste comando, foi assumido que o arquivo fatorial.sci foi salvo no diretrio atual do
Scilab. Use a opo ARQUIVO ALTERAR O DIRETRIO ATUAL ou o comando
chdir() para mudar o diretrio atual do Scilab.
Uma funo definida pelo usurio tem o mesmo status de uma funo pr-definida do
Scilab e, portanto, pode ser usada do mesmo modo. Vejamos um exemplo.
Exerccio resolvido 7.3.1. Calcular o seguinte somatrio usando a funo fat definida
acima.
SD
X10
iD1
i . D 1. C 2. C : : : C 10.
Soluo:
1 soma = 0;
2 for j=1:10
3 soma = soma + fat(j);
4 end
Comentrio. Para executar este programa, o usurio deve, antes, carregar a funo
fat(). Isto pode ser feito atravs, por exemplo, da funo exec().
100
endfunction
function y=func4(x)
comandos
endfunction
por que a varivel w no est no espao de trabalho (uma vez no foi definida no
console).
As variveis definidas pelas funes tambm no so armazenadas no espao de
trabalho.
Deste modo, estas variveis no so visveis no console. Por exemplo, a varivel p da
funo fat() no pode ser usada no console:
--> fat(3)
101
--> p + 1 // gera erro
porque p no esta definida no espao de trabalho. Neste caso, dizemos que p uma
varivel local da funo fat(). A seguir introduziremos os conceitos de variveis locais
e o globais.
7.5.1 Variveis Locais
Uma varivel dita ser local quando definida dentro de uma funo. Toda varivel
local
deixa de existir (torna-se invlida) quando a funo finalizada. Por isso, a varivel
local
dita ser visvel localmente na funo. As variveis locais tambm no podem alterar
as
variveis do espao de trabalho.
Vejamos um exemplo. Considere a seguinte funo:
1 function y = beta(x)
2 a = 3;
3 b = 2;
4 c = 5;
5 printf("a = %g b = %g c = %g\n",a,b,c);
6 y = a + b + c + x;
7 endfunction
102
8 y = R + S + t + x;
9 endfunction
gama(). Isto aconteceu porque usamos a comando global. Porm a varivel t no foi
alterada pela funo gama() porque no uma varivel global, ou seja, a varivel t
no
foi declarada como global, permanecendo como uma varivel local.
Conclumos que variveis locais so visveis somente dentro na funo, mas variveis
globais podem ser visveis tanto dentro como fora de uma funo. Variveis globais
so,
portanto, uma forma de compartilhar uma varivel entre a funo e o programa
chamador.
A declarao global deve ser usado tanto no programa chamador como na funo (e
em qualquer funo que venha a compartilhar a mesma varivel). A declarao global
opcional quando uma varivel, apesar de ser global, no modificada pela funo.
Por
exemplo, considere a funo:
1 function y = eta(x)
2 global S
3 S = x+3;
4 y = R + S;
5 endfunction
103
(c) executado pelo comando exec();
(d) Armazena suas variveis em uma rea chamada Espao de Trabalho (Workplace).
2. Arquivo de funes.
(a) uma sequncia de functions (sub-rotinas);
(b) Possuem extenso de arquivo .SCI;
(c) carregado pelo comando exec();
(d) Armazena suas variveis em uma rea prpria. Essas variveis so chamadas
de locais.
7.7 Passagem de Parmetros / UFRN-DCA - 13 de Junho de 2011 81
7.8 EXEMPLOS
Exerccio resolvido 7.8.1. Ler trs pontos .x1; y1/, .x2; y2/ e .x3; y3/ do plano cartesiano
representando os vrtices de um tringulo. Calcular a rea do tringulo.
Da geometria, tem-se o seguinte fato: se a, b e c so as medidas dos lados de um
tringulo, ento a rea deste tringulo dada por:
area D
p
s.s a/.s b/.s c/
Algoritmo-Pseudocdigo com Scilab
104
7.8 Exemplos / UFRN-DCA - 13 de Junho de 2011 82
onde s o semi-permetro dado por:
sD
aCbCc
2
Para calcular os lados do triangulo ser usado a funo dist para calcular a distncia
entre dois pontos .x1; y1/ e .x2; y2/ no plano cartesiano:
1 function d = dist(x1,y1,x2,y2)
2 d = sqrt((x2-x1)^2+(y2-y1)^2);
3 endfunction
Exerccio resolvido 7.8.2. Elaborar uma funo inverte() que receba um vetor X.
A funo retorna um vetor x invertido. Por exemplo, se a funo recebe |[2 1 8 5]|, ela
retorna [5 8 1 2].
Soluo:
1 function y = inverte(x)
2 n = length(x);
3 for i=1:n
4 y(i) = x(n+1-i);
5 end
6 endfunction
Exerccio resolvido 7.8.3. Muitas funes matemticas podem ser calculadas por meio
de um somatrio infinito de termos. Em cada caso, a preciso aumenta medida que
mais
termos na srie so considerados. Um exemplo, a funo cos x:
cos x D 1
x2
2.
C
x4
4.
x6
6.
C
Para clculos prticos, este somatrio infinito devem terminar aps um nmero finito
de
termos (penalizando a preciso do resultado). Preparar uma funo para calcular o
coseno
105
(funo COSENO.x; n/), com duas variveis de entrada, onde a primeira varivel
de entrada x e a segunda varivel de entrada o nmero de termos a serem
utilizados
nos clculos.
Soluo
7.9 O Comando return / UFRN-DCA - 13 de Junho de 2011 83
1 function y = coseno(x,n)
2 s = 1;
3 for i=1:n
4 num = x^(2*i);
5 den = fat(2*i);
6 sinal = (-1)^i;
7 s = s + sinal*num/den;
8 end
9 y = s;
10 endfunction
Exerccio resolvido 7.8.4. Elaborar uma funo membro que receba um nmero e um
vetor. Uma funo retorna o valor %t se o nmero existe no vetor. Caso contrrio, a
funo retorna %f.
106
25 while r <> 0
26 r = modulo(a, b);
27 a = b;
28 b = r;
29 end
30 maxdc = a;
31 endfunction
mdia.x/ D
1
n
Xn
iD1
xi
varincia.x/ D
1
n1
Xn
iD1
.xi mdia.x//2
desvio padro.x/ D
p
varincia.x/
O primeiro programa de estatstica mostrado abaixo no emprega a tcnica da
subrotina.
Tornando-se grande e mais complexo.
PROGRAMA VERSO 1 - Sem sub-rotinas
1 printf("Meu Programa de Estatstica Versao 1");
2 n = input("Digite o numero de elementos");
3 for i=1:n
4 x(i) = input("Digite um nmero entre 1 e 10");
5 end
6 printf("Opcao 1 - Soma\n");
7 printf("Opcao 2 - Mdia\n");
8 printf("Opcao 3 - Desvio padro\n");
9 printf("Opcao 4 - Varincia\n");
10 opcao = input("Digite sua opcao");
11
12 if opcao == 1
13 soma = 0;
14 for i=1:n
15 soma = soma + x(i);
16 end
17 printf("A soma igual a %g",soma);
18 end
19
20 if opcao == 2
21 soma = 0;
22 for i=1:n
23 soma = soma + x(i);
24 end
107
25 media = soma/n;
26 printf("A mdia igual a %g",media);
108
22 if opcao == 3
23 printf("O desvio padro igual a %g",dpad(x));
24 end
25
26 if opcao == 4
27 printf("A varincia igual a %g",var(x));
28 end
As sub-rotinas:
1 // Funo soma
2 function y = soma(x)
3 n = length(x);
4 s = 0;
5 for i=1:n
6 s = s + x(i);
7 end
8 y = s;
9 endfunction
10
11 // Funo mdia
12 function y = media(x)
13 n = length(x);
14 y = soma(x)/n;
15 endfunction
16
17 // Funo varincia
18 function y = var(x)
19 n = length(x);
20 m = media(x);
21 d = 0;
22 for i = 1:n
23 d = d + (x(i)-m)^2;
24 end
25 y = d/(n-1);
26 endfunction
27
28 // Funo Desvio Padro
29 function y = dpad(x)
30 y = sqrt(var(x));
31 endfunction
Note que para calcular a varincia foi usado a funo mdia, evitando assim a
repetio
de cdigo. Alis, como j foi dito, evitar a repetio de cdigo uma das vantagens
de usar sub-rotinas. A funo length(x) usada no cdigo acima explicada na prxima
seo.
7.10.1 O Comando de Mltipla Escolha SELECT-CASE
O comando SELECT-CASE conveniente para testar se uma expresso igual a
uma
lista de valores diferentes. A sintaxe do SELECT-CASE :
select <expresso>
case <valor1> then
<comandos> ...
case <valor2> then
<comandos> ...
7.10 Estudo de Caso: Um Programa de Estatstica / UFRN-DCA - 13 de Junho de
2011 87
case <valor i> then
<comandos> ...
else
109
<comandos> ...
end
end
Se <expresso> for igual a <valor1> ento o primeiro case executado. Se
<expresso>
for igual a <valor2> ento o segundo case executado. E assim por diante. O
comando else executado se todas as comparaes do comando case forem falsas.
PROGRAMA VERSO 3 - Com o comando SELECT-CASE
1 printf("Meu Programa de Estatstica Versao 3");
2
3 n = input("Digite o nmero de elementos");
4 for i=1:n
5 x(i) = input("Digite um nmero entre 1 e 10");
6 end
7
8 printf("Opo 1 - Soma\n");
9 printf("Opo 2 - Mdia\n");
10 printf("Opo 3 - Desvio padro\n");
11 printf("Opo 4 - Varincia\n");
12 opcao = input("Digite sua opo");
13
14 select opcao
15 case 1 then
16 printf("A soma igual a %g\n",soma(x));
17 case 2 then
18 printf("A mdia igual a %g\n",media(x));
19 case 3 then
20 printf("O desvio padro igual a %g\n",dpad(x));
21 case 4 then
22 printf("A varincia igual a %g\n",var(x));
23 end
110
23 case 3
24 printf("O desvio padro igual a %g\n",dpad(x));
25
26 case 4
27 printf("A varincia igual a %g\n",var(x));
28
29 case 0
30 printf("At a logo\n");
31
32 else
33 printf("Voc digitou uma opo invlida\n");
34 end
35 end
111
9 Referncias
[1] Atlas - Automatically Tuned Linear Algebra Software. http://math-atlas.
sourceforge.net.
[2] Cecill and free software. http://www.cecill.info.
[3] C Bunks, J.-P. Chancelier, F. Delebecque, C. Gomez, M. Goursat,
R. Nikoukhah, and S. Steer. Engineering and Scienti_c Computing With Scilab.
Birkhauser Boston, 1999.
[4] Stephen L. Campbell, Jean-Philippe Chancelier, and Ramine Nikoukhah.
Modeling and Simulation in Scilab/Scicos. Springer, 2006.
[5] J.-P. Chancelier, F. Delebecque, C. Gomez, M. Goursat, R. Nikoukhah, and
S. Steer. Introduction _a Scilab, Deuxi_eme _ Edition. Springer, 2007.
[6] Intel. Intel Math Kernel Library. http://software.intel.com/en-us/
intel-mkl/.
[7] Sylvestre Ledru. Di_erent execution modes of Scilab. http://wiki.scilab.
org/Different_execution_modes_of_Scilab.
[8] Sylvestre Ledru and Yung-Jang Lee. Localization. http://wiki.scilab.org/
Localization.
[9] Sylvestre Ledru, Pierre Mar_echal, and Simon Gareste. Atoms. http://wiki.
scilab.org/ATOMS.
[10] Sylvestre Ledru, Pierre Mar_echal, and Cl_ement David. Code conventions
for the Scilab programming language. http://wiki.scilab.org/Code%
20Conventions%20for%20the%20Scilab%20Programming%20Language.
[11] Cleve Moler. Numerical computing with Matlab.
[12] Flexdock project. Flexdock project home. https://flexdock.dev.java.net/.
[13] The Scilab Consortium. Scilab. http://www.scilab.org.