Baixe o app para aproveitar ainda mais
Prévia do material em texto
Tópico 1 – O Modelo Computacional de John von Neumann Objetivos Compreender o conceito de Modelo computacional; Entender o relacionamento entre os componentes do modelo de Von Neumann. Neste tópico, conheceremos a arquitetura de um computador a partir de um modelo computacional, conhecendo seus componentes e suas respectivas funções. Computadores são máquinas que recebem dados e instruções de programação, executam essas instruções utilizando esses dados e produzem uma saída, ou seja, um resultado. Essa sequência de operações caracteriza um ciclo de processamento. A figura 1 representa o modelo de um ciclo de processamento da informação. Figura 1 - Modelo de processamento da informação A palavra máquina está associada ao termo em inglês hardware. Em sistemas computacionais o hardware compreende todos os dispositivos físicos (entrada, saída, memória e CPU) que compõem um sistema computacional. As instruções de programação que compõem um programa de computador estão associadas ao termo em inglês software. O software compreende todos os programas que fazem o hardware funcionar. Os computadores que usamos atualmente seguem um modelo computacional concebido pelo cientista húngaro John von Neumann. (Fonte: http://www.ias.edu) O modelo proposto por Von Neumann define um computador como uma máquina programável composta pelos seguintes componentes: Memória Principal (MP). Unidade central de processamento ou CPU (Central Processing Unit), também conhecido como processador, que por sua vez é composta por: 1. Registradores. 2. Unidade Lógica e Aritmética (ULA). 3. Unidade de Controle (UC), responsável por buscar em um programa na memória principal, instrução por instrução, e executá-la sobre os dados de entrada carregados nos registradores. Unidade Lógica e Aritmética (ULA): a ULA é um conjunto de circuitos eletrônicos que executa operações lógicas (como comparações) e aritméticas (como somas, subtrações, divisões etc.). Ela recebe da Unidade de Controle os dados que irá manipular e o código da operação que deve executar, devolvendo um resultado em seguida. Registradores são a unidade de memória temporária, capazes de armazenar alguns bits. São a variedade de memória mais rápida que existe atualmente e por isso ficam junto ao processador. Devido à sua velocidade, são extremamente caros. O modelo de Von Neumann define que dados e programas são carregados, a partir de dispositivos de entrada, para dentro do sistema computacional. Além disso, o resultado de um processamento é enviado para um dispositivo de saída. Na figura 3, você pode visualizar melhor esse Modelo Computacional de Von Neumann. http://www.ias.edu/ Figura 3 - Modelo Computacional de Von Neumann Nessa figura, podemos perceber que as setas indicam o que está sendo trocado entre dois elementos do modelo e em qual sentido. Por exemplo, um dispositivo de entrada fornece dados e programas à memória principal. Dados são trocados entre a memória principal e a CPU em ambos os sentidos, ou seja, ambos recebem e enviam dados. O modelo computacional de Von Neumann propõe uma arquitetura de computador que é caracterizada, com relação à execução de um programa, da seguinte forma: Um programa é um conjunto de instruções que serão executadas na CPU. As instruções de programação são lidas a partir de dispositivos de entrada. As instruções são armazenadas em uma memória principal. Instruções de programação movimentam dados para a CPU. Na CPU, as instruções de programação que envolvem operações lógicas e aritméticas são executadas na ULA, utilizando os dados armazenados em registradores. Registradores são locais de armazenamento para dados e instruções usados pela CPU. O resultado da execução de instruções geralmente retornam à memória principal na forma de uma informação a ser armazenada. Essa sequência de operações caracteriza um ciclo de processamento da informação. O ciclo de processamento da informação definido acima é executado continuamente até que uma condição que caracteriza a finalização do processamento seja alcançada. As saídas geradas pelo ciclo de processamento são enviadas aos dispositivos de saída. Nesse tópico, estudamos o modelo computacional de Von Neumann e vimos que esse modelo permite compreender as funcionalidades que são executadas pelos dispositivos que compõem um sistema computacional. No próximo tópico, estudaremos os componentes de hardware de um sistema computacional. TÓPICO 2 – Componentes de um Sistema Computacional Objetivo Identificar os componentes de um sistema computacional. Neste tópico, serão apresentados os componentes de um sistema computacional que comumente estão presentes nos modelos atuais de computadores. Esses componentes são componentes físicos (hardwares) que executam funcionalidades inerentes ao modelo de processamento da informação (entrada-processamento- saída). Os principais componentes de um sistema computacional são: Dispositivos de entrada: funcionam exclusivamente para a entrada de dados ou comandos para execução. Exemplos: teclado e mouse. Dispositivos de saída: funcionam exclusivamente para a saída de dados, geralmente resultados de um processamento. Exemplos: impressora e monitor de vídeo. Dispositivos de entrada e saída: funcionam tanto para entrada como para saída de dados. A maioria desses dispositivos é usada para o armazenamento de dados que são gravados para serem utilizados posteriormente. Exemplos: disco rígido, leitora e gravadora de DVD e CD e dispositivo USB (Pen Drive). Existem também sistemas computacionais que são usados para prover processamento móvel, como por exemplo, em: notebooks, tablets e smartphones. Memória: a memória principal é um circuito eletrônico no qual são armazenados dados e programas. São apresentados cinco circuitos de memória. Cada circuito será fixado em um local da placa-mãe, identificado como banco de memórias. UCP: a Unidade Central de Processamento (CPU) consiste em um circuito integrado que irá compor, juntamente com a memória e as conexões dos dispositivos de entrada e saída, o sistema computacional. Na CPU, serão executadas as instruções de programação. Na maioria dos computadores, esses dispositivos são reunidos em um circuito eletrônico chamado placa-mãe. Nesse tópico, conhecemos os componentes de hardware que compõem um sistema computacional. TÓPICO 3 – Tipos de Sistemas Computacionais Objetivo Conhecer os tipos de sistemas computacionais. Neste tópico, apresentaremos os diversos tipos de sistemas computacionais atualmente usados em empresas, escritórios etc. Os diversos tipos de sistema computacional possuem em comum os componentes apresentados nos tópicos anteriores. O que irá diferenciar um sistema computacional de outro serão as características dos seus componentes, como CPU (desempenho), memória (desempenho e capacidade de armazenamento), dispositivos de entrada e saída (desempenho e capacidade de armazenamento de dados). Há sistemas computacionais que processam e armazenam grandes volumes de dados, como os mainframes. Há sistemas computacionais que se agrupam e se interligam por meio de redes de comunicação para criar processamento distribuído de aplicações e de dados. Você pode observar um equipamento que foi estruturado para ser utilizado como servidor de aplicação de dados. Existem também sistemas computacionais que são usados para prover processamento local, como o computador que você utiliza para realizar as atividades do curso de Lógica de Programação, conhecido como desktop. Existem também sistemas computacionais que são usados para prover processamento móvel, como nos notebooks, tablets e smartphones. Outros sistemas computacionais que são muito utilizados em diversas atividades da indústria e na área de serviços são os dispositivos de identificação de usuários, como os smart cards. Os cartões de crédito e as carteirasde estudante também possuem esse pequeno circuito eletrônico (Smartcards) que é programável em Java. Eles possuem memória e CPU. Há equipamentos que utilizam microcontroladores para realizar funcionalidades programadas rígidas, ou seja, que variam pouco. Exemplo: máquinas de lavar, forno micro-ondas, sistemas de freio ABS, sistemas de navegação em aviões etc. Os sistemas em que são usados os microcontroladores são conhecidos como sistemas embarcados. Durante essa aula, conhecemos o modelo de sistema computacional usado na maioria dos computadores, proposto por Von Neumann. Esse modelo inclui uma unidade de processamento e uma memória, através dos quais o computador pode executar programas escritos usando uma linguagem de programação. Também vimos os componentes de hardware que compõem os computadores modernos e os tipos de sistemas computadorizados que estão ao nosso redor, de laptops e tablets a smart cards. Na próxima aula, estudaremos a lógica e entenderemos sua função na criação de programas de computador. Referências FORBELLONE, A.; EBERSPÄCHER, H. Lógica de Programação - A construção de algoritmos e estruturas de dados. 3 ed. Pearson Education, 2005. MEDINA, M.; FERTIG, C. Algoritmos e Programação - Teoria e Prática. 2 ed. Novatec, 2006. PUGA, S.; RISSETTI, G. Lógica de programação e estruturas de dados com aplicações em Java. Pearson Education, 2003 Capítulo 3 Tópico 1 – O que são algoritmos? Objetivo Explicar o que é um algoritmo e qual a sua função. Durante este tópico, iremos compreender o que são algoritmos e como eles são fundamentais para a construção de programas de computador. Veremos alguns exemplos para identificarmos as características que todo algoritmo apresenta. Na aula anterior, você teve o primeiro contato com o conceito de abstração. Vimos alguns exemplos da análise de objetos e situações do dia a dia, com o objetivo de extrair suas principais características. Essas características nos permitem construir um modelo, uma representação de objeto ou situação, contendo aquilo que é relevante. A partir daí, podemos trazer esse modelo para dentro do computador, para que ele nos ajude em diversas tarefas. O computador é capaz de receber um conjunto de dados e uma lista de comandos que ele consiga executar. O encadeamento dessa lista de comandos é que faz o computador realizar tarefas grandes e complexas que produzem um resultado. Chamamos essa lista de comandos de algoritmo. Definição de Algoritmo Existem diversas definições para algoritmo, quase sempre ditas informais. Isso porque, assim como a lógica, é difícil propor uma definição formal única para algoritmo. Cormen (2002, p. 3) define: ... algoritmo é qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum conjunto de valores como saída. Portanto, um algoritmo é uma sequência de passos computacionais que transformam a entrada na saída. A definição proposta por Cormen (2002) é focada em algoritmos para construção de programas de computador, com um pouco mais de rigor técnico. Mas usamos algoritmos várias vezes por dia. Vejamos uma definição mais simples e próxima da nossa realidade: algoritmo é uma sequência de passos ordenados e finitos, que visam resolver um problema Quando dizemos passos ordenados, significa que existe uma ordem entre esses passos e que a mudança dessa ordem pode influenciar o resultado da execução do algoritmo. Já a característica de passos finitos quer dizer que o algoritmo não pode ter uma quantidade infinita de passos. Afinal, um algoritmo com infinitos passos nunca teria sua execução concluída e, portanto, nunca chegaria a um resultado. Figura 1 – Composição de um algoritmo A figura 2 apresenta as características fundamentais de um algoritmo: Figura 2 – Características de um algoritmo Já vimos algumas definições de algoritmos e suas características, que tal vermos agora alguns exemplos de algoritmos? Algoritmo Preparar Café Início 1. Ferver a água. 2. Colocar o pó de café na água. 3. Misturar bem para dissolver o pó na água. 4. Passar a mistura no filtro de café. 5. Adicionar açúcar (opcional). Fim Vejamos um novo exemplo, mais próximo dos computadores. Algoritmo Enviar E-mail Início 1. Fazer login no seu provedor de e-mail. 2. Clicar no botão de criar e-mail. 3. Preencher o campo referente ao destinatário com o endereço de e-mail da pessoa para quem você quer enviar a mensagem. 4. Preencher o campo referente ao assunto ao qual se refere à sua mensagem. 5. Escrever a sua mensagem na área de mensagem. 6. Enviar a mensagem clicando no botão de envio. Fim Você pode estar pensando: um algoritmo para preparar café? Um algoritmo para enviar e- mail? Esses são exemplos de tarefas que são executadas com frequência. E o que existe de comum entre o exemplo do preparo de café e envio de e-mail? As características de um algoritmo. Veja o quadro 1, a seguir. Ele aponta as características dos algoritmos em cada um dos dois exemplos citados. Quadro 1 – Características dos algoritmos Preparar Café e Enviar E-mail Característica Algoritmo Preparar Café Algoritmo Enviar E-mail Tem um nome. Preparar Café. Enviar E-mail. Resolve um problema. Fazer uma xícara/bule de café. Enviar um e-mail para um amigo/colega de trabalho/etc. Possui uma entrada. Café, açúcar e água. Endereço de e-mail do destinatário, assunto e mensagem. Possui uma saída. Café pronto para beber. Mensagem de e-mail enviada. Tem quantidade de passos e tempo de execução finitos. 5 passos. 6 passos. É formado por passos precisos, sem ambiguidade. Ex: ferver água, adicionar açúcar. Ex: Preencher campo referente ao destinatário; Enviar a mensagem clicando no botão de envio. Podemos dizer, após vermos esses dois exemplos, que um algoritmo é como uma receita, um guia, um plano escrito da resolução de um problema ou execução de uma tarefa. Um algoritmo serve como referência sobre quais passos devemos executar para alcançar um objetivo. Esse objetivo pode ser simples como fazer um sanduíche, ou complexo como projetar um equipamento eletrônico. Função de um algoritmo Você pode se questionar sobre a função de um algoritmo, afinal, a maioria de nós não precisa de um guia escrito para preparar café ou enviar um e-mail. Mas o computador é diferente. Lembra que dissemos que o computador não tem a inteligência humana? Pois é, ele precisa de instruções para executar cada tarefa que lhe damos, mesmo que ele já a tenha feito diversas vezes. Caixa Atenção : Os algoritmos são a base para um programa de computador, seu alicerce, mas não são o programa em si. Se você quer aprender a programar, tem que aprender a desenvolver algoritmos primeiro. E, para isso, você não precisa de um computador. Tudo o que você precisa para desenvolver algoritmos é a capacidade de analisar tarefas e descrever cada passo necessário para realizá-las. No próximo tópico, veremos mais exemplos de algoritmos. Por hora, é importante que você compreenda bem as seguintes ideias: 1. Algoritmos não são exclusivos para computadores, são uma descrição da execução de qualquer tarefa. 2. Na computação, algoritmos são a base para a criação de programas de computador. A partir de um algoritmo, podemos escrever um programa usando uma linguagem de programação. É uma espécie de tradução: primeiro criamos o algoritmo, depois o traduzimos para linguagem de programação, o que chamamos de código-fonte. Só depois o computador compila ou interpreta esse código-fonte, transformando-o em um programa executável. Figura 3 – Processo de transformação de um algoritmo em programa de computador Os processos de compilação e interpretação têm como objetivo transformar um código-fonte em algo que o computador possaexecutar. Esses dois processos diferem com relação ao momento dessa transformação: prévia, no caso da compilação, ou tardia (no momento de usar o programa), no caso da interpretação. Entenda que conhecer a fundo uma linguagem de programação é fundamental para escrever o código-fonte, mas o seu algoritmo influenciará muito mais a qualidade do seu programa do que seu conhecimento sobre linguagens. É nesse momento que podemos perceber a importância da criação dos algoritmos. Um algoritmo bem feito economiza tempo em correções no seu programa. Vamos fazer um pequeno exercício para compreender e fixar bem essa ideia? Quiz Imagine que você está construindo uma nova casa. Essa nova casa tem uma planta, ou seja, um projeto da sua estrutura desenhado por um engenheiro ou arquiteto. Digamos que esse projeto contém uma falha: uma das vigas está com o tamanho errado e isso pode comprometer a estrutura da casa. Agora responda, em qual fase é mais fácil e mais barato consertar essa falha? a) Na planta (projeto da casa) https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html É muito mais simples, rápido e até mais barato corrigir uma falha no projeto da casa, antes de construí-la. Uma pequena reforma na casa já pronta pode significar ter que quebrar outras partes que não têm relação direta com o que precisa ser mudado e isso significa mais trabalho, o que custa mais tempo e dinheiro. Da mesma forma, é muito melhor identificar e corrigir erros nos algoritmos do que nos códigos-fonte. Códigos-fonte geralmente são feitos por equipes, por várias pessoas. A correção de um código-fonte com o qual você não tem familiaridade é bastante complicado. Imagine ter que encontrar um objeto numa casa que você não conhece, é uma tarefa difícil. Chegamos ao final desse tópico. Conhecemos o conceito de algoritmo e suas características. Também discutimos a importância do uso de algoritmos na computação e vimos que eles são a base de qualquer programa de computador. No tópico seguinte, nos concentraremos na criação de algoritmos.Agora vamos analisar alguns algoritmos para identificar seus elementos fundamentais. Algoritmo Fazer Fotografia em Câmera Digital Início 1. Ligar câmera. 2. Escolher objeto ou paisagem para fotografar. 3. Segurar firme a câmera e pressionar levemente o botão de disparo para ajustar o foco. 4. Manter a câmera firme e pressionar o botão do disparo até o fim para fazer a fotografia. Fim O objetivo desse algoritmo é produzir uma fotografia de um objeto ou paisagem em uma câmera digital. Compreender bem o objetivo do algoritmo é fundamental para não cometermos enganos ao identificar seus dois elementos-chave: a entrada e a saída. Nesse caso, a entrada é o objeto ou paisagem que queremos registrar em uma foto. A saída, ou resultado, é uma foto do objeto ou paisagem escolhido. Figura 4 – Entrada, processamento e saída do algoritmo Fazer Fotografia Algoritmo Desenhar um Quadrado Início 1. Sabendo o tamanho que o lado do quadrado deve ter, desenhar uma linha reta da direita para a esquerda do tamanho do lado. 2. A partir do final da primeira linha, desenhar uma segunda linha de cima para baixo, do tamanho do lado. 3. A partir do final da segunda linha, desenhar uma terceira linha da direita para a esquerda, do tamanho do lado. 4. A partir do final da terceira linha, desenhar uma quarta linha de baixo para cima, do tamanho do lado. Fim Nesse algoritmo, precisamos do tamanho do lado do quadrado como entrada para produzir o desenho do quadrado como saída. Nesse caso, podemos notar com mais clareza onde se encaixa o conceito de abstração estudado na aula passada. O que chamamos de tamanho do lado do quadrado é uma abstração de uma medida real, expressa na forma de um número e uma unidade de medida, como 5 centímetros ou 2,7 metros. Agora é a sua vez! Identifique a entrada e saída dos seguintes algoritmos. Exercício 1 - Algoritmo Multiplicar dois números inteiros de dois dígitos Qual a entrada e a saída desse algoritmo? Início 1. Multiplicar o segundo dígito do multiplicador pelo multiplicando para obter a primeira parcela. 2. Multiplicar o primeiro dígito do multiplicador pelo multiplicando para obter a segunda parcela. 3. Somar as duas parcelas para obter o produto final. Fim 1. a) Um conjunto de três números inteiros e o produto desses números. 2. b) Dois números inteiros de dois dígitos e o produto desses números. 3. c) Dois números inteiros de qualquer tamanho e o produto desses números. 4. d) Dois números decimais e o produto desses números. No exemplo anterior, o algoritmo recebe uma entrada e produz um resultado através de uma operação matemática envolvendo essa entrada. Em alguns casos, a saída de um algoritmo possui os mesmos elementos da entrada, com alguma das suas características alteradas. Exercício 2 - Algoritmo Ordenar Três Números em Ordem Crescente Qual é a entrada e qual é a saída desse algoritmo? https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html Início 1. Comparar o primeiro número com o segundo. Se o primeiro for maior, trocá-los de lugar. 2. Comparar o segundo número com o terceiro. Se o segundo for maior, trocá-los de lugar. 3. Novamente, comparar o primeiro número com o segundo. Se o primeiro for maior, trocá-los de lugar (esse passo é refeito porque, após o passo 2, a ordem entre o primeiro e o segundo elementos pode ter ficado incorreta). Fim 4. a) Um conjunto de três números em qualquer ordem e o menor número do conjunto. 5. b) Um conjunto de três números em qualquer ordem e o mesmo conjunto em ordem crescente. 6. c) Um conjunto números de qualquer tamanho em qualquer ordem e o mesmo conjunto em ordem crescente. 7. d) Um conjunto de três números em ordem decrescente e o mesmo conjunto em ordem crescente. <<<ir para a página anteriorir para a próxima páginair para a primeira páginair para a última página6 de 23 Construção de Algoritmos Até agora só analisamos algoritmos prontos. Mas como já sabemos que um algoritmo é uma sequência de passos ordenados para realizar uma tarefa, que possui entrada (aquilo que ele usa para realizar a tarefa) e saída (aquilo que ele produz após executar todos os passos), estamos aptos a criar nosso próprios algoritmos. A criação de um algoritmo é um processo criativo. Isso significa que você precisa, basicamente: Analisar a tarefa que deseja realizar Identificar o que você precisa para realizá-la Criar uma sequência de passos que executa essa tarefa com sucesso e produz o resultado esperado Estas são apenas dicas. Você irá fazer tudo da sua maneira, baseado na sua experiência. Não existe uma regra fechada ou procedimento padrão para produzir algoritmos. Ou seja, não existe um algoritmo para criar algoritmos. Vamos praticar a criação de algoritmos? https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html Exercício 4 Algoritmo Calcular o custo para enviar uma caixa pelo Correio Você vai enviaruma caixa com presentes para um amigo. Considerando que sua caixa estará dentro da faixa de peso base do correio, o preço do envio será baseado apenas no volume da caixa. Para calcular o valor do envio antes de ir à agência, o correio lhe fornece um valor padrão de custo por cm³ (centímetro cúbico). Por exemplo, se o valor de referência é R$ 0,15/cm³ (quinze centavos por centímetro cúbico), basta calcular o volume da caixa que deseja enviar e multiplicar pelo valor de referência. Produza o algoritmo para resolver esse problema. Dica 1: Considere que você ainda não sabe as medidas da caixa, então inclua passos no algoritmo para medi-la. Dica 2: O volume de uma caixa é igual ao produto do comprimento x largura x altura. Entrada: A caixa e o valor de referência do Correio. Saída: O preço, em reais (R$), para o envio da caixa. Ordene os passos a seguir para montar o Algoritmo correto. Figura 3 - Estrutura de uma organização (adaptado pelo autor) A resolução desse problema ressalta novamente o que aprendemos sobre abstrações. Embora algumas informações sobre a caixa, como peso e dados de envio, sejam relevantes para o envio, não são relevantes para o problema que estamos tratando, que só precisa do volume da caixa e valor de referência do correio. Conceito de Memória Você deve ter percebido que, para o algoritmo anterior (exercício 4), alguns passos não precisam necessariamente vir antes que outros. Por exemplo, medir a altura da caixa não precisa vir antes de medir a largura, ou o comprimento. Mas para calcular o valor do envio, você precisa calcular o volume da caixa primeiro e anotar esse valor em algum lugar. A ação de anotar valores calculados durante algoritmos é essencial para o seu funcionamento. Você pode dizer: “Ah, não preciso anotar, eu lembrarei do valor”. Você pode lembrar do valor, porque seres humanos têm uma boa memória. O computador também tem memória, mas é você que tem a responsabilidade de fazê-lo guardar determinados valores nela. A ação de guardar dados na memória também precisa estar no algoritmo. Caixa Atenção Normalmente, quanto maior for a complexidade de um algoritmo, maior será a necessidade de armazenar dados em memória. Esses dados servem de referência para cálculos e tomadas de decisão futuros no algoritmo. Qualidade de algoritmos Dissemos que um algoritmo é uma receita, um guia para resolução de um problema. E você deve saber que geralmente existe mais de uma maneira de resolver um problema. Quer um exemplo? Vamos lá! https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html Digamos que Lara quer sair de sua casa e ir até o shopping. Ela tem três opções: ir de carro, ir de ônibus ou ir à pé. Faça Lara ir ao shopping de cada uma das maneiras e observe os resultados. Como você viu, todas as opções levam Lara até seu destino, ou seja, o objetivo será alcançado. Porém, cada uma tem seus pontos positivos e negativos. Ir de carro é rápido, mas custa mais caro (gasolina e estacionamento). Ir de ônibus é mais barato que ir de carro, mas demora mais (o ônibus para várias vezes no trajeto). Ir à pé é de graça, mas pode cansar e demora mais que todos os outros. Nenhuma das opções parece perfeita. Mas Lara pode escolher a mais conveniente. Ou pensar em uma nova maneira que combine as boas características de cada opção. Ir de bicicleta, por exemplo. A mesma relação vale para os algoritmos. Você pode construir diversos algoritmos para resolver um mesmo problema de maneiras diferentes. Um pode ser mais rápido, outro mais simples de ler e entender, outro que contenha pouquíssimos passos etc. Algoritmos novos podem ser criados e algoritmos antigos, melhorados. Cuidados especiais com algoritmos A criação de um algoritmo geralmente não leva muito tempo. Mas, uma vez que estiver pronto, precisa ser testado à exaustão para garantir que seus passos serão executados corretamente e o resultado final, ou seja, a saída do algoritmo, será o que se espera. Raramente um algoritmo permanece exatamente igual à sua primeira versão. Para demonstrar o que foi dito, vamos criar um algoritmo simples, porém útil, que calcula o IMC (Índice de Massa Corporal). O IMC é um índice que indica se a pessoa está dentro da faixa de peso ideal para sua altura. O IMC de uma pessoa com peso ideal está entre 18,5 e 25. Sua fórmula é igual à massa (que geralmente chamamos de peso) dividido pelo quadrado da altura. Um algoritmo para calcular o IMC e dizer se a pessoa está ou não no peso ideal seria: Entrada: Massa (peso) e altura do indivíduo. Saída: “Sim”, se o IMC estiver entre 18 e 25. “Não”, caso contrário. Início o 1. Calcular o valor do quadrado da altura e anotar como “altura ao quadrado”. o 2. Calcular o valor da massa dividido pelo quadrado da altura e anotar como “IMC”. o 3. Se o valor de “IMC” for maior ou igual a 18,5 e menor que 25, dizer “Sim”. Caso contrário, dizer “Não”. Fim https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html Você pode testar o algoritmo com sua altura e peso. Por exemplo: para uma altura de 1,75m, o valor de “altura ao quadrado” será 3,0625. Se a massa for 76kg, o valor para “IMC” será 76 / 3,0625 = 24,81. A saída do algoritmo seria “Sim”. Já para uma altura de 1,73m e 85kg de massa, a saída do algoritmo seria “Não”, pois o IMC seria igual a 85 / (1,73)2 = 28,40. Esse algoritmo parece perfeito. Mas possui falhas. O que acontece, por exemplo, se fornecemos 0 (zero) como valor da altura? Nesse caso, o algoritmo tentará efetuar uma divisão por zero, o que não é possível. Nossa obrigação, então, é de proteger o algoritmo de valores inválidos de entrada, como 0 (zero) para a altura. Para isso, vamos adicionar um novo passo, no lugar do passo 1, com a seguinte estrutura: Se o valor da massa ou altura for igual a zero, dizer “Valores inválidos” e terminar. Como um valor 0 (zero) para massa também não faz sentido, ele também é avaliado nesse novo passo. O que fizemos foi criar uma condição para que o algoritmo continuasse ou fosse interrompido. Essa é uma prática comum e teremos uma aula exclusiva sobre esse tema. Em geral, usamos condições para executar determinados passos de um algoritmo e ignorar outros. No exemplo do IMC, caso massa ou altura sejam iguais a zero, ignoramos todos os demais passos do algoritmo. Testes de algoritmo Vimos que um algoritmo, mesmo que tenha sido criado com muito cuidado e atenção, pode conter falhas. Você sabe como proceder para detectar essas falhas? Basta seguir o exemplo da indústria: testar. Os testes são a forma mais simples de validar se um algoritmo realmente faz o que promete, ou seja, se ele é capaz de produzir o resultado esperado para todas as situações (valores de entrada) às quais pode ser submetido. Caixa Saiba mais: Existem outras maneiras de validar um algoritmo além dos testes, como a prova por modelos matemáticos. Esse método, porém, é muito refinado e demanda profissionais altamente qualificados. É aplicado em algoritmos voltados para programas considerados críticos, como os que funcionam em usinas nucleares, em sistemas de navegação de aviões e trens e em equipamentos hospitalares. Para testar um algoritmo, crie um conjunto de dados de entrada que represente a realidade à qual o algoritmo será submetido e o resultado que se espera obter como saída do algoritmo. Execute o algoritmo para a entrada e verifique se a saída esperada foi obtida. Se a saída obtida não for aquela que se espera, seu algoritmo tem falhas e precisa ser revisado. Vejamos um exemplo. Se quisermos testar o algoritmo para ordenação de três números do início do tópico, podemos montar um grupo com 4 tipos de conjuntos: Um conjunto com números em ordem aleatória (Ex: {3,-5,2}); Um conjunto comnúmeros em ordem decrescente (Ex: {8,2,0}); Um conjunto com números já em ordem crescente (Ex: {-1,2,3}); Um conjunto com números repetidos (Ex: {3,2,3}). Essas quatro classes de entrada cobrem todas as possibilidades que esse algoritmo em particular pode encontrar quando for usado. Cada classe representa um tipo de entrada. Um algoritmo para outro problema de ordenação, para uma quantidade indefinida de elementos, por exemplo, pode precisar de outras classes de entrada para ser testado por completo. Chamamos cada um dos exemplos de cada classe citados ({3,-5,2}, {8,20}, {-1,2,3} e {3,2,3}) de caso de teste. Quantos mais casos de teste você aplicar ao seu algoritmo, melhor. Porém, é preciso usar casos de teste de classes diferentes. Não adianta testar seu algoritmo com 5000 casos de teste de elementos em ordem decrescente e não testá-lo para elementos em ordem crescente, aleatória ou para elementos repetidos. Vamos exercitar um pouco a escolha de casos de teste? Indique o item que possui o conjunto mais completo de casos de teste para cada algoritmo a seguir, ou seja, o conjunto de casos de teste que avalia o algoritmo para mais casos diferentes e relevantes. gora é a sua vez! Escolha o item que possui o melhor conjunto de dados para teste dos algoritmos a seguir. Exercício 5 - Algoritmo Somar dois números inteiros Entrada: um par de números inteiros Saída: o valor da soma do par de números fornecidos 1. a) {-2, -3}, {0, -25}, {-3, -10}, {-9, 0}, {-3, -1} 2. b) {6, 5}, {10, 99}, {13, 0}, {4, 9}, {5, 5} 3. c) {1, 7}, {0, -1}, {-3, -10}, {5, 0}, {3, -2} 4. d) {1, 7}, {-5, -1}, {-20, -2}, {5, 0}, {-9, -10} Exercício 6 - Algoritmo Buscar menor valor no conjunto Entrada: um conjunto não vazio de números inteiros. Saída: o valor do menor número do conjunto. 1. a) {3}, {4}, {5} 2. b) {1}, {2, 3, 2}, {0, 1, -5, 3} 3. c) {1, 2, 3, 4}, {3, 3, 2, 3} 4. d) {2, 3}, {1, 2, 3, 4}, {6} Muitos estudantes insistem em deixar o estudo de algoritmos de lado, tentando criar os seus programas diretamente com linguagem de programação, sem escrever um algoritmo primeiro. Essa atitude resulta em programas com falhas, desempenho ruim ou que sequer funcionam. Embora pareça retrabalho escrever o algoritmo para depois reescrevê-lo em linguagem de programação, esse processo ajuda a identificar falhas mais cedo e perceber detalhes menos aparentes de um problema. Por isso, não deixe de escrever o algoritmo de um programa que você pretende fazer. Depois que ele estiver pronto, execute-o mentalmente, anotando valores que foram produzidos durante os passos e verifique se a saída (resultado) foi o que se esperava, como fizemos nessa aula. Teste-o com diversos valores de entrada. Isso permite que você faça ajustes ainda no algoritmo, que são mais fáceis de aplicar que no código-fonte. Caixa Atenção: Esse é um curso de lógica de programação, então você deve esperar por conteúdos que lhe preparem para criar programas. Na computação, os algoritmos são geralmente voltados para operações matemáticas. Portanto, você verá muitos exemplos de ordenação de números (ou elementos quaisquer), cálculo de fórmulas, problemas de busca de dados etc. Nesse tópico, aprendemos que um algoritmo tem sempre uma entrada e uma saída, que correspondem aos dados que precisamos prover ao algoritmo e ao resultado que ele produz, respectivamente. Vimos que, para criar um algoritmo, precisamos analisar seu problema alvo com cuidado. Às vezes, alguns detalhes passam despercebidos e podem comprometer a qualidade do algoritmo. Executar testes é a melhor forma de verificar se um algoritmo cumpre sua tarefa sem falhas. No próximo tópico, iremos conhecer uma maneira diferente de representar um algoritmo: os fluxogramas. https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479107977/aula/index-fisico.html Veja o exemplo de fluxograma a seguir. Ele corresponde ao fluxograma do algoritmo de preparo de café, que vimos no começo da aula. Figura 5 – Fluxograma do algoritmo do preparo de café O fluxograma da figura 5 é bastante simples, pois representa um algoritmo muito simples. Percebemos que existe um fluxo que vai de “Início” até “Fim”, indicado pelas setas. Se pusermos o algoritmo original e seu fluxograma lado a lado, logo percebemos que os símbolos seguem o seguinte padrão: Quadro 2 - Componentes de um fluxograma simples Símbolo Representa O início ou fim do algoritmo. Um passo do algoritmo. O fluxo entre passos do algoritmo (também usado junto do início e fim). Um fluxograma pode conter muito mais símbolos e nós conheceremos alguns deles durante o restante do curso. À medida em que formos incorporando novos elementos aos nossos algoritmos, iremos conhecer suas representações em fluxograma. Função do fluxograma Você pode ter achado que um fluxograma como o da figura 5 não tem utilidade. De fato, fluxogramas de algoritmos extremamente simples não trazem grandes benefícios. Mas por se tratar de uma representação gráfica, fluxogramas de algoritmos complexos se tornam uma poderosa ferramenta para a sua compreensão. Outra função dos fluxogramas é facilitar o processo de teste de um algoritmo. Visualmente é mais fácil de saber em qual passo do fluxograma você está do que lendo um algoritmo escrito. Como criar fluxogramas Os fluxogramas são uma espécie de transcrição do algoritmo escrito para uma representação gráfica, assim como o código-fonte é o algoritmo reescrito em linguagem de programação. Começamos pelo bloco “Início” e depois adicionamos cada um dos passos do algoritmo em um retângulo, ligando-os com as setas. Por fim, ligamos o último passo com uma seta ao bloco “Fim”. Você pode fazer um fluxograma no papel ou usar um dos diversos softwares disponíveis no mercado para desenho de diagramas. Os pacotes Office e LibreOffice possuem funcionalidades embutidas para criação de fluxogramas nos seus editores de texto. Nesse tópico, tivemos uma noção geral sobre fluxogramas e sua relação com algoritmos. O estudo dos fluxogramas evoluirá gradualmente a cada nova aula desse curso. Chegamos ao final da aula. Conhecemos o conceito de algoritmo e compreendemos porque ele é tão importante para a computação. Vimos que algoritmos são passos ordenados para resolver problemas e que, a partir deles, podemos criar um código-fonte em uma linguagem de programação. Vimos que um algoritmo representa o processamento entre uma entrada e a saída e conhecemos os fluxogramas, que são uma maneira de representar um algoritmo graficamente. Na próxima aula, nos aproximaremos um pouco mais das linguagens de programação, estudando os tipos de dados que podemos usar para representar informações nos algoritmos. A partir daí poderemos trabalhar com valores constantes, valores variáveis e expressões. Até breve! Referências Algoritmos – NCE/UFRJ - Adriano Joaquim de Oliveira Cruz. Disponível em: <https://equipe.nce.ufrj.br/adriano/c/apostila/algoritmos.htm>. Acesso em: 22 nov. 2013. O que é algoritmo? TechMundo. 2009. Disponível em: <https://www.tecmundo.com.br/programacao/2082-o-que-e-algoritmo-.htm>. Acesso em: 20 nov. 2013. Fluxograma - InfoEscola. Disponível em: <https://www.infoescola.com/administracao_/fluxograma/>.Acesso em: 25 nov. 2013. CORMEN, Thomas. LEISERSON, Charles. RIVEST, Ronald. Algoritmos - Teoria e Prática. 2 ed. Campus Editora. 2002. 936 p. https://equipe.nce.ufrj.br/adriano/c/apostila/algoritmos.htm https://www.tecmundo.com.br/programacao/2082-o-que-e-algoritmo-.htm https://www.infoescola.com/administracao_/fluxograma/ IV - Revisão sobre memória Quando efetuamos cálculos “de cabeça”, guardamos valores na memória, ou seja, no nosso cérebro. Mas fazemos isso implicitamente, sem a necessidade de pensar “Agora eu vou guardar esse valor para lembrar depois”; simplesmente lembramos. Durante a execução de um algoritmo, é normal que precisemos anotar valores de cálculos e decisões tomadas, para utilizar esses valores futuramente dentro do algoritmo. Nesse caso, porém, é preciso formalizar a ação de registrar um valor. Durante a aula passada, indicamos, no algoritmo, a necessidade de armazenar um valor com uma instrução chamada “anotar como” seguida de um nome para identificar o valor, por exemplo: Calcular a soma de dois números e anotar o resultado como “Total”. A identificação do valor é muito importante. Imagine que estamos resolvendo uma equação complexa e precisamos tomar nota de vários valores durante o processo. Se anotarmos os valores em um papel, sem identificá-los, podemos chegar à situação ilustrada na figura 1, em que não saberemos mais de qual operação cada valor foi obtido. Além da identificação de cada valor, é importante sabermos o tipo de cada um deles. Por exemplo, se estivermos somando duas quantias em dinheiro, é relevante mantermos as casas decimais, relativas aos centavos. Porém, se estivermos calculando quantos pacotes de biscoito podemos comprar com uma determinada quantia de dinheiro, podemos descartar as casas decimais. Afinal, não podemos comprar 3,7 pacotes, só poderíamos comprar 3 ou 4 pacotes, nesse caso. Chamamos de memória o local onde guardamos os dados de entrada e que foram gerados durante o uso de um algoritmo. A memória pode ser uma folha de papel, por exemplo, se estivermos executando um algoritmo manualmente, como no cálculo das raízes de uma equação do segundo grau da figura 2, a seguir: Figura 2 – Exemplos de memória para um algoritmo Já no computador, existem diversos componentes que fazem a função de memória: discos rígidos, pen drives, DVDs etc. Porém, o componente que é considerado como memória principal é a memória RAM (Random-Access Memory, ou memória de acesso aleatório). Esse componente é bastante rápido e trabalha diretamente ligado ao processador para prover os valores que os programas precisam no menor tempo possível. Cada dado na memória deve ter um identificador (um nome) e um tipo. A memória funciona como uma grande tabela de consulta, na qual colocamos valores para uma consulta posterior. Valores armazenados na memória também podem ser modificados durante o tempo. Tipos de dados básicos Sabendo que podemos armazenar diversos tipos de dados durante o uso de um algoritmo, tornou-se evidente a necessidade de padronizar os tipos de dados que poderiam ser usados na memória. Daí surgiram os tipos básicos de dados, também chamados de tipos primitivos. Os tipos básicos ou primitivos são: Tabela 1 – Típicos básicos de dados O tipo de dado é importante para a completa identificação de valores em memória nos casos em que existem duas anotações de mesmo nome. Assim, valores em memória com mesmo nome podem ser diferenciadas pelo seu tipo. Porém, o uso de nomes repetidos para representar dados na memória é desaconselhado. Variáveis x Constantes Valores guardados na memória são chamados de variáveis. Variáveis, como o próprio nome diz, podem variar, ou seja, ter seu valor modificado. A função das variáveis é manter o valor atual de algum dado relevante dentro do algoritmo e, por isso, podem ser modificadas com o tempo. Considere uma variável do tipo inteiro chamada “contador”, que no início do algoritmo tem valor igual a 0. Digamos que, após a execução de algum passo do algoritmo, o valor dessa variável precise ser 1. Devemos modificar o valor que está anotado, mudando-o de 0 para 1. Porém, nem todos os valores que são necessários durante um algoritmo precisam mudar com o tempo. Alguns valores servem apenas como referência, durante todo o algoritmo, e permanecem inalterados. Que tal alguns exemplos? Para um algoritmo que efetua cálculos físicos, é preciso usar o valor da aceleração da gravidade (). Esse valor não muda. Para um algoritmo que efetua cálculos trigonométricos, é preciso usar o valor de pi (). Esse valor não muda. Para um algoritmo que faça o sorteio de dias de trabalho de um funcionário, é preciso ter acesso aos nomes dos dias da semana. Esses valores (nomes dos dias da semana) não mudam. Para esses casos, chamamos os valores guardados de constantes, pois eles não precisam ser modificados durante toda execução do algoritmo. Em resumo: Uso de variáveis em algoritmos Agora que já sabemos o que são variáveis e constantes, como devemos usá-las nos nossos algoritmos? Na verdade, já estamos usando-as desde o início desse curso. Quando tínhamos uma instrução do tipo “anotar como”, estávamos criando ou modificando o valor de uma variável. A partir de agora, iremos dedicar um espaço no início do algoritmo para indicar as variáveis que usaremos. Esse espaço é chamado de região de declaração de variáveis. A sintaxe é a seguinte: a região é identificada pela palavra “Variáveis”, seguida da lista de variáveis. Cada variável é declarada pelo seu nome, seguido de dois-pontos (:) e seu tipo. Veja um exemplo. Algoritmo Cadastrar Paciente Variáveis: nome: Texto idade: Inteiro peso: Decimal Início . . . Fim No exemplo do algoritmo Cadastrar Paciente, declaramos três variáveis chamadas nome, idade e peso. Não há diferença entre a declaração de variáveis e as constantes. Se uma variável nunca é modificada após receber seu primeiro valor, ela é considerada uma constante. A identificação dos tipos das variáveis faz parte do processo de abstração, pois o tipo de dado informa quais operações a variável pode sofrer (operações aritméticas podem ser aplicadas a tipos numéricos, mas não a tipos Caractere ou Texto). Por exemplo: Observe o último item do exemplo acima. Qual tipo devemos usar para armazenar um número de telefone em uma variável? Inteiro ou Texto? Isso depende da sua necessidade. Talvez, se você precisar guardar o número de telefone com traços e código DDD entre parênteses, é melhor usar o tipo Texto. Mas você também pode guardar o número como inteiro e dividi-lo em partes depois. É uma escolha de quem produz o algoritmo. Notação reduzida para declaração de variáveis Vimos que a declaração de uma variável consiste em indicá-la no topo do algoritmo com seu nome e tipo de dado. Porém, em um algoritmo complexo, pode ser necessário que haja uma quantidade grande de variáveis. Se formos declarar uma a uma em cada linha com seu nome e tipo, o algoritmo terá muitas linhas apenas para declaração de variáveis. Uma forma de diminuir o tamanho do algoritmo é agrupar as variáveis por tipo, separando-as por vírgula, como no exemplo a seguir. Algoritmo Agrupamento de Variáveis Variáveis: a,b,c,d: Inteiro parcela_1, parcela_2: Decimal resultado: Texto Início . . . Fim No algoritmo do exemplo anterior, em vez de usarmos 7 linhas para declarar as variáveis a, b, c, d, parcela_1, parcela_2 e resultado, usamos apenas 3 linhas, já que as variáveis de mesmo tipo estão agrupadas. Chegamos ao final desse tópico. Revisamos e aprofundamos o conceito de memória, conhecendo o que são variáveis e constantes. Vimos que variáveis e constantes precisam ter um nome e um tipo. Também aprendemos a usar variáveis e constantes dentro de algoritmos. No tópico seguinte, conheceremos as propriedadesdos principais operadores lógicos e aritméticos que podemos usar em nossos algoritmos. Nós já conhecemos a maioria deles de aulas passadas ou da matemática básica, mas alguns serão novos para você. Primeiro passo: atribuição de valores Agora que já sabemos declarar uma variável, vamos trocar algumas das instruções escritas que usamos em algoritmos por operadores. A primeira delas é a instrução de atribuição. O operador de atribuição clássico é uma seta que aponta da direita para a esquerda: ←. Este símbolo é usado para indicar que um valor ou o resultado de uma expressão à direita será atribuído a uma variável que está à esquerda. Veja um exemplo: Algoritmo Exemplo 1 Variáveis: x: Inteiro Início x ← 0 Fim Nesse exemplo, a variável x está recebendo o valor 0. O operador de atribuição no formato de seta é bom para escrevermos algoritmos em papel, mas não é prático para criá-los no computador, pois o caractere ← não está disponível em todos os editores de texto ou é de difícil acesso. Por isso, vamos utilizar outro símbolo, mais próximo das linguagens de programação: o símbolo = (igual). A partir de agora, sempre que você vir uma instrução do tipo “ variável = valor” ou “variável = expressão”, significa que a variável em questão recebe o valor ou resultado da expressão do lado direito do operador de atribuição =. Por exemplo: Algoritmo Exemplo 2 Variáveis: nome: Texto idade: Inteiro Início nome = “George” idade = 30 Fim Nesse segundo exemplo, a variável nome do tipo Texto está recebendo o valor “George”, e a variável idade do tipo Inteiro está recebendo o valor 30 Operadores Aritméticos Você deve conhecer os operadores aritméticos desde a escola. Eles correspondem às operações matemáticas que usamos no dia a dia. São eles: Tabela 2 - Operadores aritméticos Operador Descrição + Operador de soma. - Operador de subtração. * Operador de multiplicação. / Operador de divisão. % Operador módulo (resto da divisão). Todos eles são operadores infixos, ou seja, basta posicionar o operador entre os dois operandos (valores com os quais se deseja aplicar a operação). Os operadores de multiplicação (*) e divisão (/) são diferentes dos que usamos na matemática do primeiro grau, × representa multiplicação e ÷ representa divisão. Já o operador módulo, %, fornece o resto da divisão inteira de dois números, diferente do operador /, que fornece o quociente da divisão. Vejamos um exemplo de uso dos operadores aritméticos: Algoritmo Exemplo 3 Variáveis: a,b,c,d,e: Inteiro Início a = 5 + 5 b = 30 - 10 c = 7 * 2 d = 75 / 4 e = 9%2 Fim Os valores finais das variáveis a, b, c e d do algoritmo do exemplo 3 são 10, 20, 14 e 18, respectivamente. O valor da variável e corresponde ao resto da divisão inteira de 9 por 2, que é igual a 1 (2 × 4 = 8, resta 1 para chegar a 9). É possível usar variáveis nas operações citadas anteriormente. Basta incluí-las no cálculo e seu valor será substituído em cada ocorrência no algoritmo. Por exemplo: Algoritmo Exemplo 4 Variáveis: a,b,c: Inteiro Início a = 5 + 5 b = a * 4 c = 50 c = a + b + c Fim No algoritmo do exemplo 4, o valor da variável b será igual ao valor computado da variável a, multiplicado por 4. Como o valor de a é 10, o valor final de b será 10 * 4 = 40. O valor de c será 100. Operadores Aritméticos Especiais A maioria das linguagens de programação oferece operadores especiais que fazem o trabalho combinado de outros operadores. A função deles é diminuir o tamanho de instruções, o que diminui o tamanho dos códigos-fonte. Tanto nas linguagens de programação quanto em algoritmos, o uso desse tipo de operador é facultativo, ou seja, é uma opção de quem escreve o algoritmo. Vamos conhecer alguns deles. Os operadores +=, -=, *= e /= executam a função combinada do operador aritmético com a atribuição. Eles podem ser usados quando a variável que irá receber o valor da operação também está envolvida na operação. Vejamos alguns exemplos. Algoritmo Exemplo 5 Variáveis: a,b: Inteiro Início a = 10 a += 3 b = 50 b -= a Fim No algoritmo do exemplo 5, a instrução a += 3 é equivalente a a = a + 3. Portanto, o valor final de a é a +3 = 10 + 3 = 13. Da mesma forma, o valor de b -= a é b = b - a. Nesse caso, o valor final de b é b - a = 50 - a = 50 - 13 = 37. A mesma dinâmica vale para os operadores *= e /=. Vamos praticar um pouco? Os dois últimos operadores da tabela 3 são ++ e --. A função deles também é reduzir o tamanho de instruções. Diferente dos outros operadores vistos até aqui, eles são considerados unários, ou seja, trabalham apenas com um operando. O operador ++ é chamado de incremento, e aumenta 1 unidade à variável à qual está associado. O operador -- é chamado de decremento, e diminui 1 unidade da variável à qual está associado. Vamos entender melhor com o exemplo a seguir. Algoritmo Exemplo 6 Variáveis: a,b: Inteiro Início a = 8 b = 8 a++ b-- Fim O valor final da variável a é 9, pois, ao usar o operador ++, aumentamos o seu valor em 1 unidade. Já o valor final da variável b é 7, pois, ao usar o operador --, diminuímos 1 unidade do seu valor. Os operadores ++ e -- produzem resultados diferentes, dependendo da posição em relação à variável alvo. Se forem posicionados depois da variável, sua ação ocorre no final da instrução. Se forem posicionados antes da variável, sua ação ocorre imediatamente. Observe os dois algoritmos a seguir. No final do algoritmo do exemplo 7.1, o valor da variável a será 9 e da b será 13, pois o operador ++ só fará efeito na transição da segunda para a terceira instrução. Já no exemplo 7.2, o valor de a será 9 e o valor de b será 14. Isso ocorre porque a variável a recebe o incremento de 1 unidade antes de ter seu valor atribuído a b, pois o operador ++ está posicionado antes da variável e, portanto, é aplicado imediatamente. Assim, b terá valor 9 antes da instrução b +=5, resultado em valor final 14. Caixa Atenção: O posicionamento diferente dos operadores ++ e -- pode não parecer útil no momento, mas será bem aproveitado quando estudarmos estruturas de decisão e repetição nas aulas seguintes. Por isso, guarde bem esse conceito. Vamos fazer um pequeno exercício para fixar o entendimento sobre os operadores ++ e --. Preencha as colunas abaixo com os valores das variáveis a e b ao final da instrução em questão. Atenção: lembre-se de que os operadores ++ e --, quando posicionados depois da variável, têm seu efeito aplicado apenas no final da instrução. Algoritmo Quiz 2 Variáveis: a,b: Inteiro Operadores Lógicos e Relacionais Já conhecemos os operadores aritméticos e de atribuição. Eles podem ser usados com variáveis do tipo numérico, como Inteiro e Decimal. Mas operadores aritméticos não são o suficiente para a construção de algoritmos. Algoritmos representam uma solução para um problema e, para resolver um problema, precisamos mais do que calcular: precisamos decidir. Vejamos um exemplo. Júlia precisa ir à casa de sua amiga para estudar. Existem dois caminhos disponíveis, ambos levam Júlia ao seu destino. Qual caminho ela deve seguir? Assim como as nossas ações do cotidiano, algoritmos precisam ser capazes de executar determinadas ações, baseados em uma informação. Escolher, dar preferência, ignorar, são tomadas de decisão que precisam de um parâmetro, um ponto de referência. Para obter tais parâmetros, usamos operadores lógicos e relacionais. A função dos operadores lógicos e relacionais é a mesma: fornecer uma resposta lógica e precisa sobre uma situação. Isso significa que, sempre que usarmos esses operadores, independente dos operandos, o resultado obtido será verdadeiro ou falso. Os operadores lógicos mais comuns são os mesmos que estudamosna segunda aula desse curso. Vejamos: Tabela 4 – Operadores lógicos Operador Função && “E” (conjunção) || “OU” (disjunção) ! “NÃO” (negação) Os operadores lógicos trabalham com dois operandos do tipo Lógico, ou seja, verdadeiro ou falso. Para nos aproximarmos das linguagens de programação e evitar problemas de uso de variáveis com nomes V ou F, vamos considerar apenas que: 1 equivale a verdadeiro e 0 equivale a falso. O resultado é o mesmo da tabela verdade da operação que realizam. Vamos relembrar as tabelas verdades das operações “NÃO”, “E” e “OU”? Vejamos um exemplo de uso de operador lógico “E” em um algoritmo. Algoritmo Exemplo 8 Variáveis: a,b,c: Lógico Início a = 1 b = 0 c = a && b Fim O valor de c será 0, ou seja, falso, pois a operação “E” para 1 e 0 resulta em 0. Os operadores relacionais comparam dois valores numéricos e devolvem um resultado lógico. Confira a lista dos operadores relacionais na tabela a seguir. Lembre-se: o resultado do uso de um operador relacional é do tipo Lógico. Vejamos alguns exemplos em algoritmos. Algoritmo Exemplo 9 Variáveis: a,b: Inteiro x1,x2,x3,x4: Lógico Início a = 75 b = a / 3 x1 = a > b x2 = b < 10 x3 = b * 3 <= a x4 = a != b Fim No algoritmo Exemplo 9, os valores das variáveis do tipo lógico x1, x2, x3 e x4 indicam se o teste dos operadores relacionais resultou em verdadeiro ou falso. Sabendo que a é igual a 75 e b é igual a a/3 = 75/3 = 25, x1 será 1 (verdadeiro, pois a é maior que b), x2 será 0 (falso, pois b não é menor que 10), x3 será 1 (verdadeiro, pois b*3 = 75, é menor ou igual a 75) e x4 será 1 (verdadeiro, pois os valores de a e b são diferentes). Os operadores relacionais são muito úteis na tomada de decisões baseadas em cálculos, pois permitem a verificação de condições e são usados em situações como: Se o caminho 1 for menor que o caminho 2, então siga pelo caminho 1. Se a área a ser pintada for maior do que a quantidade de tinta disponível para a pintura, solicitar a compra de mais tinta. Enquanto a caixa d’água não estiver cheia, mantenha o fornecimento de água. As situações citadas acima, que usam “se ... então ...” e “enquanto ... ”, são ações típicas do dia a dia e, portanto, ocorrem com frequência em algoritmos. Elas são chamadas de estruturas de decisão e repetição, e serão estudadas a partir da próxima aula. Nesse tópico, conhecemos os operadores de atribuição, aritméticos, lógicos e relacionais. Cada um desses operadores ajuda na construção de cálculos e verificações nos nossos algoritmos. No próximo tópico, iremos praticar o uso de todos os operadores em expressões mais complexas. Também veremos como interpretar situações do mundo real e transformá-las em expressões de um algoritmo. Primeiramente vamos definir o que seria uma expressão. Chamaremos de expressão um conjunto de operadores e operandos em uma instrução do algoritmo, como 1 + 2, a*b/c ou 7 * c--. Nos exemplos que vimos até agora, usamos dois valores ou variáveis, no máximo três, ao mesmo tempo em cada expressão. Porém, em programas reais, precisamos manipular sequências de operações mais complexas. Para isso, conheceremos as regras de precedência para operadores aritméticos e praticaremos com alguns exemplos envolvendo operações aritméticas e lógicas. Precedência entre operadores Considere que você precisa resolver a seguinte expressão aritmética em um algoritmo: Algoritmo Exemplo 10 Variáveis: a: Decimal Início a = 150+2/5+13*4-7%2 Fim Assim como na matemática simples, os operadores aritméticos dos algoritmos também obedecem a uma sequência de precedência, ou seja, uma ordem para serem executados em uma expressão. Confira na tabela a seguir. Tabela 7 – Precedência de operadores aritméticos Ordem Operadores 1 ( ) Parênteses. 2 %, *, / Módulo, multiplicação e divisão. 3 +, - Soma e subtração. Quanto menor o valor da ordem, mais alta a precedência, ou seja, o operador tem que ser executado antes dos demais de maior ordem. Uma multiplicação, por exemplo, precisa ser resolvida antes de uma soma, caso contrário o resultado final será incorreto. Você deve ter percebido, na tabela 7, a presença dos parênteses em primeiro lugar. Isso significa que, em uma expressão, o que estiver dentro de parênteses deve ser resolvido primeiro. E quando ocorrer parênteses dentro de parênteses? Nesse caso, os grupos de parênteses mais internos têm que ser resolvidos primeiro, depois os mais externos, e só então o que não está em parênteses. Por exemplo: Figura 5 – Exemplo de sequência para solução de expressão com parênteses O uso de parênteses não apenas garante a precedência de determinadas regiões da expressão, mas também a organiza visualmente, tornando mais fácil a análise e o teste do algoritmo, sem cometer erros ou perder-se nas contas. Vamos exercitar a resolução de expressões, agora incluindo operadores lógicos, aritméticos e relacionais. O uso de parênteses não apenas garante a precedência de determinadas regiões da expressão, mas também a organiza visualmente, tornando mais fácil a análise e o teste do algoritmo, sem cometer erros ou perder-se nas contas. Vamos exercitar a resolução de expressões, agora incluindo operadores lógicos, aritméticos e relacionais. Transformando abstrações em expressões lógicas e aritméticas Durante as primeiras aulas, estudamos a abstração como uma maneira de trazer características da realidade para dentro dos nossos algoritmos. Podemos usar variáveis e operadores para construir expressões que representam a realidade, principalmente condições. Um exemplo foi dado durante a aula 3, na qual construímos o algoritmo de cálculo do IMC (Índice de Massa Corporal). Para um indivíduo ser considerado dentro da faixa de peso ideal, o valor calculado do seu IMC deveria ser maior ou igual a 18,5 e menor que 25. Considerando que uma variável chamada imc, do tipo Decimal, armazena o valor do IMC calculado de um indivíduo, a condição para que ele seja considerado dentro da faixa de peso ideal pode ser escrita da seguinte forma: imc >= 18,5 && imc < 25 A expressão que propomos é formada por dois testes relacionais (imc >= 18,5 e imc < 25), conectados através de um operador lógico &&. Podemos exibir uma mensagem específica para o caso do indivíduo analisado, dependendo do resultado da expressão. Da mesma maneira, podemos representar diversas situações e condições em nossos algoritmos. Vamos praticar um pouco? Usando as variáveis fornecidas, formule uma expressão lógica que represente a condição solicitada. Você está desenvolvendo um algoritmo para um player de vídeo para internet, como os do site Youtube.com e Vimeo.com. O player precisa carregar pelo menos metade do vídeo para começar a exibí-lo, como forma de garantir que o vídeo não irá parar e aborrecer o usuário. Como deve ser a expressão para representar essa condição? Obs: use as variáveis tamanho_total_video e quantidade_carregada_video, ambas do tipo Inteiro. 1. a) quantidade_carregada_video == tamanho_total_video / 2 2. b) quantidade_carregada_video >= tamanho_total_video / 2 3. c) quantidade_carregada_video <= tamanho_total_video 4. d) quantidade_carregada_video > tamanho_total_video Usando as variáveis fornecidas, formule uma expressão lógica que represente a condição solicitada. Os critérios para aposentadoria no Brasil por tempo de serviço são: 35 anos de contribuição ou 65 anos de idade, para os homens e; 30 anos de contribuição ou 60 anos de idade, para as mulheres https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479116565/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479116565/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479116565/aula/index-fisico.html https://leadfortaleza.com.br/ead2pcd/conteudo/tmp/myopenolat_1_101716479116565/aula/index-fisico.htmlUm novo modelo de algoritmo Você deve ter percebido que nossos algoritmos estão tomando uma nova forma, diferente daquela que vimos na aula passada. Estamos nos afastando cada vez mais da linguagem natural e usando símbolos para expressar tudo o que precisamos: desde valores armazenados na memória até operações relacionais de comparação. Esse modelo é chamado de pseudocódigo, ou seja, um falso código. Não se trata da validade do algoritmo, mas a forma como está escrito. Um pseudocódigo não utiliza uma linguagem de programação específica, embora pareça com algumas delas, permitindo a leitura tanto por quem conhece linguagens de programação quanto por quem está apenas estudando algoritmos. Os pseudocódigos são mais técnicos e organizados que um algoritmo escrito livremente em Português, por exemplo. Existem algumas simulações de linguagens de programação que podem ser usadas para a produção e teste de pseudocódigos. Essas linguagens são usadas no ensino de programação e permitem que os alunos façam testes com algoritmos, sem se preocupar com as particularidades de uma linguagem de programação real como C ou Java. Conheça alguns interpretadores de pseudocódigo em Português: Visualg (https://www.apoioinformatica.inf.br/produtos/visualg/) G-Portugol (https://sourceforge.net/projects/gpt.berlios/). Pseudocódigo e código-fonte não são a mesma coisa. Um pseudocódigo não é escrito em uma linguagem de programação real e, portanto, tem diversas limitações. O uso de pseudocódigo tem como propósito o estudo e testes de algoritmos. Nesse tópico, complementamos nossos conhecimentos sobre operadores com a noção de precedência, e vimos que podemos representar condições em nossos algoritmos usando a combinação de variáveis e operadores lógicos e relacionais. No próximo tópico, veremos as instruções para importar dados do usuário para dentro do algoritmo e exibir dados gerados dentro do algoritmo. TÓPICO 4 – Entrada e saída de dados Objetivos Compreender a função da entrada e saída de dados; Conhecer a notação de entrada e saída em um algoritmo. Agora que já estudamos como declarar variáveis e construir expressões lógicas e aritméticas usando as variáveis e operadores, podemos conhecer um princípio básico de todo algoritmo: a entrada e saída de dados. Aprenderemos a usar entrada e s Entrada de dados em algoritmos Você percebeu que em todos os exemplos que vimos durante esta aula os primeiros valores atribuídos às variáveis estavam escritos no algoritmo? Observe o algoritmo abaixo e note a atribuição de valores às variáveis v1 e v2. Algoritmo Exemplo 11 Variáveis: v1: Inteiro https://www.apoioinformatica.inf.br/produtos/visualg https://sourceforge.net/projects/gpt.berlios/ v2: Texto Início v1 = 100 v2 = “Exemplo” Fim Definir o valor de variáveis dentro do algoritmo é útil, principalmente quando estamos trabalhando com constantes, afinal, elas não mudam. Porém, a maioria dos algoritmos precisam que o usuário forneça os dados iniciais, ou seja, os valores iniciais das variáveis. Por exemplo, o algoritmo do IMC, que calcula o valor do índice de massa corporal, deve receber do usuário os valores de massa (peso) e altura. Mas, como podemos fornecer esses valores ao algoritmo? Podemos receber valores do usuário através de uma operação especial chamada ENTRADA. A sintaxe dessa operação é bem simples, vejo no exemplo a seguir. Algoritmo Entrada 1 Variáveis: x, y: Inteiro Início ENTRADA(x) y = 2 * x Fim Nesse exemplo, o valor de y será igual ao dobro do valor dado a x. Como você viu, para executar uma operação de entrada de dados basta colocar a palavra ENTRADA seguida de um par de parênteses contendo o nome de uma variável. E isso significa que, durante a execução do algoritmo, quando a instrução ENTRADA for encontrada, o usuário deverá fornecer um valor para a variável dentro dos parênteses. Quando uma instrução ENTRADA aparecer no algoritmo, a execução deve parar obrigatoriamente, até que um valor para a variável em questão seja fornecido. Isso ocorre porque o algoritmo não deve seguir sem um valor para essa variável. Se o algoritmo está sendo executado no computador, a forma mais comum de fornecer um valor para variável é através do teclado. Observe o seguinte exemplo: Saída de dados em algoritmos Da mesma forma que podemos injetar dados nos nossos algoritmos, fornecendo valores para variáveis, também temos a capacidade de executar a saída de dados, ou seja, colocar valores para fora do algoritmo. A saída de dados em programas de computador pode ocorrer de diversas formas: exibir um texto em tela, enviar um dado pela Internet, executar um pedido de impressão para uma impressora etc. No nosso caso, iremos considerar que saída de dados será exibir um valor ou texto, como se fosse na tela do computador. Usaremos a instrução SAIDA, seguida de um par de parênteses e uma lista de elementos que podem ser texto ou variáveis de qualquer tipo. O resultado da execução dessa instrução deve ser a exibição de tudo que está dentro dos parênteses, na ordem em que estão. Veja o exemplo a seguir: Algoritmo Saída 1 Variáveis: x: Inteiro Início ENTRADA(x) x++ SAIDA(“O novo valor de x é ") SAIDA(x) Fim Nesse exemplo, estamos usando a instrução SAIDA para exibir a mensagem “O novo valor de x é ” seguido do valor de x. Perceba que usamos a instrução ENTRADA para receber um valor para x, que foi incrementado em seguida, e exibido com a instrução SAIDA. Veja um exemplo similar na animação a seguir. Se você observou bem o exemplo animado, deve ter percebido que podemos usar a instrução SAIDA apenas para exibir texto, sem variáveis. Esse uso de SAIDA é muito útil para instruir o usuário, dizendo a ele o que ele deve informar ao algoritmo. Importância da entrada e saída de dados para algoritmos A instrução ENTRADA torna os algoritmos mais dinâmicos, pois permite que o usuário forneça valores para variáveis, em vez de termos que definir esses valores antes da execução do algoritmo. Na verdade, praticamente não existem algoritmos que não precisem de dados fornecidos pelo usuário para serem executados, ou seja, algoritmos que já tenham todos os valores de variáveis definidos desde o início. Já a instrução SAIDA tem outra função importantíssima, que é informar o que está acontecendo dentro do algoritmo, como o valor de cálculos ou indicar para o usuário que ele deve fornecer alguma informação ao algoritmo. Nesse tópico, conhecemos as instruções ENTRADA e SAIDA, que usamos para inserir dados no algoritmo e exibir mensagens e valores obtidos dentro do algoritmo, respectivamente. Chegamos ao final de nossa quarta aula do Curso de Introdução à Lógica de Programação. Ampliamos a nossa noção sobre a memória de um algoritmo, formalizando o conceito de variável. Aprendemos que cada variável deve ter um nome e um tipo de dados. Também conhecemos os operadores aritméticos, de atribuição, lógicos e relacionais. A junção desses operadores com as variáveis torna possível a manipulação de valores durante a execução do algoritmo e a representação de condições dentro dele. Outro assunto visto nessa aula foi a entrada e saída de dados, que torna os algoritmos mais dinâmicos e comunicativos. Representar condições em um algoritmo é o primeiro passo para a tomada de decisões, assim como fazemos no mundo real. Sabendo identificar uma condição e transcrevê-la para dentro do algoritmo é o que precisamos para começar a estudar as estruturas condicionais e de repetição. Essas estruturas dão grande flexibilidade aos algoritmos, permitindo a execução de passos baseados em decisões. E é isso que iremos estudar a partir da aula que vem. Até lá! Referências CORMEN, Thomas. LEISERSON, Charles. RIVEST, Ronald. Algoritmos - Teoriae Prática. 2 ed. Campus Editora. 2002. 936 p. Conceito de Variável - InfoEscola. Disponível em: <https://www.infoescola.com/matematica/conceito-de-variavel/>. Acesso em: 30 nov. 2013. Precedência Geral de Operadores Aritméticos. Disponível em: <https://www.cristiancechinel.pro.br/my_files/algorithms/bookhtml/node39.html>. Acesso em: 01 dez. 2013. https://www.infoescola.com/matematica/conceito-de-variavel/ https://www.cristiancechinel.pro.br/my_files/algorithms/bookhtml/node39.html Prova IV TÓPICO 1 – O que são Estruturas de Decisão? Objetivos Reconhecer estruturas de decisão em situações do mundo real; Compreender a importância das estruturas de decisão em um algoritmo. Na aula sobre algoritmos, conhecemos as suas características e como eles podem ser usados na hora de solucionar um problema. Relembrando: algoritmo é um conjunto de passos no qual se tem uma entrada que, ao ser processada, produzirá uma saída. Durante as aulas, aprendemos que algoritmos fazem parte do nosso dia-a-dia e estão presentes desde uma simples receita de bolo até em sistemas de grandes empresas. Até a aula de hoje, estávamos acostumados a escrever algoritmos em que um conjunto de passos era executado sequencialmente até encontrar a saída do algoritmo. Somente executar passos sequencialmente não é suficiente para resolver determinados problemas mais complexos e é por isso que novas estruturas foram incorporadas aos algoritmos como, por exemplo, as estruturas de decisão. As estruturas de decisão estão presentes no nosso cotidiano. É comum no nosso dia a dia tomarmos alguma decisão sobre algo que vamos fazer dada uma situação na qual nos encontramos. Vamos analisar dois diálogos entre João e Pedro para compreender melhor esse conceito. No diálogo, vemos que se a resposta do João para a pergunta de Pedro for Não, Pedro decide que irão jogar bola. Caso a resposta seja Sim, Pedro e João ficarão em casa. Perceba que existiu um desvio no fluxo de ações de Pedro que optou por escolher um dos caminhos dependendo da resposta de João. Que tal outro exemplo? Vamos analisar a figura 2. Júlia precisa ir para a casa de uma amiga estudar. Existem dois caminhos que chegam até a casa da amiga de Júlia. O caminho da direita tem distância de 5,3 Km passando por uma floresta com bastante sombra e o caminho da esquerda tem distância de 2 Km passando por um campo aberto. Vamos imaginar que Júlia precisa chegar o mais rápido possível na casa da amiga e não está preocupada se o caminho tem ou não sombra. Qual caminho ela deveria escolher? A resposta é: “O caminho da esquerda”. Perceba que antes de escolher o caminho, uma decisão precisou ser tomada. A decisão foi baseada na condição de que “Julia deve gastar o menor tempo possível”. Diante disso, qual seria a pergunta que deveria ser feita para que a resposta influenciasse na decisão? Vamos analisar a figura a seguir. Os dois exemplos apresentados são baseados em situações do dia a dia. Com algoritmos não é diferente. Algoritmos necessitam de uma estrutura capaz de desviar a execução, ou seja, um fluxo de ações. Esses desvios deverão ocorrer sempre que uma decisão for tomada. Essa estrutura é chamada de Estrutura de Decisão e é responsável por desviar o fluxo de execução de um algoritmo. Com a possibilidade de mudança de fluxo, podemos criar algoritmos mais robustos, capazes de fazer escolhas com base em uma condição. Esses algoritmos estarão aptos a resolver diversos tipos de problemas. Figura 3 - Exemplo de estrutura de decisão em fluxogramas Você se lembra dos fluxogramas? Eles são a representação gráfica de algoritmos. As estruturas de decisão podem ser representadas usando o fluxograma da figura 3. A condição é representada por um losango. Se o resultado da condição for verdadeiro, o bloco 1 será executado. Caso contrário (ou seja, a condição sendo falsa), o bloco 2 será executado. Na aula passada, tínhamos algoritmos que sempre executavam passos sequenciais. Com essa nova estrutura, podemos ter algoritmos em que somente alguns comandos serão executados. Nesse tópico, identificamos algumas situações no nosso cotidiano onde utilizamos estruturas de decisão. Além disso, aprendemos como representar uma estrutura de decisão em um fluxograma. Existem três tipos de estruturas de decisão em algoritmos. São elas: SE, SE/SENÃO e SELECIONE/CASO. Cada uma possui uma forma de utilização e um propósito que veremos mais detalhadamente nos próximos tópicos da nossa aula. No próximo tópico, iremos aprender como funciona a estrutura de decisão mais simples, a estrutura SE. TÓPICO 2 – Estrutura de Decisão SE Objetivo Compreender o funcionamento da estrutura de decisão SE. No tópico anterior, percebemos a importância que as estruturas de decisão têm no nosso dia a dia e como elas são importantes para os algoritmos em geral. Vamos agora aprender como funciona a primeira e mais simples dessas estruturas: a do tipo SE. Estruturas de decisão do tipo SE compreendem apenas uma possibilidade: a da condição ser verdadeira. Elas são formadas pela regra apresentada na figura 4. Vamos analisar a construção textual da estrutura de decisão SE. A primeira cláusula ou palavra-chave é a palavra “se”, seguida pela <condição>. Essa condição equivale a uma expressão lógica ou relacional que será verificada. Logo após, temos a palavra-chave “então” seguida pelo <bloco 1>. O que estiver dentro do bloco 1 será executado caso a <condição> seja verdadeira. Para finalizar, fechamos com a cláusula “fim_se”. Figura 4 - Estrutura de decisão SE em código e fluxograma A cláusula <condição> representa qualquer expressão lógica ou relacional, ou seja, aquelas que tenham um valor lógico (verdadeiro ou falso), também conhecidos como booleanos. Vocês lembram o que são expressões booleanas? Vamos então lembrar um pouco. Revisão de Expressão Booleana Expressão Booleana é uma estrutura lógica que pode ter um valor verdadeiro ou falso. As operações podem ser formadas por diversos operadores. A tabela 1, a seguir, contém alguns dos possíveis operadores de uma expressão booleana. Tabela 1 - Operadores Relacionais Símbolo Descrição Exemplo > “Maior que” 2 > 1 < “Menor que” 1 < 3 == “Igual a” 5 == 5 >= “Maior ou igual a” 4 ≥ 4 <= “Menor ou igual a” 8 ≤ 8 != “Diferente de” 3 ≠ 4 A expressão contida na cláusula <condição> pode ser montada usando números e/ou variáveis em um algoritmo. Exemplos: 6 < 3 – “Seis é menor do que três” media > 7 – “O valor da variável ‘media’ é maior do que 7” Na tabela 2, a seguir, você encontrará mais exemplos de possíveis expressões que podem ser inseridas na cláusula <condição>. Tabela 2 - Exemplo de expressões booleanas Condição Como ler? Resultado 1 == 1 ? “Um é igual a Um?” Verdadeiro 2 > 3 ? “Dois é maior do que Três?” Falso ‘A’ == ‘B’ ? “A é igual a B?” Falso 35 >= 0 ? “Trinta e cinco é maior ou igual a zero?” Verdadeiro Analise as expressões abaixo e informe se o resultado é Verdadeiro ou Falso. Exemplo: “2 > 3 Falso” a. 3 > 4 → Verdadeiro Falso b. CA == AC →Verdadeiro Falso c. 5 ≥ 5 →Verdadeiro Falso d. 4 < 7 →Verdadeiro Falso Verificar resposta Recomeçar Os algoritmos apresentados na aula 3 possuíam sempre um conjunto de passos que eram executados sequencialmente, ou seja, um depois do outro. E se dentre esses passos, você tivesse um comando que somente seria executado se alguma condição acontecesse? Para ajudar a entender melhor, vamos relembrar o algoritmo Preparar Café da aula 3 e apresentar uma versão modificada, adicionando uma estrutura de decisão SE. Veja então como ficaria. Algoritmo 1: Preparar Café Variáveis: Início Ferver a água Colocar pó de café na água Misturar bem para dissolver o pó na água Passar a mistura no filtro de café se João gosta
Compartilhar