quinta-feira, 4 de outubro de 2012

Algoritmos, "colocando no papel" parte II

Hoje vamos aprender um importante recursos para visualizar o fluxo do algoritmo e nos ajudar a entender as consequências dos condicionais e dos ciclos:  a montagem de fluxogramas, diagramas com setas e símbolos que representam os passos do algoritmo.

Mais uma vez não vamos aqui seguir a regra pura de construção de fluxogramas. Vamos ver uma versão simplificada e fácil, apenas para termos mais um recurso a mão. Quem quiser pode se aprofundar, procurando materiais didáticos sobre o assunto. Na internet temos diversos gratuitos.

Iniciadores e terminadores:


Iniciador e terminador
Aparecem no início e no final do programa e servem exatamente para isso (indicar o começo e o fim do algoritmo). Podem ser representados de diversas formas, mas aqui adotaremos a do retângulo-oval (essa salsicha ai em cima).

Processos genéricos (Passos):


Um verdadeiro processo genérico!
A maior parte das instruções, os passos do programa, os chamados "processos genéricos", são representados por esse retângulo (não, não ESSE exatamente, se o passo for x = a+1, você vai escrever isso dentro do retângulo e não "solte o barro", por favor, nada de programas diarrentos!)

Condicionais:

Um condicional
Representam os testes condicionais e comparativos, além disso, são usados para representar os ciclos também. Isso mesmo! Os ciclos aqui são representados como testes condicionais! O caso é que todos os símbolos só admitem uma única seta entrando e uma única seta saindo, menos... este, que pode ter saindo dele duas, ou mais setas de fluxo.

Setas de fluxo:


Setas de fluxo
Unem os símbolos e representam o fluxo de dados do algoritmo. Em geral, cada símbolo possui duas setas: uma entrando e outra saindo. Inicializadores tem apenas uma seta saindo, enquanto terminadores tem apenas uma seta entrando. Condicionais tem uma seta entrando e duas, ou mais, saindo. Pode acontecer também de uma seta apontar para outra seta.

Entradas e saídas:
Entrada e saída
Representam ah... hã... bem... as entradas e saídas do programa. O símbolo é o mesmo para ambos, um paralelogramo.

Um fluxo simples:
Um fluxo simples e retilíneo
Peguei um dos primeiros algoritmos da postagem anterior e passei para um fluxograma. Notem que é fácil entender onde ele começa, por onde deve seguir e onde termina. Usei o editor de imagens do google docs para desenhar isso. Qualquer um que tenha uma conta google (é grátis, se você tem uma conta blogger, gmail, conta no youtube, google+ e etc, provavelmente você tem acesso ao google docs).

Representando o SE ENTÃO:

Apesar do condicional "SE ENTÃO" ser um só, ele pode ter dois efeitos em um algoritmo, o que gera "duas representações" num fluxograma. No geral, um SE ENTÃO é representado por uma seta entrando num símbolo condicional e duas saindo dela. O problema está nessas setas.

Temos casos em que o SE ENTÃO só serve para adicionar passos em um programa, ou seja, ele não tem um "SE NÃO". O programa corre normalmente e quando chega no "SE ENTÃO", sendo o teste verdadeiro, ele inclui instruções do bloco SE e depois retorna a linha normal do programa. Se o teste for falso, ele simplesmente salta o bloco SE e continua o programa. Veja um modelo:
Um SE sem um SE NÃO
Nesse caso ele vai executar 1-2-3-{4-5}-6-7 se A for verdadeiro e 1-2-3-{}-6-7 se A for falso. A representação para casos como esse é, uma seta entrando no simbolo condicional e duas saindo, uma à direita para caso o teste for verdadeiro e uma para baixo, seguindo a seqüência do programa.

Um SE sem um SE NÃO
Temos também os SE ENTÃO que usam o "SE NÃO", ou seja, o programa vai correndo em sua linha normal, chega no "SE ENTÃO" e realiza o teste lógico, se o teste der verdadeiro executa um bloco de instruções, se der falso executa outro. Depois de realizar os blocos o programa volta para o curso normal. Veja o modelo:
Um SE com um SE NÃO
Nesse caso ele vai executar 1-2-3-{4-5}-8-9 se o teste for verdadeiros e 1-2-3-{6-7}-8-9 se for falso. A representação segue a anterior, seta para o lado para o caso verdadeiro, seta para baixo para o caso falso. A diferença é que da ultima instrução verdadeira vai seguir uma seta e esta vai apontar para a seta que sai da última instrução falsa.

Representando o ESCOLHA UM CASO:

Como vimos, temos os ESCOLHA UM CASO com "SAIR" em cada caso, os ESCOLHA UM CASO sem o "SAIR" em alguns casos e os escolha um caso e os sem o "SAIR" em todos os casos. Embora o condicional seja o mesmo a representação gráfica pode mudar.

A representação geral do escolha um caso é uma seta entrando em um símbolo condicional e uma saindo se dividindo em várias setas, uma para cada caso. Os casos que tiverem um "SAIR", ao fim das instruções deverá sair uma seta convergindo para a linha normal do programa. Os sem "SAIR", ao fim das instruções, deverão ter uma seta convergindo para o início do próximo caso. Veja os modelos:
Escolha um caso com SAIR em todos os casos

Escolha um caso com SAIR em todos os casos 
ESCOLHA UM CASO sem SAIR em alguns dos casos

ESCOLHA UM CASO sem SAIR em alguns dos casos 
ESCOLHA UM CASO sem SAIR
ESCOLHA UM CASO sem SAIR
 Obs.: Parece que eu esqueci de mudar o conteúdo dos símbolos condicionais em algumas figuras, está escrito "Motor ligado" ao invés de "Variável".

Ciclos:
Os ciclos, apesarem de terem diversas formas para serem escritas (teste de quebra no início, no meio e no fim) não tem maiores delongas quanto a sua representação gráfica: Eles são representados por uma seta saindo de um condicional e apontando para algum ponto anterior ao mesmo. As instruções entre esse ponto de retorno e o condicional são as que ficam entre o início do ciclo e o teste de sua quebra. As instruções que ficam na seta de retorno até o ponto de retorno são as que ficam entre do condicional de quebra e o final do bloco do ciclo. O importante é lembrar que, no caso dos ciclos, quando o condicional é verdadeiro a seta segue para baixo, voltando a linha normal do algoritmo. Quando é falso ele segue o caminho do loop, para a esquerda. Veja os modelos:
Ciclo com teste de quebra no final

Ciclo com teste de quebra no final
Ciclo com teste de quebra no meio

Ciclo com teste de quebra no meio
Ciclo com teste de quebra no início

Ciclo com teste de quebra no início
Exercícios:

1) Montar os fluxogramas dos algoritmos dos exercícios 1 a 7 da postagem anterior.

2) Montar primeiro o fluxograma e depois escrever os algoritmos para os seguintes programas:

a) Que receba 3 números e diga qual deles é o maior.
b) Que receba 5 números e os coloque em ordem crescente.
c) Que receba 10 temperaturas e armazene classifique elas em 4 classes: a < 50º, 50º <= b < 0º, 0º <= c < 50º, d >= 50º.
d) Receba 2 números e tire o mínimo múltiplo comum.

Pronto, eu pessoalmente já devia estar dormindo. Escrevi isso aqui 12/09 0130h, às 0800h vou dar um curso em um batalhão de infantaria. Já sei que a greve acabou e por isso a próxima postagem está prevista só para mês que vem, provavelmente 19/11. Trabalharemos com o MS Excel / BrOffice Calc para aprendermos a lidar com condicionais.

Isso é tudo.

Respostas aos exercícios de 19/09

1) Variáveis: hipotenusa "a", catetos "b" e "c". Entradas: dimensões dos catetos "b" e "c". Saídas: dimensão da hipotenusa "a".
Exercício 1

2) Variáveis: hipotenusa "a", catetos "b" e "c", ângulo "g". Entradas: hipotenusa "a", ângulo "g". Saídas: catetos "b" e "c".
Exercício 2

3) Variáveis: coeficientes "a", "b" e "c", delta "d", raízes "x1" e "x2", verificador "grau "(declarei esse errado, com o nome de "ver"). Entradas: coeficientes "a", "b" e "c". Saídas: raízes "x1", "x2" e textos "não existem raízes reais" e "equação de 1º grau". Blocos(em cores): nível 1(mais externos): vermelho, lilás e vermelho escuro. Nível 2 (ambos  internos ao bloco lilás) azul e ciano. Nível 3(ambos internos ao ciano): verde e amarelo. Condicionais: "Coeficiente "a" é igual à zero?" (a==0), "Delta é maior que zero?" (d>0), "Delta é igual a zero?" (d==0), "Comparar verificador grau com caso 1,2,restante" (ver).
Exercício 3

4) Variáveis: nivel_da_agua (nível da água no balde). Entradas "nivel_da_agua". Blocos (em cores): Nível 1(mais externo): vermelho. Nível 2(interno ao vermelho): lilás. Condicionais: "O balde está cheio?" (nivel_da_agua == cheio). Ciclos:  tudo o que está dentro do bloco vermelho.
Exercicio 4

5) Variáveis: nivel_do_combustivel, capacidade_do_tanque (poderia ter feito igual ao do problema do balde, colocando um nível fixo, ou um não numérico, mas dessa vez eu quis aprimorar), motor_ligado. Entradas nivel_do_combustivel, capacidade_do_tanque e motor_ligado. Blocos: Nível 1(mais externos) vermelho e ciano. Nível 2 (internos ao vermelho): lilás e azul, (internos ao ciano): verde. Condicionais: "o motor está ligado?" (motor_ligado), "o tanque está cheio?" (nivel_de_combustivel == capacidade_do_tanque). Ciclos: (1) tudo o que está dentro do bloco vermelho, (2) tudo o que está dentro do bloco ciano.
Exercício 5

6) Variáveis: nivel_de_combustivel, capacidade_do_tanque, litros_pedidos, nivel_inicial_do_tanque, motor_ligado. Entradas: nivel_de_combustivel, capacidade_do_tanque, nivel_inicial_do_combustivel, litros_pedidos. Blocos: Nível 1(mais externos): vermelho, ciano, vermelho-escuro. Nível 2 (internos ao vermelho): lilás, azul, (internos ao ciano): verde e amarelo, (interno ao vermelho-escuro): roxo. Condicionais: "o motor está ligado?" (motor_ligado), "é possível colocar todo esse combustível no tanque do veículo?" (litros pedidos > capacidade_do_tanque - nivel_inicial_do_tanque), "os litros pedidos foram colocados?" (nivel_de_combustivel == nivel_inicial_do_tanque + litros_pedidos). Ciclos (1) tudo o que está dentro do bloco vermelho, (2) tudo o que está dentro do bloco ciano, (3) tudo o que está dentro do bloco vermelho escuro.
Exercício 6

7) Variáveis: nivel_de_combustivel, capacidade_do_tanque, litros_pedidos, nivel_inicial_do_tanque, motor_ligado, preço_pedido. Entradas: nivel_de_combustivel, capacidade_do_tanque, nivel_inicial_do_combustivel, preço_pedido. Saídas: preço_pedido .Blocos: Nível 1(mais externos): vermelho, ciano, vermelho-escuro. Nível 2 (internos ao vermelho): lilás, azul, (internos ao ciano): verde e amarelo, (interno ao vermelho-escuro): roxo. Condicionais: "o motor está ligado?" (motor_ligado), "é possível colocar todo esse combustível no tanque do veículo?" (litros pedidos > capacidade_do_tanque - nivel_inicial_do_tanque), "os litros pedidos foram colocados?" (nivel_de_combustivel == nivel_inicial_do_tanque + litros_pedidos). Ciclos (1) tudo o que está dentro do bloco vermelho, (2) tudo o que está dentro do bloco ciano, (3) tudo o que está dentro do bloco vermelho escuro.
Exercício 7
8) Resposta inclusa nos exercícios anteriores.