Академический Документы
Профессиональный Документы
Культура Документы
Resumo
Este curso apresenta a linguagem de programao do Scilab da mesma forma que um
curso tradicional de introduo a programao. O Scilab um ambiente de programao
dedicado a resoluo de problemas cientficos e de engenharia. Ele est disponvel1 para
vrios sistemas operacionais tais como Windows, Linux e Mac OS X. O material deste
curso pode ser usado em qualquer um desses sistemas. Procure seu professor ou seu centro de computao local para informaes sobre como o Scilab est instalado localmente.
Sumrio
1
Preliminares
1.1 Usando o Console do Scilab como uma Simples Calculadora
1.2 Variveis e o Comando de Atribuio . . . . . . . . . . . .
1.2.1 Regras para Formao de Nomes de Variveis . . . .
1.2.2 O Ponto e Vrgula . . . . . . . . . . . . . . . . . .
1.3 Expresses Aritmticas . . . . . . . . . . . . . . . . . . . .
1.3.1 Funes Matemticas Comuns . . . . . . . . . . . .
1.3.2 Funes de Arredondamento . . . . . . . . . . . . .
1.3.3 Ordem de Avaliao entre Operadores Aritmticos .
1.4 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 Nmeros Complexos . . . . . . . . . . . . . . . . . . . . .
1.6 O Espao de Trabalho . . . . . . . . . . . . . . . . . . . . .
1.6.1 O Comando Clear . . . . . . . . . . . . . . . . . .
1.6.2 Os Comandos Save e Load . . . . . . . . . . . . . .
1.7 Formato de Visualizao dos Nmeros . . . . . . . . . . . .
1.8 Constantes Especiais do Scilab . . . . . . . . . . . . . . . .
1.9 A Varivel ans . . . . . . . . . . . . . . . . . . . . . . . . .
1.10 Ajuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arquivos de Scripts
2.1 Comando de Entrada de Dados . .
2.2 Comandos de Sada de Dados . . .
2.3 Arquivos de Scripts . . . . . . . .
2.4 Criando Arquivos de Script . . . .
2.5 Executando Arquivos de Script . .
2.6 Exemplos . . . . . . . . . . . . .
2.7 Linhas de Comentrios . . . . . .
2.8 Alterando o Diretrio de Trabalho
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
3
3
4
4
5
6
8
9
9
9
10
11
11
11
11
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
13
15
16
17
18
19
19
Estruturas de Seleo
3.1 Estruturas de Controle . . . . . . . . . .
3.2 Expresses Booleanas . . . . . . . . . . .
3.3 Variveis Booleanas . . . . . . . . . . . .
3.4 Tipos de Dados Primitivos . . . . . . . .
3.5 Ordem de Avaliao entre os Operadores .
3.6 A Seleo Simples IF-END . . . . . . . .
3.7 A Seleo Bidirecional IF-ELSE-END . .
3.8 Aninhando Seletores . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
21
22
23
23
23
24
25
26
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Estruturas de Repetio
4.1 Laos . . . . . . . . . . . . .
4.2 Lao Controlado Logicamente
4.3 Lao Controlado por Contador
4.4 Exemplos com Laos . . . . .
4.5 Laos Aninhados . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Matrizes
5.1 Vetores . . . . . . . . . . . . . . . . .
5.1.1 Acessando Elementos do Vetor .
5.2 Matrizes Bidimensionais . . . . . . . .
5.3 Vetores de String . . . . . . . . . . . .
5.4 Estudo de Caso . . . . . . . . . . . . .
5.5 Exemplos com Matrizes . . . . . . . .
5.5.1 Ordenao de Vetores . . . . .
5.5.2 Gerando Nmeros Aleatrios .
5.5.3 Uma Aplicao de Matrizes . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
32
32
32
35
36
39
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
42
42
43
45
48
49
52
52
54
55
Manipulao Matricial
6.1 Construo de Matrizes . . . . . . . . . . .
6.2 Secionamento de Matrizes . . . . . . . . .
6.2.1 Indexao Linear . . . . . . . . . .
6.3 O Operador $ . . . . . . . . . . . . . . . .
6.4 Atribuio . . . . . . . . . . . . . . . . . .
6.5 Dimenso de Matrizes . . . . . . . . . . .
6.6 Operaes Escalar-Matriz . . . . . . . . . .
6.7 Operaes Matriz-Matriz . . . . . . . . . .
6.8 Soluo de Sistemas de Equaes Lineares .
6.9 Transposta de Matrizes Complexas . . . . .
6.10 Zeros e Ones . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
58
58
62
64
65
66
67
68
69
72
72
73
.
.
.
.
.
.
.
.
.
.
.
.
.
74
74
74
75
76
78
78
79
80
81
81
84
85
87
.
.
.
.
.
.
.
.
.
Funes
7.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Parmetros de Entrada e Sada . . . . . . . . . . . . . .
7.3 Funes Definidas pelo Usurio . . . . . . . . . . . . .
7.4 A Idia Bsica das Funes . . . . . . . . . . . . . . . .
7.5 Escopo de Variveis . . . . . . . . . . . . . . . . . . . .
7.5.1 Variveis Locais . . . . . . . . . . . . . . . . .
7.5.2 Variveis Globais . . . . . . . . . . . . . . . . .
7.6 Os Programas do Scilab . . . . . . . . . . . . . . . . . .
7.7 Passagem de Parmetros . . . . . . . . . . . . . . . . .
7.8 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . .
7.9 O Comando return . . . . . . . . . . . . . . . . . . . .
7.10 Estudo de Caso: Um Programa de Estatstica . . . . . .
7.10.1 O Comando de Mltipla Escolha SELECT-CASE
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Captulo
PRELIMINARES
ESTE captulo sero apresentados o ambiente de trabalho do Scilab e conceitos bsicos de programao como variveis, tipos de dados e expresses aritmticas.
1.1
O Scilab pode fazer operaes aritmticas com nmeros reais e complexos. Os operadores aritmticos so:
Adio
+
Subtrao
Multiplicao *
Diviso
/
Potenciao
Quando o Scilab executado surge uma janela chamada de console do Scilab como
mostrado na Figura a seguir. O console do Scilab o mecanismo usado pelo usurio para
interagir com o Scilab por meio de comandos1 .
Em computao, esta forma de interagir com o computador chamada de Interface de Linha de Comandos. Consiste em digitar uma linha de texto representando um comando ou tarefa a ser executada pelo
computador. parte fundamental de muitos softwares cientficos (e.g., Matlab, Maple) e est presente em vrias linguagens de programao (e.g., Python e Perl) e sistemas operacionais como Linux (Shell) e Windows
(DOS e Powershell).
-->
Ele chamado de prompt e indica que o console do Scilab est esperando um comando a
ser digitado pelo usurio. Portanto, as operaes aritmticas so digitados aps o smbolo
-> e em seguida tecla-se [ENTER]. Exemplo:
-->2+3 [ENTER]
ans =
5.
Outros exemplos:
-->5+6/2
ans =
8.
-->4^2
ans =
// 4 elevado a potncia de 2
16.
1.2
//
//
//
//
Atribui o produto de a e b
para varivel area
//
//
2.
-->b = 4
a =
4.
-->area = a*b
area =
8.
-->b = b+1
b =
5.
significa igualdade
matemtica, uma
vez que o comando
de atribuio
i = i+1
vlido, mas no
representa
igualdade
matemtica.
1.2.1
Os nomes de variveis (tambm conhecidos por identificadores) devem seguir as seguintes regras:
1. Nomes de variveis comeam com uma letra seguido de letras, algarismos ou sublinhados. Por exemplo: Alpha, notas, A1, B23 e cor_do_objeto;
2. Caracteres especiais no so permitidos. Isto , no permitido usar #, $, &, %, ?,
!, @, <, ~, etc;
3. Caracteres acentuados no so permitidos;
4. Nomes de variveis so sensveis a maisculas e minsculas. Por exemplo, varivel
Alpha diferente das variveis ALPHA, alpha e AlPhA.
De acordo com as regras acima, os seguintes nomes de variveis so vlidos:
ALPHA, X, B1, B2, b1, matricula e MEDIA.
Porm, estes nomes de variveis so invlidos:
5B, 1b, nota[1], A/B e X@Z.
1.2.2
O Ponto e Vrgula
Mais exemplos:
-->a=2;
-->b=4;
-->area=a*b
area =
8.
1.3
EXPRESSES ARITMTICAS
Os operadores aritmticos combinam nmeros e variveis para formar expresses aritmticas. Exemplos:
A+B*C
(NOTA1+NOTA2)/2
1/(a^2+b^2)
1.3.1
// coseno de 2 vezes PI
1.
-->%e^2
ans =
// 2,718281828 ao quadrado
7.389056098931
-->abs(-5)
ans =
// valor absoluto
5.
-->modulo(8,3)
ans =
2.
-->modulo(6,3)
ans =
0.
-->sign(-4)
ans =
- 1.
-->sign(5)
ans =
1.
1.3.2
Funes de Arredondamento
Valor absoluto.
Arco co-seno.
Arco co-seno hiperblico.
Arco seno.
Arco seno hiperblico.
Arco tangente.
Arco tangente hiperblico.
Conjugado.
Co-seno.
Co-seno hiperblico.
Exponencial: ex .
Parte imaginria de um nmero complexo.
Logaritmo natural.
Logaritmo na base 10.
Parte real de um nmero complexo.
Resto da diviso de x por y.
Funo sinal: retorna o valor -1, +1 ou zero conforme o argumento x
seja negativo, positivo ou nulo, respectivamente.
Seno.
Seno hiperblico.
Raiz quadrada.
Tangente.
Tangente hiperblica.
34.
-->round(a)
ans =
35.
-->ceil(3.1)
ans =
4.
1.3.3
Para uma boa avaliao de uma expresso aritmtica necessrio se familiarizar com a
ordem de avaliao dos operadores. Aqui, as regras importantes so: prioridade, associatividade e parnteses.
ceil(x)
2
2
2
-1
-1
-1
floor(x)
1
1
1
-2
-2
-2
fix(x)
1
1
1
-1
-1
-1
round(x)
2
2
1
-1
-2
-2
Operao
Potenciao
multiplicao, diviso
Adio, subtrao
Associatividade
da direita para a esquerda
da esquerda para a direita
da esquerda para a direita
Exemplos:
2+10/5
A+B/C+D
R*3+B3/2+1
(A-B)/(C+D)
R*3+B^(3/2)+1
rnteses.
1.4
STRINGS
Strings so usados para toda e qualquer informao composta de caracteres alfanumricos e/ou caracteres especiais (exemplo, #, $, &, %, ?, !, @, <, ~, etc). Os strings so
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
ans =
abcdefgh
-->n = "Pedro"
n =
Pedro
-->m = "Paulo"
m =
Paulo
-->m + n
ans =
PauloPedro
-->m + " e " + n
ans =
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.
Devemos usar aspas duplas ou simples? A aspa simples tambm usado como operador de transposta
hermitiana (mas isto no acarreta problemas de programao). Por isso melhor usar as aspas duplas que
no possui tal duplo sentido e torna seu programa um pouco mais legvel.
-->m = "Pedro";
-->length(m)
ans =
5.
1.5
NMEROS COMPLEXOS
Parte real de z1
Parte imaginria de z1
Valor absoluto do nmero complexo
Argumento do nmero complexo
Conjugado
Seno de um nmero complexo
1.6
O ESPAO DE TRABALHO
1.6.1
O Comando Clear
O comando clear apaga todas a variveis do Espao de Trabalho criadas pelo usurio.
Exemplo:
-->clear
1.6.2
-->a+b
!--error
4
undefined variable : a
// variveis a e b no existem
// porque foram apagadas
-->load("dados.dat");
// recupera as variveis a, b e c
-->a+b
ans =
// Ok!
5.
1.7
far com que todas os nmeros sejam visualizados em 5 posies (incluindo o ponto
decimal e um espao para o sinal). Por exemplo,
-->sqrt(3)
ans =
1.73
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
10
1.8
%inf
%nan
%i
%e
%t ou %T
%f ou %F
%s
%z
1.9
O nmero .
Constante que representa a preciso numrica da mquina. o menor nmero que, somado a 1, resulta em
um nmero maior que 1 no computador.
Representa infinito .
No
numrico (do ingls, Not A Number).
1.
A base do logaritmo natural.
Representa o valor booleano verdadeiro.
Representa o valor booleano falso.
Um polinmio com uma nica raiz em zero e s como
o nome da varivel. A constante %s definida como
poly(0,s).
Um polinmio com uma nica raiz em zero e s como
o nome da varivel. A constante %z definida como
poly(0,z).
A VARIVEL ANS
A varivel ans (abreviao da palavra inglesa answer) armazena o valor corrente de sada
do Scilab. Pode-se usar ans para efetuar clculos porque ela armazena o valor do ltimo
clculo realizado. Exemplo:
-->4+5
ans =
9.
-->cos(ans)+3
ans =
2.0888697
1.10
AJUDA
help ceil
co-seno
1.11
EXERCCIOS
1. O que so variveis?
11
b) XMU2
f) NOTA1
j) I00001
c) AH!
g) A[4]
l) NOTA/2
d) NOTA1
h) A&B
m) PEDROEPAULO
d) s =
d) X + Y + C * D
e) A + D + B ^ 2 + E * 3
f) A * B / C * D
12
Captulo
ARQUIVOS DE SCRIPTS
Este captulo trata de programas sequenciais em Scilab. Sero apresentados comandos de
entrada e sada alm de mostrar como editar e executar programas no Scilab.
2.1
Programas de computador podem solicitar dados do usurio via teclado usando o comando input que tem duas formas bsicas (uma para nmeros e outra para strings). A
primeira delas, usada para solicitar dados numricos, tem a seguinte forma:
<variavel> = input(<string>);
Esta funo mostra o texto <string> e em seguida solicita que o usurio digite um
nmero. Por fim, o nmero digitado atribudo a <variavel>. Exemplo:
-->x = input("Digite um nmero")
Digite um nmero-->10
x =
10.
A segunda forma do comando input usada para solicitar dados do tipo string ao
usurio. Sua forma :
<variavel> = input(<string>,"s");
Exemplo:
-->a = input("Digite alguma coisa","s")
Digite alguma coisa-->Ol
a
Ol
2.2
14
-->x = 3;
-->y = 4;
-->r = sqrt(x*x+y*y)
r =
5.
A FUNO DISP
A funo disp() outra maneira de exibir dados. Por exemplo,
-->v0 = 2;
-->a = 4;
-->t = 3;
-->v = v0+a*t;
-->disp(v)
14.
A FUNO PRINTF
A funo printf a forma mais flexvel de exibir dados porque produz uma sada printf um
clone do comando
formatada. Por exemplo,
-->printf("Al mundo\n");
Al mundo
O caracter \n (chamado de new line) avisa ao comando printf para gerar uma nova
linha. Mais precisamente, \n move o cursor para o comeo da linha seguinte. Por exemplo, colocando \n aps o string Al faz com que printf gere uma nova linha aps
Al:
-->printf("Al\nmundo");
Al
mundo
de mesmo nome da
linguagem de
programao C.
Mais exemplos:
-->printf("A = %g B = %g",A,B);
A = 2 B = 5
-->printf("A = %g\nB = %g\n",A,B);
A = 2
B = 5
-->F = "Os valores calculados foram %g e %g";
-->printf(F,A,B);
Os valores calculados foram 2 e 5
2.3
ARQUIVOS DE SCRIPTS
15
Arquivos de script so arquivos de texto puro ou plano, isto , arquivos sem formataes como negrito, itlico e sublinhado e, por causa disso, eles podem ser criados em
qualquer editor de texto. O Scilab j contm um editor de textos (chamado SciNotes) que
facilita a criao de arquivos de script. Por isso recomendvel utilizar o SciNotes em
vez de algum outro editor de texto. Mas se voc quiser usar um editor diferente, como
o Microsoft Word, tenha o cuidado de salvar os arquivos como um arquivo texto. Caso
contrrio, se o arquivo for salvo no formato nativo (e.g., o formato doc do Word) podero
conter caracteres especiais que causaro erros no Scilab.
2.4
Note que o arquivo de script acima contm comandos para converter graus Farenheit
em graus Celsius.
1
As figuras mostradas nesta seo podem no corresponder exatamente a verso do scilab que voc
utilizando.
16
O prximo passo salvar o arquivo de script. Selecione a opo ARQUIVO SALVAR. Digite o nome farenheit.sce (os nomes de arquivos de script possuem extenso .sce) e selecione a pasta de sua preferncia para salvar o arquivo.
2.5
17
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).
2.6
EXEMPLOS
Exerccio resolvido 2.6.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:
q
d = (x1 x2 )2 + (y1 y2 )2
Soluo:
1
2
3
4
5
6
7
8
Exerccio resolvido 2.6.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:
1
1
1
=
+
Req
R1 R2
Esta frmula, tambm pode ser reescrita como:
Req =
R1 R2
R1 + R2
Soluo:
1
2
3
4
18
2.7
LINHAS DE COMENTRIOS
Comentrios podem ser inseridos em um programa para dar clareza e assim fazer as
pessoas compreenderem o que nele est escrito. Comentrios so inseridos aps smbolo
//. O smbolo // indica que o resto da linha (i.e., o comentrio) deve ser ignorado pelo
Scilab. Um exemplo mostrado a seguir:
1
2
3
4
5
6
2.8
19
Uma forma alternativa de executar scripts atravs do comando exec. O comando exec
tem a forma:
exec(<script>)
Como exemplo, considere o script farenheit.sce descrito na seo 2.4.
-->exec("farenheit.sce");
Digite os graus Farenheit-->50
Equivale a 10 graus Celsius.
Resolva este problema alterando o diretrio atual: selecione ARQUIVO ALTERAR O DIRETRIO ATUAL e depois escolha a pasta de farenheit.sce (i.e.,
c:\exemplos) na caixa de dilogo a seguir:
Boa
programao:
insira comentrios
para explicar o
funcionamento do
programa
-->exec("farenheit.sce");
Digite os graus Farenheit-->50
Equivale a 10 graus Celsius.
// executa o script
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
-->exec(c:\exemplos\farenheit.sce);
Digite os graus Farenheit-->50
Equivale a 10 graus Celsius.
2
Para executar um comando chdir (ou qualquer outro comando) automaticamente no inicio de uma sesso
do Scilab, inclua ele no arquivo de script de configurao scilab.star.
20
Captulo
ESTRUTURAS DE SELEO
Este captulo introduz as expresses booleanas e as estruturas de seleo que permitem
os programas tomarem decises.
3.1
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.
A estruturas de seleo so teis para implementar situaes que requerem a execuo
de aes alternativas que dependem de certas condies. Exemplos:
Se a nota do aluno for maior que 7 ento avise que ele foi "aprovado"; caso contrrio
informe que ele est em recuperao.
Se a lmpada est queimada compre uma nova lmpada; caso contrrio acenda a
lmpada para ler o livro.
Compre ou venda aes da bolsa de valores de acordo se ndices econmicos sobem
ou descem, respectivamente.
Portanto, a estrutura de seleo um mecanismo para selecionar entre caminhos
alternativos de execuo comandos.
A estrutura de repetio um mecanismo para repetir a execuo de uma sequncia de comandos. Os comandos que implementam estes mecanismos so chamados de
comandos de controle. So exemplos de comandos de controle: IF, FOR e WHILE
mostrados adiante. Uma estrutura de controle formado por um comando de controle
juntamente com o conjunto de comandos cuja execuo ele controla.
Com estas trs estruturas:
1. Sequncia,
2. Seleo,
21
22
3. Repetio,
possvel construir qualquer programa de computador (esta a tese principal da chamada
programao estruturada).
A estrutura de seleo ser estudada neste captulo e a estrutura de repetio no captulo 4. O uso das estruturas de seleo requer o domnio das expresses booleanas
estudadas na seo seguinte.
3.2
EXPRESSES BOOLEANAS
Da mesma forma que avaliar uma expresso aritmtica produz um valor numrico, avaliar
expresses booleanas produz um valor lgico (verdadeiro ou falso). Expresses booleanas so tambm chamadas de expresses lgicas.
Uma expresso booleana simples usa os operadores relacionais para comparar expresses aritmticas:
Operadores Relacionais
Operador
Descrio
<
Menor que
<=
Menor ou igual a
>
Maior que
>=
Maior ou igual a
==
Igual a
<> ou =
Diferente de
O termo
booleano,
largamente usado
na computao,
uma homenagem
ao matemtico e
lgico George
Boole.
Verdadeiro
Falso
Verdadeiro
No (negao)
Os operadores so definidos pelas seguintes tabelas (tambm chamadas de tabelas
verdade):
A
Verdadeiro
Verdadeiro
Falso
Falso
B
Verdadeiro
Falso
Verdadeiro
Falso
A & B
Verdadeiro
Falso
Falso
Falso
A | B
Verdadeiro
Verdadeiro
Verdadeiro
Falso
~A
Falso
Falso
Verdadeiro
Verdadeiro
Verdadeiro
Falso
Verdadeiro
programadores
principiantes
costumam
confundir o
operador Igual a
(==) com o
operador de
atribuio (=).
3.3
VARIVEIS BOOLEANAS
Da mesma forma que contedo de uma varivel pode ser um valor numrico ou um string,
ela pode conter um valor booleano (verdadeiro ou falso). Assim,
C = 1 > 2
A = C | 2 > 10
falso.
falso.
No Scilab, duas variveis especiais %t (do ingls, true) e %f (do ingls, false) representam o valor verdadeiro e falso, respectivamente. Exemplos:
B = %f
A = %t
C = A | B
3.4
O Scilab manipula trs tipos primitivos de informao que consta na maioria das linguagens de programao tradicional:
1. O nmero real;
2. O tipo string;
3. O tipo booleano.
O Scilab no possue o tipo nmero inteiro (usado em muitas linguagens). O tipo da
varivel pode mudar toda vez que um valor lhe atribudo. O novo tipo ser o mesmo do
ltimo valor atribudo. Exemplo:
A = 2.5;
A = "livro";
3.5
A ordem de avaliao entre todos operadores que j foram descritos dado na Tabela 3.1.
Exemplos:
K | P &
A > B | D < E
23
6a
7a
8a
~
^
*
/
+
<
<=
>
>=
==
<> ou =
&
|
no
potenciao
multiplicao
diviso
Adio
Subtrao
Menor que
Menor ou igual a
Maior que
Maior ou igual a
Igual a
Diferente de
e
ou
~ ( 2 < 5 ) | 40 / 5 == 10 & 6 +
~ %t
| 40 / 5 == 10 & 6 +
%f
| 40 / 5 == 10 & 6 +
%f
|
8
== 10 & 6 +
%f
|
8
== 10 & 8 >
%f
|
8
== 10 & %t
%f
|
%f
& %t
%f
|
%f
&f
3.6
2
2
2
2
5
>
>
>
>
5
5
5
5
24
25
Resultado
digite a primeira nota-->7.5
digite a segunda nota-->8.1
Sua mdia 7.8
Parabns!
Comentrio. Este programa escreve a mdia do aluno, mas s executa a linha 6 se sua
nota for maior que 7.
3.7
Caracteriza-se por selecionar entre duas sequncias de comandos quando certas condi- Boa
es, representadas por expresses booleanas, forem satisfeitas. A seleo bidirecional programao:
Sempre use
tem a seguinte forma:
endentao, ou
seja, acrescente
dois espaos antes
dos comandos que
esto aninhados no
comando IF para
melhorar a
A primeira sequncia de comandos ser executada se a expresso booleana devolver legibilidade do
um valor verdadeiro, caso contrrio a segunda sequncia de comandos ser executada. Os programa.
if <expresso booleana>
<primeira sequncia de comandos>
else
<segunda sequncia de comandos>
end
bimestral-->8.4
bimestral-->7.3
bimestral-->9.1
bimestral-->8.5
3.8
ANINHANDO SELETORES
Comandos de seleo podem ser aninhados de diversas formas criando ampla variedade
de construes como mostra os exemplos a seguir.
Exerccio resolvido 3.8.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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bimestral");
bimestral");
bimestral");
bimestral");
nota4)/4;
if media >= 7
printf("Aprovado\n");
else
if media >= 5
printf("Recuperao\n");
else
printf("Reprovado\n");
end
end
Resultado
Digite a 1a.
Digite a 2a.
Digite a 3a.
Digite a 4a.
Media = 6.7
Recuperao
nota
nota
nota
nota
bimestral-->7.3
bimestral-->6.5
bimestral-->5.5
bimestral-->7.5
26
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 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 3.8.2.
menor deles.
Soluo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Verifica se as medidas
formam um tringulo.
Trs lados iguais.
// No satisfez a propriedade da
// desigualdade triangular.
end
Resultado
Digite a primeira medida-->5
Digite a segunda medida-->5
Digite a terceira medida-->3
Tringulo issceles
Resultado
Digite a
Digite a
Digite a
No um
primeira medida-->5
segunda medida-->3
terceira medida-->1
tringulo
28
Situao
a=0eb=0
Ao
Escrever que a equao degenerada.
Calcular e escrever a nica raiz
x = c/b.
Calcular e escrever as duas razes:
a = 0 e b 6= 0
a 6= 0 e c = 0
x1 = 0
x2 = b/a
a 6= 0 e c 6= 0 e 0
b +
x1 =
2a
b
x2 =
2a
a 6= 0 e c 6= 0 e < 0
Soluo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//
// Programa para calcular as razes de uma equao do 2o grau
//
a=input("Digite o coeficiente a :");
b=input("Digite o coeficiente b :");
c=input("Digite o coeficiente c :");
if (a==0) & (b==0)
// Equacao degenerada.
printf("Equacao degenerada\n");
end
if (a==0) & (b<>0)
// Equao do 1o grau
printf("Raiz nica em %g.\n",-c/b);
end
if (a<>0) & (c==0)
// Equacao do 2o grau com raizes reais em 0 e -b/a
x = -b\a;
printf("Raiz1 = 0\n");
printf("Raiz2 = %g\n",x);
end
if (a<>0) & (c<>0)
disc = b*b - 4*a*c;
// Equacao do 2o grau
// Clculo do discriminante
if disc >= 0
// Teste do discriminante
// Raizes reais.
x1 = -b/(2*a) + sqrt(disc)/(2*a);
x2 = -b/(2*a) - sqrt(disc)/(2*a);
printf("Raiz1 = %g\n",x1);
printf("Raiz2 = %g\n",x2);
29
33
34
35
36
37
38
39
40
else
// Raizes complexas
pr = -b/(2*a);
pi = sqrt(abs(disc))/(2*a);
printf("Parte Real = %g\n",pr);
printf("Parte Imaginria = %g\n",pi);
end
end
Resultado
Digite o coeficiente a :-->1
Digite o coeficiente b :-->-5
Digite o coeficiente c :-->6
Raiz1 = 3
Raiz2 = 2
Resultado
Digite o coeficiente a :-->0
Digite o coeficiente b :-->5
Digite o coeficiente c :-->10
Raiz nica em -2.
Resultado
Digite o coeficiente a :-->2
Digite o coeficiente b :-->3
Digite o coeficiente c :-->6
Parte Real = -0.75
Parte Imaginria = 1.56125
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):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//
// Programa para calcular as razes de uma equao do 2o grau
// Esta verso manipula os nmeros complexos diretamento.
a=input("Digite o coeficiente a :");
b=input("Digite o coeficiente b :");
c=input("Digite o coeficiente c :");
if (a==0) & (b==0)
// Equacao degenerada.
printf("Equacao degenerada\n");
end
if (a==0) & (b<>0)
// Equao do 1o grau
printf("Raiz nica em %g.\n",-c/b);
end
30
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 =
F
-->isreal(3)
ans =
T
31
Captulo
ESTRUTURAS DE REPETIO
4.1
LAOS
Computadores so frequentemente usados para repetir uma mesma operao muitas vezes. Para fazer isso, utiliza-se uma estrutura de repetio. Ela faz com que um conjunto
de comandos seja executado zero, uma ou mais vezes. A estrutura de repetio , tambm, chamado de lao (do ingls, loop). O conjunto de comandos que se repete em um
lao denominado de corpo do lao. H dois tipos de lao no Scilab:
1. Lao controlado logicamente;
2. Lao controlado por contador.
No lao controlado logicamente, os comandos (i.e., o seu corpo) so repetidos indefinidamente enquanto uma certa expresso booleana for satisfeita. No lao controlado por
contador, os comandos so repetidos um nmero predeterminado de vezes.
Denomina-se iterao a repetio de um conjunto de comandos. Portanto, cada execuo do corpo do lao, juntamente com a condio de terminao do lao, uma iterao.
Nas sees seguintes sero estudados as estruturas de repetio do Scilab.
4.2
Enquanto a <expresso booleana> for verdadeira o <conjunto de comandos> repetido indefinidamente. No momento em que <expresso booleana> for falsa o <conjunto
de comandos> no ser mais repetido. Vale salientar que se <expresso booleana> for
falsa da primeira vez, o <conjunto de comandos> jamais ser executado.
A elaborao de programas com laos envolve, frequentemente, o uso de duas variveis com funes especiais: os contadores e os acumuladores na qual sero mostradas a
seguir. Considere os seguintes clculos no console do Scilab:
-->i = 1
i =
32
1.
-->i = i + 1
i =
2.
-->i = i + 1
i =
3.
-->i = i + 1
i =
4.
i = 1;
while i <= 5
nota1 = input("Digite a 1a. nota
nota2 = input("Digite a 2a. nota
nota3 = input("Digite a 3a. nota
nota4 = input("Digite a 4a. nota
media = (nota1 + nota2 + nota3 +
printf("Media = %g\n",media);
i = i + 1;
end
printf("Fim do programa");
bimestral");
bimestral");
bimestral");
bimestral");
nota4)/4;
Resultado
Digite a 1a. nota
Digite a 2a. nota
Digite a 3a. nota
Digite a 4a. nota
Media = 7.8
Digite a 1a. nota
Digite a 2a. nota
Digite a 3a. nota
Digite a 4a. nota
Media = 6.975
Digite a 1a. nota
Digite a 2a. nota
Digite a 3a. nota
Digite a 4a. nota
Media = 7.275
Digite a 1a. nota
Digite a 2a. nota
Digite a 3a. nota
bimestral-->7.5
bimestral-->8.2
bimestral-->8.3
bimestral-->7.2
bimestral-->6.5
bimestral-->6.2
bimestral-->8.2
bimestral-->7.0
bimestral-->8.2
bimestral-->7.8
bimestral-->4.8
bimestral-->8.3
bimestral-->6.5
bimestral-->7.1
bimestral-->8.3
33
bimestral-->6.8
bimestral-->9.1
bimestral-->8.5
bimestral-->9.3
bimestral-->9.5
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.
Exerccio resolvido 4.2.2.
inteiros entre 1 e 100.
Soluo:
34
35
1
2
3
4
5
6
7
cont= 1;
soma = 0;
while cont <= 100
soma = soma + cont;
cont = cont + 1;
end
printf("Soma total = %g\n",soma);
Resultado
Soma total = 5050
Comentrio. O programa inicializa as variveis cont e soma com 1 e 0, respectivamente (porque?). Cada vez que o corpo do lao executado, o valor de soma incrementado com o valor corrente da varivel cont. Deste modo, a varivel soma assume
os seguintes valores a cada repetio do lao.
4.3
primeira iterao
segunda iterao
terceira iterao
..
.
ltima iterao
5050
Boa
programao:
sempre inicialize
os contadores e
acumuladores.
O comando FOR o lao controlado por contador do Scilab. Ele repete a execuo de um
conjunto de comandos (i.e., o seu corpo) um nmero pr-determinado de vezes. Na forma
bsica, o lao FOR possui o nome de uma varivel (chamada de varivel de controle) e
especifica seu valor inicial e final e, opcionalmente, o tamanho do passo (ou incremento)
da varivel de controle. Ver a Figura 4.1.
O seguinte programa escreve a palavra disciplina 10 vezes:
for i=1:10
printf("disciplina\n");
end
36
for i=2:2:50
printf("%g ",i);
end
Resultado
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
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 4.3.2. Elabore um programa para calcular 5! (fatorial de 5)
1
2
3
4
5
6
fat = 1;
for cont=2:5
fat = fat * cont;
end
printf("O fatorial de 5 igual a %g\n",fat);
Resultado
O fatorial de 5 igual a 120
Comentrio. Note que a cada interao do lao, a varivel fat assume os seguintes
valores
incio
primeira iterao
segunda iterao
terceira iterao
quarta iterao
4.4
1
2
3
4
5
6
2 denominador 1 = numerador
Usaremos esta relao para calcular cada termo da srie no seguinte programa:
1
2
3
4
5
s = 0;
for d=1:50
s = s + (2*d-1)/d;
end
printf("Valor de S = %g\n",s);
Resultado
Valor de S = 95.5008
37
a
544
119
68
51
17
b
119
68
51
17
0
r(resto)
68
51
17
0
a = input("Digite um nmero");
b = input("Digite um nmero");
r = 1;
while r <> 0
r = modulo(a, b);
a = b;
b = r;
end
printf("O M.D.C. %g\n",a);
n = input("Digite um nmero");
valormax = n;
while n < -1
if n > valormax
valormax = n;
end
n = input("Digite um nmero");
end
printf("Valor mximo = %g\n",valormax);
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
sequencia.
Resultado
Digite um nmero-->28
Digite um nmero-->15
Digite um nmero-->81
Digite um nmero-->-34
Digite um nmero-->3
Digite um nmero-->-1
Valor mximo = 81
38
1
2
3
4
5
6
7
8
9
10
11
12
4.5
LAOS ANINHADOS
Este programa escreve quatro vezes o caracter x em uma linha como segue:
xxxx
Pode-se usar laos aninhados para produzir diversas linhas de xxxx, conforme ilustra do
no seguinte exemplo:
Exerccio resolvido 4.5.1. O seguinte programa gera uma sequencia de quatro xs por
linha. O nmero de linhas digitado pelo usurio.
1
2
3
4
5
6
7
39
printf("
1
2
3
4
5
6
7
8
9
10\n");
printf("
------------------------------------------------\n");
for i=1:10
printf("%2.0f ",i);
for j = 1:10
printf("%3.0f ",i*j);
end
printf("\n");
end
1
2
3
4
5
6
7
8
9
10
Resultado
1
2
3
4
5
6
7
8
9
10
-----------------------------------------------1
2
3
4
5
6
7
8
9
10
2
4
6
8
10
12
14
16
18
20
3
6
9
12
15
18
21
24
27
30
4
8
12
16
20
24
28
32
36
40
5
10
15
20
25
30
35
40
45
50
6
12
18
24
30
36
42
48
54
60
7
14
21
28
35
42
49
56
63
70
8
16
24
32
40
48
56
64
72
80
9
18
27
36
45
54
63
72
81
90
10
20
30
40
50
60
70
80
90 100
40
mesma linha. Em seguida, a varivel j assume o valor um. O lao interno das linhas 5-7
repetido 10 vezes escrevendo a tabuada de um. Quando o lao interno termina (aps 10
repeties), o comando printf("\n") da linha 8 gera uma nova linha. O programa
retorna para a linha 3. Na linha 3, o valor da varivel i atualizado para dois. Em
seguida, o programa executa novamente o lao interno e o programa escreve a tabuada de
dois. Novamente, o programa executa o comando printf("\n") gerando uma nova
linha e o programa retorna a linha 3, onde a varivel i atualizado para trs. A tabuada
de trs ento escrita. Lao externo continua at a varivel i ser igual a dez.
41
Captulo
MATRIZES
Matrizes so agregados de dados dentro de uma mesma varivel. Matrizes so agregados
de dados homogneos no sentido de que os dados tm sempre mesmo tipo de contedo,
ou seja, uma matriz pode conter somente dados numricos ou somente strings, mas no
os dois simultaneamente 1 . No jargo da informtica, agregados de dados homogneos
so frequentemente chamados de arrays ou arranjos. Preferimos o termo matriz (ao invs
de array) porque mais usual no jargo da matemtica.
5.1
VETORES
42
Uma aplicao de vetores armazenar variveis indexadas da matemtica. Por exemplo, as variveis indexadas x1 = 2, x2 = 4, x3 = 2 e x4 = 3 so armazenadas como:
-->x(1) = 2;
-->x(2) = 4;
-->x(3) = 2;
-->x(4) = 3;
ou equivalentemente como
-->x = [2 4 2 3];
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.
5.1.1
3.
7.
9.
8.
4. !
Os elementos de um vetor podem ser acessados de vrias maneiras. Por exemplo, considere as variveis:
43
44
a = [2 4 5 1 3];
i = 2;
Ento tem-se:
a(i+2)
a(a(4))
a(a(3))+a(2*i)
nota = [8.1 5.2 9.2 7.2 6.5 5.2 8.5 9.5 6.5 10.0];
soma = 0;
for i=1:10
soma = soma + nota(i);
end
printf("Mdia das notas = %g\n",soma/10);
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).
Exerccio resolvido 5.1.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.
1
2
3
4
5
6
7
8
9
10
11
12
for i=1:10
a(i) = input("Digite um valor");
end
for i=1:10
b(i) = input("Digite um valor");
end
for i=1:10
c(i) = 2*(a(i)+b(i));
end
for i=1:10
printf("%g ",c(i));
end
// Leitura de A e B
// Calculo de C
// Escreve de C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for i=1:10
// Leitura de A e B
a(i) = input("Digite um valor");
end
for i=1:10
b(i) = input("Digite um valor");
end
for i=1:10
if modulo(i,2)<>0
// Testa se o ndice i mpar.
c(i) = a(i);
// Se for mpar c(i) recebe o valor de a(i)
else
c(i) = b(i);
// Se for par c(i) recebe o valor de b(i)
end
end
for i=1:10
// Escreve o vetor C
printf("%g ",c(i));
end
5.2
MATRIZES BIDIMENSIONAIS
Matrizes bidimensionais usam dois ndices para individualizar elementos. Na Figura 5.2
mostrada uma matriz. Matrizes so construdas usando colchetes. Cada linha da matriz
separada por um ponto e vrgula e cada elemento de uma linha separado por espao
(ou vrgula). Por exemplo, a seguinte matriz da matemtica,
2 3 4
A=
4 5 2
poderia ser construda pelo comando:
-->a = [2 3 4; 4 5 2]
a =
!
!
2.
4.
3.
5.
4. !
2. !
2.
4.
3.
5.
4. !
2. !
45
-->a(2,3)
ans =
2.
-->a(1,3)
ans =
4.
3 1 2 4
5 5 8 6
A=
8 10 11 5
9 1 5 7
2 3 8 8
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];
46
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);
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
for j=1:4
printf("%3.0f ",a(i,j));
end
printf("\n");
end
47
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
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.
5.3
VETORES DE STRING
O vetor mes foi construdo de tal modo que h uma correspondncia entre o nmero
do ms e o ndice do elemento. Por exemplo, o ms de nmero 11 (novembro) acessado
pelo elemento mes(11). Este fato usado para resolver o exerccio a seguir.
Exerccio resolvido 5.3.1. Elaborar um programa que leia o dia, o nmero de ms e
o ano e escreva a dada no formato D de MMM de AAAA(ou D de MMM de AA).
Por exemplo, se o dia 31, o ms 12 e o ano 2003, ento o programa dever escrever
1 de dez de 2003.
48
Soluo:
1
2
3
4
5
mes = ["jan" "fev" "mar" "abr" "jun" "jul" "ago" "set" "nov" "dez"];
dia = input("Digite o dia");
nunmes = input("Digite o numero do mes");
ano = input("Digite o ano");
printf("%g de %s de %g\n",dia,mes(nunmes),ano);
Resultado
Digite o
Digite o
Digite o
2 de abr
dia-->2
numero do mes-->4
ano-->2003
de 2003
Exerccios
O que este programa escreve?
1
2
3
4
5
6
7
8
5.4
ESTUDO DE CASO
Comumente o clculo da mdia das notas pode ser efetuado pelo seguinte trecho de programa:
soma = 0;
for i = 1:4
nota = input("Digite a nota");
soma = soma + nota;
end
media = soma/4;
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.
49
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
50
26
27
printf("%s\n",aluno5);
end
Novamente, suponha que, ao invs de uma turma com cinco alunos, houvessem 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.
1
2
3
4
5
6
7
8
9
10
11
12
soma = 0;
// acumulador das notas
for i = 1:10000
aluno(i) = input("Digite o nome do aluno","s");
nota(i) = input("Nota");
soma = soma + nota(i);
end
media = soma/10000;
// calculo da media
for i = 1:10000
if nota(i) >= media
printf("%s\n",aluno(i));
end
end
51
5.5
5.5.1
52
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).
1
2
3
4
5
6
7
8
9
10
11
12
13
n = length(a);
HouveTroca = %t;
while HouveTroca
HouveTroca = %f;
for i = 1:(n-1)
if a(i) > a(i+1)
temp = a(i);
a(i) = a(i+1);
a(i+1) = temp;
HouveTroca = %t;
end
end
end
// Houve troca
53
temp = a(i);
a(i) = a(i+1);
a(i+1) = temp;
A varivel temp uma varivel temporria usada apenas para guardar o valor de a(i)
antes que o mesmo seja perdido na atribuio a(i) = a(i+1).
Exerccio 5.5.1. Modifique trecho de programa que contm algoritmo da bolha para
colocar o vetor em ordem decrescente (troque o operador > por < na linha 6). Use esta
modificao para elaborar um programa para ler um vetor com 5 elementos, coloca-lo em
ordem decrescente e escreve-lo.
5.5.2
Os nmeros aleatrios gerados por rand so nmeros fracionrios no intervalo [0, 1].
No entanto, o problema pede para gerar nmeros inteiros aleatoriamente entre 1 e 6 de
modo a simular o lanamento de um dado. Isto pode ser obtido com o seguinte procedimento. Primeiro, multiplica-se rand por 6 para gerar nmeros no intervalo [0, 6]. Por
exemplo:
-->6*rand()
Em seguida, usa-se a funo fix() para gerar apenas nmeros inteiros entre 0 e 5
(inclusive). Por exemplo,
-->fix(6*rand())
Por fim, adiciona-se o valor 1 na expresso anterior para gerar nmeros inteiros entre
1 e 6.
-->fix(6*rand())+1)
e obtm-se, deste modo, nmeros inteiros aleatrios entre 1 e 6 na qual simula o lanamento de um dado como requerido.
Ser utilizado, tambm, um vetor f que armazena a freqncia de cada dado. Por
exemplo, o elemento f(1) armazena a freqncia do dado 1, o elemento f(2) armazena a
freqncia do dado 2, e assim por diante. Soluo:
54
1
2
3
4
5
6
7
8
9
10
11
55
for i = 1:6
f(i) = 0;
// inicializa o vetor de frequencias
end
for i=1:100
r = fix(6*rand())+1; // lanamento do dado
f(r) = f(r)+1;
// adiciona 1 ao dado r
end
for i=1:6
f(i) = f(i)/100;
// divide o vetor f por 100 para obter a frequencia.
printf("freqncia do dado %1.0f = %5.2f\%\n",i,f(i));
end
5.5.3
do
do
do
do
do
do
dado
dado
dado
dado
dado
dado
1
2
3
4
5
6
=
=
=
=
=
=
0.12%
0.13%
0.29%
0.22%
0.13%
0.11%
Exerccio resolvido 5.5.3. Alguns candidatos prestaram concurso para cinco vagas em
uma empresa. Os resultados das provas do concurso esto armazenadas nas seguintes
matrizes:
Nome
Ana
Carlos
Francisco
Jos
Magali
Marcos
Maria
Marta
Paulo
Pedro
Matemtica
Portugus
Digitao
6,5
8,0
7,5
6,1
5,1
4,1
9,1
8,8
9,5
8,2
7,1
8,3
8,1
5,2
6,1
5,5
8,9
8,5
9,3
8,5
7,5
7,2
8,3
6,0
6,5
5,4
9,4
9,0
9,1
7,8
7.1
8.3
8.1
5.2
7.5;
7.2;
8.3;
6.0;
...
...
...
...
5.1
4.1
9.1
8.8
9.5
8.2
6.1
5.5
8.9
8.5
9.3
8.5
6.5; ...
5.4; ...
9.4; ...
9.0; ...
9.1; ...
7.8];
[m,n]=size(nota);
for i=1:m
soma = 0;
for j=1:n
soma = soma+nota(i,j);
end
media(i)=soma/3;
end
printf("Nome
Media\n");
// linha de cabeario
for i=1:m
printf("%-10s %3.1f\n",nome(i),media(i));
end
Resultado
Nome
Ana
Carlos
Francisco
Jos
Magali
Marcos
Maria
Marta
Paulo
Pedro
Media
7.0
7.8
8.0
5.8
5.9
5.0
9.1
8.8
9.3
8.2
maior = 0.0;
m = size(nota,1);
for i=1:m
if nota(i,2) > maior
maior = nota(i,2);
imaior = i;
// Armazena o ndice da maior nota.
end
end
printf("A maior nota de portugus: %s, %3.1f\n",nome(imaior),maior);
d) Elabore um programa para escrever um relatrio dos candidatos em ordem de classificao dos candidados.
O soluo desta questo mostrado no programa listado abaixo. Na primeira parte
do programa (linhas 1-8), calcula-se a mdia da mesma maneira que no item(b)
deste exerccio. Na segunda parte do programa (linhas 10-25) feita a ordenao
dos vetores com o algoritmo da bolha. O vetor ordenado o vetor media, mas
56
note que para cada dois elementos trocados do vetor do media tambm trocado
os respectivos elementos do vetor nome para acompanhar a mesma ordem do vetor
media. Na ltima parte do programa (linha 27-30) impresso o relatrio dos
candidatos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[m,n]=size(nota);
for i=1:m
// Computa as medias dos alunos
soma = 0;
for j=1:n
soma = soma+nota(i,j);
end
media(i)=soma/3;
end
// ordenao e troca dos elementos
HouveTroca = %t;
while HouveTroca
HouveTroca = %f;
for i = 1:(m-1)
if media(i) < media(i+1)
temp = media(i);
// troca o elemento media i com i+1
media(i) = media(i+1);
media(i+1) = temp;
temp = nome(i);
// troca o elemento nome2 i com i+1
nome(i) = nome(i+1);
nome(i+1) = temp;
HouveTroca = %t;
// Houve troca
end
end
end
printf("
Nome
Media\n");
// linha de cabeario
for i=1:m
printf("%2.0f- %-10s %3.1f\n",i,nome2(i),media(i));
end
Resultado
12345678910-
Nome
Paulo
Maria
Marta
Pedro
Francisco
Carlos
Ana
Magali
Jos
Marcos
Media
9.3
9.1
8.8
8.2
8.0
7.8
7.0
5.9
5.8
5.0
57
Captulo
MANIPULAO MATRICIAL
A manipulao matricial uma das mais interessantes caractersticas do Scilab porque
reduzem susbtancialmente a quantidade de linhas de cdigo e, frequentemente, torna o
programa mais eficiente.
6.1
CONSTRUO DE MATRIZES
Exemplo,
-->1:2:15
ans =
!
1.
3.
5.
7.
9.
11.
13.
15. !
1.
2.
3.
4.
5. !
10.
-->log(a)
12.5
15.
17.5
20. !
58
ans
!
59
2.3025851
2.5257286
2.7080502
2.8622009
2.9957323 !
0.
0.7071068
1.
0.7071068
1.225E-16 !
// Um vetor coluna
1. !
2. !
3. !
-->a
ans =
!
1.
2.
3. !
Concatenao de Matrizes
Uma operao muito comum a concatenao de matrizes. Por exemplo:
-->a = [1 2 3];
-->b = [4 5 6];
-->[a b]
ans =
!
1.
2.
3.
2.
5.
3. !
6. !
4.
5.
-->[a; b]
ans =
6. !
!
!
1.
4.
->[a; 5 4 3]
ans =
!
!
1.
5.
2.
4.
3. !
3. !
Mais exemplos:
-->c = [1 2 3 4];
-->d = [2 3 1 2; 3 4 5 4; 5 6 7 4]
d =
2.
3.
5.
3.
4.
6.
1.
5.
7.
2.
4.
4.
1.
5.
7.
3.
3.
2.
4.
4.
4.
4.
1.
5.
7.
2.
4.
4.
-->[d; c; c]
ans =
2.
3.
5.
1.
1.
3.
4.
6.
2.
2.
-->[d a b]
ans =
2.
3.
5.
3.
4.
6.
1.
2.
3.
4.
5.
6.
n = 10;
x = [];
// x inicializado com uma matriz vazia
for i=n:-1:1
x = [x i^2];
end
linspace e logspace
Construmos um vetor de 5 elementos igualmente espaos entre 0 e 10 com o operador
dois pontos da seguinte forma:
-->1:0.125:1.5
ans =
!
1.
1.125
1.25
1.375
1.5 !
Note que precisamos conhecer o incremento de 0,125 para gerar o vetor acima. Se o
incremento no conhecido, pode ser mais simples usar a funo linspace para gerar
o vetor acima. Sua sintaxe
linspace(inicio,fim,n)
60
x = linspace(inicio,fim,n)
x = logspace(inicio,fim,n)
a = [1 2 3];
b = [8 9 2];
x = [a b];
x = [a; b];
1.
1.125
1.25
1.375
1.5 !
A funo logspace(inicio,fim,n) gera n elementos logaritmicamente espaados. O primeiro elemento 10 elevado ao inicio e o ltimo elemento 10 elevado ao
fim. Por exemplo:
-->logspace(1,2,4)
ans =
!
10.
21.544347
46.415888
100. !
Na verdade, a funo plot2d(x,y) apenas conecta os pontos dados por meio de linhas retas. Portanto, para obter uma aparncia suave da curva do grfico preciso uma
quantidade suficiente de pontos (no caso usamos 50 pontos).
Um resumo das operaes construo de matrizes mostrado na Tabela 6.1.
61
(a) v(2:4)
(b) a(1:3,2)
62
(c) a(2:3,1:3)
6.2
SECIONAMENTO DE MATRIZES
O Scilab permite manipulao de parte da matriz (uma submatriz). Esta operao denominada de secionamento (do ingls, slicing). Considere o vetor:
-->v = [2 5 6 3 8]
v =
!
2.
5.
6.
3.
8. !
Obtemos uma parte do vetor (subvetor) usando o comando v(2:4) que refere-se aos
elementos 2, 3, e 4 do vetor v (ver Figura 6.1(a)):
-->v(2:4)
ans =
!
5.
6.
3. !
Considere a matriz:
-->a = [2 3 1; 7 8 4; 2 8 8]
a =
!
!
!
2.
7.
2.
3.
8.
8.
1. !
4. !
8. !
3. !
8. !
8. !
7.
2.
8.
8.
4. !
8. !
2. !
7. !
2. !
-->a(2,:)
ans =
!
7.
8.
4. !
2.
2.
3.
8.
1. !
8. !
1.
4.
8.
3.
8.
8.
2. !
7. !
2. !
7.
8.
4. !
2.
7.
3. !
8. !
2.
7.
2.
3.
8.
8.
1. !
4. !
8. !
2.
7.
2.
2.
7.
3.
8.
8.
3.
8.
1.
4.
8.
1.
4.
!
!
!
!
!
63
2.
3.
1.
6.2.1
7.
8.
4.
2. !
8. !
8. !
Indexao Linear
2.
7.
2.
6.
3.
8.
8.
4.
1.
4.
8.
5.
!
!
!
!
64
A(v)
!
!
!
!
!
!
!
!
!
!
!
!
2.
7.
2.
6.
3.
8.
8.
4.
1.
4.
8.
5.
!
!
!
!
!
!
!
!
!
!
!
!
Outros exemplos,
-->A(2:5)
ans =
!
!
!
!
7.
2.
6.
3.
!
!
!
!
-->A([2 8 1])
ans =
!
!
!
7. !
4. !
2. !
6.3
O OPERADOR $
65
10.
8.
-->x(3:$)
ans =
!
6.
6.
4.
66
2. !
4.
2. !
4.
-->x(1:2:$)
ans =
!
10.
6.
-->x($:-1:1)
ans =
!
6.4
2.
2. !
// extrai os elementos na ordem inversa
4.
6.
8.
10. !
ATRIBUIO
2.
7.
2.
3.
4.
1.
1. !
5. !
8. !
2.
8.
2.
3.
7.
1.
1. !
2. !
8. !
Outro exemplo:
-->A(:,1) = 4
A =
!
!
!
4.
4.
4.
3.
7.
1.
1. !
2. !
8. !
Considere o vetor:
-->v = [2 4 7 1 3];
-->v([2 4]) = 8
v =
!
2.
8.
7.
8.
3. !
67
2.
8.
1.
3.
9.
2.
1. !
5. !
8. !
Quando voc atribui uma matriz vazia [] a uma linha (ou coluna), ela eliminada. Por
exemplo,
-->A(2,:) = []
A =
!
!
2.
1.
3.
2.
1. !
8. !
Considere a matriz B:
-->B = [2 3; 5 8]
B =
!
!
2.
5.
3. !
8. !
2.
5.
0.
3.
8.
0.
0.
0.
0.
0. !
0. !
4. !
Como a matriz B no possui a terceira linha e nem a quarta coluna, ela foi ampliada com
os novos elementos assumindo valor zero.
6.5
DIMENSO DE MATRIZES
- 1.5707963
0.
1.5707963
3.1415927 !
-->length(v)
ans =
5.
1.
3.
2.
4.
3.
5.
4.
6.
5. !
5. !
-->size(a)
ans =
!
2.
5. !
2.
Considere o vetor:
-->b = [3 1 2 4];
Apesar de ser um vetor, b interpretado, a seguir, como uma matriz 1x4. Por exemplo:
-->size(b,"c")
ans =
//
4.
6.6
OPERAES ESCALAR-MATRIZ
68
-->A = [1 2 3 4; 5 6 7 8]
A =
!
!
1.
5.
2.
6.
3.
7.
4. !
8. !
Exemplo de multiplicao:
-->2*A
ans =
!
!
2.
10.
4.
12.
6.
14.
8. !
16. !
Exemplos de diviso:
-->A/4
ans =
!
!
0.25
1.25
0.5
1.5
0.75
1.75
1. !
2. !
-->A(:,2)/2
ans =
!
!
1. !
3. !
Exemplos de expresses:
-->A-2
ans =
! - 1.
!
3.
0.
4.
1.
5.
2. !
6. !
-->3*A-2
ans =
!
!
1.
13.
4.
16.
7.
19.
10. !
22. !
-->5+3*A(1,:)
ans =
!
6.7
8.
11.
14.
17. !
OPERAES MATRIZ-MATRIZ
1.
5.
2.
6.
3.
7.
4. !
8. !
-->B = [3 1 3 8; 3 9 6 5]
B =
69
!
!
3.
3.
1.
9.
3.
6.
8. !
5. !
-->A+B
ans =
!
!
4.
8.
3.
15.
6.
13.
12. !
13. !
-->2*A-B
ans =
! - 1.
!
7.
3.
3.
3.
8.
0. !
11. !
1.
5.
2.
6.
3.
7.
-->v = [2; 3; 4; 5]
v =
!
!
!
!
2.
3.
4.
5.
4. !
8. !
// vetor-coluna
!
!
!
!
-->A*v
ans =
!
!
40. !
96. !
27. !
71. !
1.
5.
2.
6.
3.
7.
4. !
8. !
70
71
-->B = [3 1 3 8; 3 9 6 5]
B =
!
!
3.
3.
1.
9.
3.
6.
8. !
5. !
Multiplicao pontuada:
-->A.*B
ans =
!
!
3.
15.
2.
54.
9.
42.
32. !
40. !
Do mesmo modo, a diviso elemento por elemento, requer o uso do ponto (diviso pontuada):
-->A./B
ans =
!
!
0.3333333
1.6666667
2.
0.6666667
1.
1.1666667
0.5 !
1.6 !
Existe tambm a potenciao elemento por elemento que tambm requer o uso do ponto
(potenciao pontuada):
Em geral, o Scilab
utiliza menos laos
que as linguagens
de programao
tradicionais devido
sua habilidade de
substituir laos por
alguma operao
matricial.
-->[2 3 2 4].^[1 2 3 4]
ans =
2.
9.
8.
256.
Exemplo de expresso:
-->A.^(2+1)+B/2
ans =
!
!
2.5
126.5
8.5
220.5
28.5
346.
68.
!
514.5 !
A seguinte expresso:
-->2.^A
ans =
!
!
2.
32.
4.
64.
8.
128.
16. !
256. !
2 3
8
, , ,...,
8 8 8
8
Em muitas linguagens de programao este problema seria utilizar um lao FOR, como
por exemplo:
1
2
3
4
5
6
6.8
O Scilab foi especialmente projetado para simplificar clculos de Algebra Linear. Um dos
problemas mais comuns de Algebra Linear a soluo de sistemas de equaes lineares:
x1 x2 + 2x3 = 5
x x2 6x3 = 0
1
4x1
+ x3 = 5
Este sistema tambm pode ser escrito na forma matricial Ax = b:
1 1
2
x1
5
1 1 6 x2 = 0
4
0
1
x3
5
Iniciamos a soluo do sistema preparando as matrizes A e b:
-->A = [1 -1 2;
A =
!
!
!
1.
1.
4.
- 1.
- 1.
0.
2. !
- 6. !
1. !
-->b = [5 0 5]
b =
!
!
!
1 -1 -6; 4 0 1]
// A transposta importante!
5. !
0. !
5. !
6.9
Se a matriz possue nmeros complexos, o operador de transposio () produz a transposta conjugada, ou seja, aplica a transposio e a conjugao complexa na matriz. Por
exemplo:
1
O operador de diviso a direita / definido em termos do operador de diviso esquerda:
A/b = (A\b).
72
2. + i
3.i
5.
i
!
!
-->a
ans =
! - i
!
2. - i
!
5.
- 1. - 2.i !
- 3.i
!
- i
!
Use o operador de transposio pontuada (.) para produzir a transposta sem operao
de conjugao:
-->a.
ans =
!
!
!
i
2. + i
5.
- 1. + 2.i !
3.i
!
i
!
6.10
ZEROS E ONES
73
Captulo
FUNES
7.1
INTRODUO
7.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 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
-->a = [1 2 3; 4 5 6]
a =
!
!
1.
4.
2.
5.
3. !
6. !
-->[l c] = size(a)
c =
3.
=
2.
porque recebe uma matriz e devolve dois valores (o nmero de linhas e colunas).
7.3
A declarao:
function [y1,y2,...,ym] = nomedafuncao(x1,x2,x3,...,xn)
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
2
3
4
5
6
7
function y = fat(n)
p = 1;
for i = n:-1:2
p = p*i;
end
y = p;
endfunction
75
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.
10
X
S=
i! = 1! + 2! + . . . + 10!
i=1
Soluo:
1
2
3
4
soma = 0;
for j=1:10
soma = soma + fat(j);
end
Comentrio. Para executar este programa, o usurio deve, antes, carregar a funo
fat(). Isto pode ser feito atravs, por exemplo, da funo exec().
7.4
76
function y=func1(x)
comandos
endfunction
comandos
m=func2(n)
comandos
q=func3(p)
function y=func2(x)
comandos
endfunction
function y=func3(x)
comandos
b=func4(x)
function y=func4(x)
comandos
endfunction
comandos
endfunction
Figura 7.1: O programa principal chama as funes func1(), func2() e func3(). O controle transferido para as funes, mas sempre retorna ao programa principal. A funo
func3() chama func4() transferindo o controle para func4(). A funo func4(), quando
termina, retorna o controle ao programa chamador (que func3()).
1
2
3
4
5
6
7
8
function y = soma(x)
n = length(x);
// calcula o tamanho do vetor
s = 0;
for i=1:n
s = s + x(i);
end
y = s;
endfunction
1
2
3
4
function y = media(x)
n = length(x);
y = soma(x)/n; // chama a funo soma
endfunction
77
7.5
ESCOPO DE VARIVEIS
Relembremos que as variveis definidas no console do Scilab e pelos scripts so armazenadas em uma rea da memria chamada de espao de trabalho. Por exemplo,
--> clear;
--> x = 2;
--> y = 3;
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)
--> 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
2
3
4
5
6
7
function y = beta(x)
a = 3;
b = 2;
c = 5;
printf("a = %g b = %g
y = a + b + c + x;
endfunction
c = %g\n",a,b,c);
78
1
2
3
4
5
a = 23;
b = 50;
c = 200;
w = beta(2);
printf("a = %g
b = %g
c = %g\n",a,b,c);
7.5.2
Variveis Globais
function y = gama(x)
global R;
global S;
R = 1;
S = 2;
t = 3;
printf("R = %g S = %g
y = R + S + t + x;
endfunction
t = %g\n",R,S,t);
global R;
global S;
R = 5;
S = 10;
t = 15;
u = gama(2);
printf("R = %g
S = %g
t = %g\n",R,S,t);
S = 2
S = 2
t = 3
t = 15
79
function y = eta(x)
global S
S = x+3;
y = R + S;
endfunction
global S
R = 5;
S = 10;
u = eta(2);
printf("u = %g \n",u);
7.6
OS PROGRAMAS DO SCILAB
80
Boa
programao: use
caixa alta para
nomes de variveis
globais para tornar
claro ao leitor que
so globais e para
no confundir com
variveis locais.
7.7
PASSAGEM DE PARMETROS
Funes podem ter zero, um ou mais de um parmetros de entrada. Por exemplo, uma
funo com o seguinte cabealho possui um parmetro de entrada:
function x = fatorial(n)
a = 10;
b = 20;
c = 30;
r1 = 2;
r2 = 4;
r3 = 6;
[d1, d2, d3] = beta(r1,r2,r3)
printf("a=%g b=%g c=%g\n",a,b,c);
printf("d1=%g d2=%g d3=%g\n",d1,d2,d3);
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.
81
a+b+c
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
2
3
function d = dist(x1,y1,x2,y2)
d = sqrt((x2-x1)^2+(y2-y1)^2);
endfunction
x1
y1
x2
y2
x3
y3
=
=
=
=
=
=
input("digite
input("digite
input("digite
input("digite
input("digite
input("digite
x1");
y1");
x2");
y2");
x3");
y3");
// medida do lado A
// medida do lado B
// medida do lado C
s = (a+b+c)/2;
// semiperimetro
area = sqrt(s*(s-a)*(s-b)*(s-c));
printf("rea do tringulo = %g\n",area);
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
2
3
4
5
6
function y = inverte(x)
n = length(x);
for i=1:n
y(i) = x(n+1-i);
end
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 = 1
x2 x4 x6
+
+ ...
2!
4!
6!
82
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 (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:
1
2
3
4
5
6
7
8
9
10
function y = coseno(x,n)
s = 1;
for i=1:n
num = x^(2*i);
den = fat(2*i);
sinal = (-1)^i;
s = s + sinal*num/den;
end
y = s;
endfunction
function x = fat(n)
p = 1;
for i=n:-1:2
p = p*i;
end
x = p;
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.
Soluo:
1
2
3
4
5
6
7
8
function m = membro(x,a)
n = length(a);
i = 1;
while (i <= n & a(i) <> x)
i = i+1;
end
m = i <= n;
endfunction
83
Com estes dados, o lao executado quatro vezes. Na ltima vez, o contador i contm
o valor 5 e a avaliao do primeiro argumento resulta como falso. Porm, se o segundo
argumento fosse avaliado ento causaria um erro (porque o vetor a no possui o elemento
a(5)). Mas este erro no ocorre, porque o Scilab utiliza a avaliao de curto circuito na
qual o segundo argumento avaliado somente se o primeiro argumento no for suficiente
para determinar o valor da expresso booleana.
7.9
O COMANDO RETURN
Normalmente uma funo termina aps executar a ltima linha. O comando return, porm, pode interromper a execuo de uma function em qualquer ponto do programa. Por
exemplo,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
84
7.10
n
X
xi
i=1
1X
xi
n
n
mdia(x) =
i=1
1 X
(xi mdia(x))2
varincia(x) =
n1
i=1
p
desvio padro(x) =
varincia(x)
n
O primeiro programa de estatstica mostrado abaixo no emprega a tcnica da subrotina. Tornando-se grande e mais complexo.
85
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
d = 0;
for i = 1:n
d = d + (x(i)-media)^2;
end
dpad = sqrt(d/(n-1));
printf("O desvio padro igual a %g",dpad);
end
if opcao == 4
soma = 0;
for i=1:n
soma = soma + x(i);
end
media = soma/n;
d = 0;
for i = 1:n
d = d + (x(i)-media)^2;
end
var = d/(n-1);
printf("A varincia igual a %g",var);
end
86
As sub-rotinas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Funo soma
function y = soma(x)
n = length(x);
s = 0;
for i=1:n
s = s + x(i);
end
y = s;
endfunction
// Funo mdia
function y = media(x)
n = length(x);
y = soma(x)/n;
endfunction
// Funo varincia
function y = var(x)
n = length(x);
m = media(x);
d = 0;
for i = 1:n
d = d + (x(i)-m)^2;
end
y = d/(n-1);
endfunction
// Funo Desvio Padro
function y = dpad(x)
y = sqrt(var(x));
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
87
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.
88
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
89