Introdução à Programaćão / algoritmos

Versão 0: 19/12/2019

Nesta seção apresentaremos os conceito fundamentais de algoritmos e sua implementaćão na forma de um programa.

O que é um algoritmo?

Um algoritmo descreve um processo repetitivo e é tão antiga quanto a área da Matemática. Um primeiro exemplo de algoritmo matemático útil é a soma de números com vários dígitos, por maior que sejam dois números, aplicando corretamente os passos do algoritmo da soma, conseguiremos somá-los (mesmo desconhendo o nome desses números gigantes!).

Antes de continuar a leitura, tente descrever o algoritmo da soma de dois números inteiros de vários dígitos.

Código 1.
Uma possível descrićão seria, simplificando para caso em que ambos os números tenham o mesmo número de dígitos:
1. ajusta-se os números à direita (por que?);
2. define-se uma variável auxiliar `vai_um` com valor nulo;
3. soma-se os dois dígitos mais à direita (menos significativos),
se resultar mais que `9`,
escreva o resultado menos `10` (um único dígito)
define-se `vai_um` com valor `1` (por que?),
senão
escreva o resultado (um único dígito)
define-se `vai_um` com valor `0` (por que?),
4. se não existem mais dígitos, pare
5. soma-se os próximos dois dígitos e o `vai_um`,
se resultar mais que `9`,
escreva o resultado menos `10` (um único dígito)
define-se `vai_um` com valor `1` (por que?),
senão
escreva o resultado (um único dígito)
define-se `vai_um` com valor `0` (por que?),
6. volta-se ao passo passo 4 avanćando à esquerda um dígito.
Note que os passos 4, 5 e 6 são repetidos várias vezes, constituindo o núcleo desse algoritmo.
O que é um programa de computador?
AQUI!!!!

E qual a relação disso com variável? Bem, por exemplo, é necessário contar e, para fazer usando o computador Basicamente é uma sequência de instrućões precisamos pegar uma sequência de bytes interpretá-lo como inteiro, somar 1 e registrar o valor alterado. Isso é feito utilizando a mesma posição de memória, que está assim variando, dai o nome variável.

De um ponto de vista mais elevado (alto-nivel), utilizando uma linguagem de programação com C ou Python, uma variável é representada por um nome, sem caracteres especiais (exceto "barra baixa" '_' que é permitido) e que não seja o nome de um comando da linguaguem (denominado de modo geral por palavra reservada).

Além disso uma variável deve ter um tipo associado, os tipos básicos que examinaremos nesta seção são o inteiro (int) e o flutuante (float), este último para representar os valores reais. A partir da explicação acima sobre interpretar os bytes como número ou caractere explica a necessidade de cada variável ter o seu tipo conhecido.

Para explicar melhor a necessidade de tipos, suporemos que o computador considerado utilize para uma variável int e para uma do tipo float, respectivamente, 2 e 4 bytes.

Desse modo, quando o citado computador precisa devolver o valor armazenado em uma variável do tipo inteiro, ele acessará a posição de memória associada à variável, pegará a partir dessa posição os próximos 16 bits e o interpretará como um valor inteiro.

Do ponto de vista prático, vejamos como se usa variáveis do tipo int e do tipo float nas linguagens C e Python.

| C | Python
1 | int n1,n2; | # desnecessário declarar em Python
2 | n1 = 1; | n1 = 1
3 | scanf("%d", &n2); | n2 = int(input())
4 | printf("n1=%d e n2=%d\n", n1, n2); | print "n1=", n1, " e n2=", n2 # Python 2
5 |  | print("n1=", n1, " e n2=", n2) # Python 3

Note as diferenças entre C e Python:

- De modo geral, todo comando em C precisa de ';' como finalizador.
- Na linha 1 percebe-se que em C é obrigatório declarar as variáveis, enquanto que em Python não.
- Na linha 3 nota-se que C utiliza a função pré-definida de nome scanf para pegar valores digitados pelo usuário enquanto Python usa o input. O scanf usa o formatador especial '%d' para forçar o computador a interpretar os bytes como um inteiro, enquanto o input pega os bytes digitados e o submete à outra função pré-definida Python, o int(...), que converte os bytes lidos para um inteiro.
- Na linha 4 nota-se o mesmo tipo de diferença, C utiliza a função printf para imprimir também com o formatador para inteiro '%d', além de separar em 2 blocos, o primeiro para formatar a saída, que é cercado por aspas dupla e o segunda, uma lista de variáveis compatíveis com o formatador. Já em Python, usa-se os caracteres entre aspas e as variáveis misturados, separador por vírgula.
- Vale destacar que a linha 4 apresenta a sintaxe do Python antes da versão 3, enquanto que alinha 5 apresenta o mesmo resultado mas para o Python a partir da sua versão 3.

Expressões aritméticas

Do mesmo modo que em matemática é essencial efetuarmos operações aritméticas com valores numéricos, o mesmo ocorre com o computador, na verdade efetuar contas de modo rápido e "sem erro" (na verdade existem erros numéricos, mas este é outro assunto) foi a grande motivação para se construir os computadores.

Neste, os agrupamentos de valores, variáveis e operadores aritméticos recebem o nome de expressão aritmética. De modo geral, podemos conceituar uma expressão aritmética EA como:

1. EA := K: uma constante numérica é uma expressão aritmética
2. EA := EA + EA | EA - EA | EA * EA | EA / EA: uma expressão aritmética seguida de um operador binário (com 2 itens) e seguida por outra expressão aritmética é uma expressão aritmética

Os operadores artiméticos binários, tanto em C quanto em Python são:

Operação | Operador | Exemplo
soma | + | 2 + 4
subtração | - | n1 + 1
multiplicação | * | 3 * n2
divisão | / | n1 / n2

Note que foi usado espaço em branco entre os operando e operadores, mas isso não é obrigatório.

O resultado de uma expressão aritmética depende do contexto

É importante observar que dependendo do contexto o resultado de uma expressão é um ou outro, quer dizer, se os valores envolvidos forem todos eles inteiros, o resultado será inteiro, entretanto havendo um valor real, a resposta final será real.

A importância disso fica clara ao examinar dois exemplos simples: 3 / 2 * 2 e 3.0 / 2 * 2. A primeira expressão resulta o valor 2, enquanto a segunda 3.0. Isso mesmo.

A razão é que no primeiro caso todos valores são inteiros, então o cômputo é realizado com aritmética de precisão inteira, ou seja, ao realizar o primeiro cômputo 3/2, o resultado é 1 (e não 1.5 como no segundo caso), daí o segundo operador é feito com os valores 1 * 2 resultando o valor 2.

Leônidas de Oliveira Brandão
http://line.ime.usp.br