4
1.
Noções de Programação
O objetivo deste capítulo é fornecer ao aluno noções básicas de programação aplicadas à Engenharia Química; assim sendo, apenas estruturas fundamentais e exemplos simples serão apresentados neste material.
1.1 Tipos e atribuição de variáveis
Os principais tipos de variáveis comuns à praticamente todas as linguagens de programação são:
• Inteiros: -1; 0 ; 1; 2;
• Real de simples ou dupla precisão: 2,1322 • Caracteres: armazenam texto
• Booleanos: Verdadeiro ou Falso
Cada variável pode ter seu valor atribuído ao longo do programa. O símbolo de atribuição é tipicamente representado por ← ou =. A atribuição de um “valor” à uma
variável significa que no endereço de memória reservado para esta variável, será armazenado o “valor” informado. Na atribuição de uma variável, do lado esquerdo do símbolo ← ou = deve conter a variável à qual desejamos atribuir dado “valor”; ao lado
direito, a expressão que se deseja atribuir à variável. Por exemplo, se em uma linha de programação escrevemos:
← 9 + 5
Queremos dizer que à variável será atribuído o valor de 14. Quando no cálculo do valor, empregamos a própria variável, o programa irá efetuar a conta da expressão com o valor até então armazenado da variável. Por exemplo:
← 1 ← + 3
O valor de ao final será 4, pois na primeira linha de programação, o tem seu valor atribuído de 1, na segunda ele tem seu valor atribuído de (que é até então 1) somado à 3, logo, o resultado é 4.
As variáveis não precisam ser necessariamente numéricas. Por exemplo, seja uma variável booleana (verdadeira ou falso), escrita na seguinte forma:
5 Note que a pergunta 2 > 3 é falsa, logo o “valor” de será .
Ainda outro tipo de variável é variável texto. Por exemplo: ← " "
1.2 Algoritmos e estruturas básicas de programação
A primeira coisa a se definir é o conceito de Algoritmo:
“Algoritmo: Conjunto das regras e procedimentos lógicos perfeitamente definidos que
levam à solução de um problema em um número finito de etapas.” – Dicionário do Google
A forma de representação de um agortimo apresenta algumas variantes, e vamos representar as duas principais formas aqui. De forma geral, como boa prática de programação, o algoritmo deve receber no início todos os Dados de Entrada, necessários para sua rodada. Efetuam-se então procedimentos lógicos, e são fornecidos os resultados, conforme ilustrado na Figura 1.1:
Figura 1.1 – Ilustração da estrutura básica de um algoritmo.
Por exemplo, vamos considerar o cálculo da média final, sendo informadas as notas das 4 provas (P1, P2, P3 e P4). Um algoritmo poderia ser escrito na forma:
Figura 1.2 – Ilustração de um algoritmo que calcula a média final, dadas 4 notas. Saída
Procedimentos Dados de
Entrada
Informe a média MF Calcule valor da média
final:
MF=(P1+P2+P3+P4)/4 Defina o valor
6
1.2.1 As lógicas E e OU
Algo mais deve ser descrito sobre as formas das variáveis booleanas, associadas à comparações mútuas que empregam as perguntas lógicas E e OU. A lógica E retorna verdadeiro caso ambas as condições forem verdadeiras; já a lógica OU retorna verdadeiro se pelo menos uma condição for verdadeira. Por exemplo:
← 2 < 3 2 < 5
á VerdadeiroVerdadeiroVerdadeiroVerdadeiro, & '()'* ã Outro exemplo:
← 2 > 3 2 < 5
á FalsoFalsoFalsoFalso, & /(' 012'*, & 3 , é 5'2*'
A exclusividade de ambas serem satisfeitas muda quando ao invés de empregarmos E, empregamos OU. Neste caso, se uma das condições for satisfeita, então a variável retornada é verdadeira. Por exemplo:
← 2 > 3 6 2 < 5
á 7180'0198:, & ;12: (1<:* /(' 012'*, => , é ?180'0198'
1.2.2 A Estrutura Se/SeNãoSe/SeNão
A representação típica de uma pergunta em um algoritmo é um losango (embora isto não seja uma regra). Um exemplo simples de uma estrutura Se/SenãoSe/Senão está ilustrado na figura a seguir.
Figura 1.3 – Ilustração de uma condicional Se/SenãoSe/Senão.
Se a<2
Escreva “Blá”
Escreva “Blá Blá”
Fim Se
Senão Se a<8 a 4
Senão
Escreva “Blá Blá Blá”
7 Uma figura típica que se propõem a resumir 5 anos de engenharia está apresentada a seguir:
Figura 1.4 – Algoritmo útil em engenharia.
http://www.barrett.com.au/blogs/SalesBlog/2015/3190/sales-attitudes/warren-buffetts-wisdom-and-effective-sales-team/
Como no caso ilustrado, a estrutura de perguntas pode conduzir à subestruturas de perguntas. Note que o algoritmo acima poderia ser escrito de duas formas, conforme ilustrado a seguir:
(A) (B)
Figura 1.5 – Forma de escrita do algoritmo da figura anterior.
Na primeira forma, há subestruturas Se’s dentro de estruturas Se’s. Na segunda forma, emprega-se a função E para incluir a pergunta das subestruturas.
Vamos supor que se queira efetuar uma brincadeira com um amigo que torce para um time do Rio de Janeiro, questionando para que time ele torce. Pergunte se é
Se “Estiver se Movendo”? Se “Deveria se Mover”?
Sem problemas
Use fita adesiva
Se “Deveria se Mover”?
Sem problemas Use óleo lubrificante
Fim Se Fim Se
Fim Se Senão
Senão
Senão
Se “Estiver se Movendo”? E ‘Não deveria”
Use fita adesiva
Use óleo lubrificante
Fim Se
8 flamenguista: se sim, diga que só ganha roubado; senão, pergunte se é vascaíno: se sim, o chame de vice-eterno, senão, pergunte se fluminense; se sim, é coxinha na certa; senão, pergunte se é botafoguense, se sim, deve se sentir solitário no mundo!
Figura 1.6 – Algoritmo de brincadeiras típicas feitas com torcedores dos times do Rio de Janeiro.
É importante salientar que as estruturas SenãoSe e Senão são opcionais na escrita dos algoritmos!
1.2.3 Loops
Outra estrutura fundamental são loops. Vamos supor que queríamos escrever valores de i de 1 a 10, ou seja, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Neste caso, o algoritmo que efetua esta operação está ilustrado a seguir:
Figura 1.7 – Algoritmo que ilustra a escrita de valores de 1 a 10.
Note que na estrutura acima, há um loop, ou seja, uma repetição da escrita de i de 1 a 10. São duas as principais formas de escritas de loops aceitas nos códigos de programação, ilustradas na figura a seguir, ambas com resultados idênticos.
(A) (B)
Figura 1.8 – Estruturas de loops aceitas nos programas de computação.
Para i de 1 a 10
Fim faça Escreva i
Resultados: 1 2 3 ... 10
Resultados: 1 2 3 ... 10
Faça Enquanto (i<=10)
Fim faça Escreva i
9 Note que as duas formas de escritas da Figura 1.8 são similares entre si e efetuam ambas os mesmos procedimentos da Figura 1.7. No entanto, a estrutura da Figura 1.8A inclui inevitavelmente um contador (i), cujo valor se inicia no menor valor informado no loop e vai até o maior valor informado no loop; como foi dito Para i de 1 a 10, o i irá de 1 a 10, sendo o default deste tipo de representação que o passo seja de 1 em 1 (o passo pode ser modificado). Já a estrutura da Figura 1.8B (faça enquanto), não necessariamente deve ter um contador embutido, mas uma condição satisfeita, tanto é que o contador precisa inicializado e atualizado com linhas de programação. Embora para o exemplo ilustrado ambas precisem de um contador, na estrutura da Figura 1.8A, o contador é necessário; na Figura 1.8B, o contador não é estritamente necessário.
Em outro exemplo, considere que um candidato irá tentar no máximo 6 vezes passar na prova de uma disciplina; caso não passe, irá desistir. O algoritmo que representa este procedimento está ilustrado na figura a seguir.
Figura 1.9 – Algoritmo de um candidato que tentará no máximo 6 vezes fazer uma prova de disciplina!
10
(A) (B)
Figura 1.10 – Formas de escritas dos algoritmos.
1.3 Exemplos de emprego das lógicas de estruturas básicas
Para ilustrar, vejamos alguns exemplos: Vale ressaltar que não é o objetivo aqui implementar o modo menos custoso de cálculos computacionais, mas sim a formulação mais didática! Nesta formulação didática, faremos uso excessivo de perguntas Se/SenãoSe/Senão, que sãos as operações mais custosas computacionalmente. Em uma programação otimizada, procura-se reduzir o número de operações que envolvem a estrutura Se/SenãoSe/Senão.
1-) Escreva o algoritmo que efetue a operação ∑ ²BCB , guardando o resultado em uma variável soma.
Solução: duas formas de escrita do algoritmo estão apresentadas a seguir.
Figura 1.11 – Algoritmo que efetua a operação ∑ 9²DED .
2-) Escreva o algoritmo que efetue a operação ∑BCFGB ²
FHI , guardando o resultado em uma variável soma.
Solução: duas formas de escrita do algoritmo estão apresentadas a seguir. Para i de 1 a 6
Fim faça
Faça a prova e obtenha o Resultado
Se Resultado == Aprovado
Saia do Loop
Fim Se
Faça Enquanto (Resultado== Não Aprovado) E (i<=6)
Fim faça
Faça a prova e atualize o Resultado i 1
i i+1
Resultado ”Não Aprovado”
soma soma + i² soma ← 0
i 0
i ≤ 10?
i ← i +1 Sim
Não Imprima soma
Para i de 1 a 10
Fim faça
11
Figura 1.12 – Algoritmo que efetua a operação ∑ 9²DE9GD
9HJ .
3-) Escreva o algoritmo que efetue a operação ∑ ∑IFGB LMGB + K , guardando o resultado em uma variável soma.
Solução: Note que a operação é a soma de todos os termos, fixado i=1, para todos os j’s, (1+1)+(1+2)+(1+3)+(1+4)=14; agora, fixado i=2, para todos os j’s, 14 + (2+1)+(2+2)+(2+3)+(2+4) = 32; agora, fixado i=3, para todos os j’s, 32+ (3+1)+(3+2)+(3+3)+(3+4) = 54. A figura a seguir apresenta o algoritmo que efetua esta operação.
Figura 1.13 – Algoritmo que efetua a operação ∑ ∑J9GD ONGD 9 + N
4-) Escreva o algoritmo que efetue a operação ∑ ∑LMGB + K MHF I
FGB , guardando o resultado
em uma variável soma.
Solução: A figura a seguir apresenta o algoritmo que efetua esta operação.
Para i de 1 a 6
Fim faça Se i≠ 3
soma soma + i²
Fim Se soma 0
Para i de 1 a 3
Fim faça
Para j de 1 a 4
soma soma + (i+j)
12
Figura 1.14 – Algoritmo que efetua a operação ∑ ∑ONGD 9 + N
NH9 J
9GD .
5-) Escreva o algoritmo que monte a matriz P , K = + 2 ∙ K, de dimensão 3,3.
A figura a seguir apresenta o algoritmo que efetua esta operação. Os códigos tipicamente permitem inicializar matrizes com dimensões informadas, sendo tipicamente inicializadas como uma matriz nula.
Figura 1.15 – Algoritmo que efetua a operação S 9, N = 9 + T ∙ N.
1.4 Funções e subrotinas
Funções ou subrotinas podem ser entendidos como procedimentos que devem ser executados pelo computador, recebendo argumentos de entrada e retornando argumentos de saída.
Embora subrotinas sejam comuns à diversas linguagens, neste documento, faremos uso exclusivo dos procedimentos de funções, no contexto de softwares como
Para i de 1 a 3
Fim faça
Para j de 1 a 4
soma soma + (i+j)
Fim Faça soma 0
Se i≠ j
Fim Se
Para i de 1 a 3
Fim faça
Para j de 1 a 4
M(i,j) i + 2*j
Fim Faça
13 SCILAB e MATLAB, sendo estruturas análogas à subrotinas. Nestas linguagens, a estrutura de funções está ilustrada a seguir.
function [Argumentos de saída] = Nome_da_Funcao(Argumentos de entrada) Procedimentos
endfunction
Este conceito é melhor ilustrado através de exemplos (lembrem-se que aqui usamos a notação similar à do Scilab, que não exige declaração de variáveis internas nas funções, diferente de outros softwares de programação).
1-) Escreva a seguinte função:
U VW, XY = W + XVW, XY = W − X
Em Scilab, esta função pode ser escrita como:
function[f, g]=func1(x, y)
f = x + y;
g = x - y;
endfunction
Agora, podemos dar valores de x e y e pedir o cálculo da função, o que, em Scilab, fica na forma:
x = 3; y = 4;
// note que os nomes podem ser quaisquer, não precisa ser f,g ou mesmo // x e y! Pode ser [a,b] por exemplo
[a,b] = func1(x,y);
2-) Escreva a seguinte função, em que x é um escalar e y é um vetor de tamanho 2
U VW, [Y = W ∗ XVW, [Y = W + XB ]− XB Em Scilab, esta função pode ser escrita como:
function[f, g]=func1(x, y)
// neste caso, x é um escalar (mas poderia ser um vetor), e y é um vetor de dimensão 2 f = x + y(1);
g = x*y(2) - y(1);
endfunction
14 x = 3;
y = [4; 6];
// note que os nomes podem ser quaisquer, não precisa ser f,g ou mesmo // x e y! Pode ser [a,b] por exemplo
[a,b] = func1(x,y);
3-) Escreva a seguinte função (idêntico à do Exemplo 1 desta seção, porém, neste caso, todos são vetores de dimensão n):
U5V^, [Y = ^ + [_V^, [Y = ^ − [
Em Scilab, esta função pode ser escrita como:
function[f, g]=func1(x, y)
f = x + y;
g = x - y;
endfunction
Agora, podemos dar valores de x e y e pedir o cálculo da função, o que, em Scilab, fica na forma:
x = [3; 4]; y = [5; 6];
// Neste caso, todas as variáveis são vetores de dimensão 2 [a,b] = func1(x,y);
3-) Escreva uma função que dado x e n, sendo n>1, obtenha `aVWY, para o polinômio de Tchebychev, que pode ser escrito como:
b ``CBVWY = 1VWY = 1
`aVWY = 2 ∙ W ∙ `acBVWY + `ac]VWY Em Scilab, o tal função pode ser escrita como:
functionT=func1(x, n)
// esta função calcula o polinômio de Tchebychev de ordem n para um valor x, dado x e n, n>1
T0 = 1; T1 = x;
for i=2:n
T2 = 2*x*T1 - T0;
T0 = T1; T1 = T2; end
T = T2;
15 Agora, podemos dar valores de x e n e pedir o cálculo da função, o que, em Scilab, fica na forma:
// para valores de x e n dados a seguir, pediremos o cálculo da função x = 0.8;
n = 5;
// note que os nomes podem ser quaisquer, não precisa ser f,g ou mesmo // x e y! Pode ser [a,b] por exemplo
T = func1(x,n);
1.5 Exercícios
Exercício 1.1-) Escreva algoritmos que efetuem as seguintes operações:
a-) ∏B]FGB b-) ∏ ∏FGBB] MGBe + K c-) ∑ ∏BCMGB − K MHF BC
FGB
d-) ∏ ∑LFGB fMGFgB + K
Exercício 1.2-) Tendo recebido um vetor v(:) de dimensão n, elabore um algoritmo que determine o máximo elemento, bem como sua posição. (exemplo, se v=[7 8 15 12 13], o algoritmo deve conseguir retornar o máximo elemento como 15 e a posição =3, sendo associada ao terceiro elemento do vetor).
Exercício 1.3-) Podendo empregar a função inteiro(número) que retorna a parte inteira de um número, dado um número positivo qualquer, identifique à qual quadrante ele pertence.
Exercício 1.4-) Elabore um algoritmo que, para uma matriz A(i,j) = i+2*j para i≠j e
A(i,i)=i^2, de dimensão 3x3, construa a matriz.
Exercício 1.5-) Faça uma subrotina que, ao receber uma matriz M, suas dimensões n por m, e duas linhas informadas l1 e l2, efetue a troca das linhas.