CAPÍTULO 1 1 INTRODUÇÃO A LÓGICA DE PROGRAMAÇÃO 1.1. CONCEITOS BÁSICOS Nesta disciplina, vamos estudar sobre Lógica de Programação. Mas, antes de começarmos, seria bom fazermos uma reflexão sobre o significado da palavra “Lógica”. Assim, o que é Lógica? A Lógica pode ser vista como a arte de pensar corretamente. A lógica visa a colocar ordem no pensamento. Utilizamos a lógica naturalmente em nosso dia-a-dia. Por exemplo: a) Sei que o bornal está no armário. Sei que o armário está fechado Logo, concluo que tenho de abrir o armário para pegar o bornal. b) Sei que sou mais velho que Andre. Sei que Andre é mais velho que Roberto. Então, concluo que eu sou mais velho que Roberto. 1 Sejam os seguintes fatos: Todos os filhos de José são mais altos do que Ana. Ricardo é filho de José. Então, o que podemos concluir logicamente? 2 Sejam os fatos a baixo: Andre é aluno do IFS-SE. Para ser aprovado, um aluno do IFS-SE precisa obter nota maior ou igual a 60 e comparecer a mais de 75% das aulas. André compareceu a todas as aulas e obteve nota igual a 80. Então, o que podemos concluir? 2 1.2. CONSTRUÇÃO DE ALGORITMOS A lógica de programação é essencial para pessoas que desejam trabalhar como programador de computadores. Lógica de programação pode ser definida como um conjunto de técnicas para atingir um determinado objetivo. O principal fundamento de toda programação é construir algoritmos. Mas, afinal, o que é um algoritmo? Um algoritmo pode ser definido como uma seqüência finita de passos para executar uma determinada tarefa. Podemos pensar em algoritmo como uma receita, uma seqüência de instruções para chegar numa meta específica. Quando criamos um algoritmo, estamos apenas descrevendo uma seqüência de ações para solucionarmos um problema, até mesmo para resolver problemas do nosso dia a dia, podemos escrever seqüências lógicas de atividades, ou seja, criar algoritmos: Problema: Trocar uma lâmpada. Seqüência de Passos para a Solução: 1. Pegue uma escada; 2. Posicione a escada embaixo da lâmpada; 3. Pegue uma lâmpada nova; 4. Suba na escada; 5. Retire a lâmpada velha; 6. Coloque a lâmpada nova; 7. Dessa da escada; 8. Guarde a escada. o criarmos um algoritmo, descrevemos uma possível seqüência de passos para resolver um problema. 3 Escreva um algoritmo (seqüência de passos) para trocar um pneu de um carro. 3 4 Descreva um algoritmo que defina como fazer um bolo. 1.3. ALGORITMO COM ESTRUTURA DE DECISÃO No nosso primeiro algoritmo define uma seqüência de passos para trocar uma lâmpada. Em nenhum momento perguntamos se a lâmpada está queimada. Simplesmente trocamos a lâmpada sem testá-la. Para resolver esse problema, podemos acrescentar ao nosso algoritmo um teste que verifique se a lâmpada deve ser trocada: 1. Ligue o interruptor 2. Se a lâmpada não acender 2.1. Pegue uma escada; 2.2. Posicione a escada embaixo da lâmpada; 2.3. Pegue uma lâmpada nova; 2.4. Suba na escada; 2.5. Retire a lâmpada velha; 2.6. Coloque a lâmpada nova; 2.7. Dessa da escada; 2.8. Guarde a escada. Nesse momento, estamos juntando aos passos de efetuar a troca da lâmpada a uma condição. Assim, só efetuaremos os passos definidos de 2.1 a 2.8 caso a condição definida do passo 2 seja verdadeira, ou seja, caso a lâmpada não acenda. Testes que determinam quais ações serão executadas são chamados de estruturas de seleção ou estruturas de decisão. 4 1.4. ALGORITMO COM ESTRUTURA DE REPETIÇÃO Apesar de nosso novo algoritmo estar testando a necessidade de trocar a lâmpada antes de fazê-lo, em nenhum momento verificou se a lâmpada nova que foi instalada funciona. Assim, vamos tentar alterar o nosso algoritmo a fim de garantir que ao fim de sua execução teremos uma lâmpada funcionando. Para isso, vamos adicionar um novo teste em seu final: 1. Ligue o interruptor 2. Se a lâmpada não acender 2.1. Pegue uma escada; 2.2. Posicione a escada embaixo da lâmpada; 2.3. Pegue uma lâmpada nova; 2.4. Suba na escada; 2.5. Retire a lâmpada velha; 2.6. Coloque a lâmpada nova; 2.7. Enquanto a lâmpada não acender 2.7.1. Retire a lâmpada 2.7.2. Coloque uma outra lâmpada 2.8. Dessa da escada; 2.9. Guarde a escada. Agora no nosso novo algoritmo, testará a lâmpada até que uma funcione, só finalizando-o assim que uma lâmpada acender. 5 Crie um algoritmo que indique como fazer uma prova. Faça o algoritmo pensando que o aluno não deve deixar questões em branco, assim deve continuar fazendo a prova enquanto existir questão em branco e o tempo de prova não tiver acabado. Além disso, o aluno só deve resolver uma questão se souber resolvê-la, senão pula para a próxima. 5 6 Suponha que você tenha uma caixa cheia de bolas. Nessa caixa existem bolas azuis e bolas vermelhas. Além disso, você tem também duas caixas vazias. Vamos chamar a caixa que contém as bolas de “caixa 1” e as duas caixas vazias de “caixa 2” e “caixa 3”. Neste contexto, escreva um algoritmo que defina como tirar todas as bolas da “caixa 1” colocando as bolas azuis na “caixa 2” e as bolas vermelhas na “caixa 3”. 7 André trabalha no departamento de recursos humanos de uma empresa. A empresa de André definiu que os salários dos empregados serão aumentados seguindo a seguinte regra: caso o salário seja menor que R$1000,00 o aumento será de 10% e, caso contrário, será de 8%. José recebeu uma lista contendo os nomes e salários de todos os funcionários da empresa e foi solicitado que calculasse o novo salário desses funcionários. Assim, escreva um algoritmo para que André calcule corretamente os novos salários. 8 Desafio de lógica: Três missionários e três canibais encontram-se na margem esquerda de um rio. Nessa margem também existe um bote que pode transportar uma ou duas pessoas. As seis pessoas pretendem todas passar para a margem direita (usando o bote). No entanto, os missionários têm de arranjar um plano para conseguir de modo que, em nenhuma circunstância, existam missionários numa margem em minoria relativamente aos canibais, pois têm receio do que lhes possa acontecer. Quando o bote chega à margem, os elementos do bote são contados como estando na margem. Assim, se houver apenas um canibal em uma margem, não podemos enviar a essa margem o bote com um canibal e um missionário, pois, ao chegar à outra margem, serão dois canibais contra um missionário. Lembre-se de que para o bote ir de uma margem a outra é necessário que alguém esteja remando, ou seja, o bote nunca atravessa vazio. Faça um algoritmo que exiba, passo a passo, como efetuar esta travessia de forma segura. 6 CAPÍTULO 2 PORTUGOL IDE 2.1. INICIANDO O PORTUGOL IDE Portugol IDE é uma ferramenta desenvolvida na linguagem Java para ensinar lógica de programação para iniciantes nessa área de programação, pois a IDE possibilita ao aluno criar e testa seus algoritmos. Mais para usarmos esse programa, primeiramente temos que baixá-lo na internet, o endereço para o download isso é o http://www.dei.estt.ipt.pt/portugol/node/33, depois de baixar em sua máquina é só descompactar e clicar duas vezes no programa chamado Portugol.jar, ai, ele abrir a seguinte tela. Figura 1. Tela inicial do Portugol IDE Lembrando que para rodar o programa Portugol IDE você tem que ter na sua máquina a JRE (Java Run Time) que é a máquina virtual machine da linguagem JAVA. Pois é isso que possibilita esse programa rodar tanto no Windows quanto no Linux. 7 2.2. EDITOR DE TEXTO Para começarmos a criar nossos algoritmos temos primeiro que clicar na opção Editor de Texto, pois é ai que iremos começar a digitar nossos algoritmos, e assim podermos testá-los, pois nessa opção ele permite nós executarmos o algoritmo como um programa de computador, exibindo os resultado do mesmo, ou alguma mensagem de erro se houver. A tela inicial do Editor de Texto é exibida na figura 2. Barra de título Barra de menu Barra de ferramentas Figura 2. Tela inicial do Editor de Texto Área de digitação Área de mensagem e ajuda (help) Segue a baixo as definições de cada parte especificada na figura 2: Barra de Título: Onde será exibido o nome do arquivo que guardará o algoritmo digitado. Barra de Menu: Onde é mostrado todas as opções do programa. Barra de Ferramentas: Onde é mostrado as opções mais usadas no programa em forma de ícones para maior rapidez rodar umas dessas opções. 8 Área de Digitação: Onde será digitado nosso algoritmo. 2.2.1 Barra de Ferramentas É o que mais iremos utilizar no Portugol IDE, portanto segue a baixo na figura 3 a dessa barra e suas ícones, e logo após iremos definir a função dos ícones principais. Novo Abrir Executar Salvar Executar passo a passo Figura 3. Tela da barra de ferramenta Avançar Executar na memória Retornar Segue a baixo as definições de cada parte especificada na figura 3: Novo: Inicia a tela para digitar um novo algoritmo. Abrir: Server para abrir um arquivo de algoritmo já salvo. Salvar: Serve para gravar um arquivo com o algoritmo digitado no momento. Executar: Serve para executar (rodar) o algoritmo digitado, e teste se tem erros. Executar Passa a Passo: Serve para executar (rodar) linha a linha do algoritmo digitado, e teste se tem erro em cada linha. Retornar: Serve para desfazer a última ação digitada. Avençar: Serve para ir para próxima ação após ser retorna algumas. Executar na Memória: Serve para executar (rodar) o algoritmo digitado, só que nesse caso, é mostrado na tela os nomes e valores das variáveis 9 declaradas do jeito que são reservadas na memória do computador, e teste se tem erros. 2.2.2 Exemplo de Execução Agora vamos mostrar duas figuras, a 4 e 5, exibindo o resultado de um algoritmo sendo executado pelo Portugol IDE, tanto o que foi clicado no butão Executar, quanto o butão Executar na Memória. Figura 4. Tela da execução direta pelo ícone executar Figura 5. Tela da execução direta pelo ícone executar na memória 10 CAPÍTULO 3 CONSTRUÇÃO DE ALGORITMOS PARA COMPUTADORES 3.1. FORMALIZANDO A ESCRITA DE ALGORITMOS Para que os computadores possam interpretar os algoritmos que criamos, precisamos transformar a seqüência de passos que escrevemos em linguagem natural para uma linguagem que possa ser “entendida” pelo computador. Essas linguagens são chamadas de linguagens de programação. Existem varias linguagens de programação em uso atualmente. Em nosso curso, usaremos a linguagem Portugol. O Portugol é linguagem que une a estrutura rígida das linguagens de programação à facilidade de compreensão da linguagem natural. Para aprender a criar algoritmo, devemos começar, estudando os conceitos básicos de variáveis e constantes. 3.2. VARIÁVEIS Para que um programa seja executado em um computador, o mesmo, carrega esse programa na memória. A memória é utilizada para armazenar tanto as instruções dos programas quanto os dados utilizados pelos mesmos. Qualquer programa, para ser executado, tem de estar na memória (FARRER, 1999). Memória: Meio físico para armazenar dados temporariamente ou permanentemente (TANENBAUM, 1997, p.212). Ao criamos nossos algoritmos, provavelmente precisamos armazenar dados referentes ao problema, como um nome, um número ou mesmo o resultado de uma operação. Mas, para armazenar esses dados, precisamos solicitar ao computador que ele reserve uma área da memória para nosso uso. A forma de pedirmos ao computador que reserve memória é chamada de declaração de variáveis. 11 Sintaxe: Todos os comandos utilizados em linguagem de programação, tem uma sintaxe. Sintaxe é a forma de escrita do comando. A sintaxe para declarar variável em Portugol é: Sintaxe: variavel tipo_da_variável nome_da_varial variavel: Comando em Portugol para indicar declaração de uma variável. tipo_de_variável: Indica o tipo de dados que iremos armazenar na variável. nome_da_variável: Define o nome que iremos referenciar a nossa variável. Quando declaramos uma variável, temos o objetivo de armazenar algum tipo de valor específico nela. Por exemplo, se criarmos um algoritmo que calcule de modo simples a idade de uma pessoal, precisaremos de variáveis para armazenar o nome da pessoa, bem como a ano de nascimento e ano atual, também uma que armazenará o resultado do cálculo. Assim, o nome dado à variável deve deixar claro o objetivo da mesma, ou seja, devemos utilizar nomes sugestivos. Apesar de esta ser a principal diretriz quanto à atribuição de nomes a variáveis, algumas outras regras são apresentadas a seguir: REGRAS EXEMPLOS Inicie sempre por uma caracter alfabético, nunca por número Nome (correto) 1nome (errado) Não utilize caracteres especiais como “, ( ) / *; +. Nome (M); N*B Não coloque espaços em branco ou hífen entre nomes. salario-bruto Utilize, se necessário, underline Salário_bruto Crie suas variáveis com nomes sugestivos. Se vai guardar salário de funcionários, dê à variável o nome salario. 12 Quando declaramos uma variável, devemos ter em mente os valores que serão armazenados naquele espaço de memória. É essa observação que definirá o tipo da variável a ser declarada. Uma variável pode ser de um dos seguintes tipos: TIPO DESCRIÇÃO VALORES inteiro Valares ordinais com 4 bits. -2 147 483 648 2 147 483 647 real Valores com parte decimal definidos com 64 bits -1.7 E 308 1.7 E 308 logico Valores com parte decimal definidos com 64 bits verdadeiro (V) ou falso (F) caracter Caracteres da Tabela ASCII ASCII(0) | só um caracter ASCII(255) | ex: “M” texto Conjuntos de caracteres "Sequências de caracteres entre aspas" Variável: Uma Variável é uma posição nomeada de memória, que é usada para guardar um valor que pode ser modificado pelo programa. (LAUREANO, 2005, p. 12) 9 Aprendemos algumas regras que devem ser seguidas para dar nomes a variáveis. Assinale os nomes de variáveis que obedecem a essas regras: a) ( b) ( c) ( d) ( e) ( f) ( ) nome ) telefone-celular ) nome+sobrenome ) 2taxa ) telefone_celular ) conta1 13 10 Para cada valor dado abaixo, foi definido um tipo de variável. Marque os pares de valor e tipo definidos corretamente: a) ( b) ( c) ( d) ( e) ( f) ( g) ( h) ( i) ( j) ( ) valor = 6.5 ) valor = “S” ) valor = -7 ) valor = “R” ) valor = 9 ) valor = -40.65 ) valor = 59 ) valor = “Maria” ) valor = 274 ) valor = 1.3 Tipo = inteiro Tipo = texto Tipo = inteiro Tipo = caracter Tipo = inteiro Tipo = inteiro Tipo = real Tipo = texto Tipo = real Tipo = inteiro 11 Você está fazendo um algoritmo para calcular a média dos alunos a partir das notas de 2 provas. Assim, precisará de 3 variáveis: uma para a nota da primeira prova, uma para a nota da segunda prova e uma para a média. Segundo as normas da instituição, as notas das provas devem ser números inteiros de 0 a 10. Já para a média podem ser atribuídos valores com casas decimais. Utilizando a sintaxe de declaração de variáveis em Portugol e as regras para definição de tipos e de nomes, indique como você declararia essas 3 variáveis. Dica: lembre-se de escolher nomes sugestivos para as variáveis. 3.3. CONSTANTES Do mesmo jeito que o valor de uma variável pode ser alterado ao longo de seu algoritmo. Mas, podemos precisar armazenar valores que não se alteram. Para isso existem as constantes. As constantes são criadas obedecendo às mesmas regras das variáveis. Com uma única diferença o valor armazenado na constante não se modifica durante a execução de um algoritmo. A sintaxe para declarar constante em Portugol é: Sintaxe: constante nome_da_constante <- valor 14 constante: Comando em Portugol para indicar declaração de uma constante. tipo_de_constante: Define o nome que iremos referenciar a nossa variável. valor: É o valor assumido pela constante. Por exemplo, considere um algoritmo que calcule o valor da contribuição do FGTS: 15% sobre o salário, independentemente do valor do salário. Assim, a taxa de 15% será constante durante a execução do programa. Logo, poderia declarar a constante da seguinte forma: constante TAXA_FGTS <- 0.15 Constante: Variável com valor pré-definido que não pode ser modificado por nenhuma função de um programa. (LAUREANO, 2005, p.16). 3.4. COMANDOS DE ATRIBUIÇÕES, ENTRADA E SAÍDA DE DADOS 3.4.1. Comandos de Atribuição Para armazenar um determinado valor durante a execução do programa. Para isso, utilizamos o comando de atribuição que, em Portugol, é representado por uma seta (<-), conforme sintaxe abaixo: Sintaxe: indicador <- expressão indicador: Nome da variável ou constante a ser utilizada. expressão: Valor ou expressão a ser armazenado. 15 Exemplo: variavel inteiro nota variavel caracter sexo nota <- 9 sexo <- “M” 3.4.2. Comandos de entrada de dados Responsável pela leitura e armazenamento dos dados digitado no teclado na variável que indicarmos. A sintaxe do comando de entrada de dados em Portugol é exibida a seguir: Sintaxe: ler variável ler: Responsável por ler e armazenar o que o usuário digitou pelo teclado. variável: Nome da variável a ser declarada. Exemplo: variavel real nota variavel texto nome ler nota ler nome 3.4.3. Comandos de saída de dados Responsável por exibir no monitor o valores de constantes, variáveis ou expressões. A sintaxe do comando de saída de dados em Portugol é exibida abaixo: Sintaxe: escrever expressão escrever: Responsável por exibir no monitor uma mensagem para usuário. expressão: Indica o que será exibido no monitor. É normalmente composta por um texto fixo seguido por uma vírgula e um nome de variável. 16 .Exemplo: inicio variavel texto nome escrever "Digite seu Nome" ler nome escrever “Bom dia”, nome fim 12 Assinale os comandos de atribuição realizados corretamente: a) ( b) ( c) ( d) ( ) variavel ) variavel ) variavel ) variavel texto SEXO <- “M” real altura 1.72 inteiro IDADE <- 35 texto NOME <- “Silvio” 13 No programa abaixo, dois valores inteiros são lidos e somados, e o resultado dessa soma é mostrado no final da execução. Analise as linhas do programa e assinale as afirmações corretas: Linha 1 ... inicio Linha 2 ... varavel real NOTA1, NOTA2, MEDIA Linha 3 ... escrever (“Digite a primeira nota:”) Linha 4 ... ler (NOTA1) Linha 5 ... escrever (“Digite a segunda nota:”) Linha 6 ... leia (NOTA2) Linha 7... MEDIA <- (NOTA1 + NOTA2)/2 Linha 8 ... escreva (“A média das notas digitadas é:”, MEDIA) Linha 9 ... fim a) ( ) linha 4:O primeiro valor digitado no teclado está sendo lido e armazenado em NOTA1; b) ( ) linha 6: O segundo valor digitado no teclado está sendo lido e armazenado em NOTA2; c) ( ) linha 7: O resultado da soma dos valores digitados está sendo atribuído à variável MEDIA d) ( ) linha 8: No monitor serão exibidas a mensagem que está entre aspas e a média das notas digitadas 17 14 Faça um algoritmo que solicite que o usuário digite seu nome e a seguir solicite que seja digitada sua idade. Depois que o usuário digitar o nome e a idade, o programa deve exibir na tela duas mensagens: uma com o nome e outra com a idade do usuário. Por exemplo, nome do usuário seja João e ele tenha 42 anos. Assim, após a digitação dos dados, seu programa deve exibir as seguintes mensagens: “Seu nome é João” e “Você tem 42 anos”. 3.5. OPERADORES ARITMÉTICOS E EXPRESSÕES ARITMÉTICAS Os operadores aritméticos são símbolos que representam operações aritméticas, ou seja, as operações matemáticas básicas. Abaixo é apresentada uma tabela contendo os operadores aritméticos que utilizaremos neste curso. Operadores Aritméticos Operador Operação Matemática + Adição - Subtração / Divisão * Multiplicação % Resto da divisão inteira ^ Potenciação Os operadores aritméticos serão utilizados para formar expressões aritméticas. As expressões aritméticas são formadas por operadores aritméticos que agem sobre operandos. Os operandos podem ser variáveis ou constantes do tipo numérico, ou seja, inteiros ou reais. Segue dois exemplos de expressões aritméticas: Media/2 t*2+e/2 18 Nas expressões aritméticas o computador vai seguir as mesmas ordem da matemática, primeiro divisão (/) e multiplicação (*), depois adição (+) e subtração (-), para ser alterado essa ordem, poderemos usar os parênteses (( )), os colchetes ([]) e as chaves ({}). Por exemplo: numero1 + (numero2 + numero3) / 2 Primeiro somamos numero2 a numero3; o resultado é divido por 2 e só depois somamos com numero1. Vamos agora mostrar um exemplo de algoritmo que ler e multiplica dois números inteiro e depois exibe o resultado, e logo depois explicar linha a linha desse algoritmo. Algoritmo: Linha 1... inicio Linha 2... varariavel inteiro NUM1, NUM2, MULT Linha 3... escrever “Digite o primeiro número” Linha 4... ler NUM1 Linha 5... escrever “Digite o segundo número” Linha 6... ler NUM2 Linha 7... MULT <-NUM1 * NUM2 Linha 8... escrever “O resultado da multiplicação é:”, MULT Linha 9... fim Explicação: Linha 1... Indica o início do programa. Linha 2... Declaração das três variáveis do tipo inteiro necessárias ao programa. Linha 3... O comando exibirá (escreva) a mensagem que solicita a digitação do primeiro número. Linha 4... O primeiro número digitado será lido e armazenado na variável NUM1. Linha 5... O comando escreva exibirá a mensagem que solicita a digitação do segundo número. 19 Linha 6... O segundo número digitado será lido e armazenado na variável NUM2. Linha 7... A variável MULT receberá o resultado da multiplicação do primeiro pelo segundo número. Linha 8... O comando escreva exibirá uma mensagem com o resultado da multiplicação. Linha 9... 3.6. Indica o fim do programa. OPERADORES LÓGICOS, RELACIONAIS E EXPRESSÕES LÓGICAS Antes de falarmos de expressões lógicas, vamos conhecer os operadores lógicos e relacionais, pois precisaremos desses operadores pra utilizar as expressões lógicas. 3.6.1. Operadores Lógicos De acordo com seus operandos, os operadores lógicos só retornam dois estados, verdadeiro ou falso, os mais comuns estão na tabela abaixo: Operadores Lógicos E OU NÃO Também são conhecidos como conectivos, pois podem ser usadas para juntar duas preposições como segue o exemplo abaixo, claro que utilizaremos duas variáveis inteiras, ou seja, P e S onde, P = 8 e S = 13. Você deve ter notado, pelos exemplos anteriores: • quando utilizamos o operador lógico E, o resultado só será verdadeiro se as duas condições relacionam das forem verdadeiras; • para o operador OU, basta que uma das condições seja verdadeira que o resultado será verdadeiro; • em conseqüência: para o operador OU, para que o resultado seja falso, as duas condições devem ser falsas. 20 Agora vamos aprender a utilizar a tabelas-verdade para visualizar todas as opções possíveis dos operadores lógicos. Segue um exemplo abaixo apresentando 3 tabelas-verdades dos operadores lógicos E, OU e NÃO para duas preposições (ou expressões) A e B. A B A ou B V V V V F V F V V F F F A B AeB V V V V F F F V F F F F A não A V F F V Relação Resultado P>6 E S>7 Verdadeiro: o valor de A é menor que 6 E o valor de B é maior que 7. P=5 E S<5 Falso (F): apesar de o valor de A ser igual a 5, o valor de B não é menor que 5. P = 5 OU S < 5 Verdadeiro: usando o operador OU, se ao menos uma das condições for verdadeira (A=5), o resultado da expressão é verdadeiro. 21 3.6.2. Operadores Relacionais Operadores relacionais são utilizadores pra fazer comparação entre dois valores do mesmo tipo, podendo esses valores ser representados por variáveis ou constantes. Abaixo é apresentada uma tabela contendo os operadores relacionais. Operadores Relacionais Operador Operação Relacional = Igual =/= Diferente > Maior >= Maior ou igual < Menor <= Menor ou igual O nome que se da a uma comparação feito com os operadores relacionais é relação. O resultado obtido dessa relação é sempre o valor lógico, ou seja, verdadeiro ou falso. Segue a baixo uma tabela exemplificando isso, considerando duas variáveis inteiras, P e S onde, P = 8 e S = 13. Relação Resultado P=S Falso P<S Verdadeiro P >= S Falso B != 8 Verdadeiro P >= 3 Falso 3.6.3. Expressões Lógicas Como foi dito anteriormente, as expressões lógicas são expressões formadas a partir do uso de variáveis e constantes, operadores relacionais e operadores lógicos. As expressões lógicas também retornaram sempre um valor lógico: verdadeiro ou falso. 22 Exemplos: (w < q) e (q < u) (q + z < w) ou (w>10) e (q < 5) Podemos ver nesse exemplo que combinamos operadores lógicos e relacionais numa mesma expressão, então é importante aprendermos a ordem de precedência entre eles, pois isso irá definir a forma de solução da expressão. Segue abaixo a ordem das precedências. Ordem Operador 1ª Operadores aritméticos seguindo a ordem de precedência indicada na seção 2.5. 2ª Operadores relacionais 3ª Operador lógico NÃO 4ª Operador lógico E 5ª Operador lógico OU Uma forma de você não se confundir é definir as precedências usando parênteses. As expressões dentro dos parênteses mais internos são resolvidas primeiro. Observe as seguintes declarações de variáveis e suas respectivas atribuições e responda às questões de 15 a 19: variavel inteiro NUM1 <- 20 variavel inteiro NUM2 <- 10 variavel inteiro NUM3 <- 210 variavel inteiro NUM4 <- 210 15 Coloque F ou V nas expressões abaixo: Exemplo: ( F ) NUM4 > NUM3 a) b) c) d) ( ( ( ( ) NUM1 > NUM2 ) NUM1 < NUM3 ) NUM1 < NUM4 ) NUM3 = NUM4 23 16 Coloque F ou V nas expressões abaixo: Exemplo: ( F ) NUM1-NUM2 < NUM2 a) b) c) d) ( ( ( ( ) NUM1 + NUM2 > NUM3 ) NUM1 * NUM2 < NUM4 ) NUM3 – NUM4 != NUM4 ) NUM3 / NUM1 < NUM4 17 Coloque F ou V nas expressões abaixo: Exemplo: ( F ) NUM1+ NUM2 > 10 e NUM3 - NUM4 = NUM3 a) b) c) d) ( ( ( ( ) NUM1 / NUM2 > 0 e NUM1 + NUM3 > NUM4 ) NUM1 * NUM2 > 40 e NUM3 - NUM1 > NUM4 ) NUM1 - NUM2 = 10 e NUM2 + NUM3 > NUM4 ) NUM1 + NUM2 < 10 e NUM3 - NUM4 = NUM1 18 Coloque F ou V nas expressões abaixo: Exemplo: ( V ) NUM3 / NUM2 >55 ou NUM1+ NUM3 > NUM4 a) b) c) d) ( ( ( ( ) NUM3 / NUM2 > 0 ou NUM1 + NUM3 > NUM4 ) NUM2 * NUM1 = 50 ou NUM3 - NUM1 > NUM4 ) NUM1 - NUM2 > 10 ou NUM2 + NUM3 > NUM4 ) NUM1 + NUM2 > 10 ou NUM3 / NUM1 > NUM4 19 Coloque F ou V nas expressões abaixo: Exemplo: ( V ) NUM1 > NUM2 e NUM2 < NUM3 ou NUM3 < NUM4 a) b) c) d) ( ) (NUM1 > NUM2 e NUM2 < NUM3) ou NUM3 < NUM4 ( ) NUM1 * NUM2 > 10 e (NUM1 > NUM4 ou NUM3 - NUM1 > UM4) ( ) NUM1 > 10 ou (NUM1> NUM4 e NUM3 - NUM1 > NUM4) ( ) NUM1 + NUM2 > 10 ou (NUM1 / NUM3 > NUM4 e NUM3 < NUM4) 24 20 O algoritmo abaixo deverá ler duas notas, calcular a média e mostrar o resultado. Para que o algoritmo seja executado corretamente, complete-o com os comandos que faltam: inicio variavel ____ NOTA1, NOTA2, MEDIA ________ “Digite a primeira nota” ________ NOTA1 escrever “___________________” ler (________) MEDIA <- (_______ + _______)/2 escrever “A média das notas é: ”, _____________ fim 21 Faça um algoritmo que leia um número inteiro e mostre seu antecessor e seu sucessor. 22 Faça um algoritmo que leia dois números reais e mostre a soma e a média aritmética desses números. 23 Faça um algoritmo que receba como entrada as medidas dos dois catetos de um triângulo retângulo e calcule e exiba a medida da hipotenusa e a área do triângulo. 25 3.7. ESTRUTURA DE SELEÇÃO (DECISÃO) Os comandos de seleção ou de decisão são técnicas de programação que conduzem a estruturas de programas que não são totalmente seqüenciais. Uma estrutura de seleção permite a escolha de um grupo de ações a ser executado quando determinadas condições, representadas por expressões lógicas, são ou não satisfeitas. 3.7.1. Comando SE Responsável por tomada de decisão no algoritmo, fazendo com que tenha dois tipos de bloco instruções a ser executadas de acordo com a reposta da expressão lógica, uma verdadeira e outra falsa. A sintaxe do comando SE em Portugol é exibida abaixo: Sintaxe: se expressão lógica entao bloco de instruções verdade senao bloco de instruções falso imse se: Indica o início da estrutura de seleção. expressão lógica: Condição que definirá o bloco a ser executado. entao: Responsável de executar o bloco de instrução, caso a expressão lógica seja verdadeira. senao: Responsável de executar o bloco de instrução, caso a expressão lógica seja falsa. fimse: Indica o final da estrutura de seleção. Exemplo 1: inicio variavel real nota1 variavel real nota2 variavel real media 26 ler nota1 ler nota2 media <- (nota1 + nota2)/2 se media >= 60 entao escrever "Parabéns! Aprovado!" fimse fim Note, no algoritmo acima, que não utilizamos o bloco SENAO na estrutura de seleção. Com isso, caso a média seja menor que 60, nada será executado em nosso algoritmo. Isso mostra que não é obrigatório o uso do SENAO, a não se que seja necessário executar algumas instruções se o retorno da expressão lógica for falso. Exemplo 2: inicio variavel real nota1 variavel real nota2 variavel real media ler nota1 ler nota2 media <- (nota1 + nota2)/2 se media >= 60 entao escrever "Parabéns! Aprovado!" senao escrever "Desculpe! Reprovado!" fimse fim 3.7.2. Comando ESCOLHE Também responsável por tomada de decisão, mais numa estrutura diferente do comando 27 SE. A sintaxe do comando ESCOLHA em Portugol é exibida abaixo: Sintaxe: escolhe expressão caso constante bloco de instrução 1 caso constante bloco de instrução 2 defeito bloco de instrução padrão fimescolhe escolha: Indica o início da estrutura de seleção. expressão lógica: Responsável por retorna o valor da expressão. caso constante: Responsável de executar o bloco de instrução, caso a expressão seja verdadeira. defeito: Responsável de executar o bloco de instrução, caso a nenhum dos casos seja satisfatório, ou seja, verdadeira. fimescolhe: Indica o final da estrutura de seleção. Exemplo: inicio variavel inteiro num1, num2 variavel caracter operador escrever "Digite o primeiro numero: " ler num1 escrever "Digite um operador (+, -, *, /) : " ler operador escrever "Digite o segundo numero: " ler num2 escolhe operador caso "+" : escrever "O resultado é: ", num1 + num2 28 caso "-" : escrever "O resultado é: ", num1 - num2 caso "*" : escrever "O resultado é: ", num1 * num2 caso "/" : escrever "O resultado é: ", num1 / num2 defeito : escrever "Operador invalido!!!" fimescolhe fim 24 O algoritmo abaixo deve ler o salário bruto e calcular o salário líquido. Neste exemplo, o salário líquido será o salário bruto menos os descontos de INSS e IR, seguindo as seguintes regras: caso o salário seja menor que R$ 1.500,00, não devemos descontar IR e descontaremos 8% de INSS; para salários a partir R$ 1.500,00, descontaremos 5% de IR e 11% de INSS. Ao final deve ser exibido o novo salário. Para que o algoritmo seja executado corretamente, complete-o com os comandos que faltam. Obs. essas faixas de cálculo são fictícias, apenas para exemplo, não condizendo com as leis em vigor no país. inicio var _______ bruto, liquido, inss, ir __________ (“Digite o salário”) _____ (bruto) se ___________ < 1500 entao inss <- ____________* 0.08 ir <- ____________ senão ____ <- bruto * 0.11 ir <- bruto * _____ fimse liquido <- bruto - _____ - _____ ___________ “O valor do salário líquido é:”, ______________ fim 29 25 Sabendo que triângulo é uma figura geométrica de três lados onde cada um dos lados é menor que a soma dos outros dois, queremos fazer um algoritmo que receba três valores e verifique se eles podem ser os comprimentos dos lados de um triângulo. Neste contexto, complete o algoritmo abaixo para que funcione: inicio variavel real lado1, lado2, lado3 ______ “Digite os valores dos 3 lados.” ______ lado1 ______ lado2 ler _____ se (lado1 + lado2 < _____) e (lado2 + lado3 < lado1) _____ (lado1 + _____ < lado2) então __________ “Podemos construir um triângulo com estas dimensões!” senão escrever “_____________________” _______ fim 26 Escreva um algoritmo que leia um número inteiro e diga: • Se ele é par ou ímpar. Dica: utilize o operador % (resto da divisão inteira). • Se ele é positivo, negativo ou nulo (zero). 27 Escreva um algoritmo que leia a idade de um atleta e escreva na tela em que categoria ele se enquadra, seguindo a tabela abaixo: Faixa Etária de 5 a 10 anos de 11 a 17 anos de 18 a 30 anos acima de 30 anos Categoria Infantil Juvenil Profissional Sênior 30 3.8. ESTRUTURA DE REPETIÇÃO Os comandos de repetição são técnicas de programação que permite repetir um bloco de instruções em determinado números de vezes determinado ou alguma condição seja satisfatória. 3.8.1. Comando PARA Responsável por criar um laço de repetição de instruções determinando o número de vezes que será executar essas instruções. A sintaxe do comando PARA em Portugol é exibida abaixo: Sintaxe: para variável_numérica de valor_inicial ate valor_final bloco de instruções próximo para: Indica o início da estrutura de repetição. variável_numérica: Nome da variável que vai guardar a valor que vai variar durante o laço. de: Indica onde irá iniciar o laço. valor_inicial: Valor que indicará da onde começará o laço. ate: Indica onde irá terminar o laço. valor_final: Valor que indicará onde parará o laço. proximo: Volta para início da estrutura de repetição. Exemplo: inicio variavel real nota, soma <- 0, media variável inteiro conta para conta de 0 ate 9 passo 1 escrever "Digite a nota: " 31 ler nota soma <- soma + nota proximo media <- soma / conta escrever "A média da turma é: ", media fim Note, no algoritmo acima que usamos um opção chamado PASSO no comando PARA, isso serve para incrementar o valor da variável, por isso se não informado, o valor será incrementado de 1 em 1, mais caso coloque essa opção, faz com que o valor será incrementado pelo valor informado nele, por exemplo PASSO 2, isso fará o valor da variável ser incrementada em 2 em 2. 3.8.2. Comando ENQUANTO Responsável por criar um laço de repetição de instruções enquanto uma determinada condição seja satisfatória. A sintaxe do comando ENQUANTO em Portugol é exibida abaixo: Sintaxe: enquanto condição faz bloco de instruções fimenquanto enquanto: Indica o início da estrutura de repetição. condição: Condição que definirá o bloco a ser executado. faz: Responsável de executar o bloco de instrução, caso a expressão lógica seja verdadeira. fimenquanto: Indica o final da estrutura de repetição. 32 Exemplo: inicio variavel real nota, soma <- 0, media variável inteiro resp <- 1, contador enquanto resp = 1 faz escrever "Digite a nota: " ler nota soma <- soma + nota escrever "Digite 1 para continuar ou digite outra tecla para finalizar." ler resp contador <- contador + 1 fimenquanto media <- soma / contador escrever "A média da turma é: ", media fim 28 Crie um algoritmo que leia 5 valores e determinar o maior dentre eles. 29 Crie um algoritmo que leia 4 números inteiros e calcular a soma dos que forem par. 30 Crie um algoritmo que mostre a tabuada de multiplicar do número 4. 33 31 Crie um algoritmo que calcule e mostrar a média aritmética dos números pares compreendidos entre 13 e 73. 32 Crie um algoritmo que leia 10 valores, um de cada vez, e contar quantos deles estão no intervalo [10,50] e quantos deles estão fora deste intervalo, mostrando estas informações. 3.9. VETORES E MATRIZES Até o momento, nossas variáveis que declaramos em nossos algoritmos eram capazes de armazenar apenas um valor. Assim, para cada valor que precisamos manipular, nós declaramos uma variável distinta. Mais nesse capitulo vamos aprender a armazenar vários valores do mesmo tipo em uma única uma variável. Para isso, utilizaremos os conceitos de vetores e matrizes. . 3.9.1. VETORES Um vetor é uma estrutura de dados utilizada para representar certa quantidade de valores homogêneos, ou seja: um conjunto de valores, todas do mesmo tipo, numa mesma variável. A sintaxe do comando em Portugol é exibida abaixo: Sintaxe: variavel / constante tipo nome[dimenssão] variavel: Indicar a declaração de uma variável. constante: Indicar a declaração de uma constante. tipo: Indica o tipo de dados que iremos armazenar na variável. nome: Define o nome que iremos referenciar a nossa variável. 34 dimenssão: Define o tamanho do vetor, ou seja, sua capacidade de armazenamento. Exemplo: inicio variavel real notas[10] variavel inteiro indice escrever "Lendo as notas \n" para indice de 0 ate 9 escrever "Digite a nota do próximo aluno: " ler notas[indice] proximo para indice de 0 ate 9 escrever "A nota ", notas[índice], " foi armazenada na posição ", índice, " do vetor" proximo fim 3.9.2. MATRIZES Na verdade, vetor é um tipo especial de matriz. Dizemos que vetor é uma matriz unidimensional. Ou seja, enquanto o vetor tem apenas uma dimensão, a matriz pode ter tantas dimensões quantas forem necessárias. Mas, Assim, sempre que nos referirmos a matrizes com duas dimensões, estaremos falando de matrizes bidimensionais. A sintaxe do comando em Portugol é exibida abaixo: Sintaxe: variavel / constante tipo nome[dimenssão1] [dimenssão2]... [dimenssãon] 35 variavel: Indicar a declaração de uma variável. constante: Indicar a declaração de uma constante. tipo: Indica o tipo de dados que iremos armazenar na variável. nome: Define o nome que iremos referenciar a nossa variável. dimenssão: Define o tamanho do vetor, ou seja, sua capacidade de armazenamento. Exemplo: inicio variavel real notas[5][2] variavel inteiro lin, col escrever "INICIANDO O LOOP DE LEITURA \n\n" para lin de 0 ate 4 para col de 0 ate 1 escrever "Digite a nota ", lin, " do aluno ", col ler notas[lin][col] proximo proximo escrever "\nINICIANDO O LOOP DE EXIBIÇÃO \n\n" para lin de 0 ate 4 para col de 0 ate 1 escrever "Nota = ", notas[lin][col] proximo proximo fim Note, no algoritmo acima usamos uma opção to tipo “\n” no texto do comando ESCREVER, isso serve para indicar ao computador que o que ele vai mostrar após o \n será mostrador na próxima linha, e uma naneira de você forçar uma quebra de linha. Lembrando que essa opção não é obrigatória, e sim opcional. Mais é uma maneira de melhor visualizar os resultados de seu algoritmo. 36 32 Crie um algoritmo que leia e armazene num vetor a média de 10 alunos, depois mostre somente os maiores que 6,0. 33 Crie um algoritmo que leia e armazene em vetor o nome e nota final de 10 alunos, depois mostre os mesmo com a descrição ao lado "aprovado" se nota >= 6,0 e "reprovado" se nota < 6,0. 34 Crie um algoritmo carregue uma matriz 2 x2 com os valores das vendas de uma loja, supondo 2 meses e 2 vendedores. Calcule e mostre, em cada mês, os valores das vendas. 3.10. FUNÇÕES PRÉ-DEFINIDAS Uma função é uma unidade de código de programa autônoma desenvolvida para cumprir uma determinada tarefa em particular (MIZRAHI, 1990). Sendo assim, funções pré-definidas, já são funções prontas para ser usadas no algoritmo ou programas. Segue a baixo uma tabela com alguns funções pré-definidas mais comuns para usarmos nos nossos algoritmos. 37 Função Descrição Exemplo EXP Exponeciação exp(1.0) ABS Valor Absoluto abs(123.6) RAIZ Raiz Quadrada raiz(123.6 * 4) LOG Logaritmo base 10 log(1.0 * 1000) LN Logaritmo base E ln(1.0 * 1000) INT Parte inteira de um número real int(123.6) FRAC Parte fracionária de um número real frac(123.6) ARRED Arredondamento de um número real arred(123.6) REFERÊNCIAS CARVALHO, Vicictorio Albani de – Lógica de Programação, Colatina-ES: CEAD / Ifes, 2009. LAUREANO, M. Programando em C. Rio de Janeiro: Brasport, 2005. MIZRAHI, Victorine V. Treinamento em Linguagem C – Curso Completo – Módulo 1. São Paulo: Mc Graw Hill, 1990. TANENBAUM, Andrew S. Sistemas Operacionais. Porto Alegre: Bookman, 2000. 38