Algoritmos e introdução ao Python

Table of Contents

1. Algoritmos e introdução ao Python

Um algoritmo pode ser definido como uma sequência de passos finita e bem definida para a solução de um problema de forma eficiente.

De acordo com a definição anterior, a sequência de passos deve estar bem definida. Contudo, isso pode depender do contexto. Veja, por exemplo, o vídeo a seguir.

No contexto de programação, uma sequência bem definida implica que as instruções que compõem um algoritmo podem ser executadas por um computador.

Há diversas formas de representar um algoritmo:

  • Uma descrição textual.
  • Graficamente, como em um fluxograma.
  • Utilizando pseudo-código.

1.1. Um exemplo – Verificando o critério de aprovação

Um estudante é aprovado em uma disciplina de acordo com sua nota final, que é calculada segundo a expressão

\[MF = \frac{4P_1 + 4P_2 + 2EX}{10}\]

A nota mínima para aprovação na disciplina deve ser \(MF\geq 6\) (seis). O estudante com \(3{,}0 \leq MF < 6{,}0\) terá direito a uma nova avaliação ao final do semestre (REC), sendo a nota final (NF) calculada como \(NF = \frac{MF + REC}{2}\).

A descrição textual anterior pode ser apresentada utilizando um fluxograma.

fluxograma_media.png

1.2. Outro exemplo – Encontrado a carta

Você recebeu uma pilha de cartas numeradas e deseja encontrar uma carta-alvo (p.e. 5 de Ouros). A seguir é apresentado um fluxograma representando um algoritmo para identificar a posição da carta-alvo na pilha (primeiro, segundo, terceiro etc). Suponha que a carta está presente.

Para aumentar a expressividade podemos definir a seguinte notação.

  • \(P\): pilha de cartas.
  • \(P.pop()\): revela e remove a carta do topo do pilha.
  • \(pos\): variável que armazena a posição da carta na pilha.
  • \(x\): representa a carta-alvo.

fluxograma_encontrar_carta.png

As estruturas que apareceram nos dois exemplos são importantes elementos para a construção de algoritmos:

  • Estrutura sequencial: A execução de um passo (instrução) após o outro.
  • Estrutura condicional: A execução de um ramo o outro de instruções baseados em uma condição (representada no fluxograma pelo losango).
  • Estrutura de repetição: A execução iterativa de um ou mais comandos repetidamente, chamado laço de repetição.

2. Olá, mundo!

Abra um editor de sua preferência (Thonny, VSCode, Spider, Eclipse, https://www.online-python.com/ ou outro) e digite o seguinte código.

print("Hello, World!")

Salve o arquivo com o nome hello_world.py. A extensão .py é importante para que seja reconhecido que o arquivo contém um código em Python.

Execute o arquivo. Parabéns! Você programou e executou o seu primeiro programa em Python.

Agora, seguem algumas observações:

  • print é uma função do Python. Representa um comando de saída do programa.
  • Funções são identificadas por serem seguidas de parênteses.
  • Dentro dos parênteses pode haver uma lista de argumentos, separados por vírgula.
  • Um dos argumentos possíveis para a função print é um texto (cadeia de caracteres) que será impresso na tela do usuário.
  • Uma cadeia de caracteres deve ser envolvida em aspas (simples ou duplas).

2.1. Utilizando a entrada

Modifique o código para o seguinte:

nome = input("Qual é o seu nome?")
print("Oi ", nome)
  • A função input é um função do Python que permite ler a entrada do teclado.
  • A função input retorna a sequência de caracteres que for lida do teclado.
  • Esse código também usa um comando de atribuição (\(=\)) e uma variável chamada nome recebe o retorno da função input.

3. Variáveis, tipos de dados e atribuição

Para manipular informações o computador precisa armazená-las em memória. Uma variável é um nome (uma "etiqueta'') de um espaço de memória que armazena um determinado tipo de dado.

Um tipo de dado é uma forma de classificar a informação que está armazenada na memória. Com isso, é possível dizer como aquele dado deve ser manipulado.

Alguns dos tipos de dados embutidos do Python são apresentados a seguir (uma lista completa pode ser vista neste link).

python_data_types.png

3.1. Cadeias de caracteres (strings)

Strings são sequências de caracteres. Com frequência são utilizadas para representar uma informação textual, como uma mensagem a ser impressa na tela do usuário. Em Python, uma string deve ser limitada com aspas (duplas ou simples). Alguns exemplos de strings são dados a seguir (o primeiro representa uma string vazia).

""
"     "
"Olá, Mundo"
'Pode ser aspas simples'
'$!@$'

Diversas operações são permitidas com string como, por exemplo, a concatenação (junção). A operação de concatenação é representada pelo símbolo \(+\).

Adapte o código a seguir para pedir o nome e, depois, o sobrenome do usuário. Armazene o nome e sobrenome em variáveis separadas e imprima a mensagem "Oi, " seguida do nome e sobrenome. A mensagem deve ser impressa toda na mesma linha. Utilize a operação de concatenação.o

nome = input("Qual é o seu nome?")
print("Oi, ", nome)

Outra função que pode ser aplicada a uma string é a função len que retorna o número de caracteres de uma string.

Faça um programa que pede uma frase \(F\) ao usuário e imprime a mensagem "Sua frase tem {n} caracteres " em que \(n\) é o número de caracteres de \(F\).

  • Dica: Para imprimir a mensagem você pode utilizar print(f"Sua frase tem {n} caracteres") em que n armazena comprimento da frase.

3.2. Tipos numéricos e operações aritméticas

Em Python os tipos numéricos são

  • int: para representação de números inteiros.
  • float: para representaçãode números em ponto-flutuante ("fracionários").
  • complex: para a representação de números complexos.

Os operadores aritméticos em Python são:

Operador Nome
+ Adição
- Substração
* Multiplicação
​/ Divisão
// Divisão inteira
% Módulo (resto da divisão)
** Exponenciação

Cada operador tem o mesmo sentido da Matemática tradicional.

É importante estar atento ao tipo de dado que cada variável armazena. Por exemplo, o símbolo \(+\) também é utilizado para concatenar strings. O mesmo símbolo pode ser utilizado para mais de uma operação, isso é possível pois o tipo dos dados envolvidos definem o comportamento da operação.

A operação de adição para números reais é comutativa, isto é, \(a + b = b + a\). Prove que o operador '+' para strings não é comutativo.

O que deve imprimir o seguinte código, execute-o e confirme sua hipótese

x = input("Digite um número: ")
print("O dobro do seu número é ", x + x)

A função input, utilizada para ler informações do teclado, retorna uma string. É importante converter a informação lida para o tipo de dado desejado.

Para ler um número inteiro, pode-se combinar a função input com a função int:

x = int(input("Digite um número:o "))

Analogamente, para ler um número fracionário, pode-se utilizar a função float.

3.3. Atribuição de variáveis

O comando de atribuição de variáveis = faz com que o conteúdo do lado direito seja armazenado na posição de memória indicada pelo lado esquerdo do operador. Note, então, que o lado direito deve ser avaliado, buscando na memória todos os valores correspondentes e realizado as operações necessárias. Por exemplo, considere o código a seguir.

a = 2
b = 3
c = a**2 + b**3
print(c)

Ele define três variáveis a, b e c, isto é, define três espaços (posições) de memória. Na primeira linha de código, o valor 2 é armazenado na posição a. Em seguida, o valor 3 é armazenado na posição b, então, o valor c armazena o resultado da expressão a**2 + b**3, ou seja, 31, que é, por fim, impresso na tela.

Perceba que caso a terceira linha fosse alterada para o seguinte, o resultado seria o mesmo.

a = 2
b = 3
a = a**2 + b**3
print(a)

A semântica do símbolo "=" em Python (e diversas outras linguagens de programação) não deve ser confundida com a semântica matemática de igualdade. Inclusive, por isso, muitos pseudocódigos utilizam o símbolo \(\leftarrow\) para indicar atribuição.

Um dos objetivos de uma descrição de algoritmo em pseudocódigo é evitar a dependência de uma linguagem de programação específica e, ao mesmo tempo, manter os elementos básicos da programação imperativa (expressões, condições, laços etc).

Em pseudocódigo, o código anterior poderia ser escrito da seguinte forma:

\begin{align*} &a \leftarrow 2\\ &b \leftarrow 3\\ &c \leftarrow a^{2} + b^{3}\\ &Imprima (a) \end{align*}

3.3.1. Nomeação de variáveis

Há algumas regras (e algumas boas práticas) para nomear variáveis. As regras são:

  • o nome deve começar com uma letra ou o símbolo de sublinhado "_";
  • o nome não deve começar com um número;
  • o nome deve conter apenas caracteres alfa-numéricos (letras e números) ou sublinhado;
  • os nomes de variáveis são case-sensitive, isto é, diferenciam maiúsclas e minúsculas.

Como uma boa prática é importante escolher nomes expressivos. A não ser em casos especiais, os nomes de variáveis tipicamente iniciam com letra minúscula.

4. Referências e outros materiais

Author: Pedro Belin Castellucci

Created: 2024-03-25 seg 09:00

Validate