Programação Orientada à Procedimentos II Programação Orientada à Procedimentos I Processamento Paralelo Lógica de Programação Introdução à Computação Informática Básica

 

 

Informática Básica
Introdução à Computação
Lógica de Programação
Programação Orientada à Procedimentos I
Programação Orientada à Procedimentos II

Processamento Paralelo

Aula 2

Aula 3

Aula 4



CAPÍTULO II

DESENVOLVENDO ALGORITMOS



2.1 Algoritmo e Pseudocódigo

Os algoritmos são descritos em uma linguagem chamada pseudocódigo. Este nome é uma alusão à posterior implementação em uma linguagem de programação, ou seja, quando formos programar em uma linguagem, por exemplo Visual Basic, estaremos gerando código em Visual Basic. Por isso os algoritmos são independentes das linguagens de programação. Ao contrário de uma linguagem de programação não existe um formalismo rígido de como deve ser escrito o algoritmo.
O algoritmo deve ser fácil de se interpretar e fácil de codificar. Ou seja, ele deve ser o intermediário entre a linguagem falada e a linguagem de programação.

2.2 Quais os Obstáculos de um Programador?

Certamente, o maior problema que envolve a construção de algoritmos é a complexidade; portanto, quando tentamos construir um, o objetivo principal é vencer a complexidade do problema a ser solucionado. Isto sim pode ser considerado um pesadelo constante que nos acompanhará a cada momento. Já que é tão importante assim, afinal, o que é Complexidade?
Para nós, Complexidade será sempre encarada como sinônimo de Variedade, que por sua vez representa a quantidade de situações diferentes que um problema pode apresentar, as quais devem ser previstas na sua solução.
Já que saber conviver com a complexidade é um mal necessário, é muito saudável fazer o possível para diminuí-Ia ao máximo, a fim de poder controlar o problema e encontrar sua solução. Existem diversas maneiras de reduzir a complexidade, ou evitar que ela cresça. Para fins educativos, iremos concentrar-nos, por enquanto, em impedir o crescimento da complexidade, a fim de que nos habituemos desde cedo a controlá-la. Vejamos então alguns pontos importantes que podem aumentar ou diminuir a complexidade quando forem mal ou bem utilizados.

2.2.1 Aumento da Complexidade

Uma das maiores responsáveis, talvez a maior, pelo aumento desmedido da complexidade é a forma errônea de auto questionar-se a respeito de um dado problema, pois isso pode levar a respostas irrelevantes à solução do mesmo, gerando algoritmos mais complexos do que o necessário, ou que até mesmo podem levar a nenhuma solução.
Suponha que perguntássemos a um leigo: "Como é um relógio?" este responderia que se trata de um instrumento com três ponteiros concêntricos. A descrição do leigo é completamente irrelevante, pois poderíamos ainda lhe perguntar se um relógio com dois ponteiros não seria uma possibilidade. O leigo teria de admitir a possibilidade, porém, poderíamos perguntar ainda se um relógio com um ponteiro não seria outra possibilidade, e o interlocutor seria obrigado a afirmar que o relógio seria um instrumento com três dois ou um ponteiro. Mais uma vez poderíamos perguntar se um relógio sem ponteiros, com mostrador digital, não seria freqüente.
Concluímos que a quantidade de ponteiros, ou mesmo sua existência, é irrelevante para a descrição de um relógio, porém, corresponde à pergunta que foi feita (Como é um relógio). No entanto, se tivéssemos feito uma pergunta diferente: "O que é um relógio?", o leigo poderia responder: é um instrumento cuja finalidade é marcar o decorrer do tempo. Esta descrição é bastante objetiva, contendo apenas os aspectos relevantes do relógio.

Como é um disco flexível? · Resposta: Disco quadrado, negro e chato que pode ser de diversas marcas, com uma abertura no centro e nas duas faces.

O que é um disco flexível? · Resposta: Meio magnético e portátil de armazenamento de informações.

2.2.2 Legibilidade

Mede a capacidade de compreensão do algoritmo por qualquer observador (que não o construiu), a clareza com que sua lógica está exposta. Quanto mais legível for o algoritmo, menor será a complexidade, portanto, devemos cuidar para não diminuir a legibilidade, já que estaremos aumentando desnecessariamente a complexidade.

2.2.3 Portabilidade

Existe uma verdadeira "torre de Babel" em termos de linguagens de programação, visto que é impossível conhecê-las todas profundamente, o que faz com que não compreendamos um programa escrito numa linguagem desconhecida (legibilidade pequena - alta complexidade). Porém, um problema maior seria ter de convertê-lo para outra linguagem, mesmo que dominássemos ambas as linguagens; essa dificuldade existe pelo fato de a solução do problema em si estar ligada a características e recursos da linguagem na qual ela foi concebida.
Esta é a principal vantagem do algoritmo, pois, além de se preocupar apenas com a lógica do problema, é representado em português (altamente legível, natural) e pode ainda ser convertido com facilidade para qualquer linguagem de programação.

2.3 Regras para construção do Algoritmo

Sendo a atividade de programação (construção de algoritmos) uma tarefa um tanto quanto complexa, o programador pode fazer uso de alguns artifícios que objetivam auxiliar a absorver e controlar a complexidade.
Para escrever um algoritmo precisamos descrever a seqüência de instruções, de maneira simples e objetiva. Para isso utilizaremos algumas técnicas:

· Usar somente um verbo por frase.
· Imaginar que você está desenvolvendo um algoritmo para pessoas que não trabalham com informática.
· Usar frases curtas e simples.
· Ser objetivo.
· Procurar usar palavras que não tenham sentido dúbio.


2.3.1 Método para Construção de Algoritmos

Utilizando os conceitos já desenvolvidos, podemos especificar um método que traduza uma seqüência lógica que leve à construção de algoritmos:

i) Ler atentamente o enunciado (descrição do problema)
É justamente o enunciado do exercício que fornece o encaminhamento necessário à resolução do problema, que se torna, portanto, dependente de sua completa compreensão.

ii) Retirar do enunciado a relação das entradas de dados
Através do enunciado podemos descobrir quais são os dados que devem ser fornecidos, a partir dos quais desenvolveremos os cálculos.

iii) Retirar do enunciado a relação das saídas de dados
Através do enunciado podemos descobrir quais são os dados que devem ser emitidos para compor o resultado final, objetivo do algoritmo.

iv) Determinar o que deve ser feito para transformar as entradas determinadas nas saídas especificadas
Nesta fase é que teremos a construção do algoritmo propriamente dito, pois, a partir de alguns requisitos especificados, devemos determinar qual seqüência de ações é capaz de transformar um conjunto definido de dados nas informações de resultado. Para isso, podemos:

a) Utilizar o Método Cartesiano quando a complexidade (variedade) não estiver totalmente absorvida, conhecida.
Nosso principal objetivo, enquanto programadores, é vencer a complexidade, o que mantém célebre a frase de Descartes: "Dividir para conquistar". Este método consiste justamente em atacar o problema abrangente dividindo-o em partes menores, a fim de torná-lo mais simples ou mais específico e, se necessário, dividir novamente as partes não compreendidas.
Podemos esquematizar o seguinte procedimento (algoritmo) para o método:

1. Dividir o problema em suas partes principais.
2. Analisar a divisão obtida para garantir coerência.
3. Se alguma parte não for bem compreendida, aplicar a ela o método.
4. Analisar o objeto para garantir entendimento e coerência.


b) Aplicar o Planejamento Reverso, isto é, a partir das saídas (informações de resultado), procurar desagregar, desmontando a informação, a fim de atingir os dados de entrada, quando então teríamos (do fim para o início) todas as ações.
Em nosso caso, o produto imediato é as informações de saída de dados, para as quais pode ser aplicada a mesma técnica, isto é, através desta saída podemos determinar, reversamente, os componentes da entrada de dados, bem como todas as etapas de transformação da informação.

c) Montar uma Tabela de Decisão quando uma ou mais ações dependentes de um conjunto de condições assumirem determinadas combinações de valores.
Objetiva basicamente relacionar as ações que dependem de alguma condição com as próprias condições, a fim de esclarecer e visualizar facilmente quais valores o conjunto de condições deve assumir para que se efetue sua respectiva ação.

v) Construir o algoritmo
Com base no conhecimento disponível a respeito do problema (passos anteriores), podemos montar o algoritmo definitivo, ou, ainda, podemos aplicar o Método Cartesiano em sua montagem.

vi) Executar o algoritmo
Implica executar todas as ações descritas seguindo o fluxo de execução estabelecido, verificando se os resultados obtidos correspondem ao ????

2.4 Teste de Mesa

Após desenvolver um algoritmo ele deverá sempre ser testado. Este teste é chamado de TESTE DE MESA, que significa, seguir as instruções do algoritmo de maneira precisa para verificar se o procedimento utilizado está correto ou não.

Veja o exemplo:

Nota da Prova 1
Nota da Prova 2
Nota da Prova 3
Nota da Prova 4

Utilize uma tabela como a abaixo:

P1 P2 P3 P4
       
       
       






2.5 Exercícios

1) Crie uma seqüência lógica para tomar banho:

Uma possível solução

2) Tendo como exemplo os algoritmos desenvolvidos para solucionar o problema da troca de lâmpadas, elabore um algoritmo que mostre os passos necessários para trocar um pneu furado.

Uma possível solução

3) Um homem precisa atravessar um rio com um barco que possui capacidade apenas para carregar ele mesmo e mais uma de suas três cargas, que são: um lobo, um bode e um maço de alfafa. O que o homem deve fazer para conseguir atravessar o rio sem perder suas cargas? Escreva um algoritmo mostrando a resposta, ou seja, indicando todas as ações necessárias para efetuar uma travessia segura.

Uma possível solução

4) Três jesuítas e três canibais precisam atravessar um rio; para tal dispõem de um barco com capacidade para duas pessoas. Por medidas de segurança, não se deve permitir que em alguma margem a quantidade de jesuítas seja inferior à de canibais. Qual a solução para efetuar a travessia com segurança? Elabore um algoritmo mostrando a resposta, indicando as ações que concretizam a solução deste problema.

Uma possível solução

5) Identifique os dados de entrada, processamento e saída no algoritmo abaixo:

Receba código da peça
Receba valor da peça
Receba Quantidade de peças
Calcule o valor total da peça (Quantidade * Valor da peça)
Mostre o código da peça e seu valor total

Uma possível solução

6) Faça um algoritmo para somar dois números e multiplicar o resultado pelo primeiro número.

Uma possível solução


7) Faça um algoritmo para "Calcular ,o estoque médio de uma peça", sendo que:

ESTOQUEMÉDIO = (QUANTIDADE MÍNIMA + QUANTIDADE MÁXIMA) /2

Uma possível solução

8) Considere que uma calculadora comum, de quatro operações, está com as teclas de divisão e multiplicação inoperantes, Escreva algoritmos que resolvam as expressões matemáticas a seguir usando apenas a operação de adição e de subtração.

a) 12 x 4
b) 23 x 11
c) 10/2
d) 175/7
e) 2**3

Uma possível solução