1 Bases Computacionais da Ciência (BC- 0005) Lógica de Programação: Estruturas Condicionais Maria das Graças Bruno Marietto [email protected] Centro de Matemática, Computação e Cognição (CMCC) Universidade Federal do ABC (UFABC) 2 Introdução Em um computador um conjunto de instruções pode compreender: Operações aritméticas que encontramos em uma calculadora simples: Soma Multiplicação Divisão Subtração Até instruções utilizadas para tomar decisões Ler dados a partir do teclado Gravar esses dados no disco Etc 3 Introdução Aprender a programar não é uma tarefa trivial: Pois envolve manipular uma representação abstrata do mundo real, criada dentro do computador: Aprender as questões relativas à linguagem que está sendo usada para criar os programas e a lógica de programação em si No capítulo anterior: Vimos os primeiros conceitos de Lógica de Programação: Instrução e sequência de instruções 4 Objetivos da Aula Objetivos desta aula: Apresentaremos um conceito mais elaborado: As estruturas condicionais 5 Estruturas Estruturas de controle permitem o controle do fluxo de execução dos comandos Temos três estruturas básicas de controle: Seqüencial Condicional ou Desvio Repetição 6 Estrutura de Controle Seqüencial Estrutura Seqüencial É padrão em toda a forma de algoritmo: Seqüência onde o computador irá ler os comandos de cima para baixo, e da esquerda para direita Uma estrutura seqüencial é um conjunto de comandos que serão executados em uma seqüência linear, de cima para baixo Os comandos serão executados na mesma ordem em que foram escritos C1 C2 ... Cn 7 Tomando Decisões – Estruturas Condicionais Estrutura Condicional: É também conhecida como de decisão ou seleção Um desvio condicional é usado para escolher entre cursos alternativos de ação em um programa Estrutura Condicional: É caracterizada por executar determinados códigos de programação que dependem da veracidade de uma condição 8 Tomando Decisões – Estruturas Condicionais O nosso cotidiano é repleto de tomadas de decisões: Você deve decidir entre ir à universidade de carro ou bicicleta Estudar para a disciplina de Bases ou ir à festa Para cada decisão, há conseqüências específicas Estrutura Condicional: Esta estrutura se subdivide em outras duas estruturas: Estrutura/desvio condicional simples (se-então) Estrutura/desvio condicional composta(o) (se-então- senão) 9 Tomando Decisões: Estrutura Condicional Simples No desvio condicional simples uma condição é avaliada e, se o resultado for verdadeiro, um conjunto de instruções é executado A condição irá determinar a execução ou não de um determinado comando Exemplo: Descrição narrativa: SE fizer sol ENTÃO vou à praia Fluxograma: Linguagem Algorítmica SE tempo = Sol ENTÃO { Vou à Praia } 10 Tomando Decisões: Estrutura Condicional Composta No desvio condicional composto, a condição irá determinar qual comando será executado dentre dois listados Então Senão Na estrutura composta temos: “Se.....Então.....Sen ão”. 11 Tomando Decisões: Estrutura Condicional Composta Exemplo: Descrição Narrativa: SE fizer sol ENTÃO vou à praia SENÃO jogarei cartas. Fluxograma: Ent ão Senã o Linguagem Algorítmica SE tempo = sol ENTÃO { Vou à praia } SENÃO { Jogarei cartas } 12 RoboMind 13 Mapas no RoboMind Para maiores detalhes de como montar um mapa no RoboMind veja em: http:// www.robomind.net/downloads/RoboMapFormat.pdf Os elementos que podem ser colocados no mapa são: Ladrilhos/Obstáculos Balizas/Objetos Robô Espaços em branco Linha branca ou preta 14 Mapas no RoboMind Ladrilhos: os ladrilhos são representados por letras maiúsculas Os ladrilhos existentes são: 15 Mapas no RoboMind mapaTeste2.map 16 Mapas no RoboMind Espaço: para inserir espaços em branco basta deixar um espaço livro no arquivo *.map Objeto/Baliza: o caracter * (asterisco) insere um objeto/baliza no arquivo mapa Início do robô: utilize o caracter @ (arroba) 17 Mapas no RoboMind Traços (Pintar) : Traços podem ser adicionados ao mapa escrevendo uma lista com os seguintes pares: cor = A cor da pintura (cor, tipo, x , y) Pode ser somente w ou b, respectivamente branco e preto tipo = A forma da linha . = um ponto − = uma linha horizontal para a direita | = uma linha vertical para baixo x = a posição horizontal onde a linha começa y = a posição vertical onde a linha começa 18 Mapas no RoboMind Linhas horizontais e verticais ocupam exatamente dois blocos Um ponto ocupa um bloco No exemplo duas linhas são definidas: { (w, -, 2, 2,) , (b, . , 2, 3) } uma linha horizontal em x = 2, y = 2, e um ponto preto em x = 2, y = 3 O canto superior esquerdo da tela é x = 0 e y = 0 A direção x é da esquerda para a direita, a direção y é de cima para baixo Observe que o curso da lista deve começar imediatamente depois de pintar e não são permitidos espaços em branco (espaços, tabulações, linhas de quebra) 19 Seguir o Robô ou Não? Comando Exibir-> Acompanhar Robô Caso esta opção tenha sido selecionada, a execução da simulação irá focar no movimento do robô. Sendo assim, não será possível analisar uma outra área do mapa onde o robô não esteja. Você pode tentar arrastar o mapa para tal posição, mas ele voltará para o local onde está o robô Sem a opção de rastreamento o sistema mostra qualquer local do mapa, mesmo naqueles onde o robô não está 20 Estrutura Condicionais com o RoboMind O RoboMind tem comandos para observar o ambiente, para que os seus programas possam tomar decisões baseando-se no estado do ambiente O robô pode observar as células da: Esquerda Direita Frente As observações podem ser de cinco tipos diferentes: Existe um obstáculo na célula? (ladrilho) A célula está vazia? Tem um objeto na célula? (baliza) A célula está pintada de branco? A célula está pintada de preto? 21 Estrutura Condicional com o RoboMind Resumo dos comandos para testar as observações: 22 Estrutura Condicional com o RoboMind Comandos de observação do ambiente podem ser usadas em combinação com estruturas de decisão para que o robô tome decisões baseando-se no estado do mundo: se (condição) { comandos } Comandos são executados somente se a CONDIÇÃO for VERDADEIRA 23 Estrutura Condicional com o RoboMind O que faz o programa a seguir? Observa a célula da esquerda e, se ela estiver pintada de branco, repinta a célula de preto, voltando a sua posição Digite estes comandos no RoboMind e salve-o com o nome testeEsquerda.irobot Altere o arquivo mapaTeste2.map para inicializar o robô ao lado direito da marca branca Execute o script testeEsquerda.irobot. Diminua a velocidade de execução e dê um zoom para ver o robô mais de perto 24 Estrutura Condicional com o RoboMind Nada acontece pois o Se você tentar executar esse programa e a célula da esquerda não estiver pintada de branco? bloco de código será executado apenas se aquela célula estiver pintada de branco Como resolver esta situação?? 25 Estrutura Condicional com o RoboMind Você pode usar uma variação dessa estrutura de controle para instruir o robô a realizar uma atividade alternativa, caso a condição NÃO seja verdadeira: se (condição) {comandos} senão {comandos} Nesse caso, caso SE a célula esteja pintada de branco, o robô irá pintá-la de preto e voltar a sua posição anterior. CASO CONTRRIO, o robô irá andar três posições para a frente e parar Observe que apenas UM dos blocos de comandos é executado 26 Expressões Lógicas No arquivo mapaTeste2.map altere a posição do robô para um local onde não haja marca branca na sua direita Insira no script testeEsquerda.irobot os comandos a seguir: senão { andarFrente(3) } 27 Expressões Lógicas A condição do comando SE é, na verdade, uma expressão lógica que pode assumir os valores VERDADEIRO ou FALSO, dependendo do estado do cenário Expressões lógicas: Também podem envolver combinação de expressões simples através do uso de conectivos lógicos O RoboMind dispõe de três conectivos lógicos: Não E Ou 28 Expressões Lógicas O conectivo E compara duas expressões lógicas e o resultado é VERDADEIRO apenas se as DUAS forem VERDADEIRAS O conectivo OU compara duas expressões e o resultado da expressão é VERDADEIRO se qualquer uma das DUAS, ou AMBAS, forem VERDADEIRAS 29 Expressões Lógicas Insira o script a seguir no RoboMind se(sortear() e não brancoEsquerda()) { virarEsquerda() andarFrente(1) pintarPreto() pararPintar() andarTrás(1) virarDireita() } senão { andarFrente(3) } Abra um mapa onde o robô será inicializado em um local que não haja marca branca na esquerda Execute algumas vezes o programa e veja quantas vezes o trecho do código SE foi executado E quantas vezes o trecho do código ENTÃO foi executado Explique este comportamento do programa 30 Exercício 31 Neste exercício iremos fazer com que o robô tome decisões para contornar os obstáculos à sua frente Vamos criar um cenário em que o robô deve se mover em linha reta da esquerda para a direita, mas com um obstáculo à frente. O arquivo para a criação do mapa para esse cenário está a seguir: 32 O caminho a ser percorrido pelo robô para esse mapa pode ser visto na figura abaixo. A princípio poderíamos usar uma estratégia parecida com a da aula passada, e programar o caminho “na mão”, e passando pelos pontos que contornam a caixa. Entretanto, essa abordagem não é muito flexível, pois se mudarmos a caixa de posição, o programa perde a utilidade 33 O programa a seguir faz com que o robô atravesse o cenário da esquerda para a direita O comando repetir(11) tem por objetivo repetir o comando andarLeste(1) onze vezes Esse programa funcionaria se não houvesse a CAIXA no cenário, mas se você executar esse programa nesse cenário, o seu programa ficará parado em frente à caixa Execute este programa e veja o que ocorre Dê um zoom no robô e diminua a velocidade de execução da simulação 34 Vamos alterar o programa conforme o script a seguir: repetir(10) Neste script o robô dá { um passo de cada vez, e se houver um obstáculo na frente ele contorna a caixa dando um passo para o norte, dois para o leste, e um para o sul Observe que o número de vezes em que a sequência é repetida foi diminuída para 10 pois o robô dá dois passos para a frente quando está́ contornando a caixa se (temObstáculoFrente()) { andarNorte(1) andarLeste(2) andarSul(1) } senão { andarLeste(1) } } 35 repetir(10) { se (temObstáculoFrente()) { andarNorte(1) andarLeste(2) andarSul(1) } senão { andarLeste(1) } } Esse programa funciona para qualquer lugar que você colocar a caixa no caminho do robô Isto porque a posição da caixa não está codificada diretamente no código, mas ela “é encontrada” testando-se se há um obstáculo à frente Experimente mudar a posição da caixa no cenário para se certificar disso 36 A mesma estrutura do programa funciona mesmo que existam duas caixas separadas no cenário Vamos testá-lo agora num cenário com duas caixas, que pode ser construído usando a descrição do mapa mostrada na figura a seguir Para percorrer esse cenário você pode usar o programa ao lado repetir(9) { se (temObstáculoFrente( )) { andarNorte(1) andarLeste(2) andarSul(1) } senão { andarLeste(1) } } 37 Novamente, não importa a posição das caixa no caminho do robô (desde que elas não estejam juntas), pois o robô irá verificar a posição delas testando se há um obstáculo a frente. 38 Faça um programa para que o robô, no ambiente dado pelo mapa openArea.map, pinte de branco um quadrado do seguinte modo: O robô anda para frente três posições e escolhe aleatoriamente uma direção (esquerda ou direita) Depois conclui a pintura segundo esta escolha Execute o programa algumas vezes e observe quando ocorreu o sorteio. Quantas vezes ele fez o quadrado para cada lado? 39 pintarBranco() andarNorte(3) se (sortear()) { andarLeste(3) andarSul(3) andarOeste(3) } senão { andarOeste(3) andarSul(3) andarLeste(3) } pararPintar() 40 Atividades para Casa 41 Atividades para Casa Exercícios: Propostos (1-7): Página 164; Para Casa (1-8): Páginas 164-165.