Introdução à Lógica de Programação

Um curso prático para estudantes das Ciências da Vida


Aula 1. Primeiros Passos

Instrutor: Pedro C. de Siracusa

O que é programar?

Programar é como brincar com LEGO. Seguindo esta analogia, o trabalho do programador é construir estruturas complexas (como um castelo) encaixando blocos. Ele projeta as funcionalidades que deseja criar e planeja um passo-a-passo para chegar ate elas, partindo do pressuposto de que um conjunto de blocos fundamentais já estarão disponíveis para ele. O conjunto de blocos fundamentais disponíveis para o programador é o que constituiria uma linguagem de programação. Em termos gerais ela reúne conjuntos de regras e estruturas que permitem que o programador expresse suas ideias na forma de código. Escrever código seria como encaixar blocos. Sendo assim, o programador não precisa se preocupar em construir os blocos do zero antes de começar a trabalhar.

Neste curso você trabalhará com a linguagem Python, uma linguagem de propósito geral que oferece alto nível de abstração. Isso faz de Python uma excelente primeira linguagem a ser aprendida, pois (i) você poderá aplicar seus novos conhecimentos em programação a vários projetos e contextos diferentes; e (ii) você trabalhará projetando suas ideias, sem ter que se preocupar com os mínimos detalhes sobre como seu código funciona.

Um componente fundamental da linguagem Python que nos permite executar o código que escrevemos é o interpretador. No fundo, o interpretador é um programa que executa programas! Ele lê as instruções que escrevemos na forma de código e as executa logo em seguida, sem antes precisar traduzi-lo para código de máquina. Quer ver um exemplo?

Vamos começar construindo o programa "Hello World", uma tradição bem conhecida entre os programadores quando estão aprendendo uma linguagem nova. Este pequeno programa é encarado como um primeiro teste, e simplesmente imprime uma mensagem com o texto "Hello World" no console. Escrever o programa "Hello World em Python é realmente muito simples. Veja na célula abaixo.

In [1]:
print("Hello World")
Hello World

O que fizemos foi simplesmente executar uma função, que já faz todo o "trabalho sujo" para nós. Esta função, que se chama print, recebe um texto como argumento, entre parênteses, e o imprime no console. No caso, o texto que passamos é "Hello World". As aspas envolvendo o texto servem para dizer ao interpretador que estamos construindo uma string (o tipo de dado que usamos para representar texto).

Por enquanto vamos focar no uso mais básico do interpretador Python, operando valores numéricos apenas. Nesta aula vamos aprender a usar o interpretador como uma calculadora um pouco mais elaborada. No fim você codificará um modelo de crescimento exponencial para estimar o tamanho populacional em uma cultura bacteriana.

Objetivos.

Após esta aula você deverá ser capaz de:

  • Reconhecer os principais operadores numéricos;
  • Construir e computar expressões matemáticas;
  • Armazenar e consultar resultados de computações em variáveis.

1. Tipos

Tipos são abstrações fundamentais nas linguagens de programação que nos permitem representar elementos de informação. Cada linguagem possui um conjunto de tipos primitivos (ou fundamentais), a partir dos quais o programador pode construir tipos compostos. Por enquanto vamos conhecer alguns dos tipos primitivos, que já vêm definidos na linguagem Python:

  • Tipos numéricos:

    • Integer (inteiros): Permite representar números inteiros, por exemplo 4.
    • Float (ponto flutuante): Permite representar números com parte fracionária, por exemplo 42.5.
  • String: Permite representar informação na forma de texto, por exemplo "Palavra" ou "C". Usamos aspas (duplas ou simples) para representar informação textual. Em muitas outras linguagens de programação existe também o tipo caractere (ou char). Porém, em Python um caractere é uma string de comprimento 1.

  • Boolean: Representa informação em lógica binária, True ou False.

In [2]:
print(42, type(42))
print(42.5, type(42.5))
print("Palavra", type("Palavra"))
print('C', type('C'))
print(True, type(True))
print(False, type(False))
42 <class 'int'>
42.5 <class 'float'>
Palavra <class 'str'>
C <class 'str'>
True <class 'bool'>
False <class 'bool'>

Veja os tipos nativos da linguagem Python.

2. Operadores e expressões

Operadores são os símbolos que especificam as computações mais fundamentais, como por exemplo soma, subtração, multiplicação e divisão. Sempre que aplicamos um operador sobre dois operandos, esperamos obter algum resultado imediatamente. Podemos combinar vários operadores e operandos, construindo assim expressões. Veja na tabela abaixo os principais operadores numéricos da linguagem Python.

Operação Operador Exemplo Resultado
Soma + 9 + 7 16
Subtração - 9 - 7 2
Multiplicação * 9 * 7 63
Divisão / 5 / 2 2.5
Exponenciação ** 9**2 81
Módulo % 9 % 2 1

Experimente operar alguns números na célula abaixo

In [3]:
42 + 7
Out[3]:
49
In [4]:
42-7
Out[4]:
35
In [5]:
2**8
Out[5]:
256
In [6]:
6%3
Out[6]:
0
In [7]:
3%2
Out[7]:
1
In [8]:
3%5
Out[8]:
3

Você também pode criar expressões combinando valores e operadores!

In [9]:
42 + 7 - 3/10
Out[9]:
48.7
In [10]:
3*2 - 4%2 
Out[10]:
6

Cuidado! A ordem de avaliação dos elementos em uma expressão segue a mesma convenção de precedência utilizada na matemática. Elementos entre parênteses têm prioridade durante a avaliação.

Na célula abaixo, represente a seguinte expressão em código e obtenha seu resultado:

$$ \frac{3+(3\times5)}{2\times(2+3)} $$
In [11]:
(3+(3*5))/(2*(2+3))
Out[11]:
1.8

Comentários: Está vendo este # na primeira linha da célula acima? Linhas de código precedidas por este símbolo são comentários, que funcionam como mensagens a quem está lendo seu código, normalmente outros programadores. Qualquer coisa escrita na mesma linha à direita do símbolo é simplesmente ignorada pelo interpretador, ou seja, não é executada. É comum utilizar comentários para documentar partes de um código, ou marcar regiões que devem ser trabalhadas futuramente.

3. Variáveis

Quando estamos programando, frequentemente precisamos armazenar valores obtidos em etapas anteriores em memória. Assim, podemos re-utilizar estes valores sem precisar repetir todo o código. Linguagens de programação oferecem uma maneira bastante intuitiva para isso, por meio de variáveis. O símbolo que usamos para atribuir valores a variáveis é o sinal de igual (=). Na linguagem Python, uma variável é criada assim que atribuimos algum valor a ela.

obs: O nome da variável sempre deve ser escrito à esquerda do símbolo =, e o valor a ser atribuído à variável, à direita.

Por exemplo, podemos criar uma variável chamada idade, para armazenar sua idade. Assim, sempre que quisermos saber o valor atribuído a esta variável, basta escrever seu nome em uma célula e executá-la!

In [12]:
idade = 29
In [13]:
idade
Out[13]:
29

Declare uma variável chamada semestre que armazene o valor numérico do semestre que está cursando atualmente. Em seguida, escreva o nome da variável para obter seu valor.

In [14]:
semestre = 8
In [15]:
semestre
Out[15]:
8

Quando lidamos com expressões grandes e complexas pode ser interessante quebrá-las em várias sub-expressões. Veja o seguinte exemplo:

$$ 2 \bigg[ \frac{3\times(2+5)-20}{3} \bigg]^2 + \sqrt 2 + 1 $$

Para facilitar a codificação desta expressão, vamos escrevê-la nas seguintes etapas:

  1. Atribua o resultado de $\frac{3\times(2+5)-20}{3}$ a uma variável de nome a.
  2. Atribua o resultado de $\sqrt{2}+1$ a uma variável de nome b. Lembrando que $\sqrt{2} = 2^{\frac{1}{2}}$
  3. Agora, compute o resultado da expressão inteira usando as variáveis que você acabou de criar. $2a^2 + b$ e atribua o resultado a uma variável de nome c.
  4. Por fim, imprima no console o valor da variável c.
In [16]:
a = (3*(2+5)-20)/3
b = 2**(1/2) + 1
c = 2*a**2 + b

c
Out[16]:
2.6364357845953172

Exercícios

Ex 1. Associe o resultado da expressão $2(10+1) + \frac{8}{3+1}$ a uma variável de nome a. Em seguida, associe à mesma variável o valor $5$ e imprima seu valor no console, usando a função print. Qual valor será mostrado? E se você quisesse imprimir o resultado do primeiro valor que a variável recebeu?

In [17]:
a = 2*(10+1) + (8/(3+1))
print("Primeiro valor de a:",a)
a = 5
print("Segundo valor de a:",a)
Primeiro valor de a: 24.0
Segundo valor de a: 5

Ex 2. Veja na célula abaixo a codificação da expressão $\sqrt{\frac{3(3+5)}{5+1}}$. Execute a célula e observe o resultado. O valor está correto? Caso não esteja, como corrigir a expressão?

In [18]:
( 3*(3+5) / (5+1) )**(1/2)
Out[18]:
2.0

Ex 3. Para valores de $x$ em $\{ 1,5,8, 9\}$, compute o valor da função $\quad{}f(x) = \beta_0 + \beta_1 x \quad{}$, com parâmetros $\beta_0 = -1.3$ e $\beta_1=3.5$.

In [19]:
# Crie as variáveis b0 e b1
b0=-1.3
b1=3.5

# Para cada print, armazene os valores de x e f(x) nas variáveis x e f_x 
x = 1
f_x = b0+b1*x
print("x = 1 -> f(x) =", f_x ) # res. esperado: 2.2

x = 5
f_x = b0+b1*x
print("x = 5 -> f(x) =", f_x ) # res. esperado: 16.2

x = 8
f_x = b0+b1*x
print("x = 8 -> f(x) =", f_x ) # res. esperado: 26.7

x = 9
f_x = b0+b1*x
print("x = 9 -> f(x) =", f_x ) # res. esperado: 30.2
x = 1 -> f(x) = 2.2
x = 5 -> f(x) = 16.2
x = 8 -> f(x) = 26.7
x = 9 -> f(x) = 30.2