# Introdução à programação/Algoritmos

Um algoritmo é um esquema de resolução de um problema. Pode ser implementado com qualquer sequência de valores ou objetos que tenham uma lógica infinita (por exemplo, a língua portuguesa, a linguagem Pascal, a linguagem C, uma sequência numérica, um conjunto de objetos tais como lápis e borracha), ou seja, qualquer coisa que possa fornecer uma sequência lógica. Em baixo podemos ver um algoritmo implementado num fluxograma, sobre o estado de uma lâmpada:
Figura 3 - Algoritmo num fluxograma
Seguindo o raciocínio acima, então um programa de computador já é por si um algoritmo? Sim, é verdade. Embora tenhamos que usar um algoritmo prévio na nossa língua (como apresentado na imagem acima) para escrever um programa com lógica, o próprio programa que provém desse algoritmo já é um algoritmo. Até um esquema mental é um algoritmo.
Ok, já percebi o que é um algoritmo. Mas porque isso interessa ao estudo da programação?
A verdade é que, antes de escrevermos um programa em qualquer outra linguagem é necessário escrever um esquema em papel para evitar erros, por exemplo, na nossa língua, segundo o programa que queremos fazer. Com isto não esquecemos a lógica que queremos dar ao programa e será menos comum o aparecimento de erros. Por exemplo:
    Linguagem humana:
    "Se for verdade isso, acontece isto, senão acontece aquilo"
    Linguagem de programação:
    IF isso; THEN isto; ELSE aquilo;
    O conteúdo escrito acima está formalizado numa linguagem de algoritmos chamada Portugol que é a representação utilizada pela maior parte dos programadores e professores que trabalham em instituições de ensino de linguagens de programação.
Como pode visualizar, um algoritmo pode ser escrito de várias maneiras, de cima para baixo, da esquerda para a direita, na diagonal, em árabe, em russo... O importante é que seja escrito!

## Fundamentos

Uma máquina computacional é qualquer máquina (geralmente de origem eletro-eletrônica) com capacidade de receber dados, executar operações sobre estes dados e retornar os dados transformados por estas operações.
| Entrada de Dados | Processamento | Saída de Dados |
As máquinas computacionais eletro-eletrônicas possuem geralmente dois componentes básicos: software e hardware. Chamamos de Hardware sua parte física, e software os programas que tratam os dados imputados.
Quando inserimos algum dado em um computador, os dados inseridos são transformados em sinais elétricos (chamados de bits). O bit (do inglês binary digit) representa os dois estados (ligado ou desligado) que o sinal elétrico pode assumir. Para trabalhar com estes dados, podemos associar estes estados de ligado e desligado a 0 e 1. Quando utilizamos um computador, há um fluxo de sinais elétricos, que representam os dados inseridos, processados e retornados. Um conjunto de oito bits formam um byte, que é uma unidade completa de informação.
Dentro do byte, o estado de cada um dos oito bits, assim como sua posição relativa um ao outro, faz com que o byte assuma um valor específico (não necessariamente numérico), que serve para estruturá-lo em relação a outros bytes e criar um sistema de dados que sirva ao usuário externo.
Para organizar as possibilidades de variações destes bits dentro de um byte, podemos visualizar uma tabela ASCII:
| Binário | Dec | Hex | Representação |
| 0010 0000 | 32 | 20 | espaço ( ) |
| 0010 0001 | 33 | 21 | ! |
| 0010 0010 | 34 | 22 | " |
| 0010 0011 | 35 | 23 | # |
| 0010 0100 | 36 | 24 | $ |
| 0010 0101 | 37 | 25 | % |
| 0010 0110 | 38 | 26 | & |
| 0010 0111 | 39 | 27 | ' |
| 0010 1000 | 40 | 28 | ( |
| 0010 1001 | 41 | 29 | ) |
| 0010 1010 | 42 | 2A | * |
| 0010 1011 | 43 | 2B | + |
| 0010 1100 | 44 | 2C | , |
| 0010 1101 | 45 | 2D | - |
| 0010 1110 | 46 | 2E | . |
| 0010 1111 | 47 | 2F | / |
| 0011 0000 | 48 | 30 | 0 |
| 0011 0001 | 49 | 31 | 1 |
| 0011 0010 | 50 | 32 | 2 |
| 0011 0011 | 51 | 33 | 3 |
| 0011 0100 | 52 | 34 | 4 |
| 0011 0101 | 53 | 35 | 5 |
| 0011 0110 | 54 | 36 | 6 |
| 0011 0111 | 55 | 37 | 7 |
| 0011 1000 | 56 | 38 | 8 |
| 0011 1001 | 57 | 39 | 9 |
| 0011 1010 | 58 | 3A | : |
| 0011 1011 | 59 | 3B | ; |
| 0011 1100 | 60 | 3C | < |
| 0011 1101 | 61 | 3D | = |
| 0011 1110 | 62 | 3E | > |
| 0011 1111 | 63 | 3F | ? |
| Binário | Dec | Hex | Representação |
| 0100 0000 | 64 | 40 | @ |
| 0100 0001 | 65 | 41 | A |
| 0100 0010 | 66 | 42 | B |
| 0100 0011 | 67 | 43 | C |
| 0100 0100 | 68 | 44 | D |
| 0100 0101 | 69 | 45 | E |
| 0100 0110 | 70 | 46 | F |
| 0100 0111 | 71 | 47 | G |
| 0100 1000 | 72 | 48 | H |
| 0100 1001 | 73 | 49 | I |
| 0100 1010 | 74 | 4A | J |
| 0100 1011 | 75 | 4B | K |
| 0100 1100 | 76 | 4C | L |
| 0100 1101 | 77 | 4D | M |
| 0100 1110 | 78 | 4E | N |
| 0100 1111 | 79 | 4F | O |
| 0101 0000 | 80 | 50 | P |
| 0101 0001 | 81 | 51 | Q |
| 0101 0010 | 82 | 52 | R |
| 0101 0011 | 83 | 53 | S |
| 0101 0100 | 84 | 54 | T |
| 0101 0101 | 85 | 55 | U |
| 0101 0110 | 86 | 56 | V |
| 0101 0111 | 87 | 57 | W |
| 0101 1000 | 88 | 58 | X |
| 0101 1001 | 89 | 59 | Y |
| 0101 1010 | 90 | 5A | Z |
| 0101 1011 | 91 | 5B | [ |
| 0101 1100 | 92 | 5C | \ |
| 0101 1101 | 93 | 5D | ] |
| 0101 1110 | 94 | 5E | ^ |
| 0101 1111 | 95 | 5F | _ |
| Binário | Dec | Hex | Representação |
| 0110 0000 | 96 | 60 | ` |
| 0110 0001 | 97 | 61 | a |
| 0110 0010 | 98 | 62 | b |
| 0110 0011 | 99 | 63 | c |
| 0110 0100 | 100 | 64 | d |
| 0110 0101 | 101 | 65 | e |
| 0110 0110 | 102 | 66 | f |
| 0110 0111 | 103 | 67 | g |
| 0110 1000 | 104 | 68 | h |
| 0110 1001 | 105 | 69 | i |
| 0110 1010 | 106 | 6A | j |
| 0110 1011 | 107 | 6B | k |
| 0110 1100 | 108 | 6C | l |
| 0110 1101 | 109 | 6D | m |
| 0110 1110 | 110 | 6E | n |
| 0110 1111 | 111 | 6F | o |
| 0111 0000 | 112 | 70 | p |
| 0111 0001 | 113 | 71 | q |
| 0111 0010 | 114 | 72 | r |
| 0111 0011 | 115 | 73 | s |
| 0111 0100 | 116 | 74 | t |
| 0111 0101 | 117 | 75 | u |
| 0111 0110 | 118 | 76 | v |
| 0111 0111 | 119 | 77 | w |
| 0111 1000 | 120 | 78 | x |
| 0111 1001 | 121 | 79 | y |
| 0111 1010 | 122 | 7A | z |
| 0111 1011 | 123 | 7B | { |
| 0111 1100 | 124 | 7C | | |
| 0111 1101 | 125 | 7D | } |
| 0111 1110 | 126 | 7E | ~ |

## Lógica de Programação

Logicamente torna-se trabalhoso trabalhar com dados de computador bit-a-bit. Como forma de manipular este fluxo de estados elétricos e estruturá-lo de forma a permitir operações mais simplificadas e otimizadas sobre os bytes, surgiu o conceito de programação. As linguagens de programação são geralmente em dois níveis:
* Linguagens de Baixo Nível: são linguagens de programação que tratam a informação na linguagem de máquina.
* Linguagens de Alto Nível: são linguagens de programação modeladas quase como a linguagem comum humana, que quando compiladas são convertidas para linguagem de máquina. Cada linguagem deste tipo possui uma sintaxe própria, que deve ser respeitada e aprendida para que possa ser corretamente processada por seu compilador. Compilador é um programa que permite que determinada programação em uma linguagem específica seja adaptada para linguagem de máquina.
No entanto, não é necessário que o programador aprenda todas as diversas linguagens disponíveis no mercado. Cada linguagem é recomendada para determinadas aplicações, assim como possuem suas sintaxes próprias, mas todas são estruturadas logicamente. Com o aprendizado da Lógica de Programação o aluno entenderá os conceitos básicos da programação e poderá com menor ou maior dificuldade, dependendo da linguagem escolhida, aprender a linguagem que quiser.

## Algoritmo

As linguagens de programação tratam os dados de um computador através do uso de algoritmos. Um algoritmo é uma estruturação passo-a-passo de como um determinado problema deve ser resolvido de forma não-ambígua (ou como muitos comparam "uma receita de bolo") . Desta forma, para realizar esta estruturação é necessário o uso de ferramentas e operações oriundas da Lógica, principalmente da Lógica Matemática.
Antes de estruturar-se de forma lógica para programação, devemos saber qual o tipo de problema proposto, as informações que serão imputadas e os passos a serem efetuados para atingir-se um fim específico. Por exemplo, vamos ver um "algoritmo" sobre "tomar banho":
    1.Tirar a roupa.
    2.Abrir o registro.
    3.Ensaboar-se.
    4.Enxaguar o corpo.
    5.Passar shampoo nos cabelos.
    6.Enxaguar o cabelo.
    7.Fechar o registro.
Vimos então um problema proposto (tomar banho) e os passos para solucionar o problema. Logicamente, que há outras formas de estruturarmos este algoritmo de forma a adaptá-lo a atingir o mesmo fim. No entanto, o importante é estruturá-lo de forma coerente, eficaz e simples, ou como muitos dizem de "forma elegante". Veremos na próxima lição que podemos desenhar este algoritmo e aplicar conectivos lógicos que permitam manipular as informações necessárias.
O exemplo abaixo, usar o orelhão, apresenta condições para tomar decisão.
* Retirar o fone do gancho;
* Colocar o cartão telefônico;
* Esperar o ruído de discar;
* Com ruído de discar, disque o número desejado;
* Se sinal de ocupado, faça:
** Colocar fone no gancho e voltar ao passo 1;
* Se sinal de chamada, faça:
** Esperar atender o telefone;
** Conversar;
** Colocar fone no gancho;
** Retirar o cartão;
Algoritmos também podem ter condições para repetição.

## Exercícios

Para complementar os estudos baixe alguns exercícios de algoritmos. Faça esses exercícios até sua lógica de programação ficar bem afiada.

## Bibliografia

* Algoritmo, artigo na Wikipédia em português
* Bit, artigo na Wikipédia em português