Apostila Conceitos de Programação Octave
Apostila Conceitos de Programação Octave
Apostila Conceitos de Programação Octave
SUMÁRIO
1.1. CONSTANTES
Constante é um determinado valor fixo que não se modifica ao longo do tempo,
durante a execução de um programa.
1.2. VARIÁVEIS
Variável é a representação simbólica dos elementos de certo conjunto. Cada
variável corresponde a uma posição de memória, cujo conteúdo pode se alterado ao
longo do tempo durante a execução de um programa. Embora uma variável possa assumir
diferentes valores, ela só pode armazenar um valor a cada instante.
Partindo de uma analogia, uma variável pode ser considerada como uma caixa,
onde o tipo de dado que pode ser armazenado na variável é o tamanho da caixa, mesmo
princípio acontece em programação, uma variável que irá receber um valor lógico tem um
tamanho em bytes (1 byte) inferior a uma variável que irá receber um valor Real (4 ou 8
bytes).
Valor
34
Total
Nome Tipo
Figura 1 - Representação de uma variável
Uma variável é composta por três partes:
1. Nome: é o rótulo da caixa; como ela irá ser identificada.
2. Valor: o que está armazenado dentro da caixa.
3. Tipo: são as dimensões da caixa, em computação se refere a quantidade de
bits disponíveis para armazenamento.
6
>> b = 2
b = 2
Perceba a diferença quando se utiliza o sinal ‘;’. Quando ele é inserido, o Octave
atribui o valor a variável normalmente, a retirada do sinal irá fazer com que o Octave
atribua o valor igualmente a opção anterior e imprima o valor no terminal.
Realizar a soma de variáveis e atribuir para uma nova variável é simples:
>>c = a + b;
>> c
c = 3
>> d = a + a
d = 2
Perceba que para verificar o valor de uma variável, basta apenas digitar o nome da
variável (lembre-se que o sinal ‘;’ irá impedir que o valor seja exibido).
Caso queira, pode ser incluído valores diretamente:
>> 2 * 5
ans = 10
>> 2 * 5.1
7
ans = 10.200
>> 2 ^ 3
ans = 8
>> 2 / 5
ans = 0.40000
>> disp(a);
3
E uma situação especial e quando não definimos a variável que irá ser armazendo
o resultado, nesse caso o Octave atribui automaticamente o resultado para variável ans:
>>5 * 3;
>> disp(ans);
15
1.5. VARIÁVEIS PRÉ-DEFINIDAS
Algumas variáveis já possuem valores pré-definidos:
Constante Detalhes
I, i, J, j Números imaginários puros
Inf, inf Infinito
Not a number. É o resultado de operações como '0/0 ou 'Inf -
NaN, nan
Inf'
SEEK_SET
SEEK_CUR Comandos opcionais da função fseek
SEEK_END
eps Retorna a precisão do computador
A razão entre a circunferência de um círculo e seu diâmetro.
pi
Internamente ele é computador por `4.0 * atan (1.0)'.
realmax O maior número em ponto flutuante que pode ser representado
O menor número em ponto flutuante que pode ser
realmin
representado
stdin Retornar os números dos arquivos correspondente a entrada
stdout padrão, saída padrão e saída de erro padrão.
8
stderr
Número de Euler ou Constante de Néper. É a constante que
e
resolve a equação: log (e) = 1
>> pi
ans = 3.1416
>> e
ans = 2.7183
>> realmax
ans = 1.7977e+308
1.6.1. Inteiros
Em grande parte das linguagens de programação, números naturais (0, 1, 2,
3, etc.) são conhecidos como inteiros sem sinal.
Para valores inteiros pode ser definidos a quantidade de bits utilizados para
armazenamento do valor.
• Um inteiro com sinal de n bits tem uma faixa de valores de -2n-1 até 2n-1 – 1
• Um inteiro sem sinal de n bits tem uma faixa de valores de 0 até 2n – 1
Por exemplo, se forem utilizados 8 bits para armazernar um inteiro, a escala de
valores vão:
• Inteiro com sinal: de -27 (-128) até 27 – 1 (127)
• Inteiro sem sinal: de 0 até 28 – 1 (255)
y=int8(x) Um inteiro com sinal de 8-bits entre [−27, 27 − 1] = [−128, 127]
y=uint8(x) Um inteiro sem sinal de 8-bits entre [0, 28 − 1] = [0, 255]
y=int16(x) Um inteiro com sinal de 16-bits entre [−215, 215 − 1] = [−32768, 32767]
y=uint16(x) Um inteiro sem sinal de 16-bits entre [0, 215 − 1] = [0, 65535]
Um inteiro com sinal de 32-bits entre [−231, 231 − 1] = [−2147483648,
y=int32(x)
2147483647]
y=uint32(x) Um inteiro sem sinal de 32-bits entre [0, 232 − 1] = [0, 4294967295]
9
>> a = 3 * pi
a = 9.4248
>> b = 1/3
b = 0.33333
O armazenamento em ponto flutuante tem problema de arredondamento,
verifique o resultado da equação abaixo:
>> 0.5 - 0.4 -0.1
ans = -2.7756e-17
1.6.3. String
Strings são codificadas como uma sequência de caracteres terminada pelo carácter
nulo (valor 0). Cada carácter é um número inteiro convertido através de uma definição
para um carácter. A tabela mais utilizada é a ASCII, que apresenta a equivalência de vários
símbolos para o binário.
10
>>y = "programação";
>> [x y]
ans = aulaprogramação
>> a = 5.1
a = 5.1000
>> a = "valor"
a = valor
1.7. LENDO E IMPRIMINDO VALORES NO OCTAVE
Além do comando disp, o Octave possui o comando printf, um comando mais
amplo para imprimir valores.
Fim
Perceba que o printf possui alguns caracteres estranhos dentro das aspas, o
primeiro %d se refere ao tipo de dado esperado, outros formatos que poderão ser
utilizados:
Tabela 1 - Caracteres coringas
Caractere Descrição
%d ou %i Número decimal inteiro.
%f Número real (ponto flutuante)
%s String
O “\n” (barra invertida) é o símbolo indicado para ao final realizar uma quebra de
linha na hora de apresentar o resultado
Outro exemplo de impressão:
Início
>>a = 5;
>>pi = 3.14;
a=5
>> printf("A = %d, PI = %f\n", a, pi);
A = 5, PI = 3.140000
pi = 3.14
pi
Fim
Figura 3 - Imprimindo 2 valores
Numa operação desses valores, fizemos duas saídas printfs, uma com o resultado
sendo impresso como inteiro e outra como número real:
>>a = 5;
>>pi = 3.14;
Fim
Figura 4 - Lendo um valor
Início
>>a = input("Digite um valor de A: ");
Digite um valor de A: 5
a >>b = input("Digite um valor de B: ");
Digite um valor de B: 3
b
>>printf("Resultado: %d", a + b);
Resultado: 8
a+b
Fim
Figura 5 - Algoritmo para somar dois valores
1.9. EXERCÍCIOS
1. Converta o exemplo acima de forma que possa realizar a soma de números reais.
2. Indique os nomes das variáveis que são válidos. Justifique os nomes inválidos.
a. peso d. int g. area.do.quadrado
b. média_final e. 1dia h. valor real
c. R$ f. teste 1 i. a+b
Exemplos:
Digite a quantidade de dúzias: 4
Valor das maças = R$ 40.000000
Exemplos:
Digite o valor do Cateto a: 2
Digite o valor do Cateto b: 4
O valor da hipotenusa é 4.472136
15
2. SISTEMAS DE NUMERAÇÃO
Utilizar a notação decimal é interessante para nós seres humanos, principalmente
pela associação com o número de dedos. Porém para o computador a manipulação de
dados através dessa notação é atualmente inviável, e por isso, o computador utiliza a
representação de informação através da notação binária (dois estados: ligado ou
desligado, 0 ou 1).
Resultado 64 32 16 0 0 2 0
Somando os resultados:
16
64 + 32 + 16 + 0 + 0 + 2 + 0 = 11410
Utilizando os resultados de trás para frente:
35110 = 1010111112
Método 2 – Subtração do peso das casas
Nesse método, preciso verificar se posso subtrair o valor do número pelo peso da
casa, caso positivo, acrescento 1 (um) a saída e o resto da subtração é enviada para a
próxima casa. Se o número é menor que o peso da casa, acrescento 0 (zero) para a saída e
continuo o mesmo número no valor da próxima casa.
Valor 351–256= 95 95-64= 31 31-16= 15-8= 7-4= 3-2= 1-1=0
Peso 2 = 512 2 = 256 2 = 128 2 = 64 2 = 32 24 = 16
9 8 7 6 5
2 = 8 2 = 4 2 = 2 20 = 1
3 2 1
Saída 1 0 1 0 1 1 1 1 1
Novamente chegamos ao resultado:
35110 = 1010111112
897 8
896 112 8
1 112 14 8
0 8 1
6
O resultado é 16018
1100111011
}
}
}
}
1 4 7 3
Resultado: 11001110112 = 14738
4 7 3 2
}
}
}
}
100111011010
O resultado da conversão: 1001110110102
12059 16
12048 753 16
(B)11 752 47 16
1 32 2
(F)15
Resultado = 2F1B16
101111010101
}
}
}
B D 5
E de 1F816 para binário:
1 F 8
}
}
}
111111000
21
Binário 1100001 1110010 1110001 1110101 1101001 1110100 1100101 1110100 1110101 1110010 1100001
Hexadecimal 61 72 71 75 69 74 65 74 75 72 61
Figura 8 - Representação de caracteres
𝐼!! = ň 𝑖 ×2!
!!!
Resultado 128 64 0 16 8 0 2 0
- (128) + 64 + 16 + 8 + 2 = -38
2
Fim do mundo para o Linux e similares, um problema de limitação na variável de armazenamento da
data nos sistemas com padrão POSIX podem causar problemas, o fim será as 03hrs14min07seg de 19 de
Janeiro de 2038. Para maiores detalhes procure por “Bug 2038”
23
Valor 1 2 3 4 5
Peso ... 101 100 10-1 10-2 10-3 ...
Resultado 10 2 0,3 0,04 0,005
𝐷= 10! ×𝑑[𝑖]
!!!!
Onde D seria o número decimal final, m a quantidade de casas inteiras, n o número de casas
fracionárias, e d[i] a parte do número decimal na casa i.
Por analogia, considere agora essa forma para representar o sistema binário, com o mesmo
princípio de casas e pesos. Por exemplo, vamos representar o número 101.112
Valor 1 0 1 1 1
Peso ... 22 = 4 21 = 2 20 = 1 2-1 = 1/2 2-2= 1/4 ...
Resultado 4 0 1 1/2 1/4
!
Resultado = 5
!
A representação matemática é:
!
𝐵= 2! ×𝑏[𝑖]
!!!!
24
Porém essa forma de representar números fracionários tem problemas de precisão34, por
exemplo, para representar o número 0,2 (1/5), não há formas precisão de representação,
conforme mostrado na Tabela 4.
bits 1 8 23
+- Expoente Mantissa
Figura 9 - Ponto flutuante de precisão simples
bits 1 11 52
+- Expoente Mantissa
Figura 10 - Ponto flutuante de precisão dupla
O expoente é definido através do calculo com o bias, esse número é obtido através do
número de bits no expoente com a fórmula 2k−1 – 1. Para o caso de precisão simples, o bias é 28−1 –
1 = 127. Para o ponto flutuante de precisão dupla, 211−1 – 1 = 1023.
3
Um fato curioso sobre essa problema de representação foi na guerra do Golfo, para saber mais
detalhes pesquise num site de busca por “erro arredondamento míssil Patriot”.
4
Ainda podemos verificar problemas de arredondamento no Excel, para isso numa célula qualquer
insira a equação = (0,5-0,4-0,1). O resultado deveria ser 0.
25
1. Para a parte inteira, realiza-se a conversão normal de decimal para binário: 210 = 102
2. Para a parte fracionária, faz-se sucessivas multiplicações da parte fracionária por 2:
0,625 × 2 = 1,25 1 Retira o número inteiro e continua a conta
0,25 × 2 = 0,5 0 Gerou 0, continuando...
0,5 × 2 = 1,0 1 Gerou 1 e restou 0, para aqui.
Portanto, 0,62510 = 0,1012
5
Forma de conversão retirado de http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html
26
27
3. OPERADORES
Os operadores são meios pelo qual incrementamos, decrementamos, comparamos
e avaliamos dados dentro do computador. Temos três tipos de operadores:
• Operadores Aritméticos
• Operadores Relacionais
• Operadores Lógicos
0.5
E outro que faz o processo com os operadores invertidos:
>>2 \ 4
ans =
2.
Para a potência, podem ser utilizados tanto o sinal ‘^’ quanto ‘**’:
28
>>2 ^ 2
ans =
4.
>>2 ** 2
ans =
4.
1 + 7 * 2 - 1 = 14
3 * (1 - 2) + 4 * 2 = 5
>>-1 & 2
ans = 1
>>1 & 2
ans = 1
3.3. OPERADORES RELACIONAIS
Os operadores relacionais são utilizados para comparar números. Os valores a
serem comparados podem ser números ou variáveis.
Estes operadores sempre retornam valores lógicos (Verdadeiro ou Falso). Para
estabelecer prioridades no que diz respeito a qual operação executar primeiro, utilize os
parênteses.
29
Os operadores relacionais são:
Tabela 7 - Operadores relacionais
Descrição Símbolo
Igual a ==
Diferente ~= ou !=
Maior que >
Menor que <
Maior ou igual a >=
Menor ou igual a <=
Exemplo:
Tendo duas variáveis A = 5 e B = 3
Os resultados das expressões seriam:
Tabela 8 - Exemplo de expressões
Expressão Resultado
A == B FALSO
A != B VERDADEIRO
A > B VERDADEIRO
A < B FALSO
A >= B VERDADEIRO
A <= B FALSO
Tabela 10 - Operador E
1º Valor 2º Valor Resultado
F F F
F V F
V F F
V V V
OR/OU = Uma expressão OR (OU) é verdadeira se pelo menos uma condição for
verdadeira
Tabela 11 - Operador OU
1º Valor 2º Valor Resultado
F F F
F V V
V F V
V V V
NOT = Uma expressão NOT (NÃO) inverte o valor da expressão ou condição, se
verdadeira inverte para falsa e vice-versa.
Tabela 12 - Operador NÃO
1º Valor Resultado
V F
F V
Exemplos:
Suponha que temos três variáveis A = 5, B = 8 e C =1.
Os resultados das expressões seriam:
Tabela 13 - Expressões
Expressão Resultado
A == B & B > C FALSO
A ~= B | B < C VERDADEIRO
A > B VERDADEIRO
A < B & B > C VERDADEIRO
A >= B | B == C FALSO
~ A <= B FALSO
31
3.5. EXERCÍCIOS
1) Tendo as variáveis SALARIO, IR e SALLIQ, e considerando os valores abaixo.
Informe se as expressões são verdadeiras ou falsas.
2) Sabendo que A=3, B=7 e C=4, informe se as expressões abaixo são verdadeiras ou
falsas.
a) (A + C) > B ( )
b) B >= (A + 2) ( )
c) C == (B – A) ( )
d) (B + A) <= C ( )
e) (C + A) > B ( )
3) Sabendo que A=5, B=4 e C=3 e D=6, informe se as expressões abaixo são
verdadeiras ou falsas.
a) (A > C) & (C <= D) ( )
b) (A+B) > 10 | (A+B) == (C+D) ( )
c) (A>=C) & (D >= C) ( )
4) Faça um programa que solicite ao usuário que digite a base e a altura de um
triângulo. Em seguida, apresente a área do mesmo.
Área = (Base * Altura) / 2
5) Crie um programa que solicite ao usuário que digite a quantidade de horas e de
minutos. Após isso, o programa deverá responder a quantidade de segundos nesse
período.
Segundos = (Quantidade de horas * 3600) + (Quantidade de minutos * 60)
6) Escrever um algoritmo para determinar o consumo médio de um automóvel
sendo fornecida a distância total percorrida pelo automóvel e o total de combustível gasto
Consumo médio = distância total / total de combustível gasto
7) A Loja Café com Açúcar está vendendo seus produtos em 5 (cinco) prestações
sem juros. Faça um programa que receba um valor de uma compra e mostre o valor das
prestações.
32
4. FUNÇÕES
Funções são formas de operar elementos de forma mais natural e são muito
utilizadas para melhorar estrutura um programa.
Uma função começa com a palavra chave function e termina com endfunction veja
um exemplo:
>>function res=soma(a, b)
>>res = a + b;
>>endfunction
>>soma(4, 5)
ans = 9
Detalhando as linhas
Na linha function res=soma(a, b) começamos uma função chamando a
palavra function, logo em seguinda a variável res será responsável por pelo retorno de
dados para o local em que foi chamado. Soma se refere ao nome da função e a e b os
valores que serão passados.
Dentro da função, a variável de retorno res irá receber o resultado da soma e ao
final da função irá ter seu valor retornando a função que chamou.
A linha soma(4, 5) irá chamar a função correspondente, passando os valores 4
e 5, ao final apresentado o resultado.
A sintaxe padrão da função é a seguinte:
Function [<retorno>]=<Nome_Função>(<lista de argumento>)
<Processamento>
endfunction
O retorno pode ser uma única variável ou um conjunto de variáveis, nesse caso a
lista de variáveis de retorno devem ser inseridas dentro de colchetes (“[“ e “]”)
Perceba no próximo exemplo, que a função processa retorna dois valores, um com
o resultado da soma dos parâmetros e outro com a subtração:
>>function [soma, subtrai]=processa(a, b)
>>soma = a + b;
>>subtrai = a - b;
>>endfunction
res_sub = 2
4.1. EXERCÍCIOS
1. Escreva uma função que calcule e retorne a distância entre dois pontos ( x1,
y1) e (x2, y2).
2. Escreva uma função potencia(base, expoente) que, quando chamada,
retorna baseexpoente. Por exemplo, potencia(3, 4) deve retornar 81. Assuma
que expoente é um inteiro maior ou igual a 1.
3. Crie funções que recebam um valor de x e retorne o resultado das
seguintes equações matemáticas:
a. x + 2
b. x – 2*x
c. x2 – 4
d. x3 + 2x2 - 6x + 2
4. Faça um programa que receba os valores de a, b e c e através da formula de
Bhaskara, retorne as duas raízes da expressão.
34
5. COMANDOS DE DECISÃO
Os comandos de decisão ou desvio fazem parte das técnicas de programação que
conduzem a estruturas de programas que não são totalmente sequenciais. Com as
instruções de SALTO ou DESVIO pode-se fazer com que o programa proceda de uma ou
outra maneira, de acordo com as decisões lógicas tomadas em função dos dados ou
resultados anteriores.
5.1. SE / IF
A estrutura de decisão “SE/IF” normalmente vem acompanhada de um comando,
ou seja, se determinada condição for satisfeita pelo comando SE/IF então execute
determinado comando.
A decisão é sempre composta por um ou mais operador relacional, e
quando mais de um operador relacional estiver na condição,
obrigatoriamente deve-se utilizar o operador lógico para conectar as
expressões.
if media >= 5
printf("Aprovado\n");
end
Figura 11 - Comando IF
35
if media >= 5
printf("Aprovado\n");
else
printf("Reprovado\n");
end
Figura 12 - Uso do SE/SENÃO
No exemplo acima está sendo executada uma condição que, se for verdadeira,
executa o comando “APROVADO”, caso contrário executa o segundo comando
“REPROVADO”.
5.2.1. Exercício
1) Faça um programa que some dois valores, se o resultado for 0 deve aparecer a
mensagem “Zero”, caso contrário, “Diferente de Zero”.
36
if media >= 5
if media >= 7
printf("Aprovado");
else
printf("Exame");
end
else
printf("Reprovado");
end
Figura 13 - IFs encadeados
media
media = input("Digite a nota: ")
if media < 5
Sim
media < 5 Reprovado printf("Reprovado");
elseif media >= 5 & media < 7
Não
printf("Exame");
elseif media >= 7
Sim
printf("Aprovado");
media >= 5 &&
media < 7
Exame end
Não
Sim
media >= 7 Aprovado
Não
Fim
Figura 14 - IF em sequência
Nesse caso, deve-se tomar cuidado nas condições do IF, como queremos que
apenas uma mensagem seja exibida, a condição não pode ser aplicada para vários casos,
por isso, que no segundo IF tivemos que realizar duas comparações.
Recebe Valor
Sim
Valor = 1 Janeiro
Não
Sim
Valor = 2 Fevereiro
Não
Sim
Valor = 3 Março
Não
.
.
.
.
Não Sim
Valor = 12 Março
Não é um mês
válido
Figura 15 - Diagrama de bloco do Switch
Em Octave:
mes = input("Digite o mês:");
switch (mes)
case 1
printf("Janeiro\n")
case 2
printf("Fevereiro\n")
case 3
printf("Março\n")
case 4
printf("Abril\n")
case 5
printf("Maio\n")
case 6
printf("Junho\n")
case 7
printf("Julho\n")
case 8
printf("Agosto\n")
case 9
printf("Setembro\n")
case 10
printf("Outubro\n")
case 11
39
printf("Novembro\n")
case 12
printf("Dezembro\n")
otherwise
printf("Mês inválido\n")
end
Figura 16 - Código fonte do switch
switch (valor)
case {1, 2, 3}
printf("Valor digitado foi 1, 2 ou 3\n")
case {4, 5, 6}
printf("Valor digitado foi 4, 5 ou 6\n")
otherwise
printf("Outro valor\n")
end
5.6. EXERCÍCIOS
1. Os moradores de uma localidade possuem um poço artesiano que distribui
água para a comunidade, a cobrança é feita pelo consumo, até 10m3 o morador paga taxa
fixa de R$10,00, acima dessa quantidade, ele paga R$2,00 por metro cúbico excedente.
Faça um programa que receba a quantidade de litros gastos pelo morador e retorno o
valor que deve ser pago.
2. Faça um programa que leia um número inteiro e mostre uma mensagem
indicando se é positivo, negativo ou zero.
3. Crie um programa que receba um número inteiro e classifique-o em par ou
ímpar. Dica: a função modulo(A, B) retorna o resto da divisão do número A pelo B, por
exemplo: modulo(5, 2) irá apresentar 1, enquanto modulo(6, 2), apresentará 0.
4. Elabore um algoritmo que dada a idade de um ciclista classifique-o em uma
das seguintes categorias:
Infantil A = 5 a 7 anos
Infantil B = 8 a 11 anos
Juvenil A = 12 a 13 anos
Juvenil B = 14 a 17 anos
Adultos = Maiores de 18 anos
40
6. VETORES E MATRIZES
Vetores e matrizes são construções especiais de variáveis, são um agrupamento de
variáveis do mesmo tipo em que seus elementos são acessados através de índices. O
Octave foi programado para lidar com vetores e matrizes de forma eficiente e elegante.
1. 2. 3.
4. 5. 6.
1.
2.
3.
1 2 3
4 5 6
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
Ou pode-se criar uma matriz vazia:
>>m4 = []
m4 = [](0x0)
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
1 2 3
99 5 6
7 8 9
10 11 12
13 14 15
>>A = [1 2 3; 4 5 6]
A =
1 2 3
4 5 6
>>res = soma2(A)
res =
3 4 5
6 7 8
Outro exemplo:
>>r2 = x – 2;
>>endfunction
>>A = [1 2 3; 4 5 6]
A =
1 2 3
4 5 6
3 4 5
6 7 8
resSub =
-1 0 1
2 3 4
1 2 3 4 5 6 7 8 9 10
>>a = [1:2:10]
a =
1 3 5 7 9
>>a = [2:2:10]
a =
2 4 6 8 10
>>a = [2:1] % Cria uma sequência começando em 2 e
terminando em 1??
44
a = [](1x0)
2 1
>>a = [10:-1:1]
a =
10 9 8 7 6 5 4 3 2 1
1 3 5 7 9
2 4 6 8 10
1 3 5 7 9
2 4 6 8 10
1 4 7 10 13
O operador “:” pode ser utilizado para selecionar linhas, colunas ou elementos:
>>A = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
A =
1 2 3
4 5 6
7 8 9
10 11 12
>>B = A(:, 1)
B =
1
4
7
10
Nesse exemplo foi criado a matriz A, depois foi selecionado todas as linhas através
do operador “:” e apenas a primeira coluna;
>>A = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
A =
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
>>B = A(2:4, 1)
B =
4.
7.
10.
O comando pode ser utilizado para passar uma sequência de elementos, nesse
caso foi utilizado para retornar entre as linhas e 2 e 4 apenas a primeira coluna
>>A = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
A =
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
B =
4. 5.
7. 8.
10. 11.
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
13. 14. 15.
>>B = A(1:2:5, :)
B =
1. 2. 3.
7. 8. 9.
13. 14. 15.
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
13. 14. 15.
0. 0. 0.
4. 5. 6.
7. 8. 9.
10. 11. 12.
13. 14. 15.
47
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
13. 14. 15.
0. 0. 0.
4. 5. 6.
0. 0. 0.
10. 11. 12.
0. 0. 0.
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
13. 14. 15.
0. 0. 3.
4. 5. 6.
0. 0. 9.
10. 11. 12.
0. 0. 15.
>> X = [1 0 4 -3 0 0 0 8 6];
E o comando
>> indices = find(X == 0)
indices =
2 5 6 7
2
5
6
7
1 0 4
-3 0 0
0 8 6
3
4
5
8
49
Nesse exemplo, o comando FIND retornou a posição linear dos valores iguais a 0. A
posição linear é definida pela colunas, começando no canto superior esquerdo:
Os números em Azul representam a posição dos elementos.
Retornando a posição 2.
-3 0 0
Graficamente falando:
1
2
1 0 4
-3 0 0
Ou podemos ainda querer que ele retorne apenas a 1ª ocorrência do índice:
>> Res = X(indices(1), :)
Res =
1 0 4
eye Cria uma matriz identidade
linspace Criar um vetor linearmente espaçado
ones Cria um vetor ou matriz com uns
zeros Cria um vetor ou matriz com zeros
rand gera uma matriz com valores aleatórios
1. 0. 0. 0.
0. 1. 0. 0.
0. 0. 1. 0.
0. 0. 0. 1.
>>id2 = eye(4, 2)
id2 =
1. 0.
0. 1.
0. 0.
0. 0.
>>a = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
a =
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
>>id = eye(a)
id =
1. 0. 0.
0. 1. 0.
0. 0. 1.
0. 0. 0.
52
X = eye(m,n)
X = eye(A)
Onde:
A: uma outra forma de construir uma matriz identidade, passa-se uma matriz A e o
comando eye() constrói uma matriz identidade com as mesmas dimensões da matriz A.
>>linspace(0,9,10)
ans =
0. 1. 2. 3. 4. 5. 6. 7.
8. 9.
>>linspace(0, 10, 5)
ans =
>>m1 = ones(1, 4)
m1 =
1. 1. 1. 1.
>>m2 = ones(3, 2)
m2 =
53
1. 1.
1. 1.
1. 1.
>>a = [1 2 3; 4 5 6]
a =
1. 2. 3.
4. 5. 6.
>>m3 = ones(a)
m3 =
1. 1. 1.
1. 1. 1.
As formas de chamar a função one são:
y=ones(m1,m2,...)
y=ones(A)
y=ones()
Onde:
m1 e m2 são valores que representam o número de elementos em cada dimensão
A: uma outra forma de construir uma matriz identidade, passa-se uma matriz A e o
comando ones() constrói uma matriz de elementos 1 com as mesmas dimensões da matriz
A.
>>m1 = zeros(1, 5)
m1 =
0. 0. 0. 0. 0.
>>m2 = zeros(3, 4)
m2 =
0. 0. 0. 0.
0. 0. 0. 0.
54
0. 0. 0. 0.
>>a = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
a =
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
>>m = zeros(a)
m =
0. 0. 0.
0. 0. 0.
0. 0. 0.
0. 0. 0.
Onde:
m1 e m2 são valores que representam o número de elementos em cada dimensão
A: uma outra forma de construir uma matriz identidade, passa-se uma matriz A e o
comando zeros() constrói uma matriz de elementos 1 com as mesmas dimensões da
matriz A.
>>a = [1 2 3; 4 5 6]
55
a =
1. 2. 3.
4. 5. 6.
rand(key)
rand("seed" [,n])
rand("info")
Onde:
6.7. EXERCÍCIOS
1. Criação e operação de matrizes
a. Criar 2 matrizes A e B, com dimensões 3X4.
b. Criar em C a transporta de A.
c. Gerar D, somando A e B.
d. Gerar E, subtraindo B de A .
e. Gerar F com a multiplicação, elemento a elemento, de A por B.
f. Adicionar 5 a cada elemento de B.
g. Apagar todas as variáveis usadas até este momento.
56
2. Operação em vetores:
a. Gerar um vetor inteiro H, com o valor inicial 6 e valor máximo 100,
com variação entre elementos de 6.
b. Gerar um vetor I, subtraindo 2 de cada um dos valores de H.
c. Gerar um vetor J com a multiplicação, elemento a elemento, de H
por I.
3. Insira a matriz X = [2 7 9 7; 3 1 5 6; 8 4 2 5] no Octave, execute os seguintes
comandos e detalhe o valor obtido
a. A = X(1, 1:3)
b. B = X(1:2, 1:2)
c. C = X(:,2:2:$) % O operador $ é utilizado para designar o fim da série
d. D = X(1:2:$, :)
4. Detalhe o que cada comando irá fazer:
a. x = [3 15 9 12 -1 0 -12 9 6 1]
x (x > 0) = 0
b. x = [3 15 9 12 -1 0 -12 9 6 1]
x(:, 1:2:$) = 2
c. x = [3 15 9 12 -1 0 -12 9 6 1]
y = x(x>10)
d. x = [3 15 9 12 -1 0 -12 9 6 1]
y = x(modulo(x,2)==0)
5. Faça:
a. Criar com a função rand a matriz real mat, de dimensões 7X5 e
multiplicá-la por 100. Depois utilizando a função int, modifique a
matriz mat de forma que contenha apenas valores inteiros
b. Com a matriz mat obtida do item anterior apresente a soma e o
produto de todos seus valores;
c. Ainda sobre a matriz mat apresente o maior valor, o menor valor e
a média dos valores
57
Onde:
Options: são as opções aceita pelo comando, as principais são:
-append Adiciona o novo conteúdo ao arquivo, sem destruir os dados anteriores
-ascii Salva os dados num arquivo texto simples, sem informações a mais
-binary Salva os dados em formato binário (o arquivo fica menor, mas de difícil
entendimento se aberto por um editor de texto)
-text Salva os dados em formato texto (padrão)
-zip ou -z comprime os dados com o algoritimo gzip
7.1.1. Exemplo 1
Por exemplo, considere os seguintes comandos:
>>a = [1 2 4; 6 8 4; 1 4 5];
>>save dados.txt a
Irá salvar o arquivo “dados.txt” com o seguinte conteúdo:
58
7.1.2. Exemplo 2
Se forem enviados três variáveis para o arquivo:
>>a = [1 2 4; 6 8 4; 1 4 5];
>>b = 3.444;
>>c = "texto";
>>save dados.txt a b c
O arquivo resultante fica:
# Created by Octave 4.0.3, Mon Jan 22 14:29:30 2018 -02 <cendron@Marcelos-
MacBook-Pro.local>
# name: a
# type: matrix
# rows: 3
# columns: 3
1 2 4
6 8 4
1 4 5
# name: b
# type: scalar
3.444
# name: c
# type: string
# elements: 1
# length: 5
texto
59
-ascii Assume que os dados estão em formato de texto sem nenhum cabeçalho a
mais.
-binary Assume que o arquivo está em formato binário
-text Assume que o arquivo está em formato texto
7.2.1. Exemplo 1
Para exemplificar o uso do Load, vamos partir do arquivo “dados.txt” criado com
os seguintes dados:
# name: AA
# type: matrix
# rows: 3
# columns: 3
4 5 6
1 2 3
8 9 10
Como pode ser observado, os números estão organizados numa matriz de 3 linhas
por 3 colunas, do tipo matriz, com o nome “AA”
>>load dados.txt
Será criado uma variável com o nome “AA” e os dados que estão no arquivo:
>> AA
60
AA =
4 5 6
1 2 3
8 9 10
7.2.2. Exemplo 2
Outro exemplo, dessa vez, o arquivo tem os seguintes dados:
# name: AA
# type: matrix
# rows: 3
# columns: 3
4 5 6
1 2 3
8 9 10
# name: BB
# type: matrix
# rows: 2
# columns: 3
11 12 13
14 15 16
Executando o comando:
>>load dados.txt
>> AA
AA =
4 5 6
1 2 3
8 9 10
>> BB
BB =
11 12 13
61
14 15 16
7.2.3. Exemplo 3
Dessa vez, iremos querer carregar os dados de um arquivo sem a estrutura de
cabeçalho, apenas os dados:
4 5 6
1 2 3
8 9 10
4 5 6
1 2 3
8 9 10
Veja que antes do comando load foi especificada a variável em que os dados serão
salvos. Caso seja o omitido o nome da variável, será criada uma com o mesmo nome do
arquivo.
7.2.4. Exemplo 4
Caso se imagine que para salvar duas matrizes basta colocar uma abaixo da outra:
4 5 6
1 2 3
8 9 10
1 2 3
11 12 13
Ao tentar carregar os dados, vamos apenas 1 matriz com todos os valores:
>> a = load("arquivo.txt")
a =
62
4 5 6
1 2 3
8 9 10
1 2 3
11 12 13
Para recuperar duas matrizes separadas é necessário especificar os cabeçalhos
para cada uma, como feito no exemplo 2.
7.3. EXERCÍCIOS
1. Dado a lista de valores abaixo, crie um arquivo com esses valores e faça a
importação no Octave:
2
5
9
10
11
15
16
17
18
20
2. Faça um programa que leia 2 valores de um arquivo e verifique qual o
número é maior
3. Faça um programa que receba do teclado 2 valores e salve os dois números
num arquivo.
63
8. GRÁFICOS
O Octave permite criar diversos tipos de gráficos em 2 e 3 dimensões, para isso, a
base de gráficos é construída através da função plot.
>>Y = X.^2.-4
Y =
>>plot(X, Y)
E o resultado:
64
>>Y = X.^2.-4
Y =
>>plot(X, Y);
>>xlabel("Valores de X");
>>ylabel("Valores de Y");
>>title("Teste de plotagem");
65
Podemos personalizar melhor o gráfico passando certos parâmetros para as
funções xlabel, ylabel e title:
Por exemplo:
>>xlabel("Valores de X", "fontsize", 16);
Irá reproduzir o seguinte gráfico:
66
Algumas propriedades que podem ser alteradas são:
Veja o exemplo:
67
>>X = [-3:0.5:3];
>>Y = X.^2.-4;
>>plot(X, Y);
E o resultado:
8.1.2. Adicionando legenda
Para adicionar legendas usa-se o comando:
Legend( strings [,"location",pos][,"orientation", orient
][, opções ] )
onde:
• strings: os textos que irão aparecer na legenda
• "location": esse comando é opcional, define a posição da legenda, caso seja
utilizado, o argumento pos deve ser um desses:
68
pos Localização da legenda
north Topo centro
south Baixo centro
east Centro direita
west Centro esquerda
northeast Topo direita(padrão)
northwest Topo Esquerda
southeast Baixo direita
southwest Baixo esquerda
outside Pode ser adicionado ao final da posição, para colocar a caixa da
legenda fora da área do gráfico. Por exemplo “eastoutside”
“orientation”: comando opcional, define a orientadação da legenda, se for
•
utilizado, o valor de orient deve ser "vertical" (padrão) ou "horizontal".
Veja um exemplo:
>>legend("Valor de x", "location", "east",
"orientation", "vertical");
Ainda o comando Legend pode ser executado, apenas com um dos argumentos:
69
"boxoff" Oculta uma caixa ao redor da legenda.
"right" Posiciona o rótulo de texo no lado direito do figura (padrão)
"left" Posiciona o rótulo de texo no lado esquerdo do figura
"off" Apaga a legenda.
• on
• off
• minor
• minor on
• minor off
Por exemplo:
>>grid on
Pode-se ainda inserir o grid menor:
>>grid minor on
71
Para ajustar a cor do grid, precisamos especificar a cor através do comando:
>> set(gca(), "xcolor", cor)
>> set(gca(), "ycolor", cor)
Por exemplo, para setar a cor verde para o eixo X e azul para o Y:
>> set(gca(), "xcolor", "green")
>> set(gca(), "ycolor", "blue")
72
73
9. COMANDOS DE REPETIÇÃO
Utilizamos os comandos de repetição quando desejamos que um determinado
conjunto de instruções ou comandos sejam executados um número definido ou indefinido
de vezes, ou enquanto um determinado estado prevalecer ou até que seja alcançado.
Esse tipo de estrutura é muito importante em programação, e seu uso é
constante nas disciplinas de programação.
Basicamente um laço de repetição é composto por três partes:
1. Inicialização
2. Verificação da condição.
3. Incremento/decremento
No diagrama a seguir são apresentas as três partes:
i=0 1 i=0
while i < 10
2 i=i+1
i <= 10
Não end
Sim
3
i=i+1
Fim
Figura 17 - Partes de um laço de repetição
Quanto ao formato da repetição, são basicamente três os formatos aceitos em
Octave:
• Enquanto x, processar (While... Loop);
• Para... Até... Seguinte (For... To... Next).
Figura 18 - Diagrama While
Exemplo de contador:
i=0 i = 0;
while i < 10
i = i + 1;
Sim
i <= 10
printf("%d\n", i);
end
Não
i
i=i+1
Fim
Figura 19 - Laço While
Nesse exemplo, a variável a é uma lista com 4 elementos. O for interage sobre cada
objeto, imprimindo um de cada vez.
i=i+1
Fim
Figura 20 - Laço While
Como não sabemos o valor de n, iremos criar uma variável para ela, especificar um
valor e utilizar o valor de n como limite do laço de repetição.
76
i=0 i = 0;
n = input("Digite o maior valor:");
n while i <= n
i = i + 1;
printf("%d\n", i)
Não
i <= n end
Sim
i=i+1
Fim
Figura 21 - Modificações no laço básico
Se for digitado o valor 5 (utilizaremos esse valor para o restante do exemplo)
perceba que o programa irá contar de 1 a 6, não coincidindo com o esperado que era
contar até 5, para resolver isso, vamos retirar o sinal de “=” da comparação.
A atividade proposta é somar os números pares, desconsiderando o 0 (zero) o
programa deve realizar a seguinte conta:
Total = 2 + 4 + 6 + 8 + 10
Total = 30
Antes de realizar a soma, vamos apresentar esses valores, como nosso programa
apresenta os números de 1 a 5, para apresentar os valores pares basta multiplicarmos o
valor de i por 2:
77
i=0 i = 0;
n = input("Digite o maior valor:");
n=5 while i < n
i = i + 1;
valor = i * 2;
i<n
Não
printf("%d\n", valor);
Sim
end
i=i+1
i*2
Fim
Figura 22 - Imprimindo valores pares
Por enquanto apenas alteramos o valor mostrado.
Agora vamos criar uma variável temporária que irá armazenar para cada passo do
laço o dobro do valor de i e vamos deslocar o printf para o final:
i=0 i = 0;
n = input("Digite o maior valor:");
n=5 total = 0;
while i < n
total = 0 i = i + 1;
total = total + (i * 2)
Não
end
i<n
Sim
printf("Valor final: %d\n", total)
i=i+1
total = total + (i * 2)
Fim
total
Executando passo-a-passo a repetição se desdobra na seguinte forma (note que
após o cálculo, o resultado é armazenado em total):
78
Variável Variável
Etapa Cálculo efetuado
Total i
1ᵒ 0 1 0 + (1 * 2) = 2
2ᵒ 2 2 2 + (2 * 2) = 6
3ᵒ 6 3 6 + (3 * 2) = 12
4ᵒ 12 4 12 + (4 * 2) = 20
5ᵒ 20 5 20 + (5 * 2) = 30
Saída 30
Matematicamente falando a fórmula do nosso exemplo é:
!
𝑇𝑜𝑡𝑎𝑙 = 𝑖 ∗ 2
!!!
Fim
Figura 23 - Laço While
79
Fim
Figura 24 - Modificações no laço While
Agora, iremos verificar se o valor de n pode ser dividido por i e a saída, caso
positivo:
i=0
n = 27
Não
i<n
Sim
i=i+1
n % i == 0
Não Sim
O número é
divisível por i
Fim
Fim
Figura 25 - Diagrama do programa
80
i = 2;
n = 27;
total = 0;
while i < n
if mod(n, i) == 0
printf("O número %d é divisível por %i\n", n, i);
end
i = i + 1;
end
Figura 26 - Código-fonte
9.4. EXERCÍCIOS
1) Apresente o total da soma obtido dos cem primeiros números inteiros
(1+2...+99+100).
2) Faça um programa que a partir de dois números imprima os números do
intervalo excluindo os valores dados.
3) Crie um programa que dado um número ele imprima a tabuada desse número
de 1 a 10.
4) Faça um programa que conte de 1 a 100 e a cada múltiplo de 10 emita uma
mensagem: “Múltiplo de 10”.
5) Escreva um método que recebe dois números reais a e b e retorna a soma de
todos os números pares existentes entre esses dois
6) Utilizando repetição, calcule o fatorial de um número. Lembre-se que o fatorial
de 0 é 1 e, não existe fatorial de números negativos.