Escolar Documentos
Profissional Documentos
Cultura Documentos
E. G. M. de Lacerda
Departamento de Engenharia de Computao e Automao (DCA)
UFRN estefane@dca.ufrn.br
17 de Abril de 2015
Resumo
1.4 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Arquivos de Scripts 13
2.6 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3 Estruturas de Seleo 21
4 Estruturas de Repetio 32
5 Matrizes 42
5.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6 Manipulao Matricial 58
6.3 O Operador $ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.4 Atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
7 Funes 74
7.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.8 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Captulo 1
PRELIMINARES
1
2
1.2 Variveis e o Comando de Atribuio / UFRN-DCA - 17 de Abril de 2015
-->
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.
ans =
16.
8.
-->
20.
Mais exemplos:
-->a=2;
-->b=4;
-->area=a*b // aqui o ponto e vrgula foi
area = // suprimido porque precisamos //
visualizar o resultado.
8.
2+3*cos(x)
X^(2*sin(y))
2+3*tan(x)+K^2
1.
// 2,718281828 ao quadrado
-->%e^2 ans =
7.389056098931
// valor absoluto
-->abs(-5) ans =
5.
-->modulo(6,3) ans =
0.
-->sign(-4) ans =
- 1.
-->sign(5) ans =
1.
-->a = 34.885;
35.
R*3+B3/2+1
B3 avaliada primeiro.
diviso.
1.4 STRINGS
Strings so usados para toda e qualquer informao composta de caracteres
alfanumricos e/ou caracteres especiais (exemplo, #, $, &, %, ?, !, @, <, ~, etc). Os strings
so
1.4 Strings / UFRN-DCA - 17 de Abril de 2015
-->a = "abcd" a =
abcd
-->b = efgh b =
efgh
Maria e Jose
abcdefgh
-->n = "Pedro" n =
Pedro
-->m = "Paulo" m =
Paulo
3Devemos 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.
8
-->m + n // Concatena Paulo com Pedro sem
ans = // espao entre eles.
PauloPedro
Muitas vezes precisamos armazenar informaes que contm as aspas. Isto pode ser
feito repetindo as aspas. Exemplos:
5.
a camisa 10
1234
-->evstr(a) + 10 ans =
1244.
9
1.5 NMEROS COMPLEXOS
No necessrio manuseio especial em Scilab para nmeros complexos. As operaes
com nmeros complexos so to fceis como nos reais. A unidade imaginria
representado por %i, ou seja, %i igual a sqrt(-1). Exemplos:
x = 3 + 4*%i y = 1
- %i z1 = x - y z2 =
x * y z3 = x / y
real(z1) imag(z1) Parte real de z1
abs(x)
atan(imag(x),real(x)) conj(z2) Parte imaginria de z1
sin(x)
Valor absoluto do nmero
1.6 O
complexo
Conjugado Argumento do
nmero complexo
Seno de um nmero complexo
Espao de Trabalho / UFRN-DCA - 17 de Abril de 2015
-->b = 3;
-->c = 4;
-->a = 2;
-->b = 3;
-->c = 4;
-->save("dados.dat");
5.
--> format(5)
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
-->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
com 8 posies.
1.
%e A base do logaritmo natural.
%t ou %T Representa o valor booleano verdadeiro.
%f ou %F Representa o valor booleano falso.
%s Um polinmio com uma nica raiz em zero e s como o
nome da varivel. A constante %s definida como
poly(0,s).
%z Um polinmio com uma nica raiz em zero e s como o
nome da varivel. A constante %z definida como
poly(0,z).
1.9 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
O comando help informa sobre comandos e funes do Scilab. Por exemplo: co-
a) c
b) z = 2exsinx
c) m
sina+
d) s
2 2 2 2i
h 1/2
e) g = L 0.5r r arcsin(h/r) h(r h )
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)
<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:
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")
a=
Ol
13
2.2 Comandos de Sada de Dados / UFRN-DCA - 17 de Abril de 2015
15
-->x = 3;
-->y = 4;
-->r = sqrt(x*x+y*y) // Com a omisso do ponto e virgula
r= // o resultado exibido
5.
A FUNO DISP
A funo disp() outra maneira de exibir dados. Por exemplo,
-->v0 = 2;
-->a = 4;
-->t = 3;
-->v = v0+a*t;
-->nome = "Maria";
A funo disp freqentemente usada em conjunto com a funo string que converte um
nmero em string. Por exemplo,
-->disp("A velocidade final " + string(v))
A velocidade final 14
A FUNO PRINTF
A funo printf a forma mais flexvel de exibir dados porque produz uma sada printf um
formatada. Por exemplo, clone do comando
de mesmo nome da
-->printf("Al mundo\n"); linguagem de
Al mundo
programao C.
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
2.3 Arquivos de Scripts / UFRN-DCA - 17 de Abril de 2015
<formato> uma string descrevendo a forma com que a lista de dados ser exibida.
Exemplo:
-->A = 2;
-->B = A + 3;
Mais exemplos:
-->printf("A = %g B = %g",A,B);
A=2B=5
-->printf("A = %g\nB = %g\n",A,B);
A =2
B =5
-->printf(F,A,B);
Os valores calculados foram 2 e 5
-->altura = 1.65;
Note que o arquivo de script acima contm comandos para converter graus Farenheit
em graus Celsius.
2.5 Executando Arquivos de Script / UFRN-DCA - 17 de Abril de 2015
4 As figuras mostradas nesta seo podem no corresponder exatamente a verso do scilab que voc utilizando.
18
O usurio pode criar novos arquivos de script selecionando a opo ARQUIVO NOVO. Os
passos para executar um script so mostrados na seo seguinte.
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
1 1 1
= +
Req R1 R2
R 1R 2
Req =
20
R1 + R 2
Soluo:
1
2
3
4
programa
1
2
3
4
5
6
AVISO: este comando funciona somente se o arquivo de script estiver no diretrio atual
do scilab caso contrrio ocorrer um erro como este:
-->exec("farenheit.sce");
21
!--error 241 O
arquivo "farenheit" no existe.
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.
5Para 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.
22
-->unix_w(dir)
Captulo 3
ESTRUTURAS DE SELEO
Este captulo introduz as expresses booleanas e as estruturas de seleo que permitem
os programas tomarem decises.
1. As estruturas de seleo;
2. As estruturas de repetio.
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.
1. Sequncia,
2. Seleo,
21
3.2 Expresses Booleanas / UFRN-DCA - 17 de Abril de 2015
24
3. Repetio,
Operador Descrio
< Menor que
<= Menor ou igual
a
> Maior que
Por exemplo, suponha >= Maior ou igual a que a
== Igual a
varivel A contm o <> ou = Diferente de valor 5.
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 C contm um valor verdadeiro.
1. O nmero real;
2. O tipo string;
3. O tipo booleano.
Soluo:
3.6 A Seleo Simples IF-END / UFRN-DCA - 17 de Abril de 2015
Exerccio resolvido 3.6.1. Elaborar um programa para escrever a mdia de duas notas. Se
a mdia for maior que sete, o programa dever tambm escrever Parabns.
Soluo:
1
2 nota1 = input("digite a primeira nota"); nota2 =
3 input("digite a segunda nota"); media = (nota1+nota2)/2;
4 printf("Sua mdia %g\n",%g) if media > 7
5 printf("Parabns!"); end
6
7
3.7 A Seleo Bidirecional IF-ELSE-END / UFRN-DCA - 17 de Abril de 2015
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.
Soluo:
28
1
2
3 // Leitura das notas nota1 = input("Digite a 1a. nota bimestral");
4 nota2 = input("Digite a 2a. nota bimestral"); nota3 = input("Digite
5 a 3a. nota bimestral"); nota4 = input("Digite a 4a. nota
6 bimestral"); media = (nota1 + nota2 + nota3 + nota4)/4;
7 printf("Media = %g\n",media); // Calculo da media anual if media > 6
8 printf("Aluno aprovado\n");
9 else printf("Aluno reprovado\n"); end
10
11
12
Resultado
Digite a 1a. nota bimestral-->8.4
Digite a 2a. nota bimestral-->7.3
Digite a 3a. nota bimestral-->9.1
Digite a 4a. nota bimestral-->8.5
Media = 8.325
Aluno aprovado
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.
3.8 Aninhando Seletores / UFRN-DCA - 17 de Abril de 2015 29
Soluo:
1
2 x = input("Entre com o valor de x"); if x >= 0
3 f = x^2+16; else
4 f = 0;
5 end; printf("O valor da funo %g\n",f);
6
7
Resultado
Entre com o valor de x-->2
O valor da funo 20
Soluo:
1
2
// Leitura das notas nota1 = input("Digite a 1a. nota bimestral");
3 nota2 = input("Digite a 2a. nota bimestral"); nota3 = input("Digite
4 a 3a. nota bimestral"); nota4 = input("Digite a 4a. nota
5 bimestral"); media = (nota1 + nota2 + nota3 + nota4)/4;
6
7 printf("Media = %g\n",media); // Calculo da media anual
8
9 if media >= 7
10 printf("Aprovado\n");
11 else
12 if media >= 5
13 printf("Recuperao\n"); else
14 printf("Reprovado\n");
15 end end
16
17
18
Resultado
Digite a 1a. nota bimestral-->7.3
Digite a 2a. nota bimestral-->6.5
Digite a 3a. nota bimestral-->5.5
3.8 Aninhando Seletores / UFRN-DCA - 17 de Abril de 2015 30
Exerccio resolvido 3.8.2. Escreva um programa que leia trs nmeros e escreva o menor
deles.
Soluo:
1
2
// Leitura dos nmeros a = input("Digite um
3
numero"); b = input("Digite um numero"); c
4
= input("Digite um numero");
5
6 // Determina o menor nmero
7 if a < b & a < c menor =
8 a; else
9 if b < c
10 menor = b;
11 else menor = c;
12 end
13 end printf("O menor nmero %g\n",menor);
14
15
16
Resultado
Digite um numero-->2
Digite um numero-->3
Digite um numero-->1
O menor nmero 1
Exerccio resolvido 3.8.3. Elaborar um programa Scilab para ler trs medidas a, b e c.
Depois verificar se elas podem ser as medidas dos lados de um tringulo. Se forem,
verificar ser se o tringulo equiltero, issceles ou escaleno.
Soluo:
Para saber se trs medidas podem ser as medidas dos lados de um tringulo usamos
o seguinte propriedade da Geometria (conhecido como desigualdade triangular):
Em todo tringulo, cada lado menor que a soma dos outros dois.
Resultado
Digite a primeira medida-->5
Digite a segunda medida-->3
Digite a terceira medida-->1
No um tringulo
x1 =
0 x2
=
b/a
a 6= 0 e c 6= 0 e 0 Calcular e escrever as duas
razes:
2a
x
2a
a 6= 0 e c 6= 0 e < 0 As razes so complexas.
Escrever as partes real e
imaginria das duas razes.
Soluo:
3.8 Aninhando Seletores / UFRN-DCA - 17 de Abril de 2015 33
1 //
2 // Programa para calcular as razes de uma equao do 2o grau
3 //
4
5 a=input("Digite o coeficiente a :"); b=input("Digite o coeficiente b :");
6 c=input("Digite o coeficiente c :");
7
8 if (a==0) & (b==0) // Equacao degenerada. printf("Equacao degenerada\n");
9 end
10
11 if (a==0) & (b<>0) // Equao do 1o grau printf("Raiz nica em %g.\n",-c/b);
12 end
13
14 if (a<>0) & (c==0) // Equacao do 2o grau com raizes reais em 0 e -b/a
15 x = -b\a;
16 printf("Raiz1 = 0\n"); printf("Raiz2 = %g\n",x);
17 end
18
19 if (a<>0) & (c<>0) // Equacao do 2o grau
20
21 disc = b*b - 4*a*c; // Clculo do discriminante
22
23 if disc >= 0 // Teste do discriminante
24 // Raizes reais.
25 x1 = -b/(2*a) + sqrt(disc)/(2*a); x2 = -b/(2*a) -
26 sqrt(disc)/(2*a); printf("Raiz1 = %g\n",x1);
27 printf("Raiz2 = %g\n",x2);
28
29
30
31
32
33 else
34 // Raizes complexas pr = -b/(2*a); pi =
35 sqrt(abs(disc))/(2*a); printf("Parte Real = %g\n",pr);
36 printf("Parte Imaginria = %g\n",pi);
37 end end
38
39
40
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
3.8 Aninhando Seletores / UFRN-DCA - 17 de Abril de 2015 34
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 // Programa para calcular as razes de uma equao do 2o grau // Esta verso manipula os
3 nmeros complexos diretamento.
4
5 a=input("Digite o coeficiente a :"); b=input("Digite o coeficiente b :");
6 c=input("Digite o coeficiente c :");
7
8 if (a==0) & (b==0) // Equacao degenerada. printf("Equacao degenerada\n");
9 end
10
11 if (a==0) & (b<>0) // Equao do 1o grau printf("Raiz nica
12 em %g.\n",-c/b); end
13
14
15
3.8 Aninhando Seletores / UFRN-DCA - 17 de Abril de 2015 35
16
17
18
19
20
21
22
23
24 if (a<>0) & (c==0) // Equacao do 2o grau com raizes reais em 0 e -b/a
25 x = -b\a; printf("Raiz1 = 0\n");
printf("Raiz2 = %g\n",x);
26
end
27
28
if (a<>0) & (c<>0) // Equacao do 2o grau
29
30 disc = b*b - 4*a*c; // Clculo do discriminante x1 = -b/(2*a) +
31 sqrt(disc)/(2*a); x2 = -b/(2*a) - sqrt(disc)/(2*a); printf("Raiz1 =");
32 disp(x1); printf("Raiz2 ="); disp(x2); if isreal(x1) printf("As razes so
33 reais");
34 else printf("As razes so complexas");
end end
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 =
-->isreal(3) ans =
32
4.2 Lao Controlado Logicamente
1.
/ UFRN-DCA - 17 de Abril de 2015 37
-->i = i + 1 i =
2.
-->i = i + 1 i =
3.
-->i = i + 1 i =
4.
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.
1
2
3 i = 1; while i <= 5 nota1 = input("Digite a 1a. nota bimestral"); nota2
4 = input("Digite a 2a. nota bimestral"); nota3 = input("Digite a 3a.
5 nota bimestral"); nota4 = input("Digite a 4a. nota bimestral"); media
6 = (nota1 + nota2 + nota3 + nota4)/4; printf("Media = %g\n",media); i
7 = i + 1;
8 end printf("Fim do programa");
9
10
11
Resultado
Digite a 1a. nota bimestral-->7.5
Digite a 2a. nota bimestral-->8.2
Digite a 3a. nota bimestral-->8.3
Digite a 4a. nota bimestral-->7.2
Media = 7.8
Digite a 1a. nota bimestral-->6.5
Digite a 2a. nota bimestral-->6.2
Digite a 3a. nota bimestral-->8.2
Digite a 4a. nota bimestral-->7.0
Media = 6.975
Digite a 1a. nota bimestral-->8.2
Digite a 2a. nota bimestral-->7.8
Digite a 3a. nota bimestral-->4.8
Digite a 4a. nota bimestral-->8.3
Media = 7.275
Digite a 1a. nota bimestral-->6.5
Digite a 2a. nota bimestral-->7.1
Digite a 3a. nota bimestral-->8.3
4.2 Lao Controlado Logicamente
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).
20.
-->x = 2.5 x =
2.5
-->soma = 0 soma =
0.
2.5
5.
Qual o valor da varivel soma aps repetir a execuo do ltimo comando mais duas vezes?
Exerccio resolvido 4.2.2. Elaborar um programa para calcular a soma de todos os inteiros entre
1 e 100.
Soluo:
4.3 Lao Controlado por Contador
/ UFRN-DCA - 17 de Abril de 2015 39
1
2 cont= 1; soma = 0; while cont
3 <= 100 soma = soma + cont;
4 cont = cont + 1;
5 end printf("Soma total = %g\n",soma);
6
7
Resultado
Soma total = 5050
Exerccio resolvido 4.3.1. Elabore um programa para escrever todos os nmeros pares inteiros
entre 1 e 50.
Soluo:
1
2
3
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.
fat = 1;
for cont=2:5
fat = fat * cont;
end printf("O fatorial de 5 igual a %g\n",fat);
1
2
3
4
5
6
Resultado
O fatorial de 5 igual a 120
Comentrio. Note que a cada interao do lao, a varivel fat assume os seguintes
valores
Elabore um programa para calcular o fatorial para qualquer valor n fornecido pelo usurio.
Sabendo que:
N! = 1 2 3 ... (N 1) N;
0! = 1, por definio.
Soluo:
1
2
3
4
5
6
Resultado
Entre com um nmero-->8
S= + ... +
Soluo: note que h uma relao entre numerador e denominador da seguinte forma:
2 denominador 1 = numerador
Usaremos esta relao para calcular cada termo da srie no seguinte programa:
s = 0;
for d=1:50
s = s + (2*d-1)/d;
end printf("Valor de S = %g\n",s);
1
2
3
4
5
Resultado
4.4 Exemplos com Laos / UFRN-DCA - 17 de Abril de 2015 42
Valor de S = 95.5008
O Algoritmo de Euclides est presente no quinto livro de Euclides escrito por volta
de 300 anos antes de Cristo. Sua finalidade calcular o Mximo Divisor Comum
(M.D.C.). Conhecido por muitos estudantes, o Algoritmo de Euclides desempenha
importante papel na matemtica, e por isso interessante estud-lo. Para calcular o
M.D.C. entre dois nmeros segue-se o algoritmo:
Passo 3. a = b
Passo 4. b = r
Seguindo este algoritmo manualmente, com um lpis e papel, possvel calcular o M.D.C.
entre 544 e 119, escrevendo a seguinte tabela:
a b r(resto)
544119 68
119 68 51
68 51 17
51 17 0
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);
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
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
1
2
3
4 n = input("Digite um numero inteiro positivo"); printf("Numeros de fibonacci
5 menor ou igual a %g\n",n); a = 1; b = 1;
6 printf("%g %g ",a,b); // imprime os dois primeiros elementos
7 c = a + b; // calcula o proximo elemento while (c <= n) printf("%g ",c);
8 a = b; b = c; c = a + b; // calcula o proximo elemento end
9
10
11
12
Resultado
Digite um numero inteiro positivo-->1000
Numeros de fibonacci menor ou igual a 1000
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
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 lin = input("Quantas linhas"); for i = 1:lin for
3 j = 1:4
4 printf("x");
5 end printf("\n"); // mudana da linha end
6
7
Resultado
Quantas linhas-->5 xxxx xxxx xxxx xxxx xxxx
-->printf("%5.2f",a);
23.35
1
2
printf(" 1 2 3 4 5 6 7 8 9
3
10\n"); printf(" ------------------------------------------------\n"); for i=1:10 printf("%2.0f
4
",i); for j = 1:10
5
printf("%3.0f ",i*j); end
6
printf("\n"); end
7
8
9
Resultado
1 2 3 4 5 6 7 8 9 10
------------------------------------------------
1 12 3 4 5 6 7 8 9 10
2 24 6 8 10 12 14 16 18 20
3 36 9 12 15 18 21 24 27 30
4 48 12 16 20 24 28 32 36 40
5 5 10 15 20 25 30 35 40 45 50
6 6 12 18 24 30 36 42 48 54 60
7 7 14 21 28 35 42 49 56 63 70
8 8 16 24 32 40 48 56 64 72 80
9 9 18 27 36 45 54 63 72 81 90
10 10 20 30 40 50 60 70 80 90 100
Comentrio. Inicialmente, a varivel i assume o valor um na linha 3. Na linha 4, o
programa escreve o nmero um para indicar que a tabuada de um ser escrita nesta
4.5 Laos Aninhados / UFRN-DCA - 17 de Abril de 2015 46
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.
Captulo 5
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 6. 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
Matrizes unidimensionais so chamados de vetores. Em um vetor possvel armazenar
vrios itens em uma nica varivel. Na Figura 5.1 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). Exemplo,
-->nota = [8.1 5.2 9.2 7.2 6.5 5.2 8.5 9.5 6.5 10.0];
5.2
-->nota(5) ans =
6.5
-->nota(8) ans =
9.5
42
5.1 Vetores / UFRN-DCA - 17 de Abril de 2015
6O Scilab tambm dispe de agregados de dados heterogneos que so chamados de listas e podem
armazenar simultaneamente dados numricos e strings. Listas no sero estudados neste captulo.
48
22.5
-->x(2) = 4;
-->x(3) = 2;
-->x(4) = 3;
ou equivalentemente como
-->x = [2 4 2 3];
1.
! 2. 3. 7. 9. 8. 4. !
Exerccio resolvido 5.1.1. Calcular a mdia dos elementos do vetor nota dado na Figura
5.1.
1
2 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
3 soma = soma + nota(i); end printf("Mdia das notas =
4 %g\n",soma/10);
5
6
1
2
3
4
5 for i=1:10 // Leitura de A e B a(i) = input("Digite um valor");
6 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.
7
8 c(i) = a(i); // Se for mpar c(i) recebe o valor de a(i) else
9 c(i) = b(i); // Se for par c(i) recebe o valor de b(i) end
10 end
11 for i=1:10 // Escreve o vetor C printf("%g ",c(i)); end
12
13
14
15
16
-->a = [2 3 4; 4 5 2] a =
! 2. 3. 4. !
! 4. 5. 2. !
! 2. 3. 4. !
! 4. 5. 2. !
-->a(1,2) ans =
5.2 Matrizes Bidimensionais / UFRN-DCA - 17 de Abril de 2015 52
3.
-->a(2,3) ans =
2.
-->a(1,3) ans =
4.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];
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
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
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.
j) Ler uma matriz B de mesma dimenso que A. Escrever IGUAIS se A for uma
matriz igual B. Caso contrrio, escrever DIFERENTES.
Exerccio 5.2.2. Elabore um programa para ler a matriz A, trocar a segunda linha com terceira
linha e escrever a matriz A.
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.
1
2 mes = ["jan" "fev" "mar" "abr" "jun" "jul" "ago" "set" "nov" "dez"]; dia = input("Digite o dia");
3 nunmes = input("Digite o numero do mes"); ano = input("Digite o ano"); printf("%g de %s de
4 %g\n",dia,mes(nunmes),ano);
5
Resultado
Digite o dia-->2
Digite o numero do mes-->4
Digite o ano-->2003
2 de abr de 2003
Exerccios
O que este programa escreve?
1
2
poema(1) = uma rosa; poema(2) = ; for
3
a=1:3 for b=1:2 printf("%s ",poema(b));
4
end end
5
printf(%s,poema(1));
6
7
8
Suponha uma turma com quatro alunos. Elaborar um programa que leia as
quatro notas dos alunos e seus respectivos nomes e escreva apenas os
nomes com a nota acima da mdia.
2
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
5.4 Estudo de Caso / UFRN-DCA - 17 de Abril de 2015 56
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.
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.
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,
...
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.
5.4 Estudo de Caso / UFRN-DCA - 17 de Abril de 2015 58
1
2
3
soma = 0; // acumulador das notas for i = 1:10000 aluno(i) =
4
input("Digite o nome do aluno","s"); nota(i) = input("Nota"); soma =
5 soma + nota(i); end
6
media = soma/10000; // calculo da media for i = 1:10000
7
if nota(i) >= media printf("%s\n",aluno(i));
8 end end
9
10
11
12
Passo A.1 Comparar a(1) e a(2). Se a(1) > a(2), troque os dois elementos.
a = [4 5 3 2 6]
Houve troca do nmero 4 com o nmero 5.
Passo A.2 Comparar a(2) e a(3). Se a(2) > a(3), troque os dois elementos.
a = [4 3 5 2 6]
Houve troca do nmero 5 com o nmero 3.
Passo A.3 Comparar a(3) e a(4). Se a(3) > a(4), troque os dois elementos.
a = [4 3 2 5 6]
Houve troca.
Passo A.4 Comparar a(4) e a(5). Se a(4) > a(5), troque os dois elementos.
a = [4 3 2 5 6]
No houve troca porque a(4) no maior que a(5).
Passo B.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos.
a = [3 4 2 5 6]
Houve troca do nmero 4 com o nmero 3.
Passo B.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos.
a = [3 2 4 5 6]
Houve troca do nmero 4 com o nmero 2.
Passo B.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos.
a = [3 2 4 5 6]
No houve troca.
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.
Passo C.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos.
5.5 Exemplos com Matrizes / UFRN-DCA - 17 de Abril de 2015 60
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.
contrrio, a varivel HouveTroca assume o valor verdadeiro na linha 10) (isto far com
que o lao while...end execute nova iterao).
A troca de um elemento com o elemento seguinte (i.e., a(i) com a(i+1)) realizado pelo
trecho:
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.
Para resolver este problema utiliza-se a funo rand (tambm chamada de gerador
de nmeros aleatrios). Esta funo retorna um nmero diferente (aleatrio) cada vez
que chamada, por exemplo:
-->rand() ans =
.4410204
-->rand() ans =
.8859080
-->rand() ans =
.6868068
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)
5.5 Exemplos com Matrizes / UFRN-DCA - 17 de Abril de 2015 62
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
1
2
3
[m,n]=size(nota); for i=1:m soma = 0;
4 for j=1:n soma = soma+nota(i,j);
5 end media(i)=soma/3;
6 end
7 printf("Nome Media\n"); // linha de cabeario for i=1:m printf("%-
8 10s %3.1f\n",nome(i),media(i)); end
9 10
11
12
Resultado
Nome Media
Ana 7.0
Carlos 7.8
Francisco 8.0
Jos 5.8
Magali 5.9
Marcos 5.0
Maria 9.1
Marta 8.8
Paulo 9.3
Pedro 8.2
5.5 Exemplos com Matrizes / UFRN-DCA - 17 de Abril de 2015 64
1
2
maior = 0.0; m =
3
size(nota,1); for i=1:m
4
if nota(i,2) > maior maior = nota(i,2); imaior = i; // Armazena o ndice da maior
5
nota. end
6
end printf("A maior nota de portugus: %s, %3.1f\n",nome(imaior),maior);
7
8
9
1
2
3
4
5
6
7 [m,n]=size(nota);
8 for i=1:m // Computa as medias dos alunos soma = 0; for j=1:n soma =
9 soma+nota(i,j);
10 end media(i)=soma/3;
11 end
12
13 // ordenao e troca dos elementos HouveTroca = %t; while HouveTroca HouveTroca = %f;
14 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
15
nome2 i com i+1 nome(i) = nome(i+1); nome(i+1) = temp;
16
17 HouveTroca = %t; // Houve troca end
18 end
19 end
20
21 printf(" Nome Media\n"); // linha de cabeario for i=1:m printf("%2.0f- %-
22 10s %3.1f\n",i,nome2(i),media(i)); end
23
24
25
26
27
28
29
5.5 Exemplos com Matrizes / UFRN-DCA - 17 de Abril de 2015 65
30
Resultado
Nome Media
1- Paulo 9.3
2- Maria 9.1
3- Marta 8.8
4- Pedro 8.2
5- Francisco 8.0
6- Carlos 7.8
7- Ana 7.0
8- Magali 5.9
9- Jos 5.8
10- Marcos 5.0
Captulo 6
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.
Exemplo,
-->1:2:15 ans =
! 1. 2. 3. 4. 5. !
-->a=10:2.5:20 a =
58
ans =
-->sin(0:%pi/4:%pi) ans =
! 1. !
! 2. !
! 3. !
! 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. 4. 5. 6. !
-->[a; b] ans =
! 1. 2. 3. !
! 4. 5. 6. !
->[a; 5 4 3] ans =
! 1. 2. 3. !
! 5. 4. 3. !
Mais exemplos:
-->c = [1 2 3 4];
-->d = [2 3 1 2; 3 4 5 4; 5 6 7 4] d =
2. 3. 1. 2.
3. 4. 5. 4.
5. 6. 7. 4.
-->[d; c; c] ans =
2. 3. 1. 2.
3. 4. 5. 4.
6.1 Construo de Matrizes / UFRN-DCA - 17 de Abril de 2015 68
5. 6. 7. 4.
1. 2. 3. 4.
1. 2. 3. 4.
-->[d a b] ans =
2. 3. 1. 2. 1. 4.
3. 4. 5. 4. 2. 5.
5. 6. 7. 4. 3. 6.
Este programa produz um vetor de comprimento n:
1
2
3
4
5
-->b = [4 5 6];
-->c = [1 2 3 4];
-->[a; b; c]
!--error 6
inconsistent row/column dimensions linspace e logspace
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)
Tabela 6.1: Construo de Matrizes
A funo linspace gera um vetor com n valores igualmente espaados comeando em inicio
e terminando em fim. Exemplo:
-->linspace(1,1.5,5) ans =
-->x = linspace(0,2*%pi,50);
-->y = sin(x);
-->plot2d(x,y);
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.
6.2 Secionamento de Matrizes / UFRN-DCA - 17 de Abril de 2015 70
-->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. 3. 1. !
! 7. 8. 4. !
! 2. 8. 8. !
a(1:3,2) refere-se a segunda coluna da matriz a (ver Figura 6.1(b)):
-->a(1:3,2) ans =
! 3. !
! 8. !
! 8. !
! 7. 8. 4. !
! 2. 8. 8. !
! 2. !
! 7. !
! 2. !
6.2 Secionamento de Matrizes / UFRN-DCA - 17 de Abril de 2015 71
! 7. 8. 4. !
! 2. 3. 1. !
! 2. 8. 8. !
-->a(2,x) ans =
! 7. 8. 4. !
-->a(c,c) ans =
! 2. 3. !
! 7. 8. !
Apesar de no ser a maneira mais simples, a transposta da matriz a pode ser calculada
da seguinte forma:
-->[a(:,1);a(:,2);a(:,3)] ans =
! 2. 7. 2. !
! 3. 8. 8. !
! 1. 4. 8. !
6.2.1 Indexao Linear
A operao de indexar, com apenas um ndice, uma matriz bidimensional chamada de
indexao linear. A matriz tratada como se fosse um longo vetor coluna formado pelas
colunas da matriz (uma coluna abaixo da outra). Por exemplo, a Figura 6.2.1 mostra
ndices lineares da seguinte matriz:
-->A = [2 3 1; 7 8 4; 2 8 8; 6 4 5] A =
! 2. 3. 1. !
! 7. 8. 4. !
! 2. 8. 8. !
! 6. 4. 5. !
A operao A(i) retorna elemento de A com o i-simo ndice linear. Exemplo:
-->A(8) ans =
4.
! 2. !
! 7. !
! 2. !
! 6. !
! 3. !
! 8. !
! 8. !
! 4. !
! 1. !
! 4. !
! 8. !
! 5. !
Outros exemplos,
-->A(2:5) ans =
! 7. !
! 2. !
! 6. !
! 3. !
! 7. !
! 4. !
! 2. !
! 10. 8. 6. 4. 2. !
! 6. 4. 2. !
4.
! 10. 6. 2. !
! 2. 4. 6. 8. 10. !
6.4 ATRIBUIO
Podemos atribuir matrizes para um bloco de outra matriz. Considere a matriz:
-->A = [2 3 1; 7 4 5; 2 1 8]
A=
! 2. 3. 1. !
! 7. 4. 5. !
! 2. 1. 8. !
O seguinte exemplo altera toda a segunda linha de A:
-->A(2,:) = [8 7 2]
A=
! 2. 3. 1. !
! 8. 7. 2. !
! 2. 1. 8. !
Outro exemplo:
-->A(:,1) = 4 // O nmero 4 expandido para preencher toda a coluna 1.
A=
! 4. 3. 1. !
! 4. 7. 2. !
! 4. 1. 8. !
Considere o vetor:
-->v = [2 4 7 1 3];
75
-->v([2 4]) = 8 // atribui 8 para o segundo e o quarto elemento de v v =
! 2. 8. 7. 8. 3. !
6.5 Dimenso de Matrizes / UFRN-DCA - 17 de Abril de 2015
! 2. 3. 1. !
! 1. 2. 8. !
Considere a matriz B:
-->B = [2 3; 5 8]
B =
! 2. 3. !
! 5. 8. !
-->length(v) ans =
5.
A funo size() retorna um vetor de dois elementos com o nmero de linhas e colunas de
uma matriz. Por exemplo:
-->a = [1 2 3 4 5; 3 4 5 6 5] a =
76
! 1. 2. 3. 4. 5. !
! 3. 4. 5. 6. 5. !
/ UFRN-DCA - 17 de Abril de 2015 77
6.6 Operaes Escalar-Matriz
-->size(a) ans =
! 2. 5. !
5.
l=
2.
-->size(a,1) ans =
2.
-->size(a,2) ans =
5.
2.
-->size(a,"c") ans =
5.
Considere o vetor:
-->b = [3 1 2 4];
Apesar de ser um vetor, b interpretado, a seguir, como uma matriz 1x4. Por exemplo:
4.
! 1. 2. 3. 4. !
! 5. 6. 7. 8. !
Exemplo de multiplicao:
6.7 Operaes Matriz-Matriz / UFRN-DCA - 17 de Abril de 2015 78
-->2*A
ans =
! 2. 4. 6. 8. !
! 10. 12. 14. 16. !
Exemplos de diviso:
-->A/4
ans =
! 0.25 0.5 0.75 1. !
! 1.25 1.5 1.75 2. !
-->A(:,2)/2 ans =
! 1. !
! 3. !
Exemplos de expresses:
-->A-2
ans =
! - 1. 0. 1. 2. !
! 3. 4. 5. 6. !
-->3*A-2 ans =
! 1. 4. 7. 10. !
! 13. 16. 19. 22. !
-->5+3*A(1,:) ans =
! 1. 2. 3. 4. !
! 5. 6. 7. 8. !
-->B = [3 1 3 8; 3 9 6 5] B =
! 3. 1. 3. 8. !
! 3. 9. 6. 5. !
-->A+B
ans =
! 4. 3. 6. 12. !
! 8. 15. 13. 13. !
-->2*A-B ans =
! - 1. 3. 3. 0. !
! 7. 3. 8. 11. !
A operao de multiplicao tambm segue as regras comuns da matemtica:
6.7 Operaes Matriz-Matriz / UFRN-DCA - 17 de Abril de 2015 79
-->A = [1 2 3 4; 5 6 7 8]
A=
! 1. 2. 3. 4. !
! 5. 6. 7. 8. !
// vetor-coluna
-->v = [2; 3; 4; 5] v =
! 2. !
! 3. !
! 4. !
! 5. !
-->A*v
ans =
! 40. !
! 96. !
-->A*c
!--error 10
inconsistent multiplication
! 27. !
! 71. !
O operador de multiplicao pontuada (.*) realiza uma multiplicao elemento por elemento
entre matrizes. Considere as matriz:
-->A = [1 2 3 4; 5 6 7 8] A =
! 1. 2. 3. 4. !
! 5. 6. 7. 8. !
-->B = [3 1 3 8; 3 9 6 5] B =
! 3. 1. 3. 8. !
! 3. 9. 6. 5. !
Multiplicao pontuada:
-->A.*B ans =
! 3. 2. 9. 32. !
! 15. 54. 42. 40. !
Do mesmo modo, a diviso elemento por elemento, requer o uso do ponto (diviso pontuada):
-->A./B ans =
! 0.3333333 2. 1. 0.5 !
! 1.6666667 0.6666667 1.1666667 1.6 !
6.7 Operaes Matriz-Matriz / UFRN-DCA - 17 de Abril de 2015 80
Existe tambm a potenciao elemento por elemento que tambm requer o uso do ponto
(potenciao pontuada): Em geral, o Scilab
utiliza menos laos
-->[2 3 2 4].^[1 2 3 4]
que as linguagens
ans = 256. de programao
tradicionais
2. 9. 8. devido sua
habilidade de
Exemplo de expresso: substituir laos
-->A.^(2+1)+B/2 ans = por alguma
operao
matricial.
A seguinte expresso:
-->2.^A ans =
! 2. 4. 8. 16. !
! 32. 64. 128. 256. !
eleva 2 a cada um dos elementos de A.
Exerccio resolvido 6.7.1. Calcular o valor da funo f(x) = sin(x) cos(x) para
x= ,...,
Em muitas linguagens de programao este problema seria utilizar um lao FOR, como por
exemplo:
1
2
3
4
5
6
81
6.8 Soluo de Sistemas de Equaes Lineares / UFRN-DCA - 17 de Abril de 2015
x1 x2 + 2x3
= 5 x1
x2 6x3
= 0
4x1 + x3 = 5
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; 1 -1 -6; 4 0 1]
A=
! 1. - 1. 2. !
! 1. - 1. - 6. !
! 4. 0. 1. !
! 5. !
! 0. !
! 5. !
-->A\b
ans =
Z = A - %i*B
Z. = A + %i*B
! i 2. + i 5. !
! - 1. + 2.i 3.i i !
-->a
ans =
!-i - 1. - 2.i !
! 2. - i - 3.i !
! 5. -i !
-->a.
ans =
! i - 1. + 2.i !
! 2. + i 3.i !
! 5. i !
Um resumo mostrado na Tabela 6.3
Captulo 7
FUNES
7.1 INTRODUO
Quando o tamanho de um programa estende-se a centenas de linhas, o programa
torna-se difcil de compreender e administrar. Por isso, dividir um grande programa
computacional em partes menores para facilitar a compreenso (ou legibilidade) do
problema uma tarefa comum em programao de computadores. No Scilab, este
trecho menor do programa chamado de funo. Funes so tambm chamadas de
sub-rotinas, mdulos, subprogramas ou subalgoritmos.
Funes so usados tambm para evitar repetio do mesmo cdigo no programa.
Por exemplo, suponha que seu programa tenha a tarefa de por em ordem crescente
vrias listas de nmeros. Em vez de repetir o cdigo toda vez que for realizar esta tarefa,
voc escreve uma funo para ordenar listas numricas e depois chama a mesma
funo sempre que for ordenar uma lista. Neste sentido, as funes apresentam as
seguintes vantagens: a) Voc escreve o cdigo somente uma vez. b) Voc pode reutilizar
a funo em outros programas. c) Uma vez que voc tem corrigido todos os erros do
programas (i.e., depurado o programa), ele funcionara corretamente no importa
quantas vezes voc use a funo.
Em resumo, funes so usadas para:
2. Repetir uma tarefa que realizada frequentemente sem ter que repetir o mesmo
cdigo em vrios lugares;
74
84
7.3 Funes Definidas pelo Usurio / UFRN-DCA - 17 de Abril de 2015
-->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).
endfunction
Onde,
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
85
7
120.
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
i=1
Soluo:
soma = 0; for
j=1:10
soma = soma + fat(j); end
1
2
3
4
86
Comentrio. Para executar este programa, o usurio deve, antes, carregar a funo
fat(). Isto pode ser feito atravs, por exemplo, da funo exec().
Programa
Principal function y=func1(x)
comandos
comandos endfunction
a=func1(b)
comandos
m=func2(n)
comandos function y=func2(x)
q=func3(p) 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()).
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
87
1
2
3
4
5
6
7
8
function y = media(x)
n = length(x);
y = soma(x)/n; // chama a funo soma endfunction
1
2
3
4
1
2
3
4
5
6
7
8
--> x = 2;
--> y = 3;
--> z = x + y;
--> a = x + y + w
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)
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.
1
2 a = 23; b = 50; c = 200; w = beta(2); printf("a = %g b = %g c =
3 %g\n",a,b,c);
4
5
a = 3 b = 2 c = 5 a = 23 b = 50 c =
200
1
2 function y = gama(x) global
R; global S;
3
R = 1; S =
4
2; t = 3;
5 printf("R = %g S = %g t = %g\n",R,S,t);
6 y = R + S + t + x;
7
endfunction
8
9
R=1S=2t=3
R = 1 S = 2 t = 15
7.6 Os Programas do Scilab / UFRN-DCA - 17 de Abril de 2015
Note que as variveis R e S do programa principal foram alteradas dentro da funo Boa
gama(). Isto aconteceu porque usamos a comando global. Porm a varivel t no foi programao: use
alterada pela funo gama() porque no uma varivel global, ou seja, a varivel t no caixa alta para
foi declarada como global, permanecendo como uma varivel local. nomes de
variveis globais
Conclumos que variveis locais so visveis somente dentro na funo, mas
para tornar claro
variveis globais podem ser visveis tanto dentro como fora de uma funo. Variveis
ao leitor que so
globais so, portanto, uma forma de compartilhar uma varivel entre a funo e o
globais e para no
programa chamador.
confundir com
A declarao global deve ser usado tanto no programa chamador como na funo variveis locais.
(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
2
3
4
5
1. Arquivo de comandos.
2. Arquivo de funes.
Um parmetro de sada pode ser um nmero, um vetor ou uma matriz. A seguinte Funo
possui trs parmetros de sada (e trs de entrada):
92
1
2 function [x, y, z] = beta(a, b, c)
3 a = a/2; b =
b/2; c = c/2;
4
printf("a=%g b=%g c=%g\n",a,b,c);
5
x = a; y =
6
b; z = c;
7
endfunction
8
9
1
2 a = 10; b =
3 20; c = 30;
4 r1 = 2; r2 =
5 4; r3 = 6;
6 [d1, d2, d3] = beta(r1,r2,r3) printf("a=%g b=%g
7 c=%g\n",a,b,c); printf("d1=%g d2=%g d3=%g\n",d1,d2,d3);
8
9
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.
7.8 Exemplos / UFRN-DCA - 17 de Abril de 2015
1 x1 = input("digite x1"); y1 =
2 input("digite y1"); x2 = input("digite
x2"); y2 = input("digite y2"); x3 =
3
input("digite x3"); y3 = input("digite
4
y3");
5
6 // Clculo dos lados do tringulo
7
8 a = dist(x1,y1,x2,y2); // medida do lado A b =
9
dist(x1,y1,x3,y3); // medida do lado B c = dist(x2,y2,x3,y3); //
10
11 medida do lado C
12
13 s = (a+b+c)/2; // semiperimetro
14
15 area = sqrt(s*(s-a)*(s-b)*(s-c));
16
17 printf("rea do tringulo = %g\n",area);
18
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 function y = inverte(x)
3 n = length(x); for i=1:n y(i)
4 = x(n+1-i);
end endfunction
5
6
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:
x2 x4 x6
cos x = 1 + + ... 2! 4!
6!
7.8 Exemplos / UFRN-DCA - 17 de Abril de 2015
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.
94
Soluo:
1
2 function y = coseno(x,n) s = 1;
3 for i=1:n
4 num = x^(2*i); den = fat(2*i);
5 sinal = (-1)^i; s = s +
6 sinal*num/den; end
7 y = s;
8 endfunction
9
10
1
function x = fat(n) p = 1;
2
for i=n:-1:2 p = p*i;
3
end
4
x = p;
5
endfunction
6
7
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 function m = membro(x,a) n =
length(a); i = 1;
3
while (i <= n & a(i) <> x) i = i+1;
4
end
5
m = i <= n;
6
endfunction
7
8
1
2
3
4
5
function [maxdc, indic] = mdc(a, b)
6
// Esta funo calcula o mximo divisor de dois // nmeros a e b
7 positivos.
8 // indic retorna 1 se o clculo do m.d.c. teve xito
9
// retorna 0 se os dados de entrada foram // inadequados.
10
11 indic = 0; maxdc = 0; if round(a) <> a | round(b) <> b return; // Aqui o
12 comando return interrompe // o programa.
13 end
14 if a < 1 | b < 1
15
return; // Aqui tambm o comando return //
16
interrompe o programa.
17
end
18
if a < b t = a; a
19 = b; b =
20 t;
21 end indic = 1; r = 1; while r <>
22 0 r = modulo(a, b); a = b; b =
23 r; end maxdc = a;
24 endfunction
25
26
27
28
29
30
31
7.10 Estudo de Caso: Um Programa de Estatstica / UFRN-DCA - 17 de Abril de 2015 96
soma(x) =xi
i=1 n
X
1
nX
xi
i=1 n
=
1 2n 1
mdia(x)
O primeiro X(xi mdia(x)) programa de
=
estatstica mostrado abaixo
no emprega a varincia(x) i=1 p tcnica da
subrotina. desvio padro(x) = varincia(x) Tornando-se
grande e mais complexo.
7.10 Estudo de Caso: Um Programa de Estatstica / UFRN-DCA - 17 de Abril de 2015 97
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 d = 0; for i = 1:n d = d + (x(i)-media)^2; end dpad = sqrt(d/(n-1));
36 printf("O desvio padro igual a %g",dpad);
37 end
38
39 if opcao == 4 soma = 0; for i=1:n
40 soma = soma + x(i);
end media = soma/n; d = 0; for i = 1:n d = d + (x(i)-
41
media)^2; end var = d/(n-1); printf("A varincia igual a
42
43 %g",var); end
44
45
46
47
48
49
50
51
52
53
54
55
1
2
3
printf("Meu Programa de Estatstica Versao 2");
4
5
n = input("Digite o nmero de elementos"); for i=1:n x(i) = input("Digite
6 um nmero entre 1 e 10");
7 end
8
9 printf("Opo 1 - Soma\n"); printf("Opo 2 -
10 Mdia\n"); printf("Opo 3 - Desvio padro\n");
11 printf("Opo 4 - Varincia\n"); opcao = input("Digite
12 sua opo");
13
14 if opcao == 1 printf("A soma igual a %g",soma(x));
15 end
16
if opcao == 2 printf("A mdia igual a %g",media(x));
17
end
18
19
if opcao == 3 printf("O desvio padro igual a %g",dpad(x));
20 end
21
22 if opcao == 4 printf("A varincia igual a %g",var(x));
23 end
24
25
26
27
28
As sub-rotinas:
7.10 Estudo de Caso: Um Programa de Estatstica / UFRN-DCA - 17 de Abril de 2015 100
1
2
3
4
5 // Funo soma function y =
soma(x) n = length(x); s = 0;
6
for i=1:n
7
s = s + x(i);
8
end
9
10 y = s;
11 endfunction
12
// Funo mdia function y =
13
media(x) n = length(x); y =
14 soma(x)/n; endfunction
15
16 // Funo varincia function y =
17 var(x) n = length(x); m = media(x);
18 d = 0; for i = 1:n d = d + (x(i)-
19 m)^2;
20 end y = d/(n-1);
21 endfunction
22
23 // Funo Desvio Padro function
24 y = dpad(x) y = sqrt(var(x));
25 endfunction
26
27
28
29
30
31
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.
case 2