• Nenhum resultado encontrado

APOSTILA DE LÓGICA DE PROGRAMAÇÃO

N/A
N/A
Protected

Academic year: 2019

Share "APOSTILA DE LÓGICA DE PROGRAMAÇÃO"

Copied!
71
0
0

Texto

(1)
(2)

SUMÁRIO

1. Introdução à Lógica de Programação ... 4

1.1. Lógica de programação... 6

1.2. Algoritmo... 7

1.3. Representação de um algoritmo... 13

• Diagrama Nassi-Shneiderman ou de chapin ... 14

• Fluxograma ... 14

• Português Estruturado... 15

1.4. Exercícios de Fixação ... 19

1.5. Exercícios para equipe de aprendizagem... 20

2. Tópicos preliminares... 22

2.1. Tipos Primitivos... 22

2.1.1. Inteiro... 22

2.1.2. Real ... 22

2.1.3. Caracter ... 22

2.1.4. Lógico ... 23

2.1.5. Exercício de fixação... 23

2.2. Constantes ... 23

2.3. Variável... 23

2.3.1. Formação de Identificadores... 24

2.3.2. Declaração de variáveis ... 25

2.3.3. Exercícios de fixação ... 26

2.4. Expressões aritméticas ... 26

2.4.1. Operadores aritméticos ... 27

2.4.2. Prioridades ... 27

2.4.3. Exercício de fixação... 28

2.5. Expressões lógicas ... 28

2.5.1. Operadores relacionais... 29

2.5.2. Operadores lógicos... 30

2.5.3. Tabelas-verdade ... 30

2.5.4. Prioridades entre operadores... 32

2.5.5. Exercício de fixação... 33

2.6. Comando de atribuição ... 33

2.6.1. Exercício de fixação... 34

2.7. Comando de entrada e saída ... 34

2.7.1. Entrada de dados ... 35

2.7.2. Saída de dados... 35

2.8. Blocos ... 36

2.9. Exercícios para equipe de aprendizagem... 36

3. Estruturas de Controle... 39

3.1. Estrutura seqüencial ... 39

3.1.1. Exercícios de fixação ... 41

3.2. Estrutura de seleção ... 42

3.2.1. Seleção Simples ... 42

(3)

3.2.3. Seleção Encadeada... 46

3.2.4. Exercícios de Fixação ... 54

3.3. Estrutura de repetição ... 56

3.3.1. Repetição com teste no início ... 57

3.3.2. Repetição com teste no final ... 60

3.3.3. Repetição com variável de controle... 64

3.4. Comparação entre estruturas de repetição ... 66

(4)

1. Introdução à Lógica de Programação

De uma maneira geral, as apologias abaixo definem informalmente o que vem a ser lógica:

“Lógica é a ciência do raciocínio”. (Malba Tahan)

“Lógica é a ciência das leis do pensamento e a arte de aplicá-las corretamente na pesquisa e na demonstração da verdade”.

(R. Solivete)

“A Lógica é a ciência que dirige, por meio de leis, as operações de nossa razão, para que ordenada, facilmente alcance a verdade”.

(Sinibaldi)

O uso da palavra lógica geralmente se relaciona com a coerência e a racionalidade. Freqüentemente, associa-se a lógica às ciências matemáticas, não se percebendo a sua aplicabilidade nas outras ciências.

Pode-se relacionar a lógica como um instrumento de correção do pensamento, pois ela nos ajuda a refletir sobre quais operações são válidas e quais não são, desencadeando, assim, análises das formas e leis do pensamento humano. Filosoficamente, a lógica procura determinar por que pensamos de uma forma e não de outra. Pensando a lógica como arte ou técnica, a utiliza-se visando usar adequadamente as leis do pensamento.

Analisando-se o exposto acima, pode-se dizer que a lógica é a “arte do bem pensar”. Assim, analisando-se o pensamento humano, vê-se que a forma mais complexa do pensamento é o raciocínio, logo a lógica estrutura o raciocínio e o corrige, sendo, portanto, um instrumento que impõe ordem à razão, o que indica que a razão não funciona desordenadamente. Ou seja, a lógica estuda e ensina a colocar “ordem no pensamento”.

Por exemplo, tem-se:

a. Todo homem é mortal. Sócrates é homem. Logo, Sócrates é mortal.

b. Minas Gerais é um estado do país Brasil. Todos os mineiros são de Minas Gerais. Portanto, todos os mineiros são brasileiros.

Os exemplos dados acima ilustram silogismos1, que no estudo da Lógica

Proposicional representam um argumento composto de duas premissas e uma conclusão, no qual se estabelece uma relação, a qual pode ser válida ou não.

1 Deduções formais tal que, postas duas proposições, chamadas premissas, delas, por inferência, se tira uma

(5)

Isto se apresenta como um dos objetivos da lógica, ou seja, o estudo de técnicas de formalização, dedução e análise que permitam verificar a validade dos argumentos. Nos exemplos citados, ambos são válidos.

Logo, pode-se entender o ato de raciocinar como um processo de derivação de novos conhecimentos a partir de conhecimentos antigos. O conhecimento, desta forma, é expresso através de um conjunto de proposições. Uma proposição é uma sentença declarativa à qual se pode atribuir um dos valores verdade: Verdadeiro (V) ou Falso (F). A proposição é o bloco construtor da Lógica. Por exemplo, as seguintes sentenças declarativas são proposições simples:

• Está chovendo;

• 2 é maior que 3;

• 3 é menor que 4.

Neste exemplo, pode-se afirmar que, dependendo das condições climáticas em um dado momento, a primeira proposição pode ser V ou F, a segunda é uma proposição F e a terceira é V.

Por outro lado, existem algumas sentenças declarativas às quais não se consegue atribuir um valor verdade. Por exemplo, as sentenças abaixo não são proposições:

• x é menor que 100;

• Esta sentença é falsa.

Neste caso, a não ser que se saiba o valor de x no primeiro exemplo e a sentença que se afirma ser falsa, no segundo, não se consegue atribuir um valor verdade para as sentenças.

Além das proposições simples, se apresenta comum a construção de proposições compostas a partir da combinação de proposições simples (subproposições) e conectivos (e, ou, não, se-então, se e somente se). Por exemplo, as sentenças abaixo são proposições compostas:

• Está chovendo e 2 é maior que 3;

• 2 é maior que 3 ou 3 é menor que 4.

Neste caso, independentemente das condições climáticas, a primeira proposição é F e a segunda é V (caso haja dúvida, observe que a primeira proposição – 2 é maior que 3 – é Falsa e a segunda proposição – 3 é menor que 4 – é Verdadeira. Como está se usando a conexão ou, tem-se que ou uma ou outra está certa ou errada).

(6)

• Se Platão estiver disposto a visitar Sócrates então Sócrates está disposto a visitar Platão;

• Se Sócrates estiver disposto a visitar Platão então Platão não está disposto a visitar Sócrates;

• Se Sócrates não estiver disposto a visitar Platão então Platão está disposto a visitar Sócrates.

Ressalta-se que, apesar da aparente coerência de um encadeamento lógico, este pode ser válido ou não em sua estrutura. Neste sentido, a lógica busca a criação de uma representação mais formal, que se contrapõe a linguagem natural, a qual é susceptível a argumentações informais.

Um sistema formal consiste de uma linguagem formal, apropriada para representar teorias, e de uma abstração adequada para os princípios usados para provar quando certas proposições são conseqüências lógicas de proposições que compõem teorias.

Desta forma, a Lógica Proposicional se apresenta como um sistema formal apropriado para a representação de teorias simples, ou seja, aquelas compostas de proposições elementares (proposições que não envolvem quantificadores e variáveis).

No dia-a-dia, sempre que se pensa em alguma coisa, a lógica ou a ilógica acompanha o ser humano. Quando se fala ou se escreve, se expressa o pensamento, sendo necessário a utilização da lógica. Logo, percebe-se a importância da lógica no cotidiano das pessoas, pois, quando se pretende pensar, escrever, falar ou agir de forma correta necessita-se de “colocar ordem no pensamento”. Por exemplo:

a. A porta está fechada;

O roupão está atrás da porta;

Logo, precisa-se abrir a porta para depois pegar o roupão. b. Salim é mais rico que Yussef;

Yussef é mais rico que Chafic;

Portanto, Salim é mais rico que Chafic.

1.1. Lógica de programação

O que é lógica de programação? Segundo Forbellone e Eberspächer (2005), lógica de programação se apresenta como o uso correto das leis do pensamento, da “ordem da razão” e de processos de raciocínio e simbolização formais na programação de computadores, os quais objetivam a racionalidade e o desenvolvimento de técnicas que auxiliem na concepção de soluções logicamente válidas e coerentes, visando a resolução adequada dos problemas que se pretende programar.

(7)

gramática. Logo, pode-se expressar o mesmo raciocínio de diversas formas, utilizando-se outras convenções.

Quando se pensa em programação de computadores, o mesmo problema aparece, pois existem inúmeras linguagens de programação existentes, as quais se apresentam atreladas a uma grande quantidade de detalhes computacionais inerentes a cada uma, que pouco têm a ver com o raciocínio original. Para que se possa descrever este raciocínio de maneira mais fácil e mais fiel à lógica de programação, utiliza-se o que se chama de algoritmos.

1.2. Algoritmo

Define-se como algoritmo uma seqüência de passos que visam atingir um objetivo definido. Na medida em que se necessita especificar uma seqüência de passos, faz-se necessário a utilização de uma ordem, ou seja, pensar em ordem utilizando, obviamente, a lógica.

O uso de algoritmos no cotidiano das pessoas se apresenta comum. Como exemplo, cita-se a receita de um bolo, onde se descrevem os ingredientes necessários e uma seqüência de passos (ações) que devem ser seguidas para que o bolo saia a contento (objetivo bem definido).

Ao se elaborar um algoritmo, faz-se a especificação de ações claras e precisas, as quais, a partir de um estado inicial e um período de tempo finito, confluem para um estado final – a solução do problema – previsível e bem definido. Logo, o algoritmo define um padrão de comportamento e uma norma de execução a ser seguida, visando alcançar a solução do problema e garantindo que sempre que executado, sob as mesmas condições, se alcance o mesmo resultado.

A importância do algoritmo se inscreve na necessidade de se representar mais fielmente o raciocínio envolvido na lógica de programação buscando-se abstrair uma série de detalhes computacionais que podem ser acrescentados mais tarde. Desta maneira, pode-se concentrar no que se apresenta como mais importante: a lógica para a construção do raciocínio em algoritmos.

Vale a pena destacar uma outra importante função da construção dos algoritmos que é capacidade do mesmo de ser traduzido para qualquer linguagem de programação, sendo, a partir daí, agregado as funcionalidades disponíveis nos diversos ambientes de programação. Chama-se de codificação

a passagem da solução algorítmica para qualquer linguagem de programação. Um algoritmo pode ser utilizado para demonstrar uma realização de determinada atividade no dia-a-dia. Inicialmente, utilizando-se o português coloquial, utiliza-se como exemplo a troca de uma lâmpada.

Algoritmo 1 – troca de uma lâmpada

Pegar uma escada;

Posicionar a escada embaixo da lâmpada; Buscar uma lâmpada nova;

(8)

Retirar a lâmpada velha; Colocar a lâmpada nova.

Involuntariamente, ao se fazer esta atividade, segue-se uma seqüência de ações que, representadas neste algoritmo, fazem com que o mesmo seja seguido naturalmente por qualquer pessoa, estabelecendo uma maneira de comportar, ou seja, um padrão, pois sempre se poderia agir da mesma forma.

A seqüenciação se apresenta como uma convenção que tem o objetivo de reger o fluxo de execução do algoritmo, determinando qual deve ser a primeira ação a ser executada e as subseqüentes. No caso da seqüência acima, vê-se que a mesma é linear, de cima para baixo.

Repensando o algoritmo descrito, nota-se que o mesmo possui um objetivo bem definido: trocar uma lâmpada. Mas, e se a lâmpada não estiver queimada? Não se observa no algoritmo descrito a previsão desta possibilidade, o que levaria a uma troca da lâmpada, independentemente dela estar ou não queimada. Visando solucionar esta necessidade, pode-se efetuar um teste, no intuito de se verificar se a lâmpada está ou não queimada. Uma possível solução seria:

Algoritmo 2 – troca de uma lâmpada com teste

Pegar uma escada;

Posicionar a escada embaixo da lâmpada; Buscar uma lâmpada nova;

Acionar o interruptor;

Se a lâmpada não acender, então i. Subir na escada;

ii. Retirar a lâmpada queimada; iii. Colocar a lâmpada nova.

Como se pode observar, condiciona-se algumas ações à condição da lâmpada não acender, ou seja, se essa condição for verdadeira (lâmpada queimada), efetua-se a troca da lâmpada, seguindo-se as próximas ações:

• Subir na escada;

• Retirar a lâmpada queimada;

• Colocar a lâmpada nova.

Caso a condição lâmpada não acender for falsa (lâmpada funcionando), as ações relativas à troca da lâmpada não serão executadas, e a lâmpada (em bom estado) não será trocada.

(9)

Para tanto, altera-se o teste condicional se a lâmpada não acender para o início da seqüência de ações:

Algoritmo 3 – troca de uma lâmpada com teste no início

Acionar o interruptor;

Se a lâmpada não acender, então i. Pegar uma escada;

ii. Posicionar a escada embaixo da lâmpada; iii. Buscar uma lâmpada nova;

iv. Subir na escada;

v. Retirar a lâmpada queimada; vi. Colocar a lâmpada nova.

Observe que no algoritmo 3, a ação acionar o interruptor é a primeira do algoritmo e a condição lâmpada não acender já se apresenta avaliada. No caso descrito, as ações pegar uma escada até colocar a lâmpada nova dependem da lâmpada efetivamente estar queimada. Obviamente, existem muitas maneiras de se resolver este problema, pois cada pessoa pensa e raciocina da sua maneira. Isto significa que para esse mesmo problema “trocar uma lâmpada”, pode-se ter uma série de soluções diferentes e corretas (no caso de atingirem o resultado desejado de efetuar a troca). Portanto, o bom senso e a prática de lógica de programação é que permitirão ao programador a identificação de qual solução é mais adequada, que com menos esforço e maior objetividade produzirá o resultado pretendido.

A solução apresentada no algoritmo 3 se apresenta aparentemente adequada, porém não prevê a possibilidade da nova lâmpada não acender e, portanto, não atingir ao objetivo desejado. Pode-se fazer um refinamento2 visando um modo que se troque a lâmpada diversas vezes, se necessário, até que a mesma funcione. Uma possível solução seria:

Algoritmo 4 – troca de uma lâmpada com teste e repetição indefinida

Acionar o interruptor;

Se a lâmpada não acender, então i. Pegar uma escada;

ii. Posicionar a escada embaixo da lâmpada; iii. Buscar uma lâmpada nova;

iv. Subir na escada;

v. Retirar a lâmpada queimada; vi. Colocar a lâmpada nova;

vii. Se a lâmpada não acender, então

Retirar a lâmpada queimada;

Colocar outra lâmpada nova;

(10)

Se a lâmpada não acender, então a. Retirar a lâmpada queimada; b. Colocar outra lâmpada nova; .

. . .

Até Quando?

Nota-se que o algoritmo 4 não está terminado, pois falta especificar até quando será feito o teste da lâmpada. Evidentemente, as ações cessarão quando se colocar uma lâmpada que acenda. Caso contrário, ficará se testando indefinidamente (note que o interruptor continua acionado). Esta solução se aproxima do objetivo, pois garante que a lâmpada seja trocada com êxito, porém apresentando um problema de não se saber o número exato de teste das lâmpadas.

Observe que o teste da lâmpada nova é efetuado por um mesmo conjunto de ações:

Se a lâmpada não acender, então

o Retirar a lâmpada queimada;

o Colocar outra lâmpada nova.

Logo, refinando o algoritmo descrito, pode-se, ao invés de se reescrever estas ações indefinidamente, alterar o fluxo seqüencial de execução de forma que, após executada a ação colocar outra lâmpada nova, volta-se a executar o teste se a lâmpada não acender, fazendo com que essas ações sejam executadas o número de vezes necessárias sem a necessidade de explicitá-las.

Desta maneira, faz-se necessário estipular um limite para tal repetição, objetivando garantir uma condição de parada, ou seja, que seja cessada a atividade de testar a lâmpada nova quando ela já estiver acessa. Uma solução seria:

Enquanto a lâmpada não acender, faça

o Retirar a lâmpada queimada;

o Colocar outra lâmpada nova.

Observe que a condição lâmpada não acender permaneceu e se estabeleceu um fluxo repetitivo que será finalizado assim que a condição de parada for falsa, ou seja, assim que a lâmpada acender. Percebe-se que o número de repetições é indefinido, porém finito, e que depende apenas da condição estabelecida, o que leva a repetir as ações até se alcançar o objetivo: trocar a lâmpada queimada por uma que funcione. O algoritmo 4 ficaria assim:

Algoritmo 5 – troca de uma lâmpada com teste e condição de parada

Acionar o interruptor;

(11)

ii. Posicionar a escada embaixo da lâmpada; iii. Buscar uma lâmpada nova;

iv. Subir na escada;

v. Retirar a lâmpada queimada; vi. Colocar a lâmpada nova;

vii. Enquanto a lâmpada não acender, faça

Retirar a lâmpada queimada;

Colocar outra lâmpada nova.

Até este ponto, efetuou-se a troca de uma única lâmpada (testou-se um soquete acionado por um interruptor), trocando-as quantas vezes forem necessárias para assegurar que o conjunto funcione. E se fosse necessário testar mais soquetes, por exemplo, 8 soquetes? A solução mais simples seria repetir o algoritmo 5 para os 8 soquetes existentes, ficando algo assim:

Algoritmo 6 – troca de uma lâmpada com teste para 8 soquetes

Acionar o interruptor do primeiro soquete; Se a lâmpada não acender, então

i. Pegar uma escada;

ii. Posicionar a escada embaixo da lâmpada; iii. Buscar uma lâmpada nova;

iv. Subir na escada;

v. Retirar a lâmpada queimada; vi. Colocar a lâmpada nova;

vii. Enquanto a lâmpada não acender, faça

Retirar a lâmpada queimada;

Colocar outra lâmpada nova. Acionar o interruptor do segundo soquete; Se a lâmpada não acender, então

i. Pegar uma escada;

ii. Posicionar a escada embaixo da lâmpada; iii. Buscar uma lâmpada nova;

iv. Subir na escada;

v. Retirar a lâmpada queimada; vi. Colocar a lâmpada nova;

vii. Enquanto a lâmpada não acender, faça

Retirar a lâmpada queimada;

Colocar outra lâmpada nova. .

. . . .

(12)

i. Pegar uma escada;

ii. Posicionar a escada embaixo da lâmpada; iii. Buscar uma lâmpada nova;

iv. Subir na escada;

v. Retirar a lâmpada queimada; vi. Colocar a lâmpada nova;

vii. Enquanto a lâmpada não acender, faça

Retirar a lâmpada queimada;

Colocar outra lâmpada nova.

Observe que o algoritmo 6 é apenas uma série de repetições (oito) do algoritmo 5. Como o conjunto de ações que foram repetidas é exatamente igual, pode-se alterar o fluxo seqüencial de execução de modo a fazer com que ele voltasse a executar o conjunto de ações relativas a um único soquete (algoritmo 5) tantas vezes fosse necessário. Uma solução para o teste de oito soquetes seria:

Algoritmo 7 – troca de uma lâmpada com teste para 8 soquetes

Ir até o interruptor do primeiro soquete;

Enquanto a quantidade de soquetes testados for menor que oito, faça

Acionar o interruptor;

Se a lâmpada não acender, então i. Pegar uma escada;

ii. Posicionar a escada embaixo da lâmpada; iii. Buscar uma lâmpada nova;

iv. Subir na escada;

v. Retirar a lâmpada queimada; vi. Colocar a lâmpada nova;

vii. Enquanto a lâmpada não acender, faça

Retirar a lâmpada queimada;

Colocar outra lâmpada nova; Ir até o interruptor do próximo soquete.

Neste exemplo, enquanto a condição quantidade de soquetes testados for menor que oito for verdadeira, as ações de troca ou não de um único soquete serão realizadas. Caso a condição de parada seja falsa, ou seja, todos os oito soquetes já tiverem sido testados, as ações deixarão de serem executadas.

Todos estes exemplos foram desenvolvidos a partir da descrição dos passos necessários para a resolução de um problema: efetuar a troca de uma lâmpada. Ou seja, a partir do problema, construiu-se um algoritmo que, inicialmente, possuía um pequeno número de ações que deveriam ser executadas, todas apresentadas passo a passo, uma após a outra, compondo uma ordem seqüencial de execução, a estrutura seqüencial.

(13)

determinado conjunto de ações fosse evitado, conforme o resultado de uma determinada condição. Construiu-se, assim, uma estrutura seletiva através de um teste condicional que permitiu ou não que o fluxo de execução passasse por um determinado conjunto de ações.

Ao se deparar com a inviabilidade da aplicação da estrutura de seleção para a verificação do êxito na troca da lâmpada (quantas vezes vai se executar e na situação de trocar oito lâmpadas), houve a necessidade de se repetir um mesmo trecho do algoritmo, o que foi realizado alterando-se o fluxo de execução de modo que ele passasse pelo mesmo trecho várias vezes, enquanto a condição não fosse satisfeita, construindo-se, desta maneira, uma estrutura de repetição.

Cabe ressaltar aqui que qualquer pessoa, fundamentada em suas próprias vivências, seria capaz de resolver o problema na prática, envolvendo, inclusive, situações incomuns que pudessem surgir. Contudo, um programa de computador tradicional não tem conhecimento prévio nem a capacidade de adquirir experiências, o que implica na premissa de que a pessoa que programa a solução de um problema deve determinar em detalhes todas as ações que ele deva executar, prevendo todos os obstáculos e a forma de transpô-los, ou seja, descrever uma seqüência finita de passos que garantam a solução do problema.

1.3. Representação de um algoritmo

Um algoritmo pode ser descrito como uma linha de raciocínio, a qual pode ser descrita de várias maneiras: textual ou gráfica. Nos algoritmos apresentados até o momento, observa-se que os mesmos estavam em forma textual, usando o português coloquial3.

Os algoritmos podem ser representados de várias formas, como por exemplo:

a) Através de uma língua (português, inglês, etc.): forma utilizada nos manuais de instruções, nas receitas culinárias, etc.

b) Através de uma linguagem de programação (Pascal, C, Delphi, etc.): esta forma é utilizada por alguns programadores experientes, que "pulam" a etapa do projeto do programa (algoritmo) e passam direto para a programação em si.

c) Através de representações gráficas: são bastante recomendáveis, já que um "desenho" (diagrama, fluxograma, etc.) muitas vezes substitui, com vantagem, várias palavras.

Cada uma dessas formas de representar um algoritmo tem suas vantagens e desvantagens, cabe a pessoa escolher a forma que melhor lhe

(14)

convir. Nesta disciplina serão apresentadas três formas de representação de algoritmos (que são algumas das mais utilizadas), são elas:

- Diagrama de Nassi-Shneiderman (Diagrama de Chapin)

- Fluxograma (Diagrama de Fluxo)

- Português Estruturado (Pseudocódigo, Portugol ou Pseudolinguagem)

Diagrama Nassi-Shneiderman ou de chapin

Os Diagramas Nassi-Shneiderman, também conhecidos como Diagramas de Chapin, surgiram nos anos 70 como uma maneira de ajudar nos esforços da abordagem de programação estruturada. Um típico diagrama Nassi-Shneiderman é apresentado na Figura 1 abaixo. Como se pode ver, o diagrama é fácil de ler e de entender, cada "desenho" representa uma ação (instrução) diferente.

Figura 1 – Exemplo de Diagrama Nassi-Shneiderman

A idéia básica deste diagrama é representar as ações de um algoritmo dentro de um único retângulo, subdividindo-o em retângulos menores, que representam os diferentes blocos de seqüência de ações do algoritmo.

Fluxograma

(15)

Eles permitem visualizar os caminhos (fluxos) e as etapas de processamento de dados possíveis e, dentro destas, os passos para a resolução do problema. Abaixo, na Figura 2, é apresentado um exemplo de fluxograma.

Figura 2 – Exemplo de Fluxograma

Português Estruturado

O Português Estruturado é uma forma especial de linguagem bem mais restrita que a Língua Portuguesa e com significados bem definidos para todos os termos utilizados nas instruções (comandos).

Essa linguagem também é conhecida como Portugol (junção de Português com Algol, Pseudocódigo ou Pseudolinguagem). O Português Estruturado, na verdade, é uma simplificação extrema da língua portuguesa, limitada a pouquíssimas palavras e estruturas que têm significado pré-definido, pois se deve seguir um padrão. Emprega uma linguagem intermediária entre a linguagem natural e uma linguagem de programação, para descrever os algoritmos.

(16)

não precisa ser seguida tão rigorosamente quanto a sintaxe de uma linguagem de programação, já que o algoritmo não será executado como um programa.

Embora o Português Estruturado seja uma linguagem bastante simplificada, ela possui todos os elementos básicos e uma estrutura semelhante à de uma linguagem de programação de computadores. Portanto, resolver problemas com português estruturado pode ser uma tarefa tão complexa quanto a de escrever um programa em uma linguagem de programação qualquer só não tão rígida quanto a sua sintaxe, ou seja, o algoritmo não deixa de funcionar porque esquecemos de colocar um ';' (ponto-e-vírgula) por exemplo, já um programa não funcionaria. A Figura 3 apresenta um exemplo de algoritmo na forma de representação de português estruturado.

Figura 3 – Exemplo de Português Estruturado

(17)
(18)

Figura 5 – Algoritmo 9: Diagrama de chapin de troca de uma lâmpada com teste para 8 soquetes – Fonte: Forbellone e Eberspächer (2005).

Como exemplo, citado em Forbellone e Eberspächer (2005), temos a seguinte frase: “O pregador foi grampeado durante o conserto”. Esse exemplo quando falado pode ter até oito sentidos diferentes, uma vez que pregador pode ser um religioso que prega a palavra de Deus ou um prendedor de roupas; grampeado pode ser uma escuta telefônica ou do grampo que une folhas de papel; conserto, quando pronunciado, pode se tratar de uma apresentação musical ou da manutenção em algum objeto. Pode-se, a partir do contexto no qual a frase foi dita se descobrir qual dos oito sentidos diferentes se aplicaria ao caso, mas o computador se apresenta desprovido do raciocínio necessário para interpretar a frase.

Para se evitar este tipo de problema, utilizar-se-á um conjunto de regras que visam restringir e estruturar o uso do português na apresentação de algoritmos e que, intencionalmente, se aproximam da maneira pela qual o fazem as linguagens computacionais mais comuns (como o C e o Pascal).

(19)

1.4. Exercícios de Fixação

4. Três senhoras – dona Branca, dona Rosa e dona Violeta – passeavam pelo parque quando dona Rosa disse:

- Não é curioso que estejamos usando vestidos de cores branca, rosa e violeta, embora nenhuma de nós esteja usando um vestido de cor igual ao seu próprio nome?

- Uma simples coincidência – respondeu a senhora com o vestido violeta.

Qual a cor do vestido de cada senhora?

5. 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.

(20)

1.5. Exercícios para equipe de aprendizagem

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

a. 12 x 4; b. 23 x 11; c. 10 ÷ 2; d. 175 ÷ 7; e. 28.

2. 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 medida 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, em equipe, mostrando a resposta, indicando as ações que concretizam a solução deste problema.

3. Monte, em equipe, um algoritmo para a seguinte situação: um caçador precisa atravessar o rio com sua carga: um leão, uma cabra e um pedaço de grama por meio de um bote. Sabe-se que nunca o leão pode ficar sozinho com a cabra e nem a cabra sozinha com a grama.

4. Dada a série de números : 1, 1, 2, 3, 5, 8, 13, qual é o próximo ? 5. Um pai preocupado com a saúde de seus filhos quer que eles

comam maçãs, mas não sabe fazer a distribuição. Se der 5 maçãs para cada filho, vão lhe sobrar quatro, se der 6, vai faltar uma. Quantos filhos e quantas maçãs ele tem?

6. Daniela é mais jovem do que Adriano. Carlos é mais velho do que Daniela. Qual dessas conclusões é verdadeira?

a) Adriano é mais velho do que Carlos. b) Carlos é mais velho do que Adriano. c) Daniela é a mais jovem dos três.

(21)

8. Em uma folha de papel traçam-se duas retas, formando um ângulo de 15°. Ao utilizar uma lente que aumenta três veze s, quantos graus passará a ter o ângulo?

(22)

1. Tópicos preliminares

A informação é a matéria-prima que faz necessário a existência dos computadores, pois os mesmos são capazes de manipular e armazenar um grande volume de dados com grande desempenho, liberando o homem para outras tarefas, nas quais o seu conhecimento se apresenta indispensável. Há uma pequena diferença entre dado e informação. Ao se falar que hoje é dia 07 de setembro, isto é um dado. Ao se dizer que 7 de setembro é o dia da independência, agrega-se valor ao dado data, apresentando uma informação.

Ao se aproximar da maneira como o computador manipular as informações, dividem-se as mesmas em quatro tipos ditos primitivos, que serão os tipos básicos que serão usados na construção de algoritmos.

2.1. Tipos Primitivos

2.1.1. Inteiro

Toda e qualquer informação numérica que pertença ao conjunto dos números inteiros relativos (negativa, nula ou positiva).

Apresentam-se algumas proposições declarativas comuns em que se é usado o tipo inteiro. Quais sejam:

• Ele tem 15 irmãos;

• A escapa possui 8 degraus;

• Meu vizinho comprou 2 carros novos.

Enfatizando o conceito de dado, vale observar, por exemplo, o item b: 8 é um dado do tipo inteiro e a informação é associar que 8 é o número de degraus da escada.

2.1.2. Real

Toda e qualquer informação numérica que pertença ao conjunto de números reais (negativa, nula ou positiva). Seguem exemplos:

• Ela tem 1,73 metros de altura;

• Meu saldo bancário é de R$ 215,20;

• No momento, estou pesando 82,5 kg.

2.1.3. Caracter

Toda e qualquer informação composta de um conjunto de caracteres alfanuméricos: números (0...9), alfabéticos (A...Z, a...z) e especiais (por exemplo, #, ?, !, @). Seguem exemplos:

• Constava na prova: “Use somente caneta”;

• O parque municipal estava repleto de placas: “Não pise na grama”;

(23)

2.1.4. Lógico

Toda e qualquer informação numérica que pode assumir apenas duas situações. Seguem exemplos:

• A porta pode estar aberta ou fechada;

• A lâmpada pode estar acesa ou apagada;

2.1.5. Exercício de fixação

1. Determine qual é o tipo primitivo de informação presente nas sentenças a seguir:

a. A placa “Pare!” tinha 2 furos de bala;

b. Josefina subiu 5 degraus para pegar uma maça boa;

c. Alberta levou 3,5 horas para chegar ao hospital onde concebeu uma garota;

d. Astrogilda pintou em sua camiseta: “Preserve o Meio Ambiente”, e ficou devendo R$ 100,59 ao vendedor de tintas;

e. Felisberto recebeu sua 18a medalha por ter alcançado a marca de 5,73 segundos nos 100 metros rasos.

2.2. Constantes

Define-se um dado como constante quando não existe nenhuma possibilidade do mesmo ser alterado em algum instante do tempo, ou seja, seu valor permanece constante do início ao fim da execução do algoritmo, assim como é constante para execuções diferentes no tempo.

Visando diferenciar os dados constantes do tipo caracter dos outros tipos, usar-se-á aspas duplas (“ ”) para delimitá-los.

Convenciona-se que as informações do tipo lógico poderão assumir um dos seguintes valores constantes: verdade (V) ou falsidade (F).

Exemplos:

• 5, “Não Fume”, 2528, - 0.55, V.

2.3. Variável

Classifica-se um dado como variável quando tem a possibilidade de ser alterado em algum instante no decorrer do tempo, ou seja, durante a execução do algoritmo em que é utilizado, o valor do dado sofre alteração ou o dado é dependente da execução em um certo momento ou circunstância.

Exemplos:

(24)

Um exemplo que ilustraria a diferença entre valores constantes e variáveis seria a construção de um algoritmo para calcular o comprimento de uma circunferência. Obviamente, tem-se que utilizar a fórmula que expressa o comprimento que é 2πr, na qual π tem valor constante de 3,1416...,

independente de qual seja a circunferência (ou seja, vale para todas as situações em que se calcula o comprimento). Já o valor de r, que representa o raio da circunferência, é dependente da circunferência que se está calculando, logo é variável a cada execução do algoritmo.

2.3.1. Formação de Identificadores

Suponha que para um leasing de um equipamento destinado a linha de produção de uma indústria de autopeças, não se possa utilizar um valor fixo em moeda corrente como base para o reajuste do contrato, pois com o passar do tempo esse valor estaria defasado. Visando a resolução deste problema, pode-se utilizar um parâmetro que fornecespode-se valores atualizados em moeda corrente para cada período, ou seja, um dado variável dependente do período.

Logo, haveria a necessidade de nomear este parâmetro que representa os valores em mutação, tal como IVD, índice de variação do dólar.

Esses nomes das informações de caráter variável são chamados de

identificadores, os quais devem acompanhar as seguintes regras de formação:

1. Devem começar por um caracter alfabético;

2. Podem ser seguidos por mais caracteres alfabéticos ou numéricos; 3. Não devem ser usados caracteres especiais.

O diagrama de sintaxe se apresenta a seguir.

Exemplos:

• Identificadores válidos:

Alpha, X, BJ153, K8, Notas, Média, CDE, INSS, IRPF.

• Identificadores inválidos:

5X, E(13), A:B, X-Y, Nota/2, AWQ*, P&AA. Identificador letra

(25)

2.3.2. Declaração de variáveis

No ambiente computacional, as informações variáveis são guardadas em dispositivos chamados de memória. Pode-se imaginar essa ‘memória’ como sendo um grande arquivo repleto de gavetões, no qual os gavetões seriam os locais físicos responsáveis por armazenar objetos. Os objetos (que podem ser substituídos) seriam os dados e os gavetões,as variáveis.

Visto que na memória (arquivo) existem inúmeras variáveis (gavetões), há a necessidade de diferenciá-las, o que é feito por meio de identificadores (etiquetas ou rótulos). Cada variável (gavetão), no entanto, pode guardar apenas um dado (objeto) de cada vez, sendo sempre de mesmo tipo primitivo (material).

Portanto, faz-se necessário definir nomes para determinados gavetões especificando qual o material dos objetos que podem ser armazenados nos mesmos, ou seja, declarar as variáveis que serão usadas para identificar os dados. Tem-se a seguinte regra sintática:

Exemplos:

Inteiro: X;

Caracter: Nome, Endereço, Data;

Real: ABC, XPTO, Peso, Dólar;

Lógico: Resposta, H289.

No exemplo, Resposta é o nome de um local de memória que só pode conter valores do tipo lógico, ou seja, por convenção, verdade (V) ou Falsidade (F). Já o identificador X é o nome de um local de memória que só pode conter valores do tipo inteiro, qualquer um deles.

Não deve permitir que mais de uma variável (gavetão) possua o mesmo identificador (etiqueta ou rótulo), já que não haveria maneira de saber que variável usar (que gavetão abrir). Só se pode guardar dados (objetos) em variáveis (gavetões) do mesmo material (tipo primitivo), ou seja, uma variável do tipo primitivo inteiro somente pode armazenar números inteiros, uma variável lógica, somente verdade (V) e falsidade (F), e assim por diante. Outra restrição

Declaração de variáveis tipo : identificador ;

,

tipo inteiro real

caracter

(26)

que se apresenta importante é que as variáveis (gavetões) podem receber apenas um dado (objeto) de cada vez.

2.3.3. Exercícios de fixação

1. Assinale os identificadores válidos:

a) (X) b) U2 c) AH! d) “ALUNO” e) #55 f) KM/L g) UYT

h) ASDRUBAL i) AB*C j) 0&0 l) P{0} m) B52 n) Rua

o) CEP p) dia/mês

2. Supondo que as variáveis NP, NFC, NMat e SX sejam utilizadas para armazenar a valor das peças produzidas em reais, o nome do funcionário, o número de matrícula e o sexo, declare-as corretamente, associando o tipo primitivo adequado ao dado a ser armazenado.

3. Encontre os erros da seguinte declaração de variáveis:

Inteiro: Endereço, NFilhos;

Caracter: Idade, X;

Real: XPTO, C, Peso, R$;

Lógico: Lâmpada, C;

2.4. Expressões aritméticas

Denomina-se expressão aritmética aquela cujos operadores são aritméticos e cujos operandos são constantes ou variáveis do tipo numérico (inteiro ou real). Segue sua sintaxe.

Expressão aritmética operando Operador aritmético operando

(27)

2.4.1. Operadores aritméticos

Definem-se como operadores aritméticos o conjunto de símbolos que representam as operações básicas da matemática, a saber:

Tabela 1 – Operadores aritméticos – Fonte: Forbellone e Eberspächer (2005).

Operador Função Exemplos

+ Adição 2 + 3, X + Y - Subtração 4 – 2, N – M * Multiplicação 3 * 4, A * B / Divisão 10/2, X1/X2

Para se representar as operações de radiciação e potenciação, usa-se as palavras-chave rad e pot, conforme se apresenta indicado na Tabela 2.

Tabela 2 – Potenciação e radiciação – Fonte: Forbellone e Eberspächer (2005).

Operador Função Significado Exemplos

pot (x,y) Potenciação x elevado a y pot (2,3) Rad (x) Radiciação Raiz quadrada de x rad(9)

Usa-se para outras operações matemáticas não convencionais, porém de grande utilidade na construção de algoritmos, que são o resto da divisão e o quociente da divisão inteira, conforme a tabela a seguir:

Tabela 3 – Operador de resto e quociente de divisão inteira – Fonte: Forbellone e Eberspächer (2005).

Operador Função Exemplos

mod Resto da divisão 9 mod 4 resulta em 1 27 mod 5 resulta em 2 div Quociente da divisão 9 div 4 resulta em 2

27 div 5 resulta em 5

2.4.2. Prioridades

Na resolução de expressões aritméticas, as operações guardam hierarquia entre si, demonstrada na seguinte tabela.

Tabela 4 – Precedência entre os operadores aritméticos – Fonte: Forbellone e Eberspächer (2005).

Prioridade Operadores 1a Parênteses internos

2a pot rad

3a * / div mod

(28)

Em caso de empate (operadores com mesma prioridade), deve-se resolver da esquerda para a direita, conforme a seqüência existente na expressão aritmética. Para se alterar a prioridade da tabela, utilizam-se parênteses mais internos.

Exemplos:

• 5 + 9+ 7 + 8/4 5 + 9 + 7 + 2 23

• 1 – 4 * 3/6 – pot(3,2) 1 – 4 * 3/6 – 9 1 – 12/6 – 9 1 – 2 – 9 - 10

• pot(5,2) – 4/2 + rad(1+3*5)/2 pot(5,2) – 4/2 + rad(1+15)/2 pot(5,2) – 4/2 + rad(16)/2 25 – 4/2 + 4/2

25 – 2 + 2 25

2.4.3. Exercício de fixação

1. Supondo que A, B e C são variáveis do tipo inteiro, com valores iguais a 5, 10 e – 8, respectivamente, e uma variável real D, com valor igual a 1,5, quais são os resultados das expressões aritméticas a seguir:

a. 2 * A mod 3 – C; b. rad(-2*C) div 4;

c. ((20 div 3) div 3) + pot(8,2)/2; d. (30 mod 4* pot(3,3)) * -1; e. pot(-C,2) + (D*10)/A f. rad(pot(A,B/A)) + C * D.

2.5. Expressões lógicas

(29)

2.5.1. Operadores relacionais

Utilizam-se os operadores relacionais para realizar comparações entre dois valores de mesmo primitivo. Tais valores são representados por constantes, variáveis ou expressões aritméticas. Os operadores relacionais se apresentam comuns na construção de equações. Esses operadores são apresentados a seguir.

Tabela 5 – Operadores relacionais – Fonte: Forbellone e Eberspächer (2005).

Operador Função Exemplos

= Igual a 5 = 5, X = Y

> Maior que 8 > 4, X > Y < Menor que 8 < 12, X < Y >= Maior ou igual a 6 >= 4, X >= Y <= Menor ou igual a 4 <= 6, X <= Y <> Diferente de 10 <> 11, X <> Y

O resultado obtido de uma relação é sempre um valor lógico. Por exemplo, quando se analisa a expressão numérica X + Y = Z, o resultado será verdade ou falsidade à medida que o valor da expressão aritmética X + Y seja igual ou diferente do conteúdo da variável Z.

Expressão lógica Operando lógico Operador lógico

Operador lógico Constante lógica

Variável lógica

não

Expressão relacional

Expressão relacional Expressão aritmética

Operador relacional Expressão aritmética

Expressão

literal Operador relacional Expressão literal

Expressão literal

(30)

Exemplos:

• 2 * 4 = 24/3 8 = 8 V

• 15 mod 4 < 19 mod 6 3 < 1

F

• 3 * 5 div 4 <= pot(3,2)/0,5 15 div 4 <= 9/0,5 3 <= 18 V

• 2 + 8 mod 7 >= 3 * 6 – 15 2 + 1 >= 18 – 15 3 >= 3 V

2.5.2. Operadores lógicos

Utilizar-se-á três operadores básicos para a formação de novas proposições lógicas compostas a partir de outras proposições lógicas simples. Os operadores lógicos serão apresentados a seguir.

Tabela 6 – Operadores lógicos – Fonte: Forbellone e Eberspächer (2005).

Operador Função Não Negação

e Conjunção

ou Disjunção

2.5.3. Tabelas-verdade

A tabela-verdade é o conjunto de todas as possibilidades combinatórias entre os valores de diversas variáveis lógicas, as quais se encontram em apenas duas situações (V ou F), e um conjunto de operadores lógicos.

A seguir constrói-se uma tabela-verdade com o objetivo de dispor de maneira prática os valores lógicos envolvidos em uma expressão lógica.

Tabela 7 – Operação de negação – Fonte: Forbellone e Eberspächer (2005).

A Não A

F V

(31)

Tabela 8 – Operação de conjunção – Fonte: Forbellone e Eberspächer (2005).

A B A e B

F F F

F V F

V F F

V V V

Tabela 9 – Operação de disjunção – Fonte: Forbellone e Eberspächer (2005).

A B A ou B

F F F

F V V

V F V

V V V

Exemplos:

• Se chover e relampejar eu fico em casa. Quando eu fico em casa?

Observando-se a tabela verdade do conectivo utilizado (e), vê-se que a proposição só será verificada (ou seja, “eu fico em casa”) quando os termos chover e relampejar forem simultaneamente verdadeiros.

• Se chover ou relampejar eu fico em casa.

• Quando eu fico em casa?

Verifica-se que quando se usa o operador ou, as possibilidades de “eu fico em casa” se tornam maiores, visto que, pela tabela verdade, a proposição será verdadeira em três situações: somente chovendo, somente relampejando, chovendo e relampejando.

• 2 < 5 e 15/3 = 5 V e 5 = 5 V e V V

• 2 < 5 ou 15/3 = 5 V ou 5 = 5 V ou V V

• F ou 20 div(18/3) <> (21/3) div 2 F ou 20 div 6 <> 7 div 2

(32)

não V ou pot(3,2)/3 < 15 – 35 mod 7

não V ou 9/3 < 15 – 0

não V ou 3 < 15

não V ou V F ou V V

2.5.4. Prioridades entre operadores

Entre os operadores lógicos:

Tabela 10 – Precedência entre os operadores lógicos – Fonte: Forbellone e Eberspächer (2005).

Prioridade Operadores

1a não

2a e

3a ou

Entre todos os operadores:

Tabela 11 – Precedência entre todos os operadores – Fonte: Forbellone e Eberspächer (2005).

Prioridade Operadores 1a Parênteses mais internos 2a Operadores aritméticos 3a Operadores relacionais 4a Operadores lógicos

Cabe salientar que essa última convenção de precedência (Tabela 11) não é comum a todas as linguagens, mas foi adotada por ser considerada a mais didática.

Exemplos:

a) não ((5 <> 10/2) ou V e 2 – 5 > 5 – 2 ou V)

não ((5 <> 5) ou V e – 3 > 3 ou V)

não (F ou V e F ou V)

não (F ou F ou V)

não (F ou V)

não (V)

F

b) pot(2,4) <> 4 + 2 ou 2 + 3 * 5/3 mod 5 < 0 16 <> 6 ou 2 + 15/3 mod 5 < 0

16 <> 6 ou 2 + 5 mod 5 < 0 16 <> 6 ou 2 + 0 < 0

(33)

2.5.5. Exercício de fixação

1. Determine os resultados obtidos na avaliação das expressões lógicas seguintes, sabendo que A, B e C contêm, respectivamente, 2, 7, 3,5, e que existe uma variável lógica K, cujo valor é falsidade (F):

a. B = A * C e (K ou V) b. B > A ou B = pot(A,A)

c. K e B div A >= C ou não A <= C d. não K ou V e rad(A + B) >= C e. B/A = C ou B/A <> C

f. L ou pot(A,B) <= C * 10 + A * B

2.6. Comando de atribuição

Um comando de atribuição permite o fornecimento de um valor a uma variável (guardar um objeto em um gavetão), e que o tipo do dado deve ser compatível com o tipo de variável, ou seja, somente se pode atribuir um valor lógico a uma variável capaz de comportá-lo (a variável deve ser declarada como sendo do tipo lógico).

O comando de atribuição apresenta a seguinte sintaxe:

Exemplo:

lógico: A, B;

inteiro: X; A← B;

X← 8 + 13 div 5; B← 5 = 3;

X← 2;

Esses comandos atribuem às variáveis A, X e B, os valores fornecidos à direita do símbolo de atribuição. Vale ressaltar que à esquerda do símbolo de atribuição deve existir apenas um identificador.

Atribuição identificador

expressão ;

Expressão Expressão aritmética

Expressão lógica

(34)

Ao se observar o exemplo, vê-se que as variáveis A e B são do tipo lógico e que a variável X é do tipo inteiro, conforme especificado na declaração de variáveis.

Nos comandos em que o valor a ser atribuído à variável é representado por uma expressão aritmética ou lógica, estas devem ser resolvidas em primeiro lugar, visto que, após a sua resolução, o número será armazenado na variável. Por exemplo, na penúltima atribuição, B receberá verdade se 5 fosse igual a 3. Como não é, B receberá falsidade.

Percebe-se que uma variável pode ser usada diversas vezes. Ao atribuir-se um atribuir-segundo valor a uma variável, o valor armazenado anteriormente atribuir-será descartado, sendo substituído pelo segundo. Por exemplo, na primeira utilização, a variável X recebe o resultado da expressão aritmética (o valor inteiro 10). Já na segunda utilização, esse valor é descartado, pois X passa a ter o valor inteiro 2.

2.6.1. Exercício de fixação

1. Encontre os erros dos seguintes comandos de atribuição:

lógico: A

real: B, C

inteiro: D A ← B = C D ← B

C + 1 ← B + C C e B ← 3.5

B ← pot(6,2)/3 <= rad(9) * 4

2.7. Comando de entrada e saída

Os algoritmos precisam ser alimentados por dados do meio externo para efetuarem as operações e cálculos necessários a fim de alcançar o resultado desejado. Com essa finalidade, utilizar-se-á os comandos de entrada e saída.

Visando entender esta sistemática, faz-se uma analogia com uma linha de produção.

No processo de manufatura de um produto qualquer, necessita-se de várias matérias-primas que aqui serão identificadas por entrada. Estas matérias-primas serão processadas pelo processo de produção, sendo que, depois de devidamente processadas pelo processo, serão devolvidas, alteradas, ao meio como uma saída de um produto manufaturado acabado. Da mesma maneira funciona o “processo produtivo” do computador, só que no lugar de matéria-prima e produto manufaturado entram e saem dados.

(35)

se segue o mandamento da informática: como entrada, tem-se os ingredientes que serão processados segundo um algoritmo, a receita, e finalizarão tendo por saída o bolo pronto. Note que nem os ingredientes nem o bolo pertencem à receita, pois são provenientes do meio externo à receita.

2.7.1. Entrada de dados

Para que o algoritmo possa receber os dados de que necessita, adota-se um comando de entrada de dados denominado leia, cuja finalidade é atribuir o dado a ser fornecido à variável identificada. O comando leia segue a seguinte regra sintática:

Exemplos:

leia (X);

leia (A, XPTO, NOTA);

2.7.2. Saída de dados

Para que o algoritmo possa mostrar os dados que calculou, como resposta ao problema, adota-se um comando de saída de dados denominado

escreva, cuja finalidade é exibir o conteúdo da variável identificada. O comando

escreva segue a seguinte regra sintática:

Exemplos:

escreva (Y);

escreva (B, XPTO, SOMA/4);

escreva (“Bom Dia”, NOME);

escreva (“Você pesa”, P, “quilos”);

Entrada de Dados leia identificador )

,

( ;

Saída de Dados escreva identificador )

,

( ;

(36)

2.8. Blocos

Define-se como um bloco o conjunto de ações com uma função definida. Nesse caso, um algoritmo pode ser visto como um bloco. Ele também serve para definir os limites nos quais as variáveis declaradas em seu interior são conhecidas. Para delimitar um bloco, utilizam-se os delimitadores início e fim.

Exemplo4:

início // início de bloco (algoritmo) // declaração de variáveis // seqüência de ações

fim. // fim do bloco (algoritmo)

2.9. Exercícios para equipe de aprendizagem

1. Utilizando o seguinte trecho de algoritmo:

. .

inteiro: x, y;

real: z;

leia (x);

escreva (x, “elevado ao cubo =”, pot(x,3));

leia (y);

escreva (x + y); z ← x/y;

escreva (z); z ← z+1;

x ← (y+x) mod 2;

escreva (x);

. .

explique o que está acontecendo em cada linha e qual é o resultado de cada ação executada.

4 Com o objetivo de se explicar certas linhas importantes nos algoritmos, utilizar-se-á comentários, que estarão dispostos após as barras duplas (//). O uso de comentários se mostra recomendável para aumentar a clareza do entendimento dos algoritmos.

Blocos início ação fim ;

(37)

2. Cite e discorra sobre três exemplos de seu dia-a-dia nos quais você encontra explicados entrada, saída e processamento.

3. Faça uma analogia de entrada, processamento e saída de dados com o que acontece quando você:

a) Lê e sintetiza um livro; b) Dialoga com outra pessoa.

4. Encontre os identificadores inválidos, justificando : a) $Salário

b) Salário$ c) A[1] d) xKH e) Alfa2 f) 2Vizinhos g) val0r h) valOr i) a>b j) a+b k) qwert

l) guarda_chuva m) U.F.

n) Diaadia o) Betateste

5. Calcule o resultado das expressões, sabendo que X vale 2, Y = 5 e Z =10 :

a) X = 5*3+15mod5+8-1*20div15 b) Y = Y+1

c) Y+1 = Y

d) Z = pot(5,2)-rad(125)*0/540-10div2 e) 7*rad(64)modX >= 45-18divZ = Y+3*X+Y

f) não Y*7div2 <= 47-pot(2,3)mod3 e rad(13-4)-3*2 > Z g) X>Y e Y<Z ou X<Y e Y>Z ou X=Y e Y=Z

6. Calcule o resultado das atribuições, sabendo que X vale -1, Y= 3 e Z = 7 :

a) Y ←←←← Y+1 b) Y ← Y+3 c) Y+1 ← Y

(38)

h) K ← Z div (Y / 3)

(39)

2. Estruturas de Controle

Quando se cria um algoritmo, utiliza-se o conceito de bloco lógico, entrada e saída de dados, variáveis, constantes, atribuições, expressões lógicas, relacionais e aritméticas, bem como comandos que traduzam esses conceitos de forma a representar o conjunto de ações.

Para que esse conjunto de ações se torne viável, deve existir uma perfeita lógica ao modo pelo qual essas ações são executadas, ao modo pelo qual é regido o fluxo de execução do algoritmo.

Utilizando-se as estruturas básicas de controle de fluxo de execução – seqüenciação, seleção e repetição – e da combinação delas, pode-se criar algoritmos para solucionar os problemas requeridos.

3.1. Estrutura seqüencial

A estrutura seqüencial de um algoritmo corresponde a um conjunto de ações primitivas executadas em uma seqüência linear de cima para baixo e da esquerda para a direita, ou seja, na mesma ordem em que foram escritas. Convenciona-se a utilização de ponto-e-vírgula (;) no final de cada ação, que objetiva separar uma ação da outra e auxiliar a organização seqüencial das ações, pois após encontrar um (;) deve-se executar o próximo comando da seqüência.

O algoritmo a seguir, ilustra o modelo básico que se utiliza para escrever algoritmos. Identifica-se o bloco, colocando início e fim, e dentro dele inicia-se com a declaração das variáveis e depois o corpo do algoritmo.

Algoritmo 1 – Modelo Geral – Fonte: Forbellone e Eberspächer (2005). 1. início // identificação do início do bloco correspondente ao algoritmo 2.

3. // declaração de variáveis 4.

5. // corpo do algoritmo 6. ação 1;

7. ação 2; 8. ação 3; 9. . 10. . 11. . 12. ação n; 13.

(40)

Exemplos

a. Construa um algoritmo que calcule a média aritmética entre quatro notas bimestrais quaisquer fornecidas por um aluno (usuário). Dados de entrada: quatro notas bimestrais (N1, N2, N3, N4). Dados de saída: média aritmética anual (MA).

O que devemos fazer para transformar quatro notas bimestrais em uma média anual?

Resposta: utilizar média aritmética.

O que é média aritmética?

Resposta: a soma dos elementos divididos pela quantidade deles. Neste caso particular: (N1 + N2 + N3 + N4)/4.

Durante a elaboração do algoritmo 2, depois de definidas as variações de entrada e saída de dados, realizou-se uma série de perguntas “o quê?” com o objetivo de descobrir, de maneira clara e objetiva, os aspectos relevantes que se deve considerar no desenvolvimento do algoritmo e das ações envolvidas no processamento necessário à obtenção das respostas necessárias. Segue a seguir a construção do algoritmo:

Algoritmo 2 – Média Aritmética – Fonte: Forbellone e Eberspächer (2005). 1. início // começo do algoritmo

2.

3. // declaração de variáveis

4. real: N1, N2, N3, N4, // notas bimestrais 5. MA; // média anual

6.

7. // entrada de dados 8. leia (N1, N2, N3, N4); 9.

10. // processamento

11. MA ← (N1 + N2 + N3 + N4) / 4; 12.

13. // saída de dados 14. escreva (MA); 15.

16. fim. // termino do algoritmo

b. Construa um algoritmo que calcule a quantidade de latas de tinta necessárias e o custo para pintar tanques cilíndricos de combustível, em que são fornecidos a altura e o raio desse cilindro. Sabendo que:

(41)

iii. Cada litro de tinta pinta 3 metros quadrados. Dados de entrada: altura (H) e raio (R).

Dados de saída: custo (C) e quantidade (QTDE). Utilizando o planejamento reverso5, sabe-se que:

• Custo é dado pela quantidade de latas* R$50,00;

• A quantidade de latas é dada pela quantidade total de litros/5;

• A quantidade total de litros é dada pela área do cilindro/3;

• A área do cilindro é dada pela área da base + área lateral;

• A área da base é (PI * pot(R, 2));

• A área lateral é a altura * comprimento: (2 * PI * R * H);

• Sendo que R (raio) e H (altura) são dados de entrada e PI é uma constante de valor conhecido: 3,14.

Algoritmo 3 – Quantidade de latas de tintas – Fonte: Forbellone e Eberspächer (2005). 1. início

2. real: H, R;

3. real: C, Qtde, Área, Litro; 4. leia (H, R);

5. Área ← (3,14 * pot (R, 2)) + (2 * 3,14 * R * H);

6. Litro ← Área/3;

7. Qtde ← Litro/5; 8. C ← Qtde * 50,00; 9. escreva (C, Qtde); 10. fim.

3.1.1. Exercícios de fixação

1. Construa um algoritmo para calcular as raízes de uma equação do 2o grau (Ax2 + Bx + C), sendo que os valores A, B e C são fornecidos pelo usuário (considere que a equação possui duas raízes reais).

2. Construa um algoritmo que, tendo como dados de entrada dois pontos quanisquer do plano, P(x1, y1) e Q(x2, y2) imprima a

distância entre eles. A fórmula que calcula a distância é: d = √(x2 –

x1)2 + (y2 + y1), que reescrita utilizando os operadores matemáticos

adotados fica: d = rad(pot(x2-x1, 2) + pot(y2-y1, 2).

3. Faça um algoritmo para calcular o volume de uma esfera de raio de R, em que R é um dado fornecido pelo usuário. O volume de uma esfera é dado por V = (4/3*π*R3).

5 Planejamento reverso é uma técnica que se utiliza quando se sabe quais são os dados de saída e, a partir

(42)

3.2. Estrutura de seleção

Uma estrutura de seleção permite a seleção de um grupo de ações (blocos) a ser executado quando condições determinadas (representadas por expressões lógicas ou relacionais) são ou não satisfeitas.

3.2.1. Seleção Simples

Quando se precisa testar uma condição qualquer antes de se executar uma determinada ação, usa-se uma seleção simples, que segue o modelo a seguir:

Se <condição> então

C; // comando único (ação primitiva)

fimse;

<condição> é uma expressão lógica que, quando inspecionada, gera-se um resultado falso ou verdadeiro.

Se <condição> se apresentar verdadeira, logo a ação primitiva sob a cláusula então (C) será executada. No entanto, se a mesma for falsa, encerra-se a encerra-seleção (fimse), levando-se, neste caso, a não execução de algum comando. Segue a seguir a sintaxe da seleção simples.

Observando o diagrama acima, observa-se que quando existir apenas uma ação após a cláusula, basta escrevê-la, e quando se tem necessidade de se escrever diversas ações, faz-se necessário utilizar um bloco, delimitado por início e fim, conforme modelo apresentado a seguir.

Seleção simples

Ação primitiva

Expressão lógica

Bloco

se

fimse

então

(43)

se <condição> então

início // início do bloco verdadeiro C1;

C2; // seqüência de comandos .

. Cn;

fim; // fim do bloco verdadeiro

fimse;

Se <condição> for verdadeira, logo o bloco (seqüência de comandos C1...Cn) será executado. Caso contrário, <condição> for falsa, nada se executa, encerrando-se a seleção (fimse). A existência do bloco se faz necessária devido à existência de um conjunto de ações primitivas sob a mesma cláusula então.

Vamos a um exemplo:

Suponha que no algoritmo 2, com as variáveis N1, N2, N3 e N4 (quatro notas bimestrais de um aluno), deseja-se avaliar a situação do mesmo em relação à sua aprovação, no caso obtida a partir de uma média superior ou igual a 7,5.

Tem-se, então, como informação de saída a média anual e uma informação se o aluno foi ou não aprovado.

Algoritmo 4 – Média Aritmética com aprovação – Fonte: Forbellone e Eberspächer (2005). 1. início // começo do algoritmo

2. // declaração de variáveis

3. real: N1, N2, N3, N4, // notas bimestrais 4. MA; // média anual

5. leia (N1, N2, N3, N4); // entrada de dados 6. MA ← (N1 + N2 + N3 + N4) / 4; // processamento 7. escreva (MA); // saída de dados

8. se (MA >= 7,5) 9. então

10. escreva (“Aluno Aprovado”); 11. fimse;

12. fim. // termino do algoritmo

3.2.2. Seleção Composta

(44)

Se <condição> então

início // início do bloco verdadeiro C1;

C2; // seqüência de comandos .

. Cn; Senão

C; // comando – ação primitiva

fimse;

Observa-se que a existência do bloco verdade continua, sendo o mesmo executado caso a <condição> seja verdadeira. Porém, a seleção agora se mostra composta por duas ações, pois caso o resultado seja falso, tem-se a execução do comando C (ação primitiva) que segue a cláusula senão.

Em uma segunda situação, na qual se tem a necessidade de se usar um conjunto de ações a ser executadas caso o resultado da condição for falso, cria-se, então, um bloco falso, conforme se mostra a seguir.

Seleção composta

Ação primitiva

Expressão lógica

Bloco

se

senão

então

;

Ação primitiva

Bloco

(45)

se <condição> então

início // início do bloco verdadeiro C1;

C2; // seqüência de comandos .

. Cn;

fim; // fim do bloco verdadeiro senão // início do bloco falso C1;

C2; // seqüência de comandos .

. Cn;

fim; // fim do bloco falso

fimse;

Vamos a um exemplo:

Suponha que no algoritmo 4, inclua-se a informação que provém do resultado falso da condição (MA >= 7,5), ou seja, aluno reprovado.

Algoritmo 5 – Média Aritmética com aprovação e reprovação – Fonte: Forbellone e Eberspächer (2005).

1. início // começo do algoritmo 2. // declaração de variáveis

3. real: N1, N2, N3, N4, // notas bimestrais 4. MA; // média anual

5. leia (N1, N2, N3, N4); // entrada de dados 6. MA ← (N1 + N2 + N3 + N4) / 4; // processamento

7. escreva (“Média Anual =”, MA); // saída de dados 8. se (MA >= 7,5)

9. então

10. início // bloco verdadeiro

11. escreva (“Aluno Aprovado”); // saída de dados

12. escreva (“Parabéns pela aplicação!”) // saída de dados 13. fim;

14. senão

15. início // bloco falso

16. escreva (“Aluno Reprovado”); // saída de dados

17. escreva (“Você precisa se dedicar mais!”); //saída de dados 18. fim;

19. fimse;

Imagem

Figura 1 – Exemplo de Diagrama Nassi-Shneiderman
Figura 2 – Exemplo de Fluxograma
Figura 3 – Exemplo de Português Estruturado
Figura 4 – Algoritmo 8: Fluxograma de troca de uma lâmpada com teste para 8 soquetes –  Fonte: Forbellone e Eberspächer (2005)
+7

Referências

Documentos relacionados

A realização desta dissertação tem como principal objectivo o melhoramento de um sistema protótipo já existente utilizando para isso tecnologia de reconhecimento

O objetivo do curso foi oportunizar aos participantes, um contato direto com as plantas nativas do Cerrado para identificação de espécies com potencial

Realizar a manipulação, o armazenamento e o processamento dessa massa enorme de dados utilizando os bancos de dados relacionais se mostrou ineficiente, pois o

patula inibe a multiplicação do DENV-3 nas células, (Figura 4), além disso, nas análises microscópicas não foi observado efeito citotóxico do extrato sobre as

Dentre as principais conclusões tiradas deste trabalho, destacam-se: a seqüência de mobilidade obtida para os metais pesados estudados: Mn2+>Zn2+>Cd2+>Cu2+>Pb2+>Cr3+; apesar dos

Acrescenta que “a ‘fonte do direito’ é o próprio direito em sua passagem de um estado de fluidez e invisibilidade subterrânea ao estado de segurança e clareza” (Montoro, 2016,

Com a mudança de gestão da SRE Ubá em 2015, o presidente do CME de 2012 e também Analista Educacional foi nomeado Diretor Educacional da SRE Ubá e o projeto começou a ganhar

Declaro que fiz a correção linguística de Português da dissertação de Romualdo Portella Neto, intitulada A Percepção dos Gestores sobre a Gestão de Resíduos da Suinocultura: